View Javadoc

1   package org.seasar.cubby.routing.impl;
2   
3   import java.util.Collections;
4   import java.util.List;
5   import java.util.regex.Matcher;
6   import java.util.regex.Pattern;
7   
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpServletResponse;
10  
11  import org.seasar.cubby.routing.InternalForwardInfo;
12  import org.seasar.cubby.routing.PathResolver;
13  import org.seasar.cubby.routing.Router;
14  import org.seasar.cubby.util.CubbyUtils;
15  import org.seasar.framework.log.Logger;
16  
17  /**
18   * ルーターの実装です。
19   * 
20   * @author baba
21   * @since 1.0.0
22   */
23  public class RouterImpl implements Router {
24  
25  	/** ロガー */
26  	private static final Logger logger = Logger.getLogger(RouterImpl.class);
27  
28  	/** 空の対象外パターンのリスト */
29  	private static final List<Pattern> EMPTY_IGNORE_PATH_PATTERNS = Collections
30  			.emptyList();
31  
32  	/** フォワードするための情報を抽出するクラス。 */
33  	private PathResolver pathResolver;
34  
35  	/**
36  	 * フォワードするための情報を抽出するクラスを設定します。
37  	 * 
38  	 * @param pathResolver
39  	 *            フォワードするための情報を抽出するクラス
40  	 */
41  	public void setPathResolver(final PathResolver pathResolver) {
42  		this.pathResolver = pathResolver;
43  	}
44  
45  	/**
46  	 * {@inheritDoc}
47  	 */
48  	public InternalForwardInfo routing(final HttpServletRequest request,
49  			final HttpServletResponse response) {
50  		return routing(request, response, EMPTY_IGNORE_PATH_PATTERNS);
51  	}
52  
53  	/**
54  	 * {@inheritDoc}
55  	 */
56  	public InternalForwardInfo routing(final HttpServletRequest request,
57  			final HttpServletResponse response, List<Pattern> ignorePathPatterns) {
58  		final String path = CubbyUtils.getPath(request);
59  		if (logger.isDebugEnabled()) {
60  			logger.log("DCUB0006", new Object[] { path });
61  		}
62  
63  		if (isIgnorePath(path, ignorePathPatterns)) {
64  			return null;
65  		}
66  
67  		final InternalForwardInfo internalForwardInfo = pathResolver
68  				.getInternalForwardInfo(path, request.getMethod());
69  		return internalForwardInfo;
70  	}
71  
72  	/**
73  	 * 指定された path が ignorePathPatterns にマッチするかを示します。
74  	 * 
75  	 * @param path
76  	 *            パス
77  	 * @param ignorePathPatterns
78  	 *            対象外パターンのリスト
79  	 * @return path が ignorePathPatterns にマッチする場合は <code>true</code>、そうでない場合は
80  	 *         <code>false</code>
81  	 */
82  	private boolean isIgnorePath(final String path,
83  			List<Pattern> ignorePathPatterns) {
84  		for (final Pattern pattern : ignorePathPatterns) {
85  			final Matcher matcher = pattern.matcher(path);
86  			if (matcher.matches()) {
87  				return true;
88  			}
89  		}
90  		return false;
91  	}
92  
93  }