You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/11/19 18:00:53 UTC

svn commit: r1715214 - in /felix/trunk/http: base/src/main/java/org/apache/felix/http/base/internal/registry/ base/src/test/java/org/apache/felix/http/base/internal/registry/ itest/src/test/java/org/apache/felix/http/itest/

Author: cziegeler
Date: Thu Nov 19 17:00:53 2015
New Revision: 1715214

URL: http://svn.apache.org/viewvc?rev=1715214&view=rev
Log:
FELIX-5109 : Wrong path matching for http whiteboard service

Modified:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
    felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java
    felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
    felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java Thu Nov 19 17:00:53 2015
@@ -22,6 +22,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.service.HttpServiceFactory;
 
 /**
  * The path resolver factory creates a path resolver for a pattern.
@@ -55,7 +56,11 @@ public abstract class PathResolverFactor
         {
             return new PathMatcher(handler, pattern);
         }
-        return new ExactAndPathMatcher(handler, pattern);
+        else if ( handler != null && handler.getContextServiceId() == HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID )
+        {
+            return new ExactAndPathMatcher(handler, pattern);
+        }
+        return new ExactMatcher(handler, pattern);
     }
 
     public static @Nonnull PathResolver createRegexMatcher(@Nonnull final String regex)
@@ -184,7 +189,7 @@ public abstract class PathResolverFactor
 
         public ExactAndPathMatcher(final ServletHandler handler, final String pattern)
         {
-            super(handler, pattern, 4);
+            super(handler, pattern, 5);
             this.path = pattern;
             this.prefix = pattern.concat("/");
         }
@@ -221,18 +226,63 @@ public abstract class PathResolverFactor
         }
     }
 
+    public static final class ExactMatcher extends AbstractMatcher
+    {
+        private final String path;
+
+        public ExactMatcher(final ServletHandler handler, final String pattern)
+        {
+            super(handler, pattern, 5);
+            this.path = pattern;
+        }
+
+        @Override
+        public PathResolution resolve(final String uri) {
+            if ( uri.equals(this.path) )
+            {
+                final PathResolution pr = new PathResolution();
+                pr.servletPath = uri;
+                pr.pathInfo = null;
+                pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
+
+                return pr;
+            }
+            return null;
+        }
+
+        @Override
+        public int getOrdering()
+        {
+            return this.path.length();
+        }
+    }
+
     public static final class PathMatcher extends AbstractMatcher
     {
         private final String prefix;
 
+        private final String path;
+
         public PathMatcher(final ServletHandler handler, final String pattern)
         {
             super(handler, pattern, 4);
             this.prefix = pattern.substring(0, pattern.length() - 1);
+            this.path = pattern.substring(0, pattern.length() - 2);
         }
 
         @Override
         public PathResolution resolve(final String uri) {
+            if ( uri.equals(this.path) )
+            {
+                final PathResolution pr = new PathResolution();
+                pr.servletPath = this.path;
+                pr.pathInfo = null;
+                pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
+
+                return pr;
+            }
             if ( uri.startsWith(this.prefix) )
             {
                 final PathResolution pr = new PathResolution();

Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/PathResolverFactoryTest.java Thu Nov 19 17:00:53 2015
@@ -62,4 +62,17 @@ public class PathResolverFactoryTest {
         assertResult(pr, "/foo/bar", "/foo/bar", null);
         assertResult(pr, "/foo", "/foo", null);
     }
+
+    @Test public void testPathMatcher()
+    {
+        final PathResolver pr = PathResolverFactory.createPatternMatcher(null, "/*");
+        assertNotNull(pr);
+
+        assertResult(pr, "/foo", "", "/foo");
+        assertResult(pr, "/foo/bar", "", "/foo/bar");
+
+        assertResult(pr, "/", "", "/");
+
+        assertResult(pr, "", "", null);
+    }
 }

Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java Thu Nov 19 17:00:53 2015
@@ -26,6 +26,10 @@ import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
@@ -171,6 +175,20 @@ public class ServletRegistryTest {
         assertEmpty(dto, holder);
     }
 
+    @Test public void testMatcherOrdering()  throws InvalidSyntaxException
+    {
+        final ServletHandler h1 = createServletHandler(1L, 0, "/foo");
+        final ServletHandler h2 = createServletHandler(2L, 0, "/foo/*");
+
+        final List<PathResolver> resolvers = new ArrayList<PathResolver>();
+        resolvers.add(PathResolverFactory.createPatternMatcher(h1, "/foo"));
+        resolvers.add(PathResolverFactory.createPatternMatcher(h2, "/foo/*"));
+
+        Collections.sort(resolvers);
+        assertEquals("/foo", resolvers.get(0).getPattern());
+        assertEquals("/foo/*", resolvers.get(1).getPattern());
+    }
+
     @Test public void testServletOrdering() throws InvalidSyntaxException
     {
         final ServletHandler h1 = createServletHandler(1L, 0, "/foo");
@@ -195,16 +213,16 @@ public class ServletRegistryTest {
         assertNull(pr);
 
         pr = reg.resolve("/foo/bar");
-        assertEquals("/foo/*", pr.patterns[0]);
-        assertEquals(h2, pr.handler);
+        assertEquals("/foo", pr.patterns[0]);
+        assertEquals(h1, pr.handler);
 
         pr = reg.resolve("/foo/rsrc");
         assertEquals("/foo/rsrc", pr.patterns[0]);
         assertEquals(h3, pr.handler);
 
         pr = reg.resolve("/foo/rsrc/some");
-        assertEquals("/foo/rsrc/*", pr.patterns[0]);
-        assertEquals(h4, pr.handler);
+        assertEquals("/foo/rsrc", pr.patterns[0]);
+        assertEquals(h3, pr.handler);
 
         pr = reg.resolve("/other");
         assertEquals("/other", pr.patterns[0]);

Modified: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java?rev=1715214&r1=1715213&r2=1715214&view=diff
==============================================================================
--- felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java (original)
+++ felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/ServletPatternTest.java Thu Nov 19 17:00:53 2015
@@ -257,4 +257,18 @@ public class ServletPatternTest extends
         assertTrue(initLatch.await(5, TimeUnit.SECONDS));
         assertContent("servlet2", createURL("/a/b/test/servlet"));
     }
+
+    @Test
+    public void pathMatchingTest() throws Exception
+    {
+        setupLatches(1);
+
+        setupContext("contextA", "/a");
+
+        setupServlet("servlet1", new String[]{ "/servlet/*" }, 1, "contextA");
+
+        assertTrue(initLatch.await(5, TimeUnit.SECONDS));
+        assertContent("servlet1", createURL("/a/servlet/foo"));
+        assertContent("servlet1", createURL("/a/servlet"));
+    }
 }