Use Guice injection to pass GerritServer to HttpServlets
If an HttpServlet requires the GerritServer instance to do its work (and most do) we can pass it through the constructor by way of Guice rather than trying to obtain it during the init method. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -18,16 +18,14 @@ import com.google.gerrit.client.Gerrit;
|
|||||||
import com.google.gerrit.client.reviewdb.Account;
|
import com.google.gerrit.client.reviewdb.Account;
|
||||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||||
import com.google.gerrit.client.rpc.Common;
|
import com.google.gerrit.client.rpc.Common;
|
||||||
import com.google.gwtjsonrpc.server.XsrfException;
|
|
||||||
import com.google.gwtorm.client.OrmException;
|
import com.google.gwtorm.client.OrmException;
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.ServletConfig;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
import javax.servlet.http.Cookie;
|
import javax.servlet.http.Cookie;
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
@@ -45,21 +43,13 @@ public class BecomeAnyAccountLoginServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean allowed;
|
private final boolean allowed;
|
||||||
private GerritServer server;
|
private final GerritServer server;
|
||||||
|
|
||||||
@Override
|
@Inject
|
||||||
public void init(final ServletConfig config) throws ServletException {
|
BecomeAnyAccountLoginServlet(final GerritServer gs) {
|
||||||
super.init(config);
|
server = gs;
|
||||||
allowed = isAllowed();
|
allowed = isAllowed();
|
||||||
|
|
||||||
try {
|
|
||||||
server = GerritServer.getInstance();
|
|
||||||
} catch (OrmException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
} catch (XsrfException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -24,8 +24,8 @@ import com.google.gerrit.client.reviewdb.PatchSet;
|
|||||||
import com.google.gerrit.client.reviewdb.Project;
|
import com.google.gerrit.client.reviewdb.Project;
|
||||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||||
import com.google.gerrit.client.rpc.Common;
|
import com.google.gerrit.client.rpc.Common;
|
||||||
import com.google.gwtjsonrpc.server.XsrfException;
|
|
||||||
import com.google.gwtorm.client.OrmException;
|
import com.google.gwtorm.client.OrmException;
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import eu.medsea.mimeutil.MimeType;
|
import eu.medsea.mimeutil.MimeType;
|
||||||
@@ -66,21 +66,19 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class CatServlet extends HttpServlet {
|
public class CatServlet extends HttpServlet {
|
||||||
private static final MimeType ZIP = new MimeType("application/zip");
|
private static final MimeType ZIP = new MimeType("application/zip");
|
||||||
private GerritServer server;
|
private final GerritServer server;
|
||||||
private SecureRandom rng;
|
private final SecureRandom rng;
|
||||||
private FileTypeRegistry registry;
|
private FileTypeRegistry registry;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CatServlet(final GerritServer gs) {
|
||||||
|
server = gs;
|
||||||
|
rng = new SecureRandom();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(final ServletConfig config) throws ServletException {
|
public void init(final ServletConfig config) throws ServletException {
|
||||||
super.init(config);
|
super.init(config);
|
||||||
try {
|
|
||||||
server = GerritServer.getInstance();
|
|
||||||
} catch (OrmException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
} catch (XsrfException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
}
|
|
||||||
rng = new SecureRandom();
|
|
||||||
registry = FileTypeRegistry.getInstance();
|
registry = FileTypeRegistry.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,6 +48,7 @@ import com.google.gwtorm.client.OrmException;
|
|||||||
import com.google.gwtorm.client.Transaction;
|
import com.google.gwtorm.client.Transaction;
|
||||||
import com.google.gwtorm.jdbc.Database;
|
import com.google.gwtorm.jdbc.Database;
|
||||||
import com.google.gwtorm.jdbc.SimpleDataSource;
|
import com.google.gwtorm.jdbc.SimpleDataSource;
|
||||||
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import net.sf.ehcache.Cache;
|
import net.sf.ehcache.Cache;
|
||||||
import net.sf.ehcache.CacheManager;
|
import net.sf.ehcache.CacheManager;
|
||||||
@@ -95,6 +96,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
/** Global server-side state for Gerrit. */
|
/** Global server-side state for Gerrit. */
|
||||||
|
@Singleton
|
||||||
public class GerritServer {
|
public class GerritServer {
|
||||||
private static final Logger log = LoggerFactory.getLogger(GerritServer.class);
|
private static final Logger log = LoggerFactory.getLogger(GerritServer.class);
|
||||||
private static DataSource datasource;
|
private static DataSource datasource;
|
||||||
|
@@ -15,16 +15,25 @@
|
|||||||
package com.google.gerrit.server;
|
package com.google.gerrit.server;
|
||||||
|
|
||||||
import com.google.gerrit.server.ssh.SshServlet;
|
import com.google.gerrit.server.ssh.SshServlet;
|
||||||
|
import com.google.gwtjsonrpc.server.XsrfException;
|
||||||
|
import com.google.gwtorm.client.OrmException;
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.ConfigurationException;
|
||||||
import com.google.inject.Guice;
|
import com.google.inject.Guice;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
|
import com.google.inject.Key;
|
||||||
|
import com.google.inject.Module;
|
||||||
import com.google.inject.servlet.GuiceServletContextListener;
|
import com.google.inject.servlet.GuiceServletContextListener;
|
||||||
import com.google.inject.servlet.ServletModule;
|
import com.google.inject.servlet.ServletModule;
|
||||||
|
|
||||||
|
import java.security.ProviderException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContextEvent;
|
||||||
|
|
||||||
/** Configures the web application environment for Gerrit Code Review. */
|
/** Configures the web application environment for Gerrit Code Review. */
|
||||||
public class GerritServletConfig extends GuiceServletContextListener {
|
public class GerritServletConfig extends GuiceServletContextListener {
|
||||||
@Override
|
private static Module createServletModule() {
|
||||||
protected Injector getInjector() {
|
return new ServletModule() {
|
||||||
return Guice.createInjector(new ServletModule() {
|
|
||||||
@Override
|
@Override
|
||||||
protected void configureServlets() {
|
protected void configureServlets() {
|
||||||
filter("/*").through(UrlRewriteFilter.class);
|
filter("/*").through(UrlRewriteFilter.class);
|
||||||
@@ -65,6 +74,48 @@ public class GerritServletConfig extends GuiceServletContextListener {
|
|||||||
private void rpc(String name, Class<? extends GerritJsonServlet> clazz) {
|
private void rpc(String name, Class<? extends GerritJsonServlet> clazz) {
|
||||||
serve("/gerrit/rpc/" + name).with(clazz);
|
serve("/gerrit/rpc/" + name).with(clazz);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Module createDatabaseModule() {
|
||||||
|
return new AbstractModule() {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
try {
|
||||||
|
bind(GerritServer.class).toInstance(GerritServer.getInstance(true));
|
||||||
|
} catch (OrmException e) {
|
||||||
|
addError(e);
|
||||||
|
} catch (XsrfException e) {
|
||||||
|
addError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Injector injector =
|
||||||
|
Guice.createInjector(createDatabaseModule(), createServletModule());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Injector getInjector() {
|
||||||
|
return injector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextInitialized(final ServletContextEvent event) {
|
||||||
|
super.contextInitialized(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextDestroyed(final ServletContextEvent event) {
|
||||||
|
try {
|
||||||
|
final GerritServer gs = injector.getInstance(Key.get(GerritServer.class));
|
||||||
|
gs.closeDataSource();
|
||||||
|
} catch (ConfigurationException ce) {
|
||||||
|
// Assume it never started.
|
||||||
|
} catch (ProviderException ce) {
|
||||||
|
// Assume it never started.
|
||||||
|
}
|
||||||
|
|
||||||
|
super.contextDestroyed(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,8 +18,7 @@ import com.google.gerrit.client.data.GerritConfig;
|
|||||||
import com.google.gerrit.client.reviewdb.Account;
|
import com.google.gerrit.client.reviewdb.Account;
|
||||||
import com.google.gerrit.client.rpc.Common;
|
import com.google.gerrit.client.rpc.Common;
|
||||||
import com.google.gwt.user.server.rpc.RPCServletUtils;
|
import com.google.gwt.user.server.rpc.RPCServletUtils;
|
||||||
import com.google.gwtjsonrpc.server.XsrfException;
|
import com.google.inject.Inject;
|
||||||
import com.google.gwtorm.client.OrmException;
|
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import org.spearce.jgit.lib.Constants;
|
import org.spearce.jgit.lib.Constants;
|
||||||
@@ -44,23 +43,20 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
@Singleton
|
@Singleton
|
||||||
public class HostPageServlet extends HttpServlet {
|
public class HostPageServlet extends HttpServlet {
|
||||||
private GerritServer server;
|
private final GerritServer server;
|
||||||
private String canonicalUrl;
|
private String canonicalUrl;
|
||||||
private boolean wantSSL;
|
private boolean wantSSL;
|
||||||
private Document hostDoc;
|
private Document hostDoc;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
HostPageServlet(final GerritServer gs) {
|
||||||
|
server = gs;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(ServletConfig config) throws ServletException {
|
public void init(ServletConfig config) throws ServletException {
|
||||||
super.init(config);
|
super.init(config);
|
||||||
|
|
||||||
try {
|
|
||||||
server = GerritServer.getInstance();
|
|
||||||
} catch (OrmException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
} catch (XsrfException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
final File sitePath = server.getSitePath();
|
final File sitePath = server.getSitePath();
|
||||||
canonicalUrl = server.getCanonicalURL();
|
canonicalUrl = server.getCanonicalURL();
|
||||||
wantSSL = canonicalUrl != null && canonicalUrl.startsWith("https:");
|
wantSSL = canonicalUrl != null && canonicalUrl.startsWith("https:");
|
||||||
|
@@ -15,8 +15,7 @@
|
|||||||
package com.google.gerrit.server;
|
package com.google.gerrit.server;
|
||||||
|
|
||||||
import com.google.gwt.user.server.rpc.RPCServletUtils;
|
import com.google.gwt.user.server.rpc.RPCServletUtils;
|
||||||
import com.google.gwtjsonrpc.server.XsrfException;
|
import com.google.inject.Inject;
|
||||||
import com.google.gwtorm.client.OrmException;
|
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
import org.spearce.jgit.util.NB;
|
import org.spearce.jgit.util.NB;
|
||||||
@@ -29,8 +28,6 @@ import java.io.OutputStream;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.zip.GZIPOutputStream;
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
import javax.servlet.ServletConfig;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
@@ -90,22 +87,11 @@ public class StaticServlet extends HttpServlet {
|
|||||||
return out.toByteArray();
|
return out.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private File staticBase;
|
private final File staticBase;
|
||||||
|
|
||||||
@Override
|
@Inject
|
||||||
public void init(final ServletConfig config) throws ServletException {
|
StaticServlet(final GerritServer gs) {
|
||||||
super.init(config);
|
final File p = gs.getSitePath();
|
||||||
|
|
||||||
final GerritServer srv;
|
|
||||||
try {
|
|
||||||
srv = GerritServer.getInstance();
|
|
||||||
} catch (OrmException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
} catch (XsrfException e) {
|
|
||||||
throw new ServletException("Cannot load GerritServer", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
final File p = srv.getSitePath();
|
|
||||||
staticBase = p != null ? new File(p, "static") : null;
|
staticBase = p != null ? new File(p, "static") : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,7 +20,6 @@ import com.google.gerrit.client.reviewdb.Change;
|
|||||||
import com.google.gerrit.client.reviewdb.RevId;
|
import com.google.gerrit.client.reviewdb.RevId;
|
||||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||||
import com.google.gerrit.client.rpc.Common;
|
import com.google.gerrit.client.rpc.Common;
|
||||||
import com.google.gwtjsonrpc.server.XsrfException;
|
|
||||||
import com.google.gwtorm.client.OrmException;
|
import com.google.gwtorm.client.OrmException;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
@@ -72,15 +71,8 @@ public class UrlRewriteFilter implements Filter {
|
|||||||
|
|
||||||
private FilterConfig config;
|
private FilterConfig config;
|
||||||
|
|
||||||
public void init(final FilterConfig config) throws ServletException {
|
public void init(final FilterConfig config) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
try {
|
|
||||||
GerritServer.getInstance();
|
|
||||||
} catch (OrmException e) {
|
|
||||||
throw new ServletException("Cannot initialize GerritServer", e);
|
|
||||||
} catch (XsrfException e) {
|
|
||||||
throw new ServletException("Cannot initialize GerritServer", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
|
Reference in New Issue
Block a user