Dynamically load plugins in new private injectors
Each plugin is given its own Guice injector that is isolated from the main server, and from each other. Explicit bindings in the main server are copied down into the plugin's private environment, making any object that is bound in a module (e.g. GerritGlobalModule) automatically available, but hiding anything that is loaded by a just-in-time implicit binding. These private injectors ensure plugins can't accidentally load a just-in-time binding into the sysInjector and cause them to be unable to garbage collect, or to confuse another plugin with a bogus binding. Change-Id: I7bc54c84fba30381cfb58d24b88871b2714c335a
This commit is contained in:
committed by
gerrit code review
parent
b4992582d6
commit
4c847cf912
@@ -37,13 +37,14 @@ import com.google.gerrit.server.git.ReceiveCommitsExecutorModule;
|
||||
import com.google.gerrit.server.git.WorkQueue;
|
||||
import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
|
||||
import com.google.gerrit.server.mail.SmtpEmailSender;
|
||||
import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
|
||||
import com.google.gerrit.server.plugins.PluginModule;
|
||||
import com.google.gerrit.server.schema.DataSourceProvider;
|
||||
import com.google.gerrit.server.schema.DatabaseModule;
|
||||
import com.google.gerrit.server.schema.SchemaModule;
|
||||
import com.google.gerrit.server.schema.SchemaVersionCheck;
|
||||
import com.google.gerrit.sshd.SshModule;
|
||||
import com.google.gerrit.sshd.commands.MasterCommandModule;
|
||||
import com.google.gerrit.sshd.commands.MasterPluginsModule;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.CreationException;
|
||||
import com.google.inject.Guice;
|
||||
@@ -113,6 +114,10 @@ public class WebAppInitializer extends GuiceServletContextListener {
|
||||
sshInjector = createSshInjector();
|
||||
webInjector = createWebInjector();
|
||||
|
||||
PluginGuiceEnvironment env = sysInjector.getInstance(PluginGuiceEnvironment.class);
|
||||
env.setCfgInjector(cfgInjector);
|
||||
env.setSshInjector(sshInjector);
|
||||
|
||||
// Push the Provider<HttpServletRequest> down into the canonical
|
||||
// URL provider. Its optional for that provider, but since we can
|
||||
// supply one we should do so, in case the administrator has not
|
||||
@@ -198,6 +203,7 @@ public class WebAppInitializer extends GuiceServletContextListener {
|
||||
modules.add(new SmtpEmailSender.Module());
|
||||
modules.add(new SignedTokenEmailTokenVerifier.Module());
|
||||
modules.add(new PushReplication.Module());
|
||||
modules.add(new PluginModule());
|
||||
modules.add(new CanonicalWebUrlModule() {
|
||||
@Override
|
||||
protected Class<? extends Provider<String>> provider() {
|
||||
@@ -212,7 +218,6 @@ public class WebAppInitializer extends GuiceServletContextListener {
|
||||
final List<Module> modules = new ArrayList<Module>();
|
||||
modules.add(new SshModule());
|
||||
modules.add(new MasterCommandModule());
|
||||
modules.add(cfgInjector.getInstance(MasterPluginsModule.class));
|
||||
return sysInjector.createChildInjector(modules);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user