Merge branch 'stable-2.14'

* stable-2.14:
  Fix computation of the target branch on CI
  Align button width to labels
  Bring navigation back to Gerrit
  Align action buttons with the rest of plugin info
  Display plugin description
  Define new annotation to get the plugin URL path
  Add intro page after first admin login into Gerrit
  Redirect using path-based URL

Change-Id: I8939e170e1de6b8282b4a1b2f9e2e36c2c761ac8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/AvailablePluginsCollection.java b/src/main/java/com/googlesource/gerrit/plugins/manager/AvailablePluginsCollection.java
index 6c0629c..a0e595a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/AvailablePluginsCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/AvailablePluginsCollection.java
@@ -29,16 +29,15 @@
 import com.google.inject.Singleton;
 
 @Singleton
-public class AvailablePluginsCollection implements
-    RestCollection<TopLevelResource, PluginResource>,
-    AcceptsCreate<TopLevelResource> {
+public class AvailablePluginsCollection
+    implements RestCollection<TopLevelResource, PluginResource>, AcceptsCreate<TopLevelResource> {
 
   private final DynamicMap<RestView<PluginResource>> views;
   private final Provider<ListAvailablePlugins> list;
 
   @Inject
-  AvailablePluginsCollection(DynamicMap<RestView<PluginResource>> views,
-                             Provider<ListAvailablePlugins> list) {
+  AvailablePluginsCollection(
+      DynamicMap<RestView<PluginResource>> views, Provider<ListAvailablePlugins> list) {
     this.views = views;
     this.list = list;
   }
@@ -51,7 +50,7 @@
   @Override
   public PluginResource parse(TopLevelResource parent, IdString id)
       throws ResourceNotFoundException {
-      throw new ResourceNotFoundException(id);
+    throw new ResourceNotFoundException(id);
   }
 
   @Override
@@ -60,8 +59,8 @@
   }
 
   @Override
-  public <I> RestModifyView<TopLevelResource, I> create(
-      TopLevelResource parent, IdString id) throws RestApiException {
+  public RestModifyView<TopLevelResource, ?> create(TopLevelResource parent, IdString id)
+      throws RestApiException {
     throw new IllegalArgumentException("Operation not supported");
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java b/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java
index 2c931b3..722d406 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java
@@ -24,42 +24,41 @@
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 import java.util.Date;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 public class FirstWebLoginListener implements WebLoginListener {
   private final Path pluginData;
   private final PluginLoader pluginLoader;
+  private final PluginManagerConfig config;
   private final String pluginUrlPath;
 
   @Inject
-  public FirstWebLoginListener(PluginLoader pluginLoader,
+  public FirstWebLoginListener(
+      PluginLoader pluginLoader,
       @PluginData Path pluginData,
-      @PluginCanonicalWebUrlPath String pluginUrlPath) {
+      @PluginCanonicalWebUrlPath String pluginUrlPath,
+      PluginManagerConfig config) {
     this.pluginData = pluginData;
     this.pluginLoader = pluginLoader;
     this.pluginUrlPath = pluginUrlPath;
+    this.config = config;
   }
 
   @Override
-  public void onLogin(IdentifiedUser user, HttpServletRequest request,
-      HttpServletResponse response) throws IOException {
-    if (pluginLoader.isRemoteAdminEnabled()
-        && user.getCapabilities().canAdministrateServer()) {
-      Path firstLoginFile =
-          pluginData.resolve("firstLogin." + user.getAccountId().get());
+  public void onLogin(IdentifiedUser user, HttpServletRequest request, HttpServletResponse response)
+      throws IOException {
+    if (pluginLoader.isRemoteAdminEnabled() && config.canAdministerPlugins()) {
+      Path firstLoginFile = pluginData.resolve("firstLogin." + user.getAccountId().get());
       if (!firstLoginFile.toFile().exists()) {
         response.sendRedirect(pluginUrlPath + "static/intro.html");
 
-        Files.write(firstLoginFile, new Date().toString().getBytes(),
-            StandardOpenOption.CREATE);
+        Files.write(firstLoginFile, new Date().toString().getBytes(), StandardOpenOption.CREATE);
       }
     }
   }
 
   @Override
-  public void onLogout(IdentifiedUser user, HttpServletRequest request,
-      HttpServletResponse response) {
-  }
+  public void onLogout(
+      IdentifiedUser user, HttpServletRequest request, HttpServletResponse response) {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/GerritVersionBranch.java b/src/main/java/com/googlesource/gerrit/plugins/manager/GerritVersionBranch.java
index 467e3a3..ccf3e69 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/GerritVersionBranch.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/GerritVersionBranch.java
@@ -18,7 +18,8 @@
   private static final String GERRIT_NEXT_VERSION = "2.15";
 
   public static String getBranch(String gerritVersion) {
-    if (gerritVersion == null || gerritVersion.trim().isEmpty()
+    if (gerritVersion == null
+        || gerritVersion.trim().isEmpty()
         || !Character.isDigit(gerritVersion.trim().charAt(0))
         || gerritVersion.startsWith(GERRIT_NEXT_VERSION)) {
       return "master";
@@ -35,8 +36,7 @@
       String fixVersionNumber = versionNumbers[2];
       if (fixVersionNumber.contains("-")) {
         String nextVersion =
-            String.format("%s.%d", versionNumbers[0],
-                Integer.parseInt(versionNumbers[1]) + 1);
+            String.format("%s.%d", versionNumbers[0], Integer.parseInt(versionNumbers[1]) + 1);
         if (nextVersion.equals(GERRIT_NEXT_VERSION)) {
           return "master";
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/ListAvailablePlugins.java b/src/main/java/com/googlesource/gerrit/plugins/manager/ListAvailablePlugins.java
index 9d2bb66..76e7669 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/ListAvailablePlugins.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/ListAvailablePlugins.java
@@ -24,9 +24,7 @@
 import com.google.gson.JsonElement;
 import com.google.gson.reflect.TypeToken;
 import com.google.inject.Inject;
-
 import com.googlesource.gerrit.plugins.manager.repository.PluginInfo;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -55,21 +53,23 @@
     try {
       plugins = new ArrayList<>(pluginsCache.availablePlugins());
     } catch (ExecutionException e) {
-      throw new RestApiException(
-          "Unable to load the list of available plugins", e);
+      throw new RestApiException("Unable to load the list of available plugins", e);
     }
-    Collections.sort(plugins, new Comparator<PluginInfo>() {
-      @Override
-      public int compare(PluginInfo a, PluginInfo b) {
-        return a.name.compareTo(b.name);
-      }
-    });
+    Collections.sort(
+        plugins,
+        new Comparator<PluginInfo>() {
+          @Override
+          public int compare(PluginInfo a, PluginInfo b) {
+            return a.name.compareTo(b.name);
+          }
+        });
 
     for (PluginInfo p : plugins) {
       output.put(p.name, p);
     }
 
-    return OutputFormat.JSON.newGson().toJsonTree(output,
-        new TypeToken<Map<String, Object>>() {}.getType());
+    return OutputFormat.JSON
+        .newGson()
+        .toJsonTree(output, new TypeToken<Map<String, Object>>() {}.getType());
   }
 }
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 7d64c38..8a6b387 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/Module.java
@@ -19,7 +19,6 @@
 import com.google.gerrit.extensions.webui.TopMenu;
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.UniqueAnnotations;
-
 import com.googlesource.gerrit.plugins.manager.repository.CorePluginsRepository;
 import com.googlesource.gerrit.plugins.manager.repository.JenkinsCiPluginsRepository;
 import com.googlesource.gerrit.plugins.manager.repository.PluginsRepository;
@@ -28,7 +27,9 @@
 
   @Override
   protected void configure() {
-    bind(String.class).annotatedWith(PluginCanonicalWebUrlPath.class).toProvider(PluginCanonicalWebUrlPathProvider.class);
+    bind(String.class)
+        .annotatedWith(PluginCanonicalWebUrlPath.class)
+        .toProvider(PluginCanonicalWebUrlPathProvider.class);
 
     DynamicSet.bind(binder(), TopMenu.class).to(PluginManagerTopMenu.class);
 
@@ -38,8 +39,6 @@
 
     install(PluginsCentralCache.module());
 
-    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(
-        OnStartStop.class);
-
+    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(OnStartStop.class);
   }
 }
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 1032613..9db6d87 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/OnStartStop.java
@@ -17,14 +17,11 @@
 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 org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.Collection;
 import java.util.concurrent.ExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class OnStartStop implements LifecycleListener {
   private static final Logger log = LoggerFactory.getLogger(OnStartStop.class);
@@ -36,8 +33,8 @@
   private final PluginManagerConfig config;
 
   @Inject
-  public OnStartStop(PluginsCentralCache pluginsCache,
-      @PluginName String pluginName, PluginManagerConfig config) {
+  public OnStartStop(
+      PluginsCentralCache pluginsCache, @PluginName String pluginName, PluginManagerConfig config) {
     this.pluginsCache = pluginsCache;
     this.pluginName = pluginName;
     this.config = config;
@@ -46,25 +43,26 @@
   @Override
   public void start() {
     if (config.isCachePreloadEnabled()) {
-      Thread preloader = new Thread(new Runnable() {
+      Thread preloader =
+          new Thread(
+              new Runnable() {
 
-        @Override
-        public void run() {
-          log.info("Start-up: pre-loading list of plugins from registry");
-          try {
-            Collection<PluginInfo> plugins = pluginsCache.availablePlugins();
-            log.info("{} plugins successfully pre-loaded", plugins.size());
-          } catch (ExecutionException e) {
-            log.error("Cannot access plugins list at this time", e);
-          }
-        }
-      });
+                @Override
+                public void run() {
+                  log.info("Start-up: pre-loading list of plugins from registry");
+                  try {
+                    Collection<PluginInfo> plugins = pluginsCache.availablePlugins();
+                    log.info("{} plugins successfully pre-loaded", plugins.size());
+                  } catch (ExecutionException e) {
+                    log.error("Cannot access plugins list at this time", e);
+                  }
+                }
+              });
       preloader.setName(pluginName + "-preloader");
       preloader.start();
     }
   }
 
   @Override
-  public void stop() {
-  }
+  public void stop() {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java
index b7dfb63..02e4a58 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java
@@ -15,20 +15,32 @@
 package com.googlesource.gerrit.plugins.manager;
 
 import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 
 public class PluginManagerConfig {
-  private static final String DEFAULT_GERRIT_CI_URL =
-      "https://gerrit-ci.gerritforge.com";
+  private static final String DEFAULT_GERRIT_CI_URL = "https://gerrit-ci.gerritforge.com";
 
   private final PluginConfig config;
+  private final Provider<CurrentUser> currentUserProvider;
+  private final PermissionBackend permissions;
 
   @Inject
-  public PluginManagerConfig(PluginConfigFactory configFactory,
-      @PluginName String pluginName) {
+  public PluginManagerConfig(
+      PluginConfigFactory configFactory,
+      @PluginName String pluginName,
+      Provider<CurrentUser> currentUserProvider,
+      PermissionBackend permissions) {
     this.config = configFactory.getFromGerritConfig(pluginName);
+    this.currentUserProvider = currentUserProvider;
+    this.permissions = permissions;
   }
 
   public String getJenkinsUrl() {
@@ -38,4 +50,13 @@
   public boolean isCachePreloadEnabled() {
     return config.getBoolean("preload", true);
   }
+
+  public boolean canAdministerPlugins() {
+    try {
+      permissions.user(currentUserProvider).check(GlobalPermission.ADMINISTRATE_SERVER);
+      return true;
+    } catch (AuthException | PermissionBackendException e) {
+      return false;
+    }
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerRestApiServlet.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerRestApiServlet.java
index bb94616..81cd2c7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerRestApiServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerRestApiServlet.java
@@ -24,9 +24,7 @@
   private static final long serialVersionUID = 1L;
 
   @Inject
-  PluginManagerRestApiServlet(
-      Globals globals,
-      AvailablePluginsCollection members) {
+  PluginManagerRestApiServlet(Globals globals, AvailablePluginsCollection members) {
     super(globals, Providers.of(members));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java
index 916edfd..378ff83 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java
@@ -16,12 +16,9 @@
 
 import com.google.gerrit.extensions.client.MenuItem;
 import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.plugins.PluginLoader;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -29,27 +26,27 @@
 @Singleton
 public class PluginManagerTopMenu implements TopMenu {
 
-  private PluginLoader loader;
-  private List<MenuEntry> menuEntries;
-  private Provider<CurrentUser> userProvider;
+  private final PluginLoader loader;
+  private final PluginManagerConfig config;
+  private final List<MenuEntry> menuEntries;
 
   @Inject
-  public PluginManagerTopMenu(@PluginCanonicalWebUrlPath String myUrl,
-      PluginLoader loader, Provider<CurrentUser> userProvider) {
+  public PluginManagerTopMenu(
+      @PluginCanonicalWebUrlPath String myUrl, PluginLoader loader, PluginManagerConfig config) {
     this.loader = loader;
-    this.userProvider = userProvider;
+    this.config = config;
     this.menuEntries =
-        Arrays.asList(new MenuEntry("Plugins", Arrays.asList(new MenuItem(
-            "Manage", myUrl + "static/index.html", "_self"))));
+        Arrays.asList(
+            new MenuEntry(
+                "Plugins",
+                Arrays.asList(new MenuItem("Manage", myUrl + "static/index.html", "_self"))));
   }
 
   @Override
   public List<MenuEntry> getEntries() {
-    if (loader.isRemoteAdminEnabled()
-        && userProvider.get().getCapabilities().canAdministrateServer()) {
+    if (loader.isRemoteAdminEnabled() && config.canAdministerPlugins()) {
       return menuEntries;
     }
-
     return Collections.emptyList();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralCache.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralCache.java
index c4ffbab..1c490e0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralCache.java
@@ -19,10 +19,8 @@
 import com.google.inject.Inject;
 import com.google.inject.TypeLiteral;
 import com.google.inject.name.Named;
-
 import com.googlesource.gerrit.plugins.manager.PluginsCentralLoader.ListKey;
 import com.googlesource.gerrit.plugins.manager.repository.PluginInfo;
-
 import java.util.Collection;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -47,9 +45,12 @@
     return new CacheModule() {
       @Override
       protected void configure() {
-        cache(PluginsCentralCache.PLUGINS_LIST_CACHE_NAME, ListKey.class,
-            new TypeLiteral<Collection<PluginInfo>>() {}).expireAfterWrite(1,
-            TimeUnit.DAYS).loader(PluginsCentralLoader.class);
+        cache(
+                PluginsCentralCache.PLUGINS_LIST_CACHE_NAME,
+                ListKey.class,
+                new TypeLiteral<Collection<PluginInfo>>() {})
+            .expireAfterWrite(1, TimeUnit.DAYS)
+            .loader(PluginsCentralLoader.class);
 
         bind(PluginsCentralCache.class);
       }
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 ccc8a70..c9381dc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginsCentralLoader.java
@@ -19,18 +19,15 @@
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.manager.PluginsCentralLoader.ListKey;
 import com.googlesource.gerrit.plugins.manager.repository.PluginInfo;
 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
-    CacheLoader<ListKey, Collection<PluginInfo>> {
+public class PluginsCentralLoader extends CacheLoader<ListKey, Collection<PluginInfo>> {
 
   public static class ListKey {
     static final ListKey ALL = new ListKey();
@@ -58,12 +55,10 @@
     return pluginsMap.values();
   }
 
-  private void addAll(Map<String, PluginInfo> pluginsMap,
-      Collection<PluginInfo> plugins) {
+  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)) {
+      if (currPlugin == null || isLaterVersion(pluginInfo.version, currPlugin.version)) {
         pluginsMap.put(pluginInfo.name, pluginInfo);
       }
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/TokenReplaceOutputStream.java b/src/main/java/com/googlesource/gerrit/plugins/manager/TokenReplaceOutputStream.java
index 4eb643b..01dd35c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/TokenReplaceOutputStream.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/TokenReplaceOutputStream.java
@@ -17,7 +17,6 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
-
 import javax.servlet.ServletOutputStream;
 import javax.servlet.WriteListener;
 import javax.servlet.http.HttpServletResponse;
@@ -34,8 +33,8 @@
 
   private final int outLen;
 
-  public TokenReplaceOutputStream(HttpServletResponse resp, int contentLength,
-      byte[] token, byte[] replace) {
+  public TokenReplaceOutputStream(
+      HttpServletResponse resp, int contentLength, byte[] token, byte[] replace) {
     this.resp = resp;
     this.outLen = contentLength;
     this.token = token;
@@ -56,8 +55,7 @@
 
     byte[] outData = outBuff.toByteArray();
     byte[] cmp = new byte[token.length];
-    ByteArrayOutputStream convertedData =
-        new ByteArrayOutputStream(outData.length);
+    ByteArrayOutputStream convertedData = new ByteArrayOutputStream(outData.length);
 
     for (int i = 0; i < outData.length; i++) {
       byte b = outData[i];
@@ -98,8 +96,7 @@
   }
 
   @Override
-  public void setWriteListener(WriteListener writeListener) {
-  }
+  public void setWriteListener(WriteListener writeListener) {}
 
   @Override
   public boolean isReady() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/WebModule.java b/src/main/java/com/googlesource/gerrit/plugins/manager/WebModule.java
index 0cbc9c8..86405c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/WebModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/WebModule.java
@@ -22,8 +22,7 @@
   @Override
   protected void configureServlets() {
     bind(AvailablePluginsCollection.class);
-    DynamicSet.bind(binder(), WebLoginListener.class)
-      .to(FirstWebLoginListener.class);
+    DynamicSet.bind(binder(), WebLoginListener.class).to(FirstWebLoginListener.class);
 
     serve("/available*").with(PluginManagerRestApiServlet.class);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/XAuthFilter.java b/src/main/java/com/googlesource/gerrit/plugins/manager/XAuthFilter.java
index 57fc2c9..de1eb10 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/XAuthFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/XAuthFilter.java
@@ -19,13 +19,8 @@
 import com.google.gerrit.server.AccessPath;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.io.PrintWriter;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -36,6 +31,8 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 public class XAuthFilter implements Filter {
@@ -49,12 +46,11 @@
   }
 
   @Override
-  public void destroy() {
-  }
+  public void destroy() {}
 
   @Override
-  public void doFilter(ServletRequest req, ServletResponse resp,
-      FilterChain chain) throws IOException, ServletException {
+  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
+      throws IOException, ServletException {
     HttpServletRequest httpReq = (HttpServletRequest) req;
     HttpServletResponse httpResp = (HttpServletResponse) resp;
 
@@ -64,34 +60,38 @@
       session.setAccessPathOk(AccessPath.REST_API, true);
 
       log.debug("Injecting X-Gerrit-Auth for {}", httpReq.getRequestURI());
-      httpResp = new HttpServletResponseWrapper(httpResp) {
+      httpResp =
+          new HttpServletResponseWrapper(httpResp) {
 
-        private int origContentLength;
+            private int origContentLength;
 
-        @Override
-        public void setHeader(String name, String value) {
-          log.debug("{}: {}", name, value);
-          if (name.equalsIgnoreCase("Content-Length")) {
-            origContentLength = Integer.parseInt(value);
-          } else {
-            super.setHeader(name, value);
-          }
-        }
+            @Override
+            public void setHeader(String name, String value) {
+              log.debug("{}: {}", name, value);
+              if (name.equalsIgnoreCase("Content-Length")) {
+                origContentLength = Integer.parseInt(value);
+              } else {
+                super.setHeader(name, value);
+              }
+            }
 
-        @Override
-        public PrintWriter getWriter() throws IOException {
-          return super.getWriter();
-        }
+            @Override
+            public PrintWriter getWriter() throws IOException {
+              return super.getWriter();
+            }
 
-        @Override
-        public ServletOutputStream getOutputStream() throws IOException {
-          return new TokenReplaceOutputStream(
-              (HttpServletResponse) getResponse(), origContentLength,
-              "@X-Gerrit-Auth".getBytes(), gerritAuth.getBytes());
-        }
-      };
+            @Override
+            public ServletOutputStream getOutputStream() throws IOException {
+              return new TokenReplaceOutputStream(
+                  (HttpServletResponse) getResponse(),
+                  origContentLength,
+                  "@X-Gerrit-Auth".getBytes(),
+                  gerritAuth.getBytes());
+            }
+          };
 
-      httpResp.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate, max-age=0");
+      httpResp.setHeader(
+          "Cache-Control", "private, no-cache, no-store, must-revalidate, max-age=0");
       httpResp.setHeader("Pragma", "no-cache");
       httpResp.setHeader("Expires", "0");
 
@@ -103,6 +103,5 @@
   }
 
   @Override
-  public void init(FilterConfig conf) throws ServletException {
-  }
+  public void init(FilterConfig conf) throws ServletException {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartGson.java b/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartGson.java
index ba1069a..f8516e2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartGson.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartGson.java
@@ -17,7 +17,6 @@
 import com.google.gerrit.server.OutputFormat;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
-
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
@@ -51,8 +50,7 @@
     try {
       ciUrl = new URL(url);
     } catch (MalformedURLException e) {
-      throw new IllegalArgumentException(
-          "Internal error: Gerrit CI URL seems to be malformed", e);
+      throw new IllegalArgumentException("Internal error: Gerrit CI URL seems to be malformed", e);
     }
     return new InputStreamReader(ciUrl.openStream());
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartJson.java b/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartJson.java
index d0efb56..3ea2af0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartJson.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/gson/SmartJson.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.manager.gson;
 
 import com.google.gson.JsonElement;
-
 import java.util.Optional;
 import java.util.function.Function;
 
@@ -32,16 +31,18 @@
   }
 
   public Optional<String> getOptionalString(String fieldName) {
-    return getOptional(fieldName).map(new Function<SmartJson, String>() {
-      @Override
-      public String apply(SmartJson elem) {
-        if (!elem.jsonElem.isJsonPrimitive()) {
-          throw new IllegalArgumentException("cannot convert " + elem.jsonElem
-              + " into a String");
-        }
-        return elem.jsonElem.getAsString();
-      }
-    });
+    return getOptional(fieldName)
+        .map(
+            new Function<SmartJson, String>() {
+              @Override
+              public String apply(SmartJson elem) {
+                if (!elem.jsonElem.isJsonPrimitive()) {
+                  throw new IllegalArgumentException(
+                      "cannot convert " + elem.jsonElem + " into a String");
+                }
+                return elem.jsonElem.getAsString();
+              }
+            });
   }
 
   public String getString(String fieldName) {
@@ -49,9 +50,10 @@
   }
 
   public Optional<SmartJson> getOptional(String fieldName) {
-    if (jsonElem != null && !jsonElem.isJsonNull() && jsonElem.getAsJsonObject().get(fieldName) != null) {
-      return Optional.of(SmartJson
-          .of(jsonElem.getAsJsonObject().get(fieldName)));
+    if (jsonElem != null
+        && !jsonElem.isJsonNull()
+        && jsonElem.getAsJsonObject().get(fieldName) != null) {
+      return Optional.of(SmartJson.of(jsonElem.getAsJsonObject().get(fieldName)));
     }
     return Optional.empty();
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/CorePluginsRepository.java b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/CorePluginsRepository.java
index af92981..8e96e6a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/CorePluginsRepository.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/CorePluginsRepository.java
@@ -20,10 +20,6 @@
 import com.google.gerrit.common.Version;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -37,18 +33,18 @@
 import java.util.jar.JarFile;
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class CorePluginsRepository implements PluginsRepository {
-  private static final Logger log = LoggerFactory
-      .getLogger(CorePluginsRepository.class);
+  private static final Logger log = LoggerFactory.getLogger(CorePluginsRepository.class);
   private static final String GERRIT_VERSION = Version.getVersion();
 
   private final SitePaths site;
   private final CorePluginsDescriptions pluginsDescriptions;
 
   @Inject
-  public CorePluginsRepository(SitePaths site,
-      CorePluginsDescriptions pd) {
+  public CorePluginsRepository(SitePaths site, CorePluginsDescriptions pd) {
     this.site = site;
     this.pluginsDescriptions = pd;
   }
@@ -57,13 +53,11 @@
     @Override
     public boolean apply(JarEntry entry) {
       String entryName = entry.getName();
-      return (entryName.startsWith("WEB-INF/plugins") &&
-              entryName.endsWith(".jar"));
+      return (entryName.startsWith("WEB-INF/plugins") && entryName.endsWith(".jar"));
     }
   }
 
-  class ExtractPluginInfoFromJarEntry implements
-      Function<JarEntry, PluginInfo> {
+  class ExtractPluginInfoFromJarEntry implements Function<JarEntry, PluginInfo> {
     private String gerritWarFilename;
 
     public ExtractPluginInfoFromJarEntry(String gerritWarFilename) {
@@ -74,10 +68,8 @@
     public PluginInfo apply(JarEntry entry) {
       try {
         Path entryName = Paths.get(entry.getName());
-        URI pluginUrl =
-            new URI("jar:file:" + gerritWarFilename + "!/" + entry.getName());
-        try (JarInputStream pluginJar =
-            new JarInputStream(pluginUrl.toURL().openStream())) {
+        URI pluginUrl = new URI("jar:file:" + gerritWarFilename + "!/" + entry.getName());
+        try (JarInputStream pluginJar = new JarInputStream(pluginUrl.toURL().openStream())) {
           Manifest manifestJarEntry = getManifestEntry(pluginJar);
           if (manifestJarEntry != null) {
             Attributes pluginAttributes = manifestJarEntry.getMainAttributes();
@@ -85,11 +77,12 @@
             return new PluginInfo(
                 pluginName,
                 pluginsDescriptions.get(pluginName).orElse(""),
-                pluginAttributes.getValue("Implementation-Version"), "",
+                pluginAttributes.getValue("Implementation-Version"),
+                "",
                 pluginUrl.toString());
           }
-          return new PluginInfo(entryName.getFileName().toString(), "", "", "",
-              pluginUrl.toString());
+          return new PluginInfo(
+              entryName.getFileName().toString(), "", "", "", pluginUrl.toString());
         } catch (IOException e) {
           log.error("Unable to open plugin " + pluginUrl, e);
           return null;
@@ -100,10 +93,10 @@
       }
     }
 
-    private Manifest getManifestEntry(JarInputStream pluginJar)
-        throws IOException {
-      for (JarEntry entry = pluginJar.getNextJarEntry(); entry != null; entry =
-          pluginJar.getNextJarEntry()) {
+    private Manifest getManifestEntry(JarInputStream pluginJar) throws IOException {
+      for (JarEntry entry = pluginJar.getNextJarEntry();
+          entry != null;
+          entry = pluginJar.getNextJarEntry()) {
         if (entry.getName().equals("META-INF/MANIFEST.MF")) {
           return new Manifest(pluginJar);
         }
@@ -116,8 +109,9 @@
   public Collection<PluginInfo> list(String gerritVersion) throws IOException {
     if (!gerritVersion.equals(GERRIT_VERSION)) {
       log.warn(
-          "No core plugins available for version {} which is different than " +
-          "the current running Gerrit", gerritVersion);
+          "No core plugins available for version {} which is different than "
+              + "the current running Gerrit",
+          gerritVersion);
       return Collections.emptyList();
     }
 
@@ -129,22 +123,23 @@
 
     try (JarFile gerritWar = new JarFile(gerritWarPath.toFile())) {
 
-      return FluentIterable
-          .from(Collections.list(gerritWar.entries()))
+      return FluentIterable.from(Collections.list(gerritWar.entries()))
           .filter(new SelectPluginsFromJar())
-          .transform(
-              new ExtractPluginInfoFromJarEntry(gerritWarPath.toString()))
-          .filter(new Predicate<PluginInfo>() {
-            @Override
-            public boolean apply(PluginInfo pluginInfo) {
-              return pluginInfo != null;
-            }
-          }).toSortedList(new Comparator<PluginInfo>() {
-            @Override
-            public int compare(PluginInfo a, PluginInfo b) {
-              return a.name.compareTo(b.name);
-            }
-          });
+          .transform(new ExtractPluginInfoFromJarEntry(gerritWarPath.toString()))
+          .filter(
+              new Predicate<PluginInfo>() {
+                @Override
+                public boolean apply(PluginInfo pluginInfo) {
+                  return pluginInfo != null;
+                }
+              })
+          .toSortedList(
+              new Comparator<PluginInfo>() {
+                @Override
+                public int compare(PluginInfo a, PluginInfo b) {
+                  return a.name.compareTo(b.name);
+                }
+              });
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/JenkinsCiPluginsRepository.java b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/JenkinsCiPluginsRepository.java
index 2c5e4db..6eb29a3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/JenkinsCiPluginsRepository.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/JenkinsCiPluginsRepository.java
@@ -19,16 +19,10 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
 import com.googlesource.gerrit.plugins.manager.GerritVersionBranch;
 import com.googlesource.gerrit.plugins.manager.PluginManagerConfig;
 import com.googlesource.gerrit.plugins.manager.gson.SmartGson;
 import com.googlesource.gerrit.plugins.manager.gson.SmartJson;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -39,6 +33,9 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Function;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 public class JenkinsCiPluginsRepository implements PluginsRepository {
@@ -63,8 +60,7 @@
   private final Provider<SmartGson> gsonProvider;
 
   @Inject
-  public JenkinsCiPluginsRepository(Provider<SmartGson> gsonProvider,
-      PluginManagerConfig config) {
+  public JenkinsCiPluginsRepository(Provider<SmartGson> gsonProvider, PluginManagerConfig config) {
     this.gsonProvider = gsonProvider;
     this.config = config;
   }
@@ -72,7 +68,7 @@
   @Override
   public List<PluginInfo> list(String gerritVersion) throws IOException {
     List<PluginInfo> list = cache.get(gerritVersion);
-    if(list == null) {
+    if (list == null) {
       list = getList(gerritVersion);
       cache.put(gerritVersion, list);
     }
@@ -86,8 +82,7 @@
 
     try {
       Job[] jobs =
-          gson.get(config.getJenkinsUrl() + "/view/" + viewName + "/api/json",
-              View.class).jobs;
+          gson.get(config.getJenkinsUrl() + "/view/" + viewName + "/api/json", View.class).jobs;
 
       for (Job job : jobs) {
         if (job.color.equals("blue")) {
@@ -108,18 +103,20 @@
     SmartJson jobDetails = gson.get(url + "/api/json");
     Optional<SmartJson> lastSuccessfulBuild = jobDetails.getOptional("lastSuccessfulBuild");
 
-    return lastSuccessfulBuild.flatMap(new Function<SmartJson, Optional<PluginInfo>>() {
-      @Override
-      public Optional<PluginInfo> apply(SmartJson build) {
-        String buildUrl = build.getString("url");
-        return getPluginArtifactInfo(buildUrl);
-      }
-    });
+    return lastSuccessfulBuild.flatMap(
+        new Function<SmartJson, Optional<PluginInfo>>() {
+          @Override
+          public Optional<PluginInfo> apply(SmartJson build) {
+            String buildUrl = build.getString("url");
+            return getPluginArtifactInfo(buildUrl);
+          }
+        });
   }
 
   private Optional<PluginInfo> getPluginArtifactInfo(String url) {
     Optional<SmartJson> buildExecution = tryGetJson(url + "/api/json");
-    Optional<JsonArray> artifacts = buildExecution.map(json -> json.get("artifacts").get().getAsJsonArray());
+    Optional<JsonArray> artifacts =
+        buildExecution.map(json -> json.get("artifacts").get().getAsJsonArray());
     if (artifacts.orElse(new JsonArray()).size() == 0) {
       return Optional.empty();
     }
@@ -132,14 +129,19 @@
     String pluginPath = artifactJson.get().getString("relativePath");
 
     String[] pluginPathParts = pluginPath.split("/");
-    String pluginName = isMavenBuild(pluginPathParts) ? fixPluginNameForMavenBuilds(pluginPathParts)
-        : pluginNameOfJar(pluginPathParts);
+    String pluginName =
+        isMavenBuild(pluginPathParts)
+            ? fixPluginNameForMavenBuilds(pluginPathParts)
+            : pluginNameOfJar(pluginPathParts);
 
-    String pluginUrl = String.format("%s/artifact/%s", buildExecution.get().getString("url"), pluginPath);
+    String pluginUrl =
+        String.format("%s/artifact/%s", buildExecution.get().getString("url"), pluginPath);
 
-    Optional<String> pluginVersion = fetchArtifact(buildExecution.get(), artifacts.get(), ".jar-version");
-    Optional<String> pluginDescription = fetchArtifactJson(buildExecution.get(), artifacts.get(), ".json")
-        .flatMap(json -> json.getOptionalString("description"));
+    Optional<String> pluginVersion =
+        fetchArtifact(buildExecution.get(), artifacts.get(), ".jar-version");
+    Optional<String> pluginDescription =
+        fetchArtifactJson(buildExecution.get(), artifacts.get(), ".json")
+            .flatMap(json -> json.getOptionalString("description"));
 
     for (JsonElement elem : buildExecution.get().get("actions").get().getAsJsonArray()) {
       SmartJson elemJson = SmartJson.of(elem);
@@ -147,21 +149,26 @@
 
       if (lastBuildRevision.isPresent()) {
         String sha1 = lastBuildRevision.get().getString("SHA1").substring(0, 8);
-        return pluginVersion
-            .map(version -> new PluginInfo(pluginName, pluginDescription.orElse(""), version, sha1, pluginUrl));
+        return pluginVersion.map(
+            version ->
+                new PluginInfo(pluginName, pluginDescription.orElse(""), version, sha1, pluginUrl));
       }
     }
 
     return Optional.empty();
   }
 
-  private Optional<String> fetchArtifact(SmartJson buildExecution, JsonArray artifacts, String artifactSuffix) {
+  private Optional<String> fetchArtifact(
+      SmartJson buildExecution, JsonArray artifacts, String artifactSuffix) {
     StringBuilder artifactBody = new StringBuilder();
     Optional<SmartJson> verArtifactJson = findArtifact(artifacts, artifactSuffix);
     if (verArtifactJson.isPresent()) {
-      String versionUrl = String.format("%s/artifact/%s", buildExecution.getString("url"),
-          verArtifactJson.get().getString("relativePath"));
-      try (BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(versionUrl).openStream()), 4096)) {
+      String versionUrl =
+          String.format(
+              "%s/artifact/%s",
+              buildExecution.getString("url"), verArtifactJson.get().getString("relativePath"));
+      try (BufferedReader reader =
+          new BufferedReader(new InputStreamReader(new URL(versionUrl).openStream()), 4096)) {
         String line;
         while ((line = reader.readLine()) != null) {
           if (artifactBody.length() > 0) {
@@ -169,7 +176,7 @@
           }
           artifactBody.append(line);
         }
-      } catch(Exception e) {
+      } catch (Exception e) {
         log.error("Unable to fetch artifact from " + versionUrl);
         return Optional.empty();
       }
@@ -177,10 +184,16 @@
     return Optional.of(artifactBody.toString());
   }
 
-  private Optional<SmartJson> fetchArtifactJson(SmartJson buildExecution, JsonArray artifacts, String artifactSuffix) {
+  private Optional<SmartJson> fetchArtifactJson(
+      SmartJson buildExecution, JsonArray artifacts, String artifactSuffix) {
     Optional<SmartJson> jsonArtifact = findArtifact(artifacts, artifactSuffix);
-    return jsonArtifact.flatMap(artifactJson -> tryGetJson(String.format("%s/artifact/%s",
-        buildExecution.getString("url"), jsonArtifact.get().getString("relativePath"))));
+    return jsonArtifact.flatMap(
+        artifactJson ->
+            tryGetJson(
+                String.format(
+                    "%s/artifact/%s",
+                    buildExecution.getString("url"),
+                    jsonArtifact.get().getString("relativePath"))));
   }
 
   private Optional<SmartJson> tryGetJson(String url) {
@@ -194,18 +207,16 @@
 
   private String fixPluginNameForMavenBuilds(String[] pluginPathParts) {
     String mavenPluginFilename =
-        StringUtils.substringBeforeLast(
-            pluginPathParts[pluginPathParts.length - 1], ".");
+        StringUtils.substringBeforeLast(pluginPathParts[pluginPathParts.length - 1], ".");
     int versionDelim = mavenPluginFilename.indexOf('-');
-    return versionDelim > 0 ? mavenPluginFilename
-        .substring(0, versionDelim) : mavenPluginFilename;
+    return versionDelim > 0 ? mavenPluginFilename.substring(0, versionDelim) : mavenPluginFilename;
   }
 
   private String pluginNameOfJar(String[] pluginJarParts) {
-    int filePos = pluginJarParts.length-1;
+    int filePos = pluginJarParts.length - 1;
     int pathPos = filePos - 1;
 
-    if(pluginJarParts[filePos].startsWith(pluginJarParts[pathPos])) {
+    if (pluginJarParts[filePos].startsWith(pluginJarParts[pathPos])) {
       return pluginJarParts[pathPos];
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/PluginInfo.java b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/PluginInfo.java
index 51a5471..ac30a64 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/manager/repository/PluginInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/manager/repository/PluginInfo.java
@@ -32,4 +32,4 @@
     this.sha1 = sha1;
     this.url = url;
   }
-}
\ No newline at end of file
+}