FELIX-4060 : Implement HTTP Service Update (RFC-189)

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1656521 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
index ca4d465..1f6b33a 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
@@ -505,11 +505,6 @@
     }
 
     /**
-     * Request attribute that provides access to the request dispatcher provider.
-     */
-    public static final String REQUEST_DISPATCHER_PROVIDER = "org.apache.felix.http.requestDispatcherProvider";
-
-    /**
      * Catch-all filter chain that simple finishes all requests with a "404 Not Found" error.
      */
     private static final FilterChain DEFAULT_CHAIN = new NotFoundFilterChain();
@@ -529,9 +524,9 @@
      * @throws ServletException in case of exceptions during the actual dispatching;
      * @throws IOException in case of I/O problems.
      */
-    public void dispatch(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
+    public void dispatch(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException
     {
-        final String requestURI = getRequestURI(req);
+        String requestURI = getRequestURI(req);
 
         // Determine which servlets we should forward the request to...
         final ServletHandler servletHandler = this.handlerRegistry.getServletHander(requestURI);
@@ -543,10 +538,10 @@
             return;
         }
 
-        // Provides access to the correct request dispatcher...
-        req.setAttribute(REQUEST_DISPATCHER_PROVIDER, this);
+        // strip of context path
+        requestURI = requestURI.substring(servletHandler.getContext().getContextPath().length());
 
-        String servletPath = (servletHandler != null) ? servletHandler.determineServletPath(requestURI) : "";
+        final String servletPath = servletHandler.determineServletPath(requestURI);
         String pathInfo = UriUtils.compactPath(UriUtils.relativePath(servletPath, requestURI));
         String queryString = null; // XXX
 
@@ -566,10 +561,6 @@
 
             wrappedResponse.sendError(500);
         }
-        finally
-        {
-            req.removeAttribute(REQUEST_DISPATCHER_PROVIDER);
-        }
     }
 
     @Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
index 30869e9..32da3ef 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
@@ -115,12 +115,7 @@
         }
         return EMPTY_FILTER_HANDLER;
     }
-/*
-    public synchronized Servlet getServletByAlias(String alias)
-    {
-        return this.servletPatternMap.get(alias);
-    }
-*/
+
     public ServletHandler getServletHandlerByName(final Long contextId, final String name)
     {
         if ( contextId != null )
@@ -144,8 +139,7 @@
         {
             if ( requestURI.startsWith(r.getPrefixPath()))
             {
-                // TODO - we could stip of the prefix and simplify handler registration
-                final ServletHandler handler = r.getServletHander(requestURI);
+                final ServletHandler handler = r.getServletHander(requestURI.substring(r.getPrefixPath().length() - 1));
                 if ( handler != null )
                 {
                     return handler;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
index 313fcbf..38391b6 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
@@ -37,7 +37,7 @@
 {
     private final Map<Servlet, ServletHandler> servletMap = new HashMap<Servlet, ServletHandler>();
     private final Map<Filter, FilterHandler> filterMap = new HashMap<Filter, FilterHandler>();
-    private final Map<String, Servlet> servletPatternMap= new HashMap<String, Servlet>();
+    private final Map<String, Servlet> servletPatternMap = new HashMap<String, Servlet>();
     private volatile HandlerMapping<ServletHandler> servletMapping = new HandlerMapping<ServletHandler>();
     private volatile HandlerMapping<FilterHandler> filterMapping = new HandlerMapping<FilterHandler>();
     private volatile ErrorsMapping errorsMapping = new ErrorsMapping();
@@ -123,7 +123,7 @@
 
         for (int i = 0; i < length; i++)
         {
-            String pattern = contextInfo != null ? contextInfo.getFullPath(patterns[i]) : patterns[i];
+            final String pattern = patterns[i];
             if (this.servletPatternMap.containsKey(pattern))
             {
                 throw new ServletException("Servlet instance " + handler.getName() + " already registered");
@@ -275,7 +275,7 @@
 
                 for (int i = 0; i < length; i++)
                 {
-                    this.servletPatternMap.remove(contextInfo.getFullPath(patterns[i]));
+                    this.servletPatternMap.remove(patterns[i]);
                 }
 
                 this.errorsMapping.removeServlet(handler.getServlet());
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
index 9be2c36..fec9663 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
@@ -62,7 +62,7 @@
         this.patterns = new Pattern[length];
         for (int i = 0; i < length; i++)
         {
-            String pattern = (contextInfo == null ? patterns[i] : contextInfo.getFullPath(patterns[i]));
+            final String pattern = patterns[i];
             this.patterns[i] = Pattern.compile(PatternUtil.convertToRegEx(pattern));
         }
         if ( contextInfo != null )
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public int compareTo(ServletHandler other)
+    public int compareTo(final ServletHandler other)
     {
         return getId() - other.getId();
     }
@@ -88,10 +88,14 @@
             uri = "/";
         }
 
-        Matcher matcher = this.patterns[0].matcher(uri);
-        if (matcher.find(0))
+        // Patterns are sorted on length in descending order, so we should get the longest match first...
+        for (int i = 0; i < this.patterns.length; i++)
         {
-            return matcher.groupCount() > 0 ? matcher.group(1) : matcher.group();
+            Matcher matcher = this.patterns[i].matcher(uri);
+            if (matcher.find(0))
+            {
+                return matcher.groupCount() > 0 ? matcher.group(1) : matcher.group();
+            }
         }
 
         return null;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
index 38a064c..b3ceb67 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
@@ -97,15 +97,6 @@
         return this.prefix;
     }
 
-    public String getFullPath(final String path)
-    {
-        if ( this.prefix == null )
-        {
-            return path;
-        }
-        return this.prefix.concat(path);
-    }
-
     public Map<String, String> getInitParams()
     {
         return initParams;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
index 2090bcc..16a6254 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
@@ -67,8 +67,8 @@
         this.info = info;
         this.bundle = bundle;
         this.sharedContext = new SharedServletContextImpl(webContext,
-                info.getPrefix(),
                 info.getName(),
+                info.getPrefix(),
                 info.getInitParams(),
                 new ServletContextAttributeListener() {