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@1680351 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
index f0044b5..9fe4628 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
@@ -24,7 +24,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -33,7 +32,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.TreeSet;
 import java.util.concurrent.ConcurrentSkipListMap;
 
 import javax.annotation.Nonnull;
@@ -748,35 +746,7 @@
     {
         final FailedDTOHolder failedDTOHolder = new FailedDTOHolder();
 
-        final Collection<ServletContextDTO> contextDTOs = new TreeSet<ServletContextDTO>(new Comparator<ServletContextDTO>() {
-
-            @Override
-            public int compare(ServletContextDTO o1, ServletContextDTO o2) {
-                // Service id's can be negative. Negative id's follow the reverse natural ordering of integers.
-                int reverseOrder = ( o1.serviceId >= 0 && o2.serviceId >= 0 ) ? 1 : -1;
-                return reverseOrder * Long.compare(o1.serviceId, o2.serviceId);
-            }
-        });
-
-        synchronized ( this.contextMap )
-        {
-            for (final List<ContextHandler> contextHandlerList : this.contextMap.values())
-            {
-                if ( !contextHandlerList.isEmpty() )
-                {
-                    final ContextHandler handler = contextHandlerList.get(0);
-                    final ServletContextDTO dto = ServletContextDTOBuilder.build(handler.getContextInfo(), handler.getSharedContext(), -1);
-
-                    if ( registry.getRuntime(dto, failedDTOHolder) )
-                    {
-                        handler.getListenerRegistry().getRuntime(dto);
-                        contextDTOs.add(dto);
-                    }
-                }
-            }
-            failedDTOHolder.add(serviceFailures);
-        }
-
+        final Collection<ServletContextDTO> contextDTOs = new ArrayList<ServletContextDTO>();
         // add the context for the http service
         final ServletContextHelperInfo info = new ServletContextHelperInfo(Integer.MAX_VALUE, 0, HTTP_SERVICE_CONTEXT_NAME, "/", null);
         final ServletContextDTO dto = ServletContextDTOBuilder.build(info, webContext, -1);
@@ -785,6 +755,32 @@
             contextDTOs.add(dto);
         }
 
+        // get sort list of context handlers
+        final List<ContextHandler> contextHandlerList = new ArrayList<ContextHandler>();
+        synchronized ( this.contextMap )
+        {
+            for (final List<ContextHandler> list : this.contextMap.values())
+            {
+                if ( !list.isEmpty() )
+                {
+                    contextHandlerList.add(list.get(0));
+                }
+            }
+            failedDTOHolder.add(serviceFailures);
+        }
+        Collections.sort(contextHandlerList);
+
+        for (final ContextHandler handler : contextHandlerList)
+        {
+            final ServletContextDTO scDTO = ServletContextDTOBuilder.build(handler.getContextInfo(), handler.getSharedContext(), -1);
+
+            if ( registry.getRuntime(scDTO, failedDTOHolder) )
+            {
+                handler.getListenerRegistry().getRuntime(scDTO);
+                contextDTOs.add(scDTO);
+            }
+        }
+
         return new RegistryRuntime(failedDTOHolder, contextDTOs);
     }
 }
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistryTest.java
similarity index 99%
rename from http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageTest.java
rename to http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistryTest.java
index f69244c..f4cc50f 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/ErrorPageRegistryTest.java
@@ -47,7 +47,7 @@
 import org.osgi.service.http.runtime.dto.ServletContextDTO;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
 
-public class ErrorPageTest {
+public class ErrorPageRegistryTest {
 
     private final ErrorPageRegistry reg = new ErrorPageRegistry();