Invoke more plugins through plugin context

Change-Id: I9986d6372724030ff360c49d578a0a8edb70c881
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin
2018-10-17 17:14:42 +02:00
parent 48c55620ef
commit b4de05ee72
17 changed files with 97 additions and 124 deletions

View File

@@ -39,6 +39,7 @@ import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions; import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.permissions.ProjectPermission; import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.util.RequestContext; import com.google.gerrit.server.util.RequestContext;
@@ -208,7 +209,7 @@ class InProcessProtocol extends TestProtocol<Context> {
private static class Upload implements UploadPackFactory<Context> { private static class Upload implements UploadPackFactory<Context> {
private final TransferConfig transferConfig; private final TransferConfig transferConfig;
private final DynamicSet<UploadPackInitializer> uploadPackInitializers; private final PluginSetContext<UploadPackInitializer> uploadPackInitializers;
private final DynamicSet<PreUploadHook> preUploadHooks; private final DynamicSet<PreUploadHook> preUploadHooks;
private final UploadValidators.Factory uploadValidatorsFactory; private final UploadValidators.Factory uploadValidatorsFactory;
private final ThreadLocalRequestContext threadContext; private final ThreadLocalRequestContext threadContext;
@@ -218,7 +219,7 @@ class InProcessProtocol extends TestProtocol<Context> {
@Inject @Inject
Upload( Upload(
TransferConfig transferConfig, TransferConfig transferConfig,
DynamicSet<UploadPackInitializer> uploadPackInitializers, PluginSetContext<UploadPackInitializer> uploadPackInitializers,
DynamicSet<PreUploadHook> preUploadHooks, DynamicSet<PreUploadHook> preUploadHooks,
UploadValidators.Factory uploadValidatorsFactory, UploadValidators.Factory uploadValidatorsFactory,
ThreadLocalRequestContext threadContext, ThreadLocalRequestContext threadContext,
@@ -267,9 +268,7 @@ class InProcessProtocol extends TestProtocol<Context> {
List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks); List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test")); hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
up.setPreUploadHook(PreUploadHookChain.newChain(hooks)); up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
for (UploadPackInitializer initializer : uploadPackInitializers) { uploadPackInitializers.runEach(initializer -> initializer.init(req.project, up));
initializer.init(req.project, up);
}
return up; return up;
} }
} }
@@ -279,7 +278,7 @@ class InProcessProtocol extends TestProtocol<Context> {
private final ProjectCache projectCache; private final ProjectCache projectCache;
private final AsyncReceiveCommits.Factory factory; private final AsyncReceiveCommits.Factory factory;
private final TransferConfig config; private final TransferConfig config;
private final DynamicSet<ReceivePackInitializer> receivePackInitializers; private final PluginSetContext<ReceivePackInitializer> receivePackInitializers;
private final DynamicSet<PostReceiveHook> postReceiveHooks; private final DynamicSet<PostReceiveHook> postReceiveHooks;
private final ThreadLocalRequestContext threadContext; private final ThreadLocalRequestContext threadContext;
private final PermissionBackend permissionBackend; private final PermissionBackend permissionBackend;
@@ -290,7 +289,7 @@ class InProcessProtocol extends TestProtocol<Context> {
ProjectCache projectCache, ProjectCache projectCache,
AsyncReceiveCommits.Factory factory, AsyncReceiveCommits.Factory factory,
TransferConfig config, TransferConfig config,
DynamicSet<ReceivePackInitializer> receivePackInitializers, PluginSetContext<ReceivePackInitializer> receivePackInitializers,
DynamicSet<PostReceiveHook> postReceiveHooks, DynamicSet<PostReceiveHook> postReceiveHooks,
ThreadLocalRequestContext threadContext, ThreadLocalRequestContext threadContext,
PermissionBackend permissionBackend) { PermissionBackend permissionBackend) {
@@ -339,9 +338,8 @@ class InProcessProtocol extends TestProtocol<Context> {
rp.setTimeout(config.getTimeout()); rp.setTimeout(config.getTimeout());
rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit()); rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit());
for (ReceivePackInitializer initializer : receivePackInitializers) { receivePackInitializers.runEach(
initializer.init(projectState.getNameKey(), rp); initializer -> initializer.init(projectState.getNameKey(), rp));
}
rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks))); rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks)));
return rp; return rp;

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.elasticsearch;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.index.Index; import com.google.gerrit.index.Index;
import com.google.gerrit.index.IndexDefinition; import com.google.gerrit.index.IndexDefinition;
import com.google.gerrit.index.Schema; import com.google.gerrit.index.Schema;
@@ -26,6 +25,7 @@ import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.GerritIndexStatus; import com.google.gerrit.server.index.GerritIndexStatus;
import com.google.gerrit.server.index.OnlineUpgradeListener; import com.google.gerrit.server.index.OnlineUpgradeListener;
import com.google.gerrit.server.index.VersionManager; import com.google.gerrit.server.index.VersionManager;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.io.IOException; import java.io.IOException;
@@ -45,7 +45,7 @@ public class ElasticIndexVersionManager extends VersionManager {
ElasticIndexVersionManager( ElasticIndexVersionManager(
@GerritServerConfig Config cfg, @GerritServerConfig Config cfg,
SitePaths sitePaths, SitePaths sitePaths,
DynamicSet<OnlineUpgradeListener> listeners, PluginSetContext<OnlineUpgradeListener> listeners,
Collection<IndexDefinition<?, ?, ?>> defs, Collection<IndexDefinition<?, ?, ?>> defs,
ElasticIndexVersionDiscovery versionDiscovery) { ElasticIndexVersionDiscovery versionDiscovery) {
super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg)); super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg));

View File

@@ -38,6 +38,7 @@ import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions; import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.permissions.ProjectPermission; import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.util.time.TimeUtil; import com.google.gerrit.server.util.time.TimeUtil;
@@ -285,14 +286,14 @@ public class GitOverHttpServlet extends GitServlet {
private final TransferConfig config; private final TransferConfig config;
private final DynamicSet<PreUploadHook> preUploadHooks; private final DynamicSet<PreUploadHook> preUploadHooks;
private final DynamicSet<PostUploadHook> postUploadHooks; private final DynamicSet<PostUploadHook> postUploadHooks;
private final DynamicSet<UploadPackInitializer> uploadPackInitializers; private final PluginSetContext<UploadPackInitializer> uploadPackInitializers;
@Inject @Inject
UploadFactory( UploadFactory(
TransferConfig tc, TransferConfig tc,
DynamicSet<PreUploadHook> preUploadHooks, DynamicSet<PreUploadHook> preUploadHooks,
DynamicSet<PostUploadHook> postUploadHooks, DynamicSet<PostUploadHook> postUploadHooks,
DynamicSet<UploadPackInitializer> uploadPackInitializers) { PluginSetContext<UploadPackInitializer> uploadPackInitializers) {
this.config = tc; this.config = tc;
this.preUploadHooks = preUploadHooks; this.preUploadHooks = preUploadHooks;
this.postUploadHooks = postUploadHooks; this.postUploadHooks = postUploadHooks;
@@ -314,9 +315,7 @@ public class GitOverHttpServlet extends GitServlet {
} }
} }
ProjectState state = (ProjectState) req.getAttribute(ATT_STATE); ProjectState state = (ProjectState) req.getAttribute(ATT_STATE);
for (UploadPackInitializer initializer : uploadPackInitializers) { uploadPackInitializers.runEach(initializer -> initializer.init(state.getNameKey(), up));
initializer.init(state.getNameKey(), up);
}
return up; return up;
} }
} }

View File

@@ -14,10 +14,11 @@
package com.google.gerrit.httpd; package com.google.gerrit.httpd;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.plugincontext.PluginItemContext;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Singleton; import com.google.inject.Singleton;
@@ -34,8 +35,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
public class UniversalWebLoginFilter implements Filter { public class UniversalWebLoginFilter implements Filter {
private final DynamicItem<WebSession> session; private final PluginItemContext<WebSession> session;
private final DynamicSet<WebLoginListener> webLoginListeners; private final PluginSetContext<WebLoginListener> webLoginListeners;
private final Provider<CurrentUser> userProvider; private final Provider<CurrentUser> userProvider;
public static ServletModule module() { public static ServletModule module() {
@@ -52,8 +53,8 @@ public class UniversalWebLoginFilter implements Filter {
@Inject @Inject
public UniversalWebLoginFilter( public UniversalWebLoginFilter(
DynamicItem<WebSession> session, PluginItemContext<WebSession> session,
DynamicSet<WebLoginListener> webLoginListeners, PluginSetContext<WebLoginListener> webLoginListeners,
Provider<CurrentUser> userProvider) { Provider<CurrentUser> userProvider) {
this.session = session; this.session = session;
this.webLoginListeners = webLoginListeners; this.webLoginListeners = webLoginListeners;
@@ -75,20 +76,18 @@ public class UniversalWebLoginFilter implements Filter {
Optional<IdentifiedUser> loggedInUserAfter = loggedInUser(); Optional<IdentifiedUser> loggedInUserAfter = loggedInUser();
if (!loggedInUserBefore.isPresent() && loggedInUserAfter.isPresent()) { if (!loggedInUserBefore.isPresent() && loggedInUserAfter.isPresent()) {
for (WebLoginListener loginListener : webLoginListeners) { webLoginListeners.runEach(
loginListener.onLogin(loggedInUserAfter.get(), httpRequest, wrappedResponse); l -> l.onLogin(loggedInUserAfter.get(), httpRequest, wrappedResponse));
}
} else if (loggedInUserBefore.isPresent() && !loggedInUserAfter.isPresent()) { } else if (loggedInUserBefore.isPresent() && !loggedInUserAfter.isPresent()) {
for (WebLoginListener loginListener : webLoginListeners) { webLoginListeners.runEach(
loginListener.onLogout(loggedInUserBefore.get(), httpRequest, wrappedResponse); l -> l.onLogout(loggedInUserBefore.get(), httpRequest, wrappedResponse));
}
} }
wrappedResponse.play(); wrappedResponse.play();
} }
private Optional<IdentifiedUser> loggedInUser() { private Optional<IdentifiedUser> loggedInUser() {
return session.get().isSignedIn() return session.call(s -> s.isSignedIn())
? Optional.of(userProvider.get().asIdentifiedUser()) ? Optional.of(userProvider.get().asIdentifiedUser())
: Optional.empty(); : Optional.empty();
} }

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.lucene;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.index.Index; import com.google.gerrit.index.Index;
import com.google.gerrit.index.IndexDefinition; import com.google.gerrit.index.IndexDefinition;
import com.google.gerrit.index.Schema; import com.google.gerrit.index.Schema;
@@ -25,6 +24,7 @@ import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.GerritIndexStatus; import com.google.gerrit.server.index.GerritIndexStatus;
import com.google.gerrit.server.index.OnlineUpgradeListener; import com.google.gerrit.server.index.OnlineUpgradeListener;
import com.google.gerrit.server.index.VersionManager; import com.google.gerrit.server.index.VersionManager;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.io.IOException; import java.io.IOException;
@@ -47,7 +47,7 @@ public class LuceneVersionManager extends VersionManager {
LuceneVersionManager( LuceneVersionManager(
@GerritServerConfig Config cfg, @GerritServerConfig Config cfg,
SitePaths sitePaths, SitePaths sitePaths,
DynamicSet<OnlineUpgradeListener> listeners, PluginSetContext<OnlineUpgradeListener> listeners,
Collection<IndexDefinition<?, ?, ?>> defs) { Collection<IndexDefinition<?, ?, ?>> defs) {
super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg)); super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg));
} }

View File

@@ -16,7 +16,7 @@ package com.google.gerrit.server.auth;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.util.ArrayList; import java.util.ArrayList;
@@ -25,10 +25,10 @@ import java.util.List;
/** Universal implementation of the AuthBackend that works with the injected set of AuthBackends. */ /** Universal implementation of the AuthBackend that works with the injected set of AuthBackends. */
@Singleton @Singleton
public final class UniversalAuthBackend implements AuthBackend { public final class UniversalAuthBackend implements AuthBackend {
private final DynamicSet<AuthBackend> authBackends; private final PluginSetContext<AuthBackend> authBackends;
@Inject @Inject
UniversalAuthBackend(DynamicSet<AuthBackend> authBackends) { UniversalAuthBackend(PluginSetContext<AuthBackend> authBackends) {
this.authBackends = authBackends; this.authBackends = authBackends;
} }
@@ -36,7 +36,8 @@ public final class UniversalAuthBackend implements AuthBackend {
public AuthUser authenticate(AuthRequest request) throws AuthException { public AuthUser authenticate(AuthRequest request) throws AuthException {
List<AuthUser> authUsers = new ArrayList<>(); List<AuthUser> authUsers = new ArrayList<>();
List<AuthException> authExs = new ArrayList<>(); List<AuthException> authExs = new ArrayList<>();
for (AuthBackend backend : authBackends) { authBackends.runEach(
backend -> {
try { try {
authUsers.add(requireNonNull(backend.authenticate(request))); authUsers.add(requireNonNull(backend.authenticate(request)));
} catch (MissingCredentialsException ex) { } catch (MissingCredentialsException ex) {
@@ -44,7 +45,7 @@ public final class UniversalAuthBackend implements AuthBackend {
} catch (AuthException ex) { } catch (AuthException ex) {
authExs.add(ex); authExs.add(ex);
} }
} });
// Handle the valid responses // Handle the valid responses
if (authUsers.size() == 1) { if (authUsers.size() == 1) {

View File

@@ -17,8 +17,8 @@ package com.google.gerrit.server.cache;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification; import com.google.common.cache.RemovalNotification;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.registration.PluginName; import com.google.gerrit.extensions.registration.PluginName;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -35,13 +35,13 @@ public class ForwardingRemovalListener<K, V> implements RemovalListener<K, V> {
ForwardingRemovalListener create(String cacheName); ForwardingRemovalListener create(String cacheName);
} }
private final DynamicSet<CacheRemovalListener> listeners; private final PluginSetContext<CacheRemovalListener> listeners;
private final String cacheName; private final String cacheName;
private String pluginName = PluginName.GERRIT; private String pluginName = PluginName.GERRIT;
@Inject @Inject
ForwardingRemovalListener( ForwardingRemovalListener(
DynamicSet<CacheRemovalListener> listeners, @Assisted String cacheName) { PluginSetContext<CacheRemovalListener> listeners, @Assisted String cacheName) {
this.listeners = listeners; this.listeners = listeners;
this.cacheName = cacheName; this.cacheName = cacheName;
} }
@@ -56,8 +56,6 @@ public class ForwardingRemovalListener<K, V> implements RemovalListener<K, V> {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void onRemoval(RemovalNotification<K, V> notification) { public void onRemoval(RemovalNotification<K, V> notification) {
for (CacheRemovalListener<K, V> l : listeners) { listeners.runEach(l -> l.onRemoval(pluginName, cacheName, notification));
l.onRemoval(pluginName, cacheName, notification);
}
} }
} }

View File

@@ -17,9 +17,9 @@ package com.google.gerrit.server.config;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry; import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult; import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
@@ -29,11 +29,12 @@ public class GerritServerConfigReloader {
private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final GerritServerConfigProvider configProvider; private final GerritServerConfigProvider configProvider;
private final DynamicSet<GerritConfigListener> configListeners; private final PluginSetContext<GerritConfigListener> configListeners;
@Inject @Inject
GerritServerConfigReloader( GerritServerConfigReloader(
GerritServerConfigProvider configProvider, DynamicSet<GerritConfigListener> configListeners) { GerritServerConfigProvider configProvider,
PluginSetContext<GerritConfigListener> configListeners) {
this.configProvider = configProvider; this.configProvider = configProvider;
this.configListeners = configListeners; this.configListeners = configListeners;
} }
@@ -53,9 +54,7 @@ public class GerritServerConfigReloader {
public Multimap<UpdateResult, ConfigUpdateEntry> fireUpdatedConfigEvent( public Multimap<UpdateResult, ConfigUpdateEntry> fireUpdatedConfigEvent(
ConfigUpdatedEvent event) { ConfigUpdatedEvent event) {
Multimap<UpdateResult, ConfigUpdateEntry> updates = ArrayListMultimap.create(); Multimap<UpdateResult, ConfigUpdateEntry> updates = ArrayListMultimap.create();
for (GerritConfigListener configListener : configListeners) { configListeners.runEach(l -> updates.putAll(l.configUpdated(event)));
updates.putAll(configListener.configUpdated(event));
}
return updates; return updates;
} }
} }

View File

@@ -15,16 +15,16 @@
package com.google.gerrit.server.extensions.events; package com.google.gerrit.server.extensions.events;
import com.google.gerrit.extensions.events.PluginEventListener; import com.google.gerrit.extensions.events.PluginEventListener;
import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
@Singleton @Singleton
public class PluginEvent { public class PluginEvent {
private final DynamicSet<PluginEventListener> listeners; private final PluginSetContext<PluginEventListener> listeners;
@Inject @Inject
PluginEvent(DynamicSet<PluginEventListener> listeners) { PluginEvent(PluginSetContext<PluginEventListener> listeners) {
this.listeners = listeners; this.listeners = listeners;
} }
@@ -33,9 +33,7 @@ public class PluginEvent {
return; return;
} }
Event e = new Event(pluginName, type, data); Event e = new Event(pluginName, type, data);
for (PluginEventListener l : listeners) { listeners.runEach(l -> l.onPluginEvent(e));
l.onPluginEvent(e);
}
} }
private static class Event extends AbstractNoNotifyEvent implements PluginEventListener.Event { private static class Event extends AbstractNoNotifyEvent implements PluginEventListener.Event {

View File

@@ -18,10 +18,10 @@ import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.data.GarbageCollectionResult; import com.google.gerrit.common.data.GarbageCollectionResult;
import com.google.gerrit.extensions.events.GarbageCollectorListener; import com.google.gerrit.extensions.events.GarbageCollectorListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.GcConfig; import com.google.gerrit.server.config.GcConfig;
import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent; import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.List; import java.util.List;
@@ -43,7 +43,7 @@ public class GarbageCollection {
private final GitRepositoryManager repoManager; private final GitRepositoryManager repoManager;
private final GarbageCollectionQueue gcQueue; private final GarbageCollectionQueue gcQueue;
private final GcConfig gcConfig; private final GcConfig gcConfig;
private final DynamicSet<GarbageCollectorListener> listeners; private final PluginSetContext<GarbageCollectorListener> listeners;
public interface Factory { public interface Factory {
GarbageCollection create(); GarbageCollection create();
@@ -54,7 +54,7 @@ public class GarbageCollection {
GitRepositoryManager repoManager, GitRepositoryManager repoManager,
GarbageCollectionQueue gcQueue, GarbageCollectionQueue gcQueue,
GcConfig config, GcConfig config,
DynamicSet<GarbageCollectorListener> listeners) { PluginSetContext<GarbageCollectorListener> listeners) {
this.repoManager = repoManager; this.repoManager = repoManager;
this.gcQueue = gcQueue; this.gcQueue = gcQueue;
this.gcConfig = config; this.gcConfig = config;
@@ -113,13 +113,7 @@ public class GarbageCollection {
return; return;
} }
Event event = new Event(p, statistics); Event event = new Event(p, statistics);
for (GarbageCollectorListener l : listeners) { listeners.runEach(l -> l.onGarbageCollected(event));
try {
l.onGarbageCollected(event);
} catch (RuntimeException e) {
logger.atWarning().withCause(e).log("Failure in GarbageCollectorListener");
}
}
} }
private static void logGcInfo(Project.NameKey projectName, String msg) { private static void logGcInfo(Project.NameKey projectName, String msg) {

View File

@@ -14,7 +14,7 @@
package com.google.gerrit.server.git.receive; package com.google.gerrit.server.git.receive;
import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import java.util.Collection; import java.util.Collection;
import org.eclipse.jgit.transport.PostReceiveHook; import org.eclipse.jgit.transport.PostReceiveHook;
@@ -22,17 +22,15 @@ import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceivePack;
class LazyPostReceiveHookChain implements PostReceiveHook { class LazyPostReceiveHookChain implements PostReceiveHook {
private final DynamicSet<PostReceiveHook> hooks; private final PluginSetContext<PostReceiveHook> hooks;
@Inject @Inject
LazyPostReceiveHookChain(DynamicSet<PostReceiveHook> hooks) { LazyPostReceiveHookChain(PluginSetContext<PostReceiveHook> hooks) {
this.hooks = hooks; this.hooks = hooks;
} }
@Override @Override
public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) { public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
for (PostReceiveHook h : hooks) { hooks.runEach(h -> h.onPostReceive(rp, commands));
h.onPostReceive(rp, commands);
}
} }
} }

View File

@@ -18,11 +18,11 @@ import static java.util.Objects.requireNonNull;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.index.Index; import com.google.gerrit.index.Index;
import com.google.gerrit.index.IndexCollection; import com.google.gerrit.index.IndexCollection;
import com.google.gerrit.index.IndexDefinition; import com.google.gerrit.index.IndexDefinition;
import com.google.gerrit.index.SiteIndexer; import com.google.gerrit.index.SiteIndexer;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -35,7 +35,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> {
private final SiteIndexer<K, V, I> batchIndexer; private final SiteIndexer<K, V, I> batchIndexer;
private final int oldVersion; private final int oldVersion;
private final int newVersion; private final int newVersion;
private final DynamicSet<OnlineUpgradeListener> listeners; private final PluginSetContext<OnlineUpgradeListener> listeners;
private I index; private I index;
private final AtomicBoolean running = new AtomicBoolean(); private final AtomicBoolean running = new AtomicBoolean();
@@ -43,7 +43,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> {
IndexDefinition<K, V, I> def, IndexDefinition<K, V, I> def,
int oldVersion, int oldVersion,
int newVersion, int newVersion,
DynamicSet<OnlineUpgradeListener> listeners) { PluginSetContext<OnlineUpgradeListener> listeners) {
this.name = def.getName(); this.name = def.getName();
this.indexes = def.getIndexCollection(); this.indexes = def.getIndexCollection();
this.batchIndexer = def.getSiteIndexer(); this.batchIndexer = def.getSiteIndexer();
@@ -68,9 +68,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> {
} finally { } finally {
running.set(false); running.set(false);
if (!ok) { if (!ok) {
for (OnlineUpgradeListener listener : listeners) { listeners.runEach(listener -> listener.onFailure(name, oldVersion, newVersion));
listener.onFailure(name, oldVersion, newVersion);
}
} }
} }
} }
@@ -94,9 +92,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> {
} }
private void reindex() throws IOException { private void reindex() throws IOException {
for (OnlineUpgradeListener listener : listeners) { listeners.runEach(listener -> listener.onStart(name, oldVersion, newVersion));
listener.onStart(name, oldVersion, newVersion);
}
index = index =
requireNonNull( requireNonNull(
indexes.getWriteIndex(newVersion), indexes.getWriteIndex(newVersion),
@@ -118,9 +114,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> {
} }
logger.atInfo().log("Reindex %s to version %s complete", name, version(index)); logger.atInfo().log("Reindex %s to version %s complete", name, version(index));
activateIndex(); activateIndex();
for (OnlineUpgradeListener listener : listeners) { listeners.runEach(listener -> listener.onSuccess(name, oldVersion, newVersion));
listener.onSuccess(name, oldVersion, newVersion);
}
} }
public void activateIndex() { public void activateIndex() {

View File

@@ -21,13 +21,13 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.index.Index; import com.google.gerrit.index.Index;
import com.google.gerrit.index.IndexCollection; import com.google.gerrit.index.IndexCollection;
import com.google.gerrit.index.IndexDefinition; import com.google.gerrit.index.IndexDefinition;
import com.google.gerrit.index.IndexDefinition.IndexFactory; import com.google.gerrit.index.IndexDefinition.IndexFactory;
import com.google.gerrit.index.Schema; import com.google.gerrit.index.Schema;
import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.ProvisionException; import com.google.inject.ProvisionException;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
@@ -61,7 +61,7 @@ public abstract class VersionManager implements LifecycleListener {
protected final String runReindexMsg; protected final String runReindexMsg;
protected final SitePaths sitePaths; protected final SitePaths sitePaths;
private final DynamicSet<OnlineUpgradeListener> listeners; private final PluginSetContext<OnlineUpgradeListener> listeners;
// The following fields must be accessed synchronized on this. // The following fields must be accessed synchronized on this.
protected final Map<String, IndexDefinition<?, ?, ?>> defs; protected final Map<String, IndexDefinition<?, ?, ?>> defs;
@@ -69,7 +69,7 @@ public abstract class VersionManager implements LifecycleListener {
protected VersionManager( protected VersionManager(
SitePaths sitePaths, SitePaths sitePaths,
DynamicSet<OnlineUpgradeListener> listeners, PluginSetContext<OnlineUpgradeListener> listeners,
Collection<IndexDefinition<?, ?, ?>> defs, Collection<IndexDefinition<?, ?, ?>> defs,
boolean onlineUpgrade) { boolean onlineUpgrade) {
this.sitePaths = sitePaths; this.sitePaths = sitePaths;

View File

@@ -45,7 +45,6 @@ import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import com.google.gerrit.common.FormatUtil; import com.google.gerrit.common.FormatUtil;
import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.git.LockFailureException; import com.google.gerrit.git.LockFailureException;
import com.google.gerrit.git.RefUpdateUtil; import com.google.gerrit.git.RefUpdateUtil;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
@@ -72,6 +71,7 @@ import com.google.gerrit.server.notedb.PrimaryStorageMigrator;
import com.google.gerrit.server.notedb.PrimaryStorageMigrator.NoNoteDbStateException; import com.google.gerrit.server.notedb.PrimaryStorageMigrator.NoNoteDbStateException;
import com.google.gerrit.server.notedb.RepoSequence; import com.google.gerrit.server.notedb.RepoSequence;
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException; import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.update.ChainedReceiveCommands; import com.google.gerrit.server.update.ChainedReceiveCommands;
import com.google.gerrit.server.util.ManualRequestContext; import com.google.gerrit.server.util.ManualRequestContext;
@@ -150,7 +150,7 @@ public class NoteDbMigrator implements AutoCloseable {
private final WorkQueue workQueue; private final WorkQueue workQueue;
private final MutableNotesMigration globalNotesMigration; private final MutableNotesMigration globalNotesMigration;
private final PrimaryStorageMigrator primaryStorageMigrator; private final PrimaryStorageMigrator primaryStorageMigrator;
private final DynamicSet<NotesMigrationStateListener> listeners; private final PluginSetContext<NotesMigrationStateListener> listeners;
private int threads; private int threads;
private ImmutableList<Project.NameKey> projects = ImmutableList.of(); private ImmutableList<Project.NameKey> projects = ImmutableList.of();
@@ -179,7 +179,7 @@ public class NoteDbMigrator implements AutoCloseable {
WorkQueue workQueue, WorkQueue workQueue,
MutableNotesMigration globalNotesMigration, MutableNotesMigration globalNotesMigration,
PrimaryStorageMigrator primaryStorageMigrator, PrimaryStorageMigrator primaryStorageMigrator,
DynamicSet<NotesMigrationStateListener> listeners) { PluginSetContext<NotesMigrationStateListener> listeners) {
// Reload gerrit.config/notedb.config on each migrator invocation, in case a previous // Reload gerrit.config/notedb.config on each migrator invocation, in case a previous
// migration in the same process modified the on-disk contents. This ensures the defaults for // migration in the same process modified the on-disk contents. This ensures the defaults for
// trial/autoMigrate get set correctly below. // trial/autoMigrate get set correctly below.
@@ -390,7 +390,7 @@ public class NoteDbMigrator implements AutoCloseable {
private final ChangeRebuilderImpl rebuilder; private final ChangeRebuilderImpl rebuilder;
private final MutableNotesMigration globalNotesMigration; private final MutableNotesMigration globalNotesMigration;
private final PrimaryStorageMigrator primaryStorageMigrator; private final PrimaryStorageMigrator primaryStorageMigrator;
private final DynamicSet<NotesMigrationStateListener> listeners; private final PluginSetContext<NotesMigrationStateListener> listeners;
private final ListeningExecutorService executor; private final ListeningExecutorService executor;
private final ImmutableList<Project.NameKey> projects; private final ImmutableList<Project.NameKey> projects;
@@ -416,7 +416,7 @@ public class NoteDbMigrator implements AutoCloseable {
ChangeRebuilderImpl rebuilder, ChangeRebuilderImpl rebuilder,
MutableNotesMigration globalNotesMigration, MutableNotesMigration globalNotesMigration,
PrimaryStorageMigrator primaryStorageMigrator, PrimaryStorageMigrator primaryStorageMigrator,
DynamicSet<NotesMigrationStateListener> listeners, PluginSetContext<NotesMigrationStateListener> listeners,
ListeningExecutorService executor, ListeningExecutorService executor,
ImmutableList<Project.NameKey> projects, ImmutableList<Project.NameKey> projects,
ImmutableList<Change.Id> changes, ImmutableList<Change.Id> changes,
@@ -737,9 +737,7 @@ public class NoteDbMigrator implements AutoCloseable {
private void preStateChange(NotesMigrationState oldState, NotesMigrationState newState) private void preStateChange(NotesMigrationState oldState, NotesMigrationState newState)
throws IOException { throws IOException {
for (NotesMigrationStateListener listener : listeners) { listeners.runEach(l -> l.preStateChange(oldState, newState), IOException.class);
listener.preStateChange(oldState, newState);
}
} }
private void setControlFlags() throws MigrationException { private void setControlFlags() throws MigrationException {

View File

@@ -15,8 +15,8 @@
package com.google.gerrit.server.plugins; package com.google.gerrit.server.plugins;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.registration.PluginName; import com.google.gerrit.extensions.registration.PluginName;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.nio.file.Path; import java.nio.file.Path;
@@ -28,10 +28,10 @@ import org.eclipse.jgit.internal.storage.file.FileSnapshot;
class UniversalServerPluginProvider implements ServerPluginProvider { class UniversalServerPluginProvider implements ServerPluginProvider {
private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final DynamicSet<ServerPluginProvider> serverPluginProviders; private final PluginSetContext<ServerPluginProvider> serverPluginProviders;
@Inject @Inject
UniversalServerPluginProvider(DynamicSet<ServerPluginProvider> sf) { UniversalServerPluginProvider(PluginSetContext<ServerPluginProvider> sf) {
this.serverPluginProviders = sf; this.serverPluginProviders = sf;
} }
@@ -80,7 +80,8 @@ class UniversalServerPluginProvider implements ServerPluginProvider {
private List<ServerPluginProvider> providersForHandlingPlugin(Path srcPath) { private List<ServerPluginProvider> providersForHandlingPlugin(Path srcPath) {
List<ServerPluginProvider> providers = new ArrayList<>(); List<ServerPluginProvider> providers = new ArrayList<>();
for (ServerPluginProvider serverPluginProvider : serverPluginProviders) { serverPluginProviders.runEach(
serverPluginProvider -> {
boolean handles = serverPluginProvider.handles(srcPath); boolean handles = serverPluginProvider.handles(srcPath);
logger.atFine().log( logger.atFine().log(
"File %s handled by %s ? => %s", "File %s handled by %s ? => %s",
@@ -88,7 +89,7 @@ class UniversalServerPluginProvider implements ServerPluginProvider {
if (handles) { if (handles) {
providers.add(serverPluginProvider); providers.add(serverPluginProvider);
} }
} });
return providers; return providers;
} }
} }

View File

@@ -27,7 +27,6 @@ import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.api.accounts.AccountInput; import com.google.gerrit.extensions.api.accounts.AccountInput;
import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -51,6 +50,7 @@ import com.google.gerrit.server.group.db.GroupsUpdate;
import com.google.gerrit.server.group.db.InternalGroupUpdate; import com.google.gerrit.server.group.db.InternalGroupUpdate;
import com.google.gerrit.server.mail.send.OutgoingEmailValidator; import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.gerrit.server.ssh.SshKeyCache; import com.google.gerrit.server.ssh.SshKeyCache;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -73,7 +73,7 @@ public class CreateAccount
private final SshKeyCache sshKeyCache; private final SshKeyCache sshKeyCache;
private final Provider<AccountsUpdate> accountsUpdateProvider; private final Provider<AccountsUpdate> accountsUpdateProvider;
private final AccountLoader.Factory infoLoader; private final AccountLoader.Factory infoLoader;
private final DynamicSet<AccountExternalIdCreator> externalIdCreators; private final PluginSetContext<AccountExternalIdCreator> externalIdCreators;
private final Provider<GroupsUpdate> groupsUpdate; private final Provider<GroupsUpdate> groupsUpdate;
private final OutgoingEmailValidator validator; private final OutgoingEmailValidator validator;
@@ -85,7 +85,7 @@ public class CreateAccount
SshKeyCache sshKeyCache, SshKeyCache sshKeyCache,
@UserInitiated Provider<AccountsUpdate> accountsUpdateProvider, @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
AccountLoader.Factory infoLoader, AccountLoader.Factory infoLoader,
DynamicSet<AccountExternalIdCreator> externalIdCreators, PluginSetContext<AccountExternalIdCreator> externalIdCreators,
@UserInitiated Provider<GroupsUpdate> groupsUpdate, @UserInitiated Provider<GroupsUpdate> groupsUpdate,
OutgoingEmailValidator validator) { OutgoingEmailValidator validator) {
this.seq = seq; this.seq = seq;
@@ -131,9 +131,7 @@ public class CreateAccount
} }
extIds.add(ExternalId.createUsername(username, accountId, input.httpPassword)); extIds.add(ExternalId.createUsername(username, accountId, input.httpPassword));
for (AccountExternalIdCreator c : externalIdCreators) { externalIdCreators.runEach(c -> extIds.addAll(c.create(accountId, username, input.email)));
extIds.addAll(c.create(accountId, username, input.email));
}
try { try {
accountsUpdateProvider accountsUpdateProvider

View File

@@ -14,10 +14,10 @@
package com.google.gerrit.server.restapi.config; package com.google.gerrit.server.restapi.config;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.webui.TopMenu; import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.server.config.ConfigResource; import com.google.gerrit.server.config.ConfigResource;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.util.ArrayList; import java.util.ArrayList;
@@ -25,19 +25,17 @@ import java.util.List;
@Singleton @Singleton
class ListTopMenus implements RestReadView<ConfigResource> { class ListTopMenus implements RestReadView<ConfigResource> {
private final DynamicSet<TopMenu> extensions; private final PluginSetContext<TopMenu> extensions;
@Inject @Inject
ListTopMenus(DynamicSet<TopMenu> extensions) { ListTopMenus(PluginSetContext<TopMenu> extensions) {
this.extensions = extensions; this.extensions = extensions;
} }
@Override @Override
public List<TopMenu.MenuEntry> apply(ConfigResource resource) { public List<TopMenu.MenuEntry> apply(ConfigResource resource) {
List<TopMenu.MenuEntry> entries = new ArrayList<>(); List<TopMenu.MenuEntry> entries = new ArrayList<>();
for (TopMenu extension : extensions) { extensions.runEach(extension -> entries.addAll(extension.getEntries()));
entries.addAll(extension.getEntries());
}
return entries; return entries;
} }
} }