Support multiple plugins repositories bindings Change-Id: I023b0b339f4999f4d62f68e2f4070f7af72d92a6
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java b/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java index c29f2c9..0a96bfb 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java
@@ -29,7 +29,8 @@ protected void configure() { DynamicSet.bind(binder(), TopMenu.class).to(PluginManagerTopMenu.class); - bind(PluginsRepository.class).to(JenkinsCiPluginsRepository.class); + DynamicSet.setOf(binder(), PluginsRepository.class); + DynamicSet.bind(binder(), PluginsRepository.class).to(JenkinsCiPluginsRepository.class); install(PluginsCentralCache.module());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java b/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java index 8156016..1032613 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java
@@ -14,33 +14,31 @@ package com.googlesource.gerrit.plugins.manager; -import com.google.gerrit.common.Version; import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.manager.repository.PluginInfo; -import com.googlesource.gerrit.plugins.manager.repository.PluginsRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; import java.util.Collection; +import java.util.concurrent.ExecutionException; public class OnStartStop implements LifecycleListener { private static final Logger log = LoggerFactory.getLogger(OnStartStop.class); - private final PluginsRepository pluginsRepo; + private final PluginsCentralCache pluginsCache; private final String pluginName; private final PluginManagerConfig config; @Inject - public OnStartStop(PluginsRepository pluginsRepo, + public OnStartStop(PluginsCentralCache pluginsCache, @PluginName String pluginName, PluginManagerConfig config) { - this.pluginsRepo = pluginsRepo; + this.pluginsCache = pluginsCache; this.pluginName = pluginName; this.config = config; } @@ -54,10 +52,9 @@ public void run() { log.info("Start-up: pre-loading list of plugins from registry"); try { - Collection<PluginInfo> plugins = - pluginsRepo.list(Version.getVersion()); + Collection<PluginInfo> plugins = pluginsCache.availablePlugins(); log.info("{} plugins successfully pre-loaded", plugins.size()); - } catch (IOException e) { + } catch (ExecutionException e) { log.error("Cannot access plugins list at this time", e); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java index d7bf1b9..ccc8a70 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java
@@ -16,6 +16,7 @@ import com.google.common.cache.CacheLoader; import com.google.gerrit.common.Version; +import com.google.gerrit.extensions.registration.DynamicSet; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -24,6 +25,8 @@ import com.googlesource.gerrit.plugins.manager.repository.PluginsRepository; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; @Singleton public class PluginsCentralLoader extends @@ -37,15 +40,55 @@ private static final String GERRIT_VERSION = Version.getVersion(); - private final PluginsRepository repository; + private final DynamicSet<PluginsRepository> repositories; @Inject - public PluginsCentralLoader(PluginsRepository repository) { - this.repository = repository; + public PluginsCentralLoader(DynamicSet<PluginsRepository> repositories) { + this.repositories = repositories; } @Override public Collection<PluginInfo> load(ListKey all) throws Exception { - return repository.list(GERRIT_VERSION); + Map<String, PluginInfo> pluginsMap = new HashMap<>(); + Collection<PluginInfo> plugins; + for (PluginsRepository pluginsRepository : repositories) { + plugins = pluginsRepository.list(GERRIT_VERSION); + addAll(pluginsMap, plugins); + } + return pluginsMap.values(); + } + + private void addAll(Map<String, PluginInfo> pluginsMap, + Collection<PluginInfo> plugins) { + for (PluginInfo pluginInfo : plugins) { + PluginInfo currPlugin = pluginsMap.get(pluginInfo.name); + if (currPlugin == null + || isLaterVersion(pluginInfo.version, currPlugin.version)) { + pluginsMap.put(pluginInfo.name, pluginInfo); + } + } + } + + private boolean isLaterVersion(String newVersion, String currVersion) { + String[] vals1 = newVersion.replaceAll("-", ".").split("\\."); + String[] vals2 = currVersion.replaceAll("-", ".").split("\\."); + int i = 0; + + while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) { + i++; + } + + if (i < vals1.length && i < vals2.length) { + return compareNumOrStrings(vals1[i], vals2[i]) > 0; + } + return vals1.length - vals2.length > 0; + } + + private int compareNumOrStrings(String v1, String v2) { + try { + return Integer.parseInt(v1) - Integer.parseInt(v2); + } catch (NumberFormatException e) { + return v1.compareTo(v2); + } } }