diff options
author | Jan Bartel | 2013-06-17 06:53:22 +0000 |
---|---|---|
committer | Jan Bartel | 2013-06-17 06:53:22 +0000 |
commit | d47eb462e7072387196869d9bc2d7dab45a3e8e9 (patch) | |
tree | d4793315d16c90e521051b4a3520959912821238 /jetty-servlet | |
parent | 2ea7843d867b69b61691541cadc8f091b14a7d28 (diff) | |
download | org.eclipse.jetty.project-d47eb462e7072387196869d9bc2d7dab45a3e8e9.tar.gz org.eclipse.jetty.project-d47eb462e7072387196869d9bc2d7dab45a3e8e9.tar.xz org.eclipse.jetty.project-d47eb462e7072387196869d9bc2d7dab45a3e8e9.zip |
410693 ServletContextHandler.setHandler does not relink handlers
Diffstat (limited to 'jetty-servlet')
-rw-r--r-- | jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java | 63 | ||||
-rw-r--r-- | jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java | 51 |
2 files changed, 109 insertions, 5 deletions
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java index 7f7e79ffd7..ab388e8afb 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java @@ -176,19 +176,28 @@ public class ServletContextHandler extends ContextHandler if (getSessionHandler()!=null) { - handler.setHandler(_sessionHandler); + if (handler==this) + super.setHandler(_sessionHandler); + else + handler.setHandler(_sessionHandler); handler=_sessionHandler; } - + if (getSecurityHandler()!=null) { - handler.setHandler(_securityHandler); + if (handler==this) + super.setHandler(_securityHandler); + else + handler.setHandler(_securityHandler); handler=_securityHandler; } - + if (getServletHandler()!=null) { - handler.setHandler(_servletHandler); + if (handler==this) + super.setHandler(_servletHandler); + else + handler.setHandler(_servletHandler); handler=_servletHandler; } } @@ -488,6 +497,50 @@ public class ServletContextHandler extends ContextHandler relinkHandlers(); _servletHandler.setHandler(next); } + + /* ------------------------------------------------------------ */ + @Override + public void setHandler(Handler handler) + { + if (handler instanceof ServletHandler) + setServletHandler((ServletHandler) handler); + else if (handler instanceof SessionHandler) + setSessionHandler((SessionHandler) handler); + else if (handler instanceof SecurityHandler) + setSecurityHandler((SecurityHandler)handler); + else if (handler instanceof HandlerWrapper) + { + super.setHandler(handler); + relinkHandlers(); + } + else + throw new IllegalArgumentException(); + } + + + /* ------------------------------------------------------------ */ + /** + * Insert a HandlerWrapper before the first Session,Security or ServletHandler + * but after any other HandlerWrappers. + */ + public void insertHandler(HandlerWrapper handler) + { + HandlerWrapper h=this; + + // Skip any injected handlers + while (h.getHandler() instanceof HandlerWrapper) + { + HandlerWrapper wrapper = (HandlerWrapper)h.getHandler(); + if (wrapper instanceof SessionHandler || + wrapper instanceof SecurityHandler || + wrapper instanceof ServletHandler) + break; + h=wrapper; + } + + h.setHandler(handler); + relinkHandlers(); + } /* ------------------------------------------------------------ */ /** diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java index b923e53d8c..f717434606 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java @@ -23,12 +23,17 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.PrintWriter; +import java.net.MalformedURLException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.Servlet; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -41,8 +46,11 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandlerContainer; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.util.resource.Resource; import org.hamcrest.Matchers; +import org.hamcrest.core.IsEqual; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -229,6 +237,49 @@ public class ServletContextHandlerTest response = _connector.getResponses(request.toString()); assertResponseContains("Hello World", response); } + + @Test + public void testReplaceHandler () throws Exception + { + ServletContextHandler servletContextHandler = new ServletContextHandler(); + ServletHolder sh = new ServletHolder(new TestServlet()); + servletContextHandler.addServlet(sh, "/foo"); + final AtomicBoolean contextInit = new AtomicBoolean(false); + final AtomicBoolean contextDestroy = new AtomicBoolean(false); + + servletContextHandler.addEventListener(new ServletContextListener() { + + @Override + public void contextInitialized(ServletContextEvent sce) + { + if (sce.getServletContext() != null) + contextInit.set(true); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) + { + if (sce.getServletContext() != null) + contextDestroy.set(true); + } + + }); + ServletHandler shandler = servletContextHandler.getServletHandler(); + + ResourceHandler rh = new ResourceHandler(); + + servletContextHandler.setHandler(rh); + assertEquals(shandler, servletContextHandler.getServletHandler()); + assertEquals(rh, servletContextHandler.getHandler()); + assertEquals(rh.getHandler(), shandler); + _server.setHandler(servletContextHandler); + _server.start(); + assertTrue(contextInit.get()); + _server.stop(); + assertTrue(contextDestroy.get()); + } + + private int assertResponseContains(String expected, String response) { |