View Javadoc

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   * リクエストされたURLを適切なアクションに振り分けるフィルタ。
33   * <p>
34   * {@link PathResolver} によって {@link ForwardInfo} を抽出し、そこに保持された情報をもとにフォワードします。
35   * </p>
36   * 
37   * @author baba
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 }