FELIX-4893 : Replace filter registry with path resolvers
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1680754 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
index 9914367..a1cc0e2 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
@@ -17,9 +17,6 @@
package org.apache.felix.http.base.internal.handler;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
import javax.annotation.Nonnull;
import javax.servlet.Filter;
@@ -31,7 +28,6 @@
import org.apache.felix.http.base.internal.context.ExtServletContext;
import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.util.PatternUtil;
import org.osgi.service.http.runtime.dto.DTOConstants;
/**
@@ -49,8 +45,6 @@
protected volatile int useCount;
- private final Pattern[] patterns;
-
public FilterHandler(final long contextServiceId,
final ExtServletContext context,
final FilterInfo filterInfo)
@@ -58,38 +52,6 @@
this.contextServiceId = contextServiceId;
this.context = context;
this.filterInfo = filterInfo;
- // Compose a single array of all patterns & regexs the filter must represent...
- String[] patterns = getFilterPatterns(filterInfo);
-
- this.patterns = new Pattern[patterns.length];
- for (int i = 0; i < patterns.length; i++)
- {
- this.patterns[i] = Pattern.compile(patterns[i]);
- }
- }
-
- private static String[] getFilterPatterns(FilterInfo filterInfo)
- {
- List<String> result = new ArrayList<String>();
- if (filterInfo.getPatterns() != null)
- {
- for (int i = 0; i < filterInfo.getPatterns().length; i++)
- {
- result.add(PatternUtil.convertToRegEx(filterInfo.getPatterns()[i]));
- }
- }
- if (filterInfo.getRegexs() != null)
- {
- for (int i = 0; i < filterInfo.getRegexs().length; i++)
- {
- result.add(filterInfo.getRegexs()[i]);
- }
- }
- return result.toArray(new String[result.size()]);
- }
-
- public Pattern[] getPatterns() {
- return this.patterns;
}
@Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java b/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java
index 530dca7..c9c3c97 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/util/PatternUtil.java
@@ -18,15 +18,7 @@
*/
package org.apache.felix.http.base.internal.util;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.SortedSet;
import java.util.StringTokenizer;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
* Some convenience utilities to deal with path patterns.
@@ -36,19 +28,6 @@
public class PatternUtil
{
- public static String convertToRegEx(String pattern)
- {
- String result = pattern;
- // see Servlet 3.0, section 12.2
- // - replace '*.' prefixes with a regex that matches extensions...
- result = result.replaceFirst("^\\Q*.\\E(.*)$", "\\^(.*)(\\\\.\\\\Q$1\\\\E)\\$");
- // - replace '/*' suffixes with a regex that matches paths (actually,
- // the path should also start with a leading slash, but we're a bit
- // more liberal on this one)...
- result = result.replaceFirst("^(.*)\\Q/*\\E$", "\\^($1)(|/.*)\\$");
- return result;
- }
-
// check for valid symbolic name
public static boolean isValidSymbolicName(final String name)
{
@@ -119,93 +98,4 @@
return valid;
}
-
- /**
- * Compares {@link Pattern}s based on a set of simple rules:
- * <ol>
- * <li>exact matches go first;</li>
- * <li>followed by wildcard path matches;</li>
- * <li>lastly all wildcard extension matches.</li>
- * </ol>
- * <p>
- * Equal matches will first be sorted on length in descending order (longest patterns first),
- * and in case of equal lengths, they are sorted in natural (ascending) order.
- * </p>
- */
- public enum PatternComparator implements Comparator<Pattern>
- {
- INSTANCE;
-
- @Override
- public int compare(Pattern p1, Pattern p2)
- {
- String ps1 = p1.pattern();
- String ps2 = p2.pattern();
-
- // Sorts wildcard path matches before wildcard extension matches...
- int r;
- if (isWildcardPath(ps1))
- {
- if (isWildcardPath(ps2))
- {
- // Descending on length...
- r = ps2.length() - ps1.length();
- }
- else
- {
- // Exact matches go first...
- r = isWildcardExtension(ps2) ? -1 : 1;
- }
- }
- else if (isWildcardExtension(ps1))
- {
- if (isWildcardExtension(ps2))
- {
- // Descending on length...
- r = ps2.length() - ps1.length();
- }
- else
- {
- // Wildcard paths & exact matches go first...
- r = 1;
- }
- }
- else
- {
- if (isWildcardExtension(ps2) || isWildcardPath(ps2))
- {
- // Exact matches go first...
- r = -1;
- }
- else
- {
- // Descending on length...
- r = ps2.length() - ps1.length();
- }
- }
-
- if (r == 0)
- {
- // In case of a draw, ensure we sort in a predictable (ascending) order...
- r = ps1.compareTo(ps2);
- }
-
- return r;
- }
-
- private boolean isWildcardExtension(String p)
- {
- return p.startsWith("^(.*");
- }
-
- private boolean isWildcardPath(String p)
- {
- return p.startsWith("^(/");
- }
- }
-
- public static boolean isWildcardPattern(Pattern p)
- {
- return p.pattern().contains(".*");
- }
}
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java
index 602906e..690a41c 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/util/PatternUtilTest.java
@@ -18,13 +18,9 @@
*/
package org.apache.felix.http.base.internal.util;
-import static org.apache.felix.http.base.internal.util.PatternUtil.convertToRegEx;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import java.util.regex.Pattern;
-
import org.junit.Test;
/**
@@ -36,42 +32,6 @@
{
@Test
- public void testConvertToRegExOk()
- {
- assertEquals("", convertToRegEx(""));
- assertEquals("/", convertToRegEx("/"));
- assertEquals("^(/foo/bar)(|/.*)$", convertToRegEx("/foo/bar/*"));
- assertEquals("^(.*)(\\.\\Qbop\\E)$", convertToRegEx("*.bop"));
- assertEquals("^(.*)(\\.\\Qtar.gz\\E)$", convertToRegEx("*.tar.gz"));
- assertEquals("^(.*)(\\.\\Q*\\E)$", convertToRegEx("*.*"));
- }
-
- @Test
- public void testConvertToRegExCreatesCorrectRegExOk()
- {
- Pattern p1 = Pattern.compile(convertToRegEx("/foo/bar/*"));
- Pattern p2 = Pattern.compile(convertToRegEx("/baz/*"));
- Pattern p3 = Pattern.compile(convertToRegEx("/catalog"));
- Pattern p4 = Pattern.compile(convertToRegEx("*.bop"));
- Pattern p5 = Pattern.compile(convertToRegEx("*.tar.gz"));
- Pattern p6 = Pattern.compile(convertToRegEx("*.*"));
-
- // Examples from the Servlet 3.0 spec, section 12.2.2...
- assertTrue(p1.matcher("/foo/bar/index.html").matches());
- assertTrue(p1.matcher("/foo/bar/index.bop").matches());
- assertTrue(p2.matcher("/baz").matches());
- assertTrue(p2.matcher("/baz/index.html").matches());
- assertTrue(p3.matcher("/catalog").matches());
- assertFalse(p3.matcher("/catalog/index.html").matches());
- assertTrue(p4.matcher("/catalog/index.bop").matches());
- assertTrue(p4.matcher("/index.bop").matches());
- assertTrue(p5.matcher("/index.tar.gz").matches());
- assertFalse(p5.matcher("/index.tar-gz").matches());
- assertFalse(p5.matcher("/index.gz").matches());
- assertFalse(p6.matcher("/index.gz").matches());
- }
-
- @Test
public void testSymbolicName()
{
assertTrue(PatternUtil.isValidSymbolicName("default"));