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  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 }