FELIX-4548 : Implement the missing errors registration
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1656314 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/DispatcherServlet.java b/http/base/src/main/java/org/apache/felix/http/base/internal/DispatcherServlet.java
index 05b93a7..0bca9bc 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/DispatcherServlet.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/DispatcherServlet.java
@@ -54,6 +54,11 @@
super.destroy();
}
+ public boolean handleError(HttpServletRequest request, HttpServletResponse response, int errorCode, String exceptionType) throws IOException
+ {
+ return this.controller.getDispatcher().handleError(request, response, errorCode, exceptionType);
+ }
+
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
@@ -84,6 +89,7 @@
this.listener = requestAttributeListener;
}
+ @Override
public void setAttribute(String name, Object value)
{
if (value == null)
@@ -106,6 +112,7 @@
}
}
+ @Override
public void removeAttribute(String name)
{
Object oldValue = this.getAttribute(name);
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 60cb8b2..b1954bb 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
@@ -42,11 +42,6 @@
private volatile HandlerMapping<FilterHandler> filterMapping = new HandlerMapping<FilterHandler>();
private volatile ErrorsMapping errorsMapping = new ErrorsMapping();
- public synchronized void addErrorServlet(String errorPage, ServletHandler handler) throws ServletException
- {
- this.errorsMapping.addErrorServlet(errorPage, handler);
- }
-
public synchronized void addFilter(FilterHandler handler) throws ServletException
{
if (this.filterMap.containsKey(handler.getFilter()))
@@ -85,6 +80,14 @@
this.servletPatternMap.put(pattern, handler.getServlet());
}
+ patterns = handler.getServletInfo().getErrorPage();
+ if ( patterns != null )
+ {
+ for(final String errorPage : patterns)
+ {
+ this.errorsMapping.addErrorServlet(errorPage, handler);
+ }
+ }
handler.init();
this.servletMap.put(handler.getServlet(), handler);
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
index a520e21..ed2c6e9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
@@ -116,7 +116,7 @@
@Override
public boolean isValid()
{
- return super.isValid() && !isEmpty(this.patterns);
+ return super.isValid() && (!isEmpty(this.patterns) || !isEmpty(this.errorPage));
}
public String getName()
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
index f63c0e8..7497517 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
@@ -34,9 +34,10 @@
{
try
{
- return btx.createFilter(String.format("(&(objectClass=%s)(%s=*))",
+ return btx.createFilter(String.format("(&(objectClass=%s)(|(%s=*)(%s=*)))",
Servlet.class.getName(),
- HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN));
+ HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN,
+ HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ERROR_PAGE));
}
catch ( final InvalidSyntaxException ise)
{