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