Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Bartel2013-06-17 06:53:22 +0000
committerJan Bartel2013-06-17 06:53:22 +0000
commitd47eb462e7072387196869d9bc2d7dab45a3e8e9 (patch)
treed4793315d16c90e521051b4a3520959912821238 /jetty-servlet
parent2ea7843d867b69b61691541cadc8f091b14a7d28 (diff)
downloadorg.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.java63
-rw-r--r--jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java51
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)
{

Back to the top