Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Format Configuration class with google-java-format
  Extract configuration to a separate class

Change-Id: Ib896fc90ae27cb89b3a55ecd8ed7bd326bbde582
diff --git a/BUILD b/BUILD
index 89f3d06..89097bb 100644
--- a/BUILD
+++ b/BUILD
@@ -31,5 +31,6 @@
     visibility = ["//visibility:public"],
     exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
         ":delete-project__plugin",
+        "@mockito//jar",
     ],
 )
diff --git a/WORKSPACE b/WORKSPACE
index 5b3dbc5..f8451b4 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -24,3 +24,7 @@
 
 # Load release Plugin API
 gerrit_api()
+
+load("//:external_plugin_deps.bzl", "external_plugin_deps")
+
+external_plugin_deps()
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
new file mode 100644
index 0000000..43d72aa
--- /dev/null
+++ b/external_plugin_deps.bzl
@@ -0,0 +1,33 @@
+load("//tools/bzl:maven_jar.bzl", "maven_jar")
+
+def external_plugin_deps():
+  maven_jar(
+    name = "mockito",
+    artifact = "org.mockito:mockito-core:2.16.0",
+    sha1 = "a022ee494c753789a1e7cae75099de81d8a5cea6",
+    deps = [
+      "@byte_buddy//jar",
+      "@byte_buddy_agent//jar",
+      "@objenesis//jar",
+    ],
+  )
+
+  BYTE_BUDDY_VERSION = "1.7.9"
+
+  maven_jar(
+    name = "byte_buddy",
+    artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
+    sha1 = "51218a01a882c04d0aba8c028179cce488bbcb58",
+  )
+
+  maven_jar(
+    name = "byte_buddy_agent",
+    artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VERSION,
+    sha1 = "a6c65f9da7f467ee1f02ff2841ffd3155aee2fc9",
+  )
+
+  maven_jar(
+    name = "objenesis",
+    artifact = "org.objenesis:objenesis:2.6",
+    sha1 = "639033469776fd37c08358c6b92a4761feb2af4b",
+  )
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Configuration.java
new file mode 100644
index 0000000..be7186d
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Configuration.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.deleteproject;
+
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class Configuration {
+  private static String DELETED_PROJECTS_PARENT = "Deleted-Projects";
+
+  private final boolean allowDeletionWithTags;
+  private final boolean hideProjectOnPreserve;
+  private final String deletedProjectsParent;
+
+  @Inject
+  public Configuration(PluginConfigFactory pluginConfigFactory, @PluginName String pluginName) {
+    PluginConfig cfg = pluginConfigFactory.getFromGerritConfig(pluginName);
+    allowDeletionWithTags = cfg.getBoolean("allowDeletionOfReposWithTags", true);
+    hideProjectOnPreserve = cfg.getBoolean("hideProjectOnPreserve", false);
+    deletedProjectsParent = cfg.getString("parentForDeletedProjects", DELETED_PROJECTS_PARENT);
+  }
+
+  public boolean deletionWithTagsAllowed() {
+    return allowDeletionWithTags;
+  }
+
+  public boolean projectOnPreserveHidden() {
+    return hideProjectOnPreserve;
+  }
+
+  public String getDeletedProjectsParent() {
+    return deletedProjectsParent;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java
index 67ef40a..9ebfd34 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java
@@ -18,7 +18,6 @@
 import com.google.gerrit.extensions.webui.UiAction;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.project.ProjectResource;
@@ -40,7 +39,7 @@
       Provider<CurrentUser> userProvider,
       @PluginName String pluginName,
       DeleteLog deleteLog,
-      PluginConfigFactory cfgFactory,
+      Configuration cfg,
       HideProject hideProject,
       PermissionBackend permissionBackend,
       NotesMigration migration) {
@@ -53,7 +52,7 @@
         userProvider,
         pluginName,
         deleteLog,
-        cfgFactory,
+        cfg,
         hideProject,
         permissionBackend,
         migration);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
index fe02aeb..97c3726 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
@@ -29,7 +29,6 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.permissions.GlobalPermission;
 import com.google.gerrit.server.permissions.PermissionBackend;
@@ -60,7 +59,7 @@
   private final Provider<CurrentUser> userProvider;
   private final String pluginName;
   private final DeleteLog deleteLog;
-  private final PluginConfigFactory cfgFactory;
+  private final Configuration cfg;
   private final HideProject hideProject;
   private PermissionBackend permissionBackend;
   private NotesMigration migration;
@@ -75,7 +74,7 @@
       Provider<CurrentUser> userProvider,
       @PluginName String pluginName,
       DeleteLog deleteLog,
-      PluginConfigFactory cfgFactory,
+      Configuration cfg,
       HideProject hideProject,
       PermissionBackend permissionBackend,
       NotesMigration migration) {
@@ -87,7 +86,7 @@
     this.userProvider = userProvider;
     this.pluginName = pluginName;
     this.deleteLog = deleteLog;
-    this.cfgFactory = cfgFactory;
+    this.cfg = cfg;
     this.hideProject = hideProject;
     this.permissionBackend = permissionBackend;
     this.migration = migration;
@@ -146,10 +145,7 @@
     boolean preserve = input != null && input.preserve;
     Exception ex = null;
     try {
-      if (!preserve
-          || !cfgFactory
-              .getFromGerritConfig(pluginName)
-              .getBoolean("hideProjectOnPreserve", false)) {
+      if (!preserve || !cfg.projectOnPreserveHidden()) {
         if (!migration.disableChangeReviewDb()) {
           dbHandler.delete(project);
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
index 97a4627..8b60ae3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HideProject.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.deleteproject;
 
 import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.client.ProjectState;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -23,7 +22,6 @@
 import com.google.gerrit.extensions.restapi.TopLevelResource;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 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.ProjectConfig;
 import com.google.gerrit.server.permissions.PermissionBackendException;
@@ -38,26 +36,22 @@
 
 @Singleton
 class HideProject {
-  private static String DEFAULT_PARENT_FOR_DELETED_PROJECTS = "Deleted-Projects";
 
   private final MetaDataUpdate.Server metaDataUpdateFactory;
   private final ProjectCache projectCache;
   private final CreateProject.Factory createProjectFactory;
-  private final PluginConfigFactory cfgFactory;
-  private final String pluginName;
+  private final Configuration cfg;
 
   @Inject
   HideProject(
       MetaDataUpdate.Server metaDataUpdateFactory,
       ProjectCache projectCache,
       CreateProject.Factory createProjectFactory,
-      PluginConfigFactory cfgFactory,
-      @PluginName String pluginName) {
+      Configuration cfg) {
     this.metaDataUpdateFactory = metaDataUpdateFactory;
     this.projectCache = projectCache;
     this.createProjectFactory = createProjectFactory;
-    this.cfgFactory = cfgFactory;
-    this.pluginName = pluginName;
+    this.cfg = cfg;
   }
 
   public void apply(ProjectResource rsrc)
@@ -73,10 +67,7 @@
         projectConfig.remove(as);
       }
 
-      String parentForDeletedProjects =
-          cfgFactory
-              .getFromGerritConfig(pluginName)
-              .getString("parentForDeletedProjects", DEFAULT_PARENT_FOR_DELETED_PROJECTS);
+      String parentForDeletedProjects = cfg.getDeletedProjectsParent();
       createProjectIfMissing(parentForDeletedProjects);
       p.setParentName(parentForDeletedProjects);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
index c36ce1a..063a6f9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandler.java
@@ -14,16 +14,15 @@
 
 package com.googlesource.gerrit.plugins.deleteproject.fs;
 
-import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.changes.NotifyHandling;
 import com.google.gerrit.extensions.events.ProjectDeletedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
+import com.googlesource.gerrit.plugins.deleteproject.Configuration;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.FileVisitResult;
@@ -45,19 +44,16 @@
 
   private final GitRepositoryManager repoManager;
   private final DynamicSet<ProjectDeletedListener> deletedListener;
-  private final PluginConfigFactory cfgFactory;
-  private final String pluginName;
+  private final Configuration config;
 
   @Inject
   public FilesystemDeleteHandler(
       GitRepositoryManager repoManager,
       DynamicSet<ProjectDeletedListener> deletedListener,
-      PluginConfigFactory cfgFactory,
-      @PluginName String pluginName) {
+      Configuration config) {
     this.repoManager = repoManager;
     this.deletedListener = deletedListener;
-    this.cfgFactory = cfgFactory;
-    this.pluginName = pluginName;
+    this.config = config;
   }
 
   public void delete(Project project, boolean preserveGitRepository)
@@ -73,10 +69,7 @@
 
   public void assertCanDelete(ProjectResource rsrc, boolean preserveGitRepository)
       throws CannotDeleteProjectException {
-    if (!preserveGitRepository
-        && !cfgFactory
-            .getFromGerritConfig(pluginName)
-            .getBoolean("allowDeletionOfReposWithTags", true)) {
+    if (!preserveGitRepository && !config.deletionWithTagsAllowed()) {
       assertHasNoTags(rsrc);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java
new file mode 100644
index 0000000..3d069ef
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/ConfigurationTest.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.deleteproject;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ConfigurationTest {
+  private static final String CUSTOM_PARENT = "customParent";
+  private static final String PLUGIN_NAME = "delete-project";
+
+  @Mock private PluginConfigFactory pluginConfigFactoryMock;
+
+  private Configuration deleteConfig;
+
+  @Test
+  public void defaultValuesAreLoaded() {
+    when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME))
+        .thenReturn(new PluginConfig(PLUGIN_NAME, new Config()));
+    deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME);
+
+    assertThat(deleteConfig.getDeletedProjectsParent()).isEqualTo("Deleted-Projects");
+    assertThat(deleteConfig.deletionWithTagsAllowed()).isTrue();
+    assertThat(deleteConfig.projectOnPreserveHidden()).isFalse();
+  }
+
+  @Test
+  public void customValuesAreLoaded() {
+    PluginConfig pluginConfig = new PluginConfig(PLUGIN_NAME, new Config());
+    pluginConfig.setString("parentForDeletedProjects", CUSTOM_PARENT);
+    pluginConfig.setBoolean("allowDeletionOfReposWithTags", false);
+    pluginConfig.setBoolean("hideProjectOnPreserve", true);
+    when(pluginConfigFactoryMock.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig);
+    deleteConfig = new Configuration(pluginConfigFactoryMock, PLUGIN_NAME);
+
+    assertThat(deleteConfig.getDeletedProjectsParent()).isEqualTo(CUSTOM_PARENT);
+    assertThat(deleteConfig.deletionWithTagsAllowed()).isFalse();
+    assertThat(deleteConfig.projectOnPreserveHidden()).isTrue();
+  }
+}
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
new file mode 100644
index 0000000..2eabedb
--- /dev/null
+++ b/tools/bzl/maven_jar.bzl
@@ -0,0 +1 @@
+load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar")