package org.ignition.blojsom.servlet; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.util.*; public class PermalinkFilter implements Filter { public void init(FilterConfig filterConfig) { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hreq = (HttpServletRequest)request; String uri = hreq.getRequestURI(); if (!uri.endsWith("/")) { int lastSlash = uri.lastIndexOf('/'); if (lastSlash >= 0) { hreq = new PermalinkRequest(hreq, uri.substring(lastSlash + 1)); } } chain.doFilter(hreq, response); } private class PermalinkRequest extends HttpServletRequestWrapper { private Map params; private String uri; private String url; private String pathInfo; public PermalinkRequest(HttpServletRequest request, String permalink) { super(request); params = new HashMap(request.getParameterMap()); params.put("permalink", new String[]{ permalink }); params = Collections.unmodifiableMap(params); uri = chopPermalink(request.getRequestURI(), permalink); url = chopPermalink(request.getRequestURL().toString(), permalink); pathInfo = chopPermalink(request.getPathInfo(), permalink); } private String chopPermalink(String str, String permalink) { return str.substring(0, str.length() - permalink.length()); } public String getRequestURI() { return uri; } public StringBuffer getRequestURL() { return new StringBuffer(url); } public String getPathInfo() { return pathInfo; } public String getParameter(String name) { String[] values = getParameterValues(name); return (values != null) ? values[0] : null; } public Map getParameterMap() { return params; } public Enumeration getParameterNames() { return Collections.enumeration(params.keySet()); } public String[] getParameterValues(String name) { return (String[])params.get(name); } } }