Manage attach of ApiModule binding upon plugin reload
The introduction of the x-plugin communication in I63c9b7f2a
did not consider the special case of plugin reloading where
the bindings are updated atomically rather than being
removed and reconnected.
Reattach all Dynamic{Item,Set,Map} also coming from ApiModule
when reloading plugins in the same way was done for the other
API provided by Gerrit core.
Bug: Issue 346350837
Release-Notes: Fix binding of ApiModule bindings upload plugin reload
Change-Id: I6cda1b3fcf9dcd14ea851f765099be8707071c62
diff --git a/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
index 89d6f8f..59e3342 100644
--- a/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
+++ b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
@@ -362,6 +362,23 @@
reattachItem(old, sysItems, newPlugin.getSysInjector(), newPlugin);
reattachItem(old, sshItems, newPlugin.getSshInjector(), newPlugin);
reattachItem(old, httpItems, newPlugin.getHttpInjector(), newPlugin);
+
+ apiInjector = Optional.ofNullable(newPlugin.getApiInjector()).orElse(apiInjector);
+
+ if (apiInjector != null) {
+ apiItems.putAll(dynamicItemsOf(apiInjector));
+ apiSets.putAll(dynamicSetsOf(apiInjector));
+ apiMaps.putAll(dynamicMapsOf(apiInjector));
+
+ List<Injector> allPluginInjectors =
+ listOfInjectors(
+ newPlugin.getSysInjector(),
+ newPlugin.getSshInjector(),
+ newPlugin.getHttpInjector());
+ allPluginInjectors.forEach(i -> reattachItem(old, apiItems, i, newPlugin));
+ allPluginInjectors.forEach(i -> reattachSet(old, apiSets, i, newPlugin));
+ allPluginInjectors.forEach(i -> reattachMap(old, apiMaps, i, newPlugin));
+ }
} finally {
exit(oldContext);
}