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;
+    }
 }