diff --git a/pax-web-extender-whiteboard/src/main/java/org/ops4j/pax/web/extender/whiteboard/internal/tracker/AbstractTracker.java b/pax-web-extender-whiteboard/src/main/java/org/ops4j/pax/web/extender/whiteboard/internal/tracker/AbstractTracker.java index 369ca585db..cf09483751 100644 --- a/pax-web-extender-whiteboard/src/main/java/org/ops4j/pax/web/extender/whiteboard/internal/tracker/AbstractTracker.java +++ b/pax-web-extender-whiteboard/src/main/java/org/ops4j/pax/web/extender/whiteboard/internal/tracker/AbstractTracker.java @@ -17,6 +17,8 @@ */ package org.ops4j.pax.web.extender.whiteboard.internal.tracker; +import javax.servlet.Servlet; + import org.ops4j.lang.NullArgumentException; import org.ops4j.pax.web.extender.whiteboard.ExtenderConstants; import org.ops4j.pax.web.extender.whiteboard.internal.ExtenderContext; @@ -201,6 +203,13 @@ public void removedService(final ServiceReference serviceReference, remove = true; } } + + T registered = bundleContext.getService(serviceReference); + if (!remove && Servlet.class.isAssignableFrom(registered.getClass())) { + //special case where the removed service is a servlet, all other filters etc. should be stopped now too. + remove = true; + } + bundleContext.ungetService(serviceReference); } if (webApplication != null && remove) { diff --git a/pax-web-itest/pax-web-itest-container/pax-web-itest-container-jetty/src/test/java/org/ops4j/pax/web/itest/jetty/SharedContextFilterIntegrationTest.java b/pax-web-itest/pax-web-itest-container/pax-web-itest-container-jetty/src/test/java/org/ops4j/pax/web/itest/jetty/SharedContextFilterIntegrationTest.java index c9fb70cb4c..067c3f578b 100644 --- a/pax-web-itest/pax-web-itest-container/pax-web-itest-container-jetty/src/test/java/org/ops4j/pax/web/itest/jetty/SharedContextFilterIntegrationTest.java +++ b/pax-web-itest/pax-web-itest-container/pax-web-itest-container-jetty/src/test/java/org/ops4j/pax/web/itest/jetty/SharedContextFilterIntegrationTest.java @@ -19,6 +19,7 @@ import static org.ops4j.pax.exam.OptionUtils.combine; import static org.ops4j.pax.tinybundles.core.TinyBundles.bundle; +import org.eclipse.jetty.http.HttpStatus; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -103,4 +104,15 @@ public void testStop() throws Exception { testClient.testWebPath("http://127.0.0.1:8181/sharedContext/", "SimpleServlet: TEST OK"); } + + @Test + public void testStopServletBundle() throws Exception { + for (final Bundle b : bundleContext.getBundles()) { + if (SERVLET_BUNDLE.equalsIgnoreCase(b.getSymbolicName())) { + b.stop(); + } + } + + testClient.testWebPath("http://127.0.0.1:8181/sharedContext/", HttpStatus.NOT_FOUND_404); + } }