You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/02/02 18:38:05 UTC

svn commit: r1656521 - in /felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal: dispatch/ handler/ runtime/ whiteboard/

Author: cziegeler
Date: Mon Feb  2 17:38:04 2015
New Revision: 1656521

URL: http://svn.apache.org/r1656521
Log:
FELIX-4060 : Implement HTTP Service Update (RFC-189)

Modified:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java Mon Feb  2 17:38:04 2015
@@ -505,11 +505,6 @@ public final class Dispatcher implements
     }
 
     /**
-     * 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 @@ public final class Dispatcher implements
      * @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 @@ public final class Dispatcher implements
             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 @@ public final class Dispatcher implements
 
             wrappedResponse.sendError(500);
         }
-        finally
-        {
-            req.removeAttribute(REQUEST_DISPATCHER_PROVIDER);
-        }
     }
 
     @Override

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java Mon Feb  2 17:38:04 2015
@@ -115,12 +115,7 @@ public final class HandlerRegistry
         }
         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 @@ public final class HandlerRegistry
         {
             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;

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java Mon Feb  2 17:38:04 2015
@@ -37,7 +37,7 @@ public final class PerContextHandlerRegi
 {
     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 @@ public final class PerContextHandlerRegi
 
         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 @@ public final class PerContextHandlerRegi
 
                 for (int i = 0; i < length; i++)
                 {
-                    this.servletPatternMap.remove(contextInfo.getFullPath(patterns[i]));
+                    this.servletPatternMap.remove(patterns[i]);
                 }
 
                 this.errorsMapping.removeServlet(handler.getServlet());

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java Mon Feb  2 17:38:04 2015
@@ -62,7 +62,7 @@ public final class ServletHandler extend
         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 @@ public final class ServletHandler extend
     }
 
     @Override
-    public int compareTo(ServletHandler other)
+    public int compareTo(final ServletHandler other)
     {
         return getId() - other.getId();
     }
@@ -88,10 +88,14 @@ public final class ServletHandler extend
             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;

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java Mon Feb  2 17:38:04 2015
@@ -97,15 +97,6 @@ public final class ServletContextHelperI
         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;

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java?rev=1656521&r1=1656520&r2=1656521&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java Mon Feb  2 17:38:04 2015
@@ -67,8 +67,8 @@ public final class ContextHandler implem
         this.info = info;
         this.bundle = bundle;
         this.sharedContext = new SharedServletContextImpl(webContext,
-                info.getPrefix(),
                 info.getName(),
+                info.getPrefix(),
                 info.getInitParams(),
                 new ServletContextAttributeListener() {