1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.filter;
17
18 import static org.seasar.cubby.CubbyConstants.ATTR_ROUTINGS;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.StringTokenizer;
25 import java.util.regex.Pattern;
26
27 import javax.servlet.Filter;
28 import javax.servlet.FilterChain;
29 import javax.servlet.FilterConfig;
30 import javax.servlet.RequestDispatcher;
31 import javax.servlet.ServletException;
32 import javax.servlet.ServletRequest;
33 import javax.servlet.ServletResponse;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36
37 import org.seasar.cubby.routing.InternalForwardInfo;
38 import org.seasar.cubby.routing.Router;
39 import org.seasar.cubby.routing.Routing;
40 import org.seasar.framework.container.S2Container;
41 import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
42 import org.seasar.framework.log.Logger;
43 import org.seasar.framework.util.StringUtil;
44
45
46
47
48
49
50
51
52
53
54 public class RequestRoutingFilter implements Filter {
55
56
57 private static final Logger logger = Logger
58 .getLogger(RequestRoutingFilter.class);
59
60
61 public static final String IGNORE_PATH_PATTERN = "ignorePathPattern";
62
63
64 private final List<Pattern> ignorePathPatterns = new ArrayList<Pattern>();
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public void init(final FilterConfig config) throws ServletException {
97 final String ignorePathPatternString = config
98 .getInitParameter(IGNORE_PATH_PATTERN);
99 if (!StringUtil.isEmpty(ignorePathPatternString)) {
100
101 for (final StringTokenizer tokenizer = new StringTokenizer(
102 ignorePathPatternString, ","); tokenizer.hasMoreTokens();) {
103 final String token = tokenizer.nextToken();
104 final Pattern pattern = Pattern.compile(token);
105 ignorePathPatterns.add(pattern);
106 }
107 }
108 }
109
110
111
112
113 public void destroy() {
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 public void doFilter(final ServletRequest req, final ServletResponse res,
140 final FilterChain chain) throws IOException, ServletException {
141 final HttpServletRequest request = (HttpServletRequest) req;
142 final HttpServletResponse response = (HttpServletResponse) res;
143
144 final S2Container container = SingletonS2ContainerFactory
145 .getContainer();
146 final Router router = (Router) container.getComponent(Router.class);
147
148 final InternalForwardInfo internalForwardInfo = router.routing(request,
149 response, ignorePathPatterns);
150 if (internalForwardInfo != null) {
151 final String internalForwardPath = internalForwardInfo
152 .getInternalForwardPath();
153 final Map<String, Routing> onSubmitRoutings = internalForwardInfo
154 .getOnSubmitRoutings();
155 if (logger.isDebugEnabled()) {
156 logger.log("DCUB0001", new Object[] { internalForwardPath,
157 onSubmitRoutings });
158 logger.log("DCUB0015", new Object[] { onSubmitRoutings });
159 }
160 request.setAttribute(ATTR_ROUTINGS, onSubmitRoutings);
161 final RequestDispatcher requestDispatcher = request
162 .getRequestDispatcher(internalForwardPath);
163 requestDispatcher.forward(request, response);
164 } else {
165 chain.doFilter(request, response);
166 }
167 }
168
169 }