Merge branch 'stable-2.15' into stable-2.16

* stable-2.15:
  Upgrade mockito-core to 2.26.0

Change-Id: Ia516cb5b6037c6c99cf5f0c4fb7ce90ebf2de883
diff --git a/WORKSPACE b/WORKSPACE
index af1215e..f312d73 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,11 +3,11 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "8386b3fbf80e375f0a10c8386c0a8dfe260c5c1b",
+    commit = "c827ba79413585ab9dfc1bbd0d7f609eedd6aa80",
     #local_path = "/home/<user>/projects/bazlets",
 )
 
-#Snapshot Plugin API
+# Snapshot Plugin API
 #load(
 #    "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
 #    "gerrit_api_maven_local",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
index 5dc7ff3..f40ef0f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.webhooks;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.security.KeyManagementException;
@@ -28,12 +29,10 @@
 import org.apache.http.conn.socket.PlainConnectionSocketFactory;
 import org.apache.http.conn.ssl.NoopHostnameVerifier;
 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /* HTTP client that doesn't verify remote's SSL certificate */
 class DefaultHttpClientProvider extends HttpClientProvider {
-  private static final Logger log = LoggerFactory.getLogger(DefaultHttpClientProvider.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   static final String DEFAULT = "default";
 
@@ -63,7 +62,7 @@
       context.init(null, trustAllCerts, null);
       return context;
     } catch (KeyManagementException | NoSuchAlgorithmException e) {
-      log.warn("Error building SSLContext object", e);
+      log.atWarning().withCause(e).log("Error building SSLContext object");
       return null;
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
index 1c36eeb..986c84e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
@@ -17,19 +17,18 @@
 import static com.googlesource.gerrit.plugins.webhooks.RemoteConfig.REMOTE;
 
 import com.google.common.base.Strings;
-import com.google.gerrit.common.EventListener;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventListener;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.inject.Inject;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class EventHandler implements EventListener {
-  private static final Logger log = LoggerFactory.getLogger(EventHandler.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   private final PluginConfigFactory configFactory;
   private final String pluginName;
@@ -61,17 +60,16 @@
           configFactory.getProjectPluginConfigWithInheritance(
               projectEvent.getProjectNameKey(), pluginName);
     } catch (NoSuchProjectException e) {
-      log.warn(
-          "Ignoring event for a non-existing project {}, {}",
-          projectEvent.getProjectNameKey().get(),
-          projectEvent);
+      log.atWarning().log(
+          "Ignoring event for a non-existing project %s, %s",
+          projectEvent.getProjectNameKey().get(), projectEvent);
       return;
     }
 
     for (String name : cfg.getSubsections(REMOTE)) {
       RemoteConfig remote = remoteFactory.create(cfg, name);
       if (Strings.isNullOrEmpty(remote.getUrl())) {
-        log.warn("remote.{}.url not defined, skipping this remote", name);
+        log.atWarning().log("remote.%s.url not defined, skipping this remote", name);
         continue;
       }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
index aecb43a..f9afd02 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
@@ -14,6 +14,9 @@
 
 package com.googlesource.gerrit.plugins.webhooks;
 
+import static com.google.common.flogger.LazyArgs.lazy;
+
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Provider;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ServiceUnavailableRetryStrategy;
@@ -25,12 +28,10 @@
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Provides an HTTP client with SSL capabilities. */
 abstract class HttpClientProvider implements Provider<CloseableHttpClient> {
-  private static final Logger log = LoggerFactory.getLogger(HttpClientProvider.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   private static final int CONNECTIONS_PER_ROUTE = 100;
   // Up to 2 target instances with the max number of connections per host:
   private static final int MAX_CONNECTIONS = 2 * CONNECTIONS_PER_ROUTE;
@@ -85,14 +86,9 @@
   }
 
   private void logRetry(String cause, HttpContext context) {
-    if (log.isDebugEnabled()) {
-      log.debug(
-          "Retrying request caused by '"
-              + cause
-              + "', request: '"
-              + context.getAttribute("http.request")
-              + "'");
-    }
+    log.atFine().log(
+        "Retrying request caused by '%s', request: '%s'",
+        cause, lazy(() -> context.getAttribute("http.request")));
   }
 
   private HttpClientConnectionManager create(
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
index 0c23b6e..0c5bd24 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
@@ -18,14 +18,13 @@
 import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
+import com.google.common.flogger.FluentLogger;
 import com.googlesource.gerrit.plugins.webhooks.HttpResponseHandler.HttpResult;
 import java.io.IOException;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ResponseHandler;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class HttpResponseHandler implements ResponseHandler<HttpResult> {
 
@@ -39,7 +38,7 @@
     }
   }
 
-  private static final Logger log = LoggerFactory.getLogger(HttpResponseHandler.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   @Override
   public HttpResult handleResponse(HttpResponse response) {
@@ -57,7 +56,7 @@
       try {
         return EntityUtils.toString(entity);
       } catch (IOException e) {
-        log.error("Error parsing entity", e);
+        log.atSevere().withCause(e).log("Error parsing entity");
       }
     }
     return "";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/Module.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/Module.java
index 6c06f6f..edaaeff 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/Module.java
@@ -17,10 +17,10 @@
 import static com.googlesource.gerrit.plugins.webhooks.DefaultHttpClientProvider.DEFAULT;
 import static com.googlesource.gerrit.plugins.webhooks.SslVerifyingHttpClientProvider.SSL_VERIFY;
 
-import com.google.gerrit.common.EventListener;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.events.EventListener;
 import com.google.inject.Inject;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
index 0d7fd51..90c03b9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
@@ -16,6 +16,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
@@ -25,11 +26,9 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import javax.net.ssl.SSLException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class PostTask implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(PostTask.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   interface Factory {
     PostTask create(ProjectEvent event, RemoteConfig remote);
@@ -71,7 +70,7 @@
     try {
       Optional<EventProcessor.Request> content = processor.get();
       if (!content.isPresent()) {
-        log.debug("No content. Webhook [{}] skipped.", remote.getUrl());
+        log.atFine().log("No content. Webhook [%s] skipped.", remote.getUrl());
         return;
       }
 
@@ -86,7 +85,7 @@
         logRetry(e);
         reschedule();
       } else {
-        log.error("Failed to post: {}", toString(), e);
+        log.atSevere().withCause(e).log("Failed to post: %s", toString());
       }
     }
   }
@@ -96,15 +95,12 @@
   }
 
   private void logRetry(String reason) {
-    if (log.isDebugEnabled()) {
-      log.debug("Retrying {} in {}ms. Reason: {}", toString(), remote.getRetryInterval(), reason);
-    }
+    log.atFine().log(
+        "Retrying %s in %dms. Reason: %s", toString(), remote.getRetryInterval(), reason);
   }
 
   private void logRetry(Throwable cause) {
-    if (log.isDebugEnabled()) {
-      log.debug("Retrying {} in {}ms. Cause: {}", toString(), remote.getRetryInterval(), cause);
-    }
+    log.atFine().withCause(cause).log("Retrying %s in %dms", toString(), remote.getRetryInterval());
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/WebhooksConfig.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/WebhooksConfig.java
index 88bb951..56db3f6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/WebhooksConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/WebhooksConfig.java
@@ -27,7 +27,7 @@
 
 import com.google.common.base.Strings;
 import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.VersionedMetaData;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.webhooks.rest.UpsertRemote;
 import java.io.IOException;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/DeleteRemote.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/DeleteRemote.java
index 1a4f032..7bb1470 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/DeleteRemote.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/DeleteRemote.java
@@ -17,7 +17,7 @@
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.git.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/RemotesCollection.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/RemotesCollection.java
index 4f1508c..f1e8acc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/RemotesCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/RemotesCollection.java
@@ -18,7 +18,6 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ChildCollection;
 import com.google.gerrit.extensions.restapi.IdString;
@@ -32,16 +31,13 @@
 import org.eclipse.jgit.lib.Config;
 
 @Singleton
-public class RemotesCollection
-    implements ChildCollection<ProjectWebhooksResource, RemoteResource>,
-        AcceptsCreate<ProjectWebhooksResource> {
+public class RemotesCollection implements ChildCollection<ProjectWebhooksResource, RemoteResource> {
 
   private final DynamicMap<RestView<RemoteResource>> views;
   private final PluginConfigFactory configFactory;
   private final RemoteConfig.Factory remoteFactory;
   private final Provider<ListRemotes> list;
   private final String pluginName;
-  private final UpsertRemote.Inserter.Factory inserterFactory;
 
   @Inject
   RemotesCollection(
@@ -49,14 +45,12 @@
       PluginConfigFactory configFactory,
       RemoteConfig.Factory remoteFactory,
       Provider<ListRemotes> list,
-      @PluginName String pluginName,
-      UpsertRemote.Inserter.Factory inserterFactory) {
+      @PluginName String pluginName) {
     this.views = views;
     this.configFactory = configFactory;
     this.remoteFactory = remoteFactory;
     this.list = list;
     this.pluginName = pluginName;
-    this.inserterFactory = inserterFactory;
   }
 
   @Override
@@ -80,9 +74,4 @@
   public DynamicMap<RestView<RemoteResource>> views() {
     return views;
   }
-
-  @Override
-  public UpsertRemote.Inserter create(ProjectWebhooksResource parent, IdString id) {
-    return inserterFactory.create(id.get());
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/UpsertRemote.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/UpsertRemote.java
index 0c212c6..41eedae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/UpsertRemote.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/UpsertRemote.java
@@ -19,17 +19,17 @@
 import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
 import com.google.gerrit.extensions.restapi.RestModifyView;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.git.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
 import com.googlesource.gerrit.plugins.webhooks.RemoteConfig;
 import com.googlesource.gerrit.plugins.webhooks.WebhooksConfig;
 import java.io.IOException;
@@ -67,25 +67,22 @@
   }
 
   public static class Inserter
-      implements RestModifyView<ProjectWebhooksResource, UpsertRemote.Input> {
-    public interface Factory {
-      Inserter create(String remoteName);
-    }
+      implements RestCollectionCreateView<
+          ProjectWebhooksResource, RemoteResource, UpsertRemote.Input> {
 
     private final UpsertRemote upserter;
-    private final String remoteName;
 
-    @AssistedInject
-    Inserter(UpsertRemote upserter, @Assisted String remoteName) {
+    @Inject
+    Inserter(UpsertRemote upserter) {
       this.upserter = upserter;
-      this.remoteName = remoteName;
     }
 
     @Override
-    public RemoteInfo apply(ProjectWebhooksResource rsrc, UpsertRemote.Input in)
+    public RemoteInfo apply(
+        ProjectWebhooksResource rsrc, IdString remoteName, UpsertRemote.Input in)
         throws RepositoryNotFoundException, IOException, ConfigInvalidException,
             NoSuchProjectException, AuthException {
-      return upserter.upsert(rsrc.getProject(), remoteName, in);
+      return upserter.upsert(rsrc.getProject(), remoteName.get(), in);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/WebhooksRestModule.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/WebhooksRestModule.java
index 6ab24a4..c227964 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/WebhooksRestModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/rest/WebhooksRestModule.java
@@ -18,7 +18,6 @@
 import static com.googlesource.gerrit.plugins.webhooks.rest.ProjectWebhooksResource.PROJECT_WEBHOOK_KIND;
 import static com.googlesource.gerrit.plugins.webhooks.rest.RemoteResource.REMOTE_KIND;
 
-import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.restapi.RestApiModule;
 
@@ -31,18 +30,11 @@
 
     child(CONFIG_KIND, "projects").to(ProjectsCollection.class);
     child(PROJECT_WEBHOOK_KIND, "remotes").to(RemotesCollection.class);
+    create(REMOTE_KIND).to(UpsertRemote.Inserter.class);
     get(REMOTE_KIND).to(GetRemote.class);
     put(REMOTE_KIND).to(UpsertRemote.Updater.class);
     delete(REMOTE_KIND).to(DeleteRemote.class);
 
     bind(Permissions.class).to(PermissionsImpl.class);
-
-    install(
-        new FactoryModule() {
-          @Override
-          protected void configure() {
-            factory(UpsertRemote.Inserter.Factory.class);
-          }
-        });
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/webhooks/rest/UpdateRemoteIT.java b/src/test/java/com/googlesource/gerrit/plugins/webhooks/rest/UpdateRemoteIT.java
index 0f3f228..cb6f0c7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/webhooks/rest/UpdateRemoteIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/webhooks/rest/UpdateRemoteIT.java
@@ -39,8 +39,8 @@
 
   @Override
   @Before
-  public void setUp() throws Exception {
-    super.setUp();
+  public void setUpTestPlugin() throws Exception {
+    super.setUpTestPlugin();
     fooEndpoint = String.format("/config/server/webhooks~projects/%s/remotes/foo", project.get());
   }