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/05/20 09:31:27 UTC

svn commit: r1680472 - in /felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry: PathResolver.java PathResolverFactory.java ServletRegistration.java ServletRegistry.java

Author: cziegeler
Date: Wed May 20 07:31:27 2015
New Revision: 1680472

URL: http://svn.apache.org/r1680472
Log:
FELIX-4888 : ServletHandler's are not sorted by longest matching path. Pattern matching (WiP)

Removed:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistration.java
Modified:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolver.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolver.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolver.java?rev=1680472&r1=1680471&r2=1680472&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolver.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolver.java Wed May 20 07:31:27 2015
@@ -16,10 +16,14 @@
  */
 package org.apache.felix.http.base.internal.registry;
 
+import org.apache.felix.http.base.internal.handler.ServletHandler;
+
 
 public interface PathResolver extends Comparable<PathResolver> {
 
-    PathResolution match(String uri);
+    PathResolution resolve(String uri);
+
+    ServletHandler getServletHandler();
 
     int getRanking();
 

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java?rev=1680472&r1=1680471&r2=1680472&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PathResolverFactory.java Wed May 20 07:31:27 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.felix.http.base.internal.registry;
 
+import org.apache.felix.http.base.internal.handler.ServletHandler;
+
 /**
  * The path resolver factory creates a path resolver for a pattern.
  * The servlet spec supports different patterns
@@ -30,33 +32,36 @@ package org.apache.felix.http.base.inter
  */
 public abstract class PathResolverFactory {
 
-    public static PathResolver create(final String pattern)
+    public static PathResolver create(final ServletHandler handler, final String pattern)
     {
         if ( pattern.length() == 0 )
         {
-            return new RootMatcher();
+            return new RootMatcher(handler);
         }
         else if ( pattern.equals("/") )
         {
-            return new DefaultMatcher();
+            return new DefaultMatcher(handler);
         }
         else if ( pattern.startsWith("*.") )
         {
-            return new ExtensionMatcher(pattern.substring(1));
+            return new ExtensionMatcher(handler, pattern.substring(1));
         }
         else if ( pattern.endsWith("/*") )
         {
-            return new PathMatcher(pattern);
+            return new PathMatcher(handler, pattern);
         }
-        return new ExactAndPathMatcher(pattern);
+        return new ExactAndPathMatcher(handler, pattern);
     }
 
     public static abstract class AbstractMatcher implements PathResolver
     {
         private final int ranking;
 
-        public AbstractMatcher(final int ranking)
+        private final ServletHandler handler;
+
+        public AbstractMatcher(final ServletHandler handler, final int ranking)
         {
+            this.handler = handler;
             this.ranking = ranking;
         }
 
@@ -71,6 +76,11 @@ public abstract class PathResolverFactor
         }
 
         @Override
+        public ServletHandler getServletHandler() {
+            return this.handler;
+        }
+
+        @Override
         public int getRanking() {
             return this.ranking;
         }
@@ -83,19 +93,20 @@ public abstract class PathResolverFactor
 
     public static final class RootMatcher extends AbstractMatcher
     {
-        public RootMatcher()
+        public RootMatcher(final ServletHandler handler)
         {
-            super(2);
+            super(handler, 2);
         }
 
         @Override
-        public PathResolution match(final String uri) {
+        public PathResolution resolve(final String uri) {
             if ( uri.length() == 0 )
             {
                 final PathResolution pr = new PathResolution();
                 pr.pathInfo = "/";
                 pr.servletPath = "";
                 pr.requestURI = "";
+                pr.handler = this.getServletHandler();
 
                 return pr;
             }
@@ -105,17 +116,18 @@ public abstract class PathResolverFactor
 
     public static final class DefaultMatcher extends AbstractMatcher
     {
-        public DefaultMatcher()
+        public DefaultMatcher(final ServletHandler handler)
         {
-            super(1);
+            super(handler, 1);
         }
 
         @Override
-        public PathResolution match(final String uri) {
+        public PathResolution resolve(final String uri) {
             final PathResolution pr = new PathResolution();
             pr.pathInfo = null;
             pr.servletPath = uri;
             pr.requestURI = uri;
+            pr.handler = this.getServletHandler();
 
             return pr;
         }
@@ -127,21 +139,22 @@ public abstract class PathResolverFactor
 
         private final String prefix;
 
-        public ExactAndPathMatcher(final String pattern)
+        public ExactAndPathMatcher(final ServletHandler handler, final String pattern)
         {
-            super(4);
+            super(handler, 4);
             this.path = pattern;
             this.prefix = pattern.concat("/");
         }
 
         @Override
-        public PathResolution match(final String uri) {
+        public PathResolution resolve(final String uri) {
             if ( uri.equals(this.path) )
             {
                 final PathResolution pr = new PathResolution();
                 pr.pathInfo = null;
                 pr.servletPath = uri;
                 pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
 
                 return pr;
             }
@@ -151,6 +164,7 @@ public abstract class PathResolverFactor
                 pr.servletPath = this.prefix.substring(0, this.prefix.length() - 1);
                 pr.pathInfo = uri.substring(pr.servletPath.length());
                 pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
 
                 return pr;
             }
@@ -168,20 +182,21 @@ public abstract class PathResolverFactor
     {
         private final String prefix;
 
-        public PathMatcher(final String pattern)
+        public PathMatcher(final ServletHandler handler, final String pattern)
         {
-            super(4);
+            super(handler, 4);
             this.prefix = pattern.substring(0, pattern.length() - 1);
         }
 
         @Override
-        public PathResolution match(final String uri) {
+        public PathResolution resolve(final String uri) {
             if ( uri.startsWith(this.prefix) )
             {
                 final PathResolution pr = new PathResolution();
                 pr.servletPath = this.prefix.substring(0, this.prefix.length() - 1);
                 pr.pathInfo = uri.substring(pr.servletPath.length());
                 pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
 
                 return pr;
             }
@@ -199,20 +214,21 @@ public abstract class PathResolverFactor
     {
         private final String extension;
 
-        public ExtensionMatcher(final String extension)
+        public ExtensionMatcher(final ServletHandler handler, final String extension)
         {
-            super(3);
+            super(handler, 3);
             this.extension = extension;
         }
 
         @Override
-        public PathResolution match(final String uri) {
+        public PathResolution resolve(final String uri) {
             if ( uri.endsWith(this.extension) )
             {
                 final PathResolution pr = new PathResolution();
                 pr.pathInfo = null;
                 pr.servletPath = uri;
                 pr.requestURI = uri;
+                pr.handler = this.getServletHandler();
 
                 return pr;
             }

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java?rev=1680472&r1=1680471&r2=1680472&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ServletRegistry.java Wed May 20 07:31:27 2015
@@ -47,7 +47,7 @@ import org.osgi.service.http.runtime.dto
  */
 public final class ServletRegistry
 {
-    private final Map<String, ServletRegistration> activeServletMappings = new ConcurrentHashMap<String, ServletRegistration>();
+    private final Map<String, PathResolver> activeServletMappings = new ConcurrentHashMap<String, PathResolver>();
 
     private final Map<String, List<ServletHandler>> inactiveServletMappings = new HashMap<String, List<ServletHandler>>();
 
@@ -71,15 +71,15 @@ public final class ServletRegistry
     {
         PathResolver resolver = null;
         PathResolution candidate = null;
-        for(final Map.Entry<String, ServletRegistration> entry : this.activeServletMappings.entrySet())
+        for(final Map.Entry<String, PathResolver> entry : this.activeServletMappings.entrySet())
         {
             final PathResolution pr = entry.getValue().resolve(relativeRequestURI);
-            if ( pr != null && (resolver == null || entry.getValue().getPathResolver().compareTo(resolver) < 0) )
+            if ( pr != null && (resolver == null || entry.getValue().compareTo(resolver) < 0) )
             {
                 // TODO - we should have all patterns under which this servlet is actively registered
                 pr.patterns = new String[] {entry.getKey()};
                 candidate = pr;
-                resolver = entry.getValue().getPathResolver();
+                resolver = entry.getValue();
             }
         }
         return candidate;
@@ -102,7 +102,7 @@ public final class ServletRegistry
             boolean isActive = false;
             for(final String pattern : handler.getServletInfo().getPatterns())
             {
-                final ServletRegistration regHandler = this.activeServletMappings.get(pattern);
+                final PathResolver regHandler = this.activeServletMappings.get(pattern);
                 if ( regHandler != null )
                 {
                     if ( regHandler.getServletHandler().getServletInfo().getServiceReference().compareTo(handler.getServletInfo().getServiceReference()) < 0 )
@@ -203,7 +203,7 @@ public final class ServletRegistry
 
             for(final String pattern : info.getPatterns())
             {
-                final ServletRegistration regHandler = this.activeServletMappings.get(pattern);
+                final PathResolver regHandler = this.activeServletMappings.get(pattern);
                 if ( regHandler != null && regHandler.getServletHandler().getServletInfo().equals(info) )
                 {
                     cleanupHandler = regHandler.getServletHandler();
@@ -290,7 +290,7 @@ public final class ServletRegistry
         final int result = handler.init();
         if ( result == -1 )
         {
-            final ServletRegistration reg = new ServletRegistration(handler, PathResolverFactory.create(pattern));
+            final PathResolver reg = PathResolverFactory.create(handler, pattern);
             this.activeServletMappings.put(pattern, reg);
 
             // add ok