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() {