001: package com.meterware.servletunit;
002:
003: /********************************************************************************************************************
004: * $Id: FilterUrlMap.java,v 1.1 2004/02/26 17:36:47 russgold Exp $
005: *
006: * Copyright (c) 2004, Russell Gold
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
009: * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
010: * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
011: * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included in all copies or substantial portions
014: * of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
017: * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
019: * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020: * DEALINGS IN THE SOFTWARE.
021: *
022: *******************************************************************************************************************/
023: import java.util.ArrayList;
024:
025: /**
026: *
027: * @author <a href="mailto:russgold@httpunit.org">Russell Gold</a>
028: **/
029: class FilterUrlMap {
030:
031: private ArrayList _urlPatterns = new ArrayList();
032: private ArrayList _filters = new ArrayList();
033:
034: void put(String urlPattern, FilterMetaData metaData) {
035: _urlPatterns.add(UrlPatternMatcher
036: .newPatternMatcher(urlPattern));
037: _filters.add(metaData);
038: }
039:
040: FilterMetaData[] getMatchingFilters(String resourceName) {
041: ArrayList matches = new ArrayList();
042: for (int i = 0; i < _urlPatterns.size(); i++) {
043: UrlPatternMatcher urlPattern = (UrlPatternMatcher) _urlPatterns
044: .get(i);
045: if (urlPattern.matchesResourceName(resourceName))
046: matches.add(_filters.get(i));
047: }
048: return (FilterMetaData[]) matches
049: .toArray(new FilterMetaData[matches.size()]);
050: }
051:
052: }
053:
054: abstract class UrlPatternMatcher {
055:
056: static UrlPatternMatcher[] _templates = new UrlPatternMatcher[] {
057: new ExtensionUrlPatternMatcher(),
058: new PathMappingUrlPatternMatcher() };
059:
060: static UrlPatternMatcher newPatternMatcher(String pattern) {
061: for (int i = 0; i < _templates.length; i++) {
062: UrlPatternMatcher matcher = _templates[i].create(pattern);
063: if (matcher != null)
064: return matcher;
065: }
066: return new ExactUrlPatternMatcher(pattern);
067: }
068:
069: /**
070: * Returns a suitable pattern matcher if this class is compatible with the pattern. Will return null otherwise.
071: */
072: abstract UrlPatternMatcher create(String pattern);
073:
074: /**
075: * Returns true if the specified resource matches this pattern.
076: */
077: abstract boolean matchesResourceName(String resourceName);
078: }
079:
080: class ExactUrlPatternMatcher extends UrlPatternMatcher {
081: private String _pattern;
082:
083: public ExactUrlPatternMatcher(String pattern) {
084: _pattern = pattern;
085: }
086:
087: UrlPatternMatcher create(String pattern) {
088: return new ExactUrlPatternMatcher(pattern);
089: }
090:
091: boolean matchesResourceName(String resourceName) {
092: return _pattern.equals(resourceName);
093: }
094: }
095:
096: class ExtensionUrlPatternMatcher extends UrlPatternMatcher {
097: private String _suffix;
098:
099: ExtensionUrlPatternMatcher() {
100: }
101:
102: ExtensionUrlPatternMatcher(String suffix) {
103: _suffix = suffix;
104: }
105:
106: UrlPatternMatcher create(String pattern) {
107: return !pattern.startsWith("*.") ? null
108: : new ExtensionUrlPatternMatcher(pattern.substring(1));
109: }
110:
111: boolean matchesResourceName(String resourceName) {
112: return resourceName.endsWith(_suffix);
113: }
114: }
115:
116: class PathMappingUrlPatternMatcher extends UrlPatternMatcher {
117: private String _exactPath;
118: private String _prefix;
119:
120: PathMappingUrlPatternMatcher() {
121: }
122:
123: PathMappingUrlPatternMatcher(String exactPath) {
124: _exactPath = exactPath;
125: _prefix = exactPath + '/';
126: }
127:
128: UrlPatternMatcher create(String pattern) {
129: return !handlesPattern(pattern) ? null
130: : new PathMappingUrlPatternMatcher(pattern.substring(0,
131: pattern.length() - 2));
132: }
133:
134: private boolean handlesPattern(String pattern) {
135: return pattern.startsWith("/") && pattern.endsWith("/*");
136: }
137:
138: boolean matchesResourceName(String resourceName) {
139: return resourceName.startsWith(_prefix)
140: || resourceName.equals(_exactPath);
141: }
142: }
|