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