You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ja...@apache.org on 2014/10/28 16:30:26 UTC
svn commit: r1634894 - in /felix/trunk/http:
base/src/main/java/org/apache/felix/http/base/internal/handler/
base/src/main/java/org/apache/felix/http/base/internal/logger/
base/src/main/java/org/apache/felix/http/base/internal/service/
whiteboard/src/m...
Author: jawi
Date: Tue Oct 28 15:30:25 2014
New Revision: 1634894
URL: http://svn.apache.org/r1634894
Log:
FELIX-4561 - Unregistration fails sometimes:
- if the HttpService itself is stopping, it deregisters all of its
servlets and filters. This causes the whiteboard service to also
start deregistering its servlets & filters, causing exceptions in
the HttpService;
- make the whiteboard unregister at best-effort, catching exceptions
that occur during the unregistration & log a message instead;
- suppress throwing of exceptions when unregister is called on the
HttpService while the bundle is stopping.
Modified:
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/logger/SystemLogger.java
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/FilterMapping.java
felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ServletMapping.java
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=1634894&r1=1634893&r2=1634894&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 Tue Oct 28 15:30:25 2014
@@ -68,7 +68,7 @@ public final class HandlerRegistry
servletMap.remove(handler.getServlet(), handler);
handler.destroy();
- throw new NamespaceException("Servlet with alias already registered");
+ throw new NamespaceException("Servlet with alias '" + handler.getAlias() + "' already registered");
}
updateServletArray();
Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java?rev=1634894&r1=1634893&r2=1634894&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java Tue Oct 28 15:30:25 2014
@@ -40,6 +40,11 @@ public final class SystemLogger
getLogger().log(LogService.LOG_DEBUG, message);
}
+ public static void debug(String message, Throwable cause)
+ {
+ getLogger().log(LogService.LOG_DEBUG, message, cause);
+ }
+
public static void info(String message)
{
getLogger().log(LogService.LOG_INFO, message);
Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java?rev=1634894&r1=1634893&r2=1634894&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java Tue Oct 28 15:30:25 2014
@@ -124,9 +124,17 @@ public final class HttpServiceImpl imple
public void unregister(String alias)
{
final Servlet servlet = this.handlerRegistry.getServletByAlias(alias);
- if ( servlet == null )
+ if (servlet == null)
{
- throw new IllegalArgumentException("Nothing registered at " + alias);
+ // FELIX-4561 - don't bother throwing an exception if we're stopping anyway...
+ if ((bundle.getState() & Bundle.STOPPING) != 0)
+ {
+ throw new IllegalArgumentException("Nothing registered at " + alias);
+ }
+ else
+ {
+ SystemLogger.debug("Nothing registered at " + alias + "; ignoring this because the bundle is stopping!", null);
+ }
}
unregisterServlet(servlet);
}
Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/FilterMapping.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/FilterMapping.java?rev=1634894&r1=1634893&r2=1634894&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/FilterMapping.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/FilterMapping.java Tue Oct 28 15:30:25 2014
@@ -23,8 +23,7 @@ import org.apache.felix.http.base.intern
import org.osgi.framework.Bundle;
import org.osgi.service.http.HttpService;
-public final class FilterMapping
- extends AbstractMapping
+public final class FilterMapping extends AbstractMapping
{
private final Filter filter;
private final int ranking;
@@ -38,14 +37,35 @@ public final class FilterMapping
this.ranking = ranking;
}
- Filter getFilter()
+ public void register(HttpService httpService)
{
- return filter;
+ if (httpService instanceof ExtHttpService)
+ {
+ register((ExtHttpService) httpService);
+ }
+ else
+ {
+ // Warn the user that something strange is going on...
+ SystemLogger.warning("Unable to register filter for " + this.pattern + ", as no ExtHttpService seems to be present!", null);
+ }
}
- int getRanking()
+ public void unregister(HttpService httpService)
{
- return ranking;
+ if (httpService instanceof ExtHttpService)
+ {
+ unregister((ExtHttpService) httpService);
+ }
+ else
+ {
+ // Warn the user that something strange is going on...
+ SystemLogger.warning("Unable to unregister filter for " + this.pattern + ", as no ExtHttpService seems to be present!", null);
+ }
+ }
+
+ Filter getFilter()
+ {
+ return filter;
}
String getPattern()
@@ -53,16 +73,14 @@ public final class FilterMapping
return pattern;
}
- public void register(HttpService httpService)
+ int getRanking()
{
- if (httpService instanceof ExtHttpService) {
- register((ExtHttpService)httpService);
- }
+ return ranking;
}
private void register(ExtHttpService httpService)
{
- if (!this.isRegistered() && getContext() != null)
+ if (!isRegistered() && getContext() != null)
{
try
{
@@ -71,22 +89,31 @@ public final class FilterMapping
}
catch (Exception e)
{
- SystemLogger.error("Failed to register filter", e);
+ // Warn that something might have gone astray...
+ SystemLogger.warning("Failed to register filter for " + this.pattern, null);
+ SystemLogger.debug("Failed to register filter for " + this.pattern + "; details:", e);
}
}
}
- public void unregister(HttpService httpService)
+ private void unregister(ExtHttpService httpService)
{
- if (httpService instanceof ExtHttpService && this.isRegistered())
+ if (isRegistered())
{
- unregister((ExtHttpService) httpService);
- setRegistered(false);
+ try
+ {
+ httpService.unregisterFilter(this.filter);
+ }
+ catch (Exception e)
+ {
+ // Warn that something might have gone astray...
+ SystemLogger.debug("Failed to unregister filter for " + this.pattern, e);
+ }
+ finally
+ {
+ // Best effort: avoid mappings that are registered which is reality aren't registered...
+ setRegistered(false);
+ }
}
}
-
- private void unregister(ExtHttpService httpService)
- {
- httpService.unregisterFilter(this.filter);
- }
}
Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ServletMapping.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ServletMapping.java?rev=1634894&r1=1634893&r2=1634894&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ServletMapping.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ServletMapping.java Tue Oct 28 15:30:25 2014
@@ -22,8 +22,7 @@ import org.apache.felix.http.base.intern
import org.osgi.framework.Bundle;
import org.osgi.service.http.HttpService;
-public final class ServletMapping
- extends AbstractMapping
+public final class ServletMapping extends AbstractMapping
{
private final Servlet servlet;
private final String alias;
@@ -35,38 +34,51 @@ public final class ServletMapping
this.alias = alias;
}
- String getAlias()
- {
- return this.alias;
- }
-
- Servlet getServlet()
- {
- return this.servlet;
- }
-
public void register(HttpService httpService)
{
- if (!this.isRegistered() && getContext() != null)
+ if (!isRegistered() && getContext() != null)
{
try
{
httpService.registerServlet(this.alias, this.servlet, getInitParams(), getContext());
- this.setRegistered(true);
+ setRegistered(true);
}
catch (Exception e)
{
- SystemLogger.error("Failed to register servlet", e);
+ // Warn that something might have gone astray...
+ SystemLogger.warning("Failed to register servlet for " + this.alias, e);
}
}
}
public void unregister(HttpService httpService)
{
- if (this.isRegistered())
+ if (isRegistered())
{
- httpService.unregister(this.alias);
- this.setRegistered(false);
+ try
+ {
+ httpService.unregister(this.alias);
+ }
+ catch (Exception e)
+ {
+ // Warn that something might have gone astray...
+ SystemLogger.debug("Failed to unregister servlet for " + this.alias, e);
+ }
+ finally
+ {
+ // Best effort: avoid mappings that are registered which is reality aren't registered...
+ setRegistered(false);
+ }
}
}
+
+ String getAlias()
+ {
+ return this.alias;
+ }
+
+ Servlet getServlet()
+ {
+ return this.servlet;
+ }
}