From 09a35b97254f84624775f15283aa6bffaadcda70 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 8 Aug 2013 17:46:09 -0700 Subject: Fix Gerrit plugins under Tomcat by avoiding Guice static filter The static GuiceFilter breaks when a plugin loads and configures its own web environment. Follow the pattern used by JettyServer to initialize and load GuiceFilter in a non-static way, allowing Gerrit to always have its own filter stack during any request. Bug: issue 1966 Change-Id: I864f3badc4ec90154a276d35e6a5a3fa75058933 --- .../com/google/gerrit/httpd/WebAppInitializer.java | 26 +++++++++++++++++----- gerrit-war/src/main/webapp/WEB-INF/web.xml | 6 +---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java index d0b8c3843a..945547fe0f 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java @@ -59,6 +59,7 @@ import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.Provider; import com.google.inject.name.Names; +import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.GuiceServletContextListener; import com.google.inject.spi.Message; @@ -67,16 +68,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; import javax.servlet.ServletContextEvent; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.sql.DataSource; /** Configures the web application environment for Gerrit Code Review. */ -public class WebAppInitializer extends GuiceServletContextListener { +public class WebAppInitializer extends GuiceServletContextListener + implements Filter { private static final Logger log = LoggerFactory.getLogger(WebAppInitializer.class); @@ -87,6 +96,13 @@ public class WebAppInitializer extends GuiceServletContextListener { private Injector webInjector; private Injector sshInjector; private LifecycleManager manager; + private GuiceFilter filter; + + @Override + public void doFilter(ServletRequest req, ServletResponse res, + FilterChain chain) throws IOException, ServletException { + filter.doFilter(req, res, chain); + } private synchronized void init() { if (manager == null) { @@ -139,6 +155,7 @@ public class WebAppInitializer extends GuiceServletContextListener { .setHttpServletRequest( webInjector.getProvider(HttpServletRequest.class)); + filter = webInjector.getInstance(GuiceFilter.class); manager = new LifecycleManager(); manager.add(dbInjector); manager.add(cfgInjector); @@ -286,18 +303,17 @@ public class WebAppInitializer extends GuiceServletContextListener { } @Override - public void contextInitialized(final ServletContextEvent event) { - super.contextInitialized(event); + public void init(FilterConfig cfg) throws ServletException { + contextInitialized(new ServletContextEvent(cfg.getServletContext())); init(); manager.start(); } @Override - public void contextDestroyed(final ServletContextEvent event) { + public void destroy() { if (manager != null) { manager.stop(); manager = null; } - super.contextDestroyed(event); } } diff --git a/gerrit-war/src/main/webapp/WEB-INF/web.xml b/gerrit-war/src/main/webapp/WEB-INF/web.xml index 205341c35a..386eb07573 100644 --- a/gerrit-war/src/main/webapp/WEB-INF/web.xml +++ b/gerrit-war/src/main/webapp/WEB-INF/web.xml @@ -8,14 +8,10 @@ guiceFilter - com.google.inject.servlet.GuiceFilter + com.google.gerrit.httpd.WebAppInitializer guiceFilter /* - - - com.google.gerrit.httpd.WebAppInitializer - -- cgit v1.2.3