FELIX-4888 : ServletHandler's are not sorted by longest matching path. Implement new servlet registry, start filter holder implementation

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1679835 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java
index 3c521fe..9154e04 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java
@@ -185,7 +185,7 @@
         List<ServletHolder> inactiveList = this.inactivateServletMapping.get(pattern);
         if ( inactiveList == null )
         {
-            inactiveList = new ArrayList<ServletHolder>(inactiveList);
+            inactiveList = new ArrayList<ServletHolder>();
             this.inactivateServletMapping.put(pattern, inactiveList);
         }
         inactiveList.add(holder);
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
index d440cc1..9bba212 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ServletRegistryTest.java
@@ -36,6 +36,7 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.runtime.dto.DTOConstants;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
 
 public class ServletRegistryTest {
@@ -66,6 +67,50 @@
         assertEquals(0, status.size());
     }
 
+    @Test public void testSimpleHiding() throws InvalidSyntaxException
+    {
+        final Map<ServletInfo, ServletRegistry.ServletRegistrationStatus> status = reg.getServletStatusMapping();
+        // empty reg
+        assertEquals(0, status.size());
+
+        // register servlets
+        final ServletHolder h1 = createServletHolder(1L, 10, "/foo");
+        reg.addServlet(h1);
+
+        final ServletHolder h2 = createServletHolder(2L, 0, "/foo");
+        reg.addServlet(h2);
+
+        // two entries in reg
+        assertEquals(2, status.size());
+        assertNotNull(status.get(h1.getServletInfo()));
+        assertNotNull(status.get(h2.getServletInfo()));
+
+        // h1 is active
+        assertNotNull(status.get(h1.getServletInfo()).pathToStatus.get("/foo"));
+        final int code1 = status.get(h1.getServletInfo()).pathToStatus.get("/foo");
+        assertEquals(-1, code1);
+
+        // h2 is hidden
+        assertNotNull(status.get(h2.getServletInfo()).pathToStatus.get("/foo"));
+        final int code2 = status.get(h2.getServletInfo()).pathToStatus.get("/foo");
+        assertEquals(DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, code2);
+
+        // remove servlet 1
+        reg.removeServlet(h1.getServletInfo());
+
+        // h2 is active
+        assertEquals(1, status.size());
+        assertNotNull(status.get(h2.getServletInfo()).pathToStatus.get("/foo"));
+        final int code3 = status.get(h2.getServletInfo()).pathToStatus.get("/foo");
+        assertEquals(-1, code3);
+
+        // remove servlet 2
+        reg.removeServlet(h2.getServletInfo());
+
+        // empty again
+        assertEquals(0, status.size());
+    }
+
     private static ServletInfo createServletInfo(final long id, final int ranking, final String... paths) throws InvalidSyntaxException
     {
         final BundleContext bCtx = mock(BundleContext.class);