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
32
33
34
35
36
37
38
39 public class RequestRoutingFilter implements Filter {
40
41 private static final Logger logger = Logger
42 .getLogger(RequestRoutingFilter.class);
43
44 private final List<Pattern> ignorePathPatterns = new ArrayList<Pattern>();
45
46 public void init(final FilterConfig config) throws ServletException {
47 final String ignorePathPatternString = config
48 .getInitParameter("ignorePathPattern");
49 if (!StringUtil.isEmpty(ignorePathPatternString)) {
50
51 for (final StringTokenizer tokenizer = new StringTokenizer(
52 ignorePathPatternString, ","); tokenizer.hasMoreTokens();) {
53 final String token = tokenizer.nextToken();
54 final Pattern pattern = Pattern.compile(token);
55 ignorePathPatterns.add(pattern);
56 }
57 }
58 }
59
60 public void destroy() {
61 }
62
63 public void doFilter(final ServletRequest request,
64 final ServletResponse response, final FilterChain chain)
65 throws IOException, ServletException {
66
67 final String rewritePath = rewrite((HttpServletRequest) request,
68 (HttpServletResponse) response);
69 if (!StringUtil.isEmpty(rewritePath)) {
70 if (logger.isDebugEnabled()) {
71 logger.log("DCUB0001", new Object[] { rewritePath });
72 }
73 final RequestDispatcher requestDispatcher = request
74 .getRequestDispatcher(rewritePath);
75 requestDispatcher.forward(request, response);
76 } else {
77 chain.doFilter(request, response);
78 }
79 }
80
81 private String rewrite(final HttpServletRequest request,
82 final HttpServletResponse response) throws ServletException,
83 IOException {
84 final String path = CubbyUtils.getPath(request);
85
86 if (isIgnorePath(path)) {
87 return null;
88 }
89
90 final S2Container container = SingletonS2ContainerFactory
91 .getContainer();
92 final PathResolver pathResolver = (PathResolver) container
93 .getComponent(PathResolver.class);
94
95 final String rewritePath;
96 final ForwardInfo forwardInfo = pathResolver.getForwardInfo(path);
97 if (forwardInfo != null) {
98 request.setAttribute(ATTR_ACTION_CLASS_NAME, forwardInfo
99 .getActionClassName());
100 request.setAttribute(ATTR_METHOD_NAME, forwardInfo.getMethodName());
101 rewritePath = forwardInfo.getRewritePath();
102 } else {
103 rewritePath = null;
104 }
105 return rewritePath;
106 }
107
108 private boolean isIgnorePath(final String path) {
109 for (final Pattern pattern : ignorePathPatterns) {
110 final Matcher matcher = pattern.matcher(path);
111 if (matcher.matches()) {
112 return true;
113 }
114 }
115 return false;
116 }
117
118 }