1 package org.seasar.cubby.filter; 2 3 import static org.seasar.cubby.CubbyConstants.ATTR_ACTION_CLASS_NAME; 4 import static org.seasar.cubby.CubbyConstants.ATTR_METHOD_NAME; 5 6 import java.io.IOException; 7 import java.util.ArrayList; 8 import java.util.List; 9 import java.util.StringTokenizer; 10 import java.util.regex.Matcher; 11 import java.util.regex.Pattern; 12 13 import javax.servlet.Filter; 14 import javax.servlet.FilterChain; 15 import javax.servlet.FilterConfig; 16 import javax.servlet.RequestDispatcher; 17 import javax.servlet.ServletException; 18 import javax.servlet.ServletRequest; 19 import javax.servlet.ServletResponse; 20 import javax.servlet.http.HttpServletRequest; 21 import javax.servlet.http.HttpServletResponse; 22 23 import org.seasar.cubby.convention.ForwardInfo; 24 import org.seasar.cubby.convention.PathResolver; 25 import org.seasar.cubby.util.CubbyUtils; 26 import org.seasar.framework.container.S2Container; 27 import org.seasar.framework.container.factory.SingletonS2ContainerFactory; 28 import org.seasar.framework.log.Logger; 29 import org.seasar.framework.util.StringUtil; 30 31 public class UrlRewriteFilter implements Filter { 32 33 private final Logger logger = Logger.getLogger(this.getClass()); 34 35 private final List<Pattern> ignorePathPatterns = new ArrayList<Pattern>(); 36 37 public void init(final FilterConfig config) throws ServletException { 38 final String ignorePathPatternString = config 39 .getInitParameter("ignorePathPattern"); 40 if (!StringUtil.isEmpty(ignorePathPatternString)) { 41 42 for (final StringTokenizer tokenizer = new StringTokenizer( 43 ignorePathPatternString, ","); tokenizer.hasMoreTokens();) { 44 final String token = tokenizer.nextToken(); 45 final Pattern pattern = Pattern.compile(token); 46 ignorePathPatterns.add(pattern); 47 } 48 } 49 } 50 51 public void destroy() { 52 } 53 54 public void doFilter(final ServletRequest request, 55 final ServletResponse response, final FilterChain chain) 56 throws IOException, ServletException { 57 58 final String rewritePath = rewrite((HttpServletRequest) request, 59 (HttpServletResponse) response); 60 if (!StringUtil.isEmpty(rewritePath)) { 61 if (logger.isDebugEnabled()) { 62 logger.log("DCUB0001", new Object[] { rewritePath }); 63 } 64 final RequestDispatcher requestDispatcher = request 65 .getRequestDispatcher(rewritePath); 66 requestDispatcher.forward(request, response); 67 } else { 68 chain.doFilter(request, response); 69 } 70 } 71 72 private String rewrite(final HttpServletRequest request, 73 final HttpServletResponse response) throws ServletException, 74 IOException { 75 final String path = CubbyUtils.getPath(request); 76 77 if (isIgnorePath(path)) { 78 return null; 79 } 80 81 final S2Container container = SingletonS2ContainerFactory 82 .getContainer(); 83 final PathResolver pathResolver = (PathResolver) container 84 .getComponent(PathResolver.class); 85 86 final String rewritePath; 87 final ForwardInfo forwardInfo = pathResolver.getForwardInfo(path); 88 if (forwardInfo != null) { 89 request.setAttribute(ATTR_ACTION_CLASS_NAME, forwardInfo.getActionClassName()); 90 request.setAttribute(ATTR_METHOD_NAME, forwardInfo.getMethodName()); 91 rewritePath = forwardInfo.getRewritePath(); 92 } else { 93 rewritePath = null; 94 } 95 return rewritePath; 96 } 97 98 private boolean isIgnorePath(final String path) { 99 for (final Pattern pattern : ignorePathPatterns) { 100 final Matcher matcher = pattern.matcher(path); 101 if (matcher.matches()) { 102 return true; 103 } 104 } 105 return false; 106 } 107 }