FELIX-4888 : ServletHandler's are not sorted by longest matching path. DTO handling (WiP)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1680331 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 3e368eb..9f1771d 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
@@ -335,7 +335,7 @@
final long serviceId = entry.getKey().getServiceId();
for(final Map.Entry<String, Integer> map : entry.getValue().pathToStatus.entrySet())
{
- if ( entry.getKey().isResource() )
+ if ( !entry.getKey().isResource() )
{
ServletDTO state = (map.getValue() == -1 ? servletDTOs.get(serviceId) : failedServletDTOs.get(serviceId));
if ( state == null )
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 bca0be2..55c1571 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
@@ -17,7 +17,10 @@
package org.apache.felix.http.base.internal.registry;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -33,6 +36,7 @@
import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler;
import org.apache.felix.http.base.internal.handler.ServletHandler;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder;
import org.junit.Test;
import org.mockito.Matchers;
import org.osgi.framework.Bundle;
@@ -41,17 +45,41 @@
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.runtime.dto.DTOConstants;
+import org.osgi.service.http.runtime.dto.FailedServletDTO;
+import org.osgi.service.http.runtime.dto.ServletContextDTO;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
public class ServletRegistryTest {
private final ServletRegistry reg = new ServletRegistry();
+ private void assertEmpty(final ServletContextDTO dto, final FailedDTOHolder holder)
+ {
+ assertNull(dto.servletDTOs);
+ assertNull(dto.resourceDTOs);
+ assertTrue(holder.failedResourceDTOs.isEmpty());
+ assertTrue(holder.failedServletDTOs.isEmpty());
+ }
+
+ private void clear(final ServletContextDTO dto, final FailedDTOHolder holder)
+ {
+ dto.servletDTOs = null;
+ dto.resourceDTOs = null;
+ holder.failedResourceDTOs.clear();
+ holder.failedServletDTOs.clear();
+ }
+
@Test public void testSingleServlet() throws InvalidSyntaxException, ServletException
{
+ final FailedDTOHolder holder = new FailedDTOHolder();
+ final ServletContextDTO dto = new ServletContextDTO();
+
final Map<ServletInfo, ServletRegistry.ServletRegistrationStatus> status = reg.getServletStatusMapping();
// empty reg
assertEquals(0, status.size());
+ // check DTO
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertEmpty(dto, holder);
// register servlet
final ServletHandler h1 = createServletHandler(1L, 0, "/foo");
@@ -66,6 +94,17 @@
final int code = status.get(h1.getServletInfo()).pathToStatus.get("/foo");
assertEquals(-1, code);
+ // check DTO
+ clear(dto, holder);
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertNull(dto.resourceDTOs);
+ assertTrue(holder.failedResourceDTOs.isEmpty());
+ assertTrue(holder.failedServletDTOs.isEmpty());
+ assertNotNull(dto.servletDTOs);
+ assertEquals(1, dto.servletDTOs.length);
+ assertEquals(1, dto.servletDTOs[0].patterns.length);
+ assertEquals("/foo", dto.servletDTOs[0].patterns[0]);
+
// remove servlet
final Servlet s = h1.getServlet();
reg.removeServlet(h1.getServletInfo(), true);
@@ -73,13 +112,23 @@
// empty again
assertEquals(0, status.size());
+ // check DTO
+ clear(dto, holder);
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertEmpty(dto, holder);
}
@Test public void testSimpleHiding() throws InvalidSyntaxException, ServletException
{
+ final FailedDTOHolder holder = new FailedDTOHolder();
+ final ServletContextDTO dto = new ServletContextDTO();
+
final Map<ServletInfo, ServletRegistry.ServletRegistrationStatus> status = reg.getServletStatusMapping();
// empty reg
assertEquals(0, status.size());
+ // check DTO
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertEmpty(dto, holder);
// register servlets
final ServletHandler h1 = createServletHandler(1L, 10, "/foo");
@@ -106,6 +155,23 @@
final int code2 = status.get(h2.getServletInfo()).pathToStatus.get("/foo");
assertEquals(DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, code2);
+ // check DTO
+ clear(dto, holder);
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertNull(dto.resourceDTOs);
+ assertTrue(holder.failedResourceDTOs.isEmpty());
+ assertFalse(holder.failedServletDTOs.isEmpty());
+ assertNotNull(dto.servletDTOs);
+ assertEquals(1, dto.servletDTOs.length);
+ assertEquals(1, dto.servletDTOs[0].patterns.length);
+ assertEquals("/foo", dto.servletDTOs[0].patterns[0]);
+ assertEquals(1, dto.servletDTOs[0].serviceId);
+ assertEquals(1, holder.failedServletDTOs.size());
+ final FailedServletDTO failedDTO = holder.failedServletDTOs.iterator().next();
+ assertEquals(1, failedDTO.patterns.length);
+ assertEquals("/foo", failedDTO.patterns[0]);
+ assertEquals(2, failedDTO.serviceId);
+
// remove servlet 1
final Servlet s1 = h1.getServlet();
reg.removeServlet(h1.getServletInfo(), true);
@@ -118,6 +184,18 @@
final int code3 = status.get(h2.getServletInfo()).pathToStatus.get("/foo");
assertEquals(-1, code3);
+ // check DTO
+ clear(dto, holder);
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertNull(dto.resourceDTOs);
+ assertTrue(holder.failedResourceDTOs.isEmpty());
+ assertTrue(holder.failedServletDTOs.isEmpty());
+ assertNotNull(dto.servletDTOs);
+ assertEquals(1, dto.servletDTOs.length);
+ assertEquals(1, dto.servletDTOs[0].patterns.length);
+ assertEquals("/foo", dto.servletDTOs[0].patterns[0]);
+ assertEquals(2, dto.servletDTOs[0].serviceId);
+
// remove servlet 2
final Servlet s2 = h2.getServlet();
reg.removeServlet(h2.getServletInfo(), true);
@@ -125,6 +203,10 @@
// empty again
assertEquals(0, status.size());
+ // check DTO
+ clear(dto, holder);
+ reg.getRuntimeInfo(dto, holder.failedServletDTOs, holder.failedResourceDTOs);
+ assertEmpty(dto, holder);
}
private static ServletInfo createServletInfo(final long id, final int ranking, final String... paths) throws InvalidSyntaxException