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"));