Merge "Fix Maven build"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/CannotDeleteProjectException.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/CannotDeleteProjectException.java
similarity index 93%
rename from src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/CannotDeleteProjectException.java
rename to src/main/java/com/googlesource/gerrit/plugins/deleteproject/CannotDeleteProjectException.java
index c051ab4..6b737ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/CannotDeleteProjectException.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/CannotDeleteProjectException.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.deleteproject.database;
+package com.googlesource.gerrit.plugins.deleteproject;
 
 public class CannotDeleteProjectException extends Exception {
   private static final long serialVersionUID = 1L;
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 a928dd1..67368a6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteAction.java
@@ -21,9 +21,11 @@
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+
 import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.database.DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.fs.FilesystemDeleteHandler;
+import com.googlesource.gerrit.plugins.deleteproject.projectconfig.ProjectConfigDeleteHandler;
 
 public class DeleteAction extends DeleteProject implements
     UiAction<ProjectResource> {
@@ -32,10 +34,11 @@
       DatabaseDeleteHandler dbHandler,
       FilesystemDeleteHandler fsHandler,
       CacheDeleteHandler cacheHandler,
+      ProjectConfigDeleteHandler pcHandler,
       Provider<CurrentUser> userProvider,
       @PluginName String pluginName) {
     super(allProjectsNameProvider, dbHandler, fsHandler, cacheHandler,
-        userProvider, pluginName);
+        pcHandler, userProvider, pluginName);
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteCommand.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteCommand.java
index a712a7f..0b66915 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteCommand.java
@@ -29,20 +29,20 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.CapabilityControl;
-import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.config.AllProjectsNameProvider;
 import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectResource;
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+
 import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
-import com.googlesource.gerrit.plugins.deleteproject.database.CannotDeleteProjectException;
 import com.googlesource.gerrit.plugins.deleteproject.database.DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.fs.FilesystemDeleteHandler;
+import com.googlesource.gerrit.plugins.deleteproject.projectconfig.ProjectConfigDeleteHandler;
 
 @CommandMetaData(name = "delete", description = "Delete specific project")
 public final class DeleteCommand extends SshCommand {
@@ -58,28 +58,26 @@
   @Option(name = "--preserve-git-repository", usage = "don't delete git repository directory")
   private boolean preserveGitRepository = false;
 
-  private final SitePaths site;
-  private final AllProjectsName allProjectsName;
   private final CacheDeleteHandler cacheDeleteHandler;
   private final DatabaseDeleteHandler databaseDeleteHandler;
   private final FilesystemDeleteHandler filesystemDeleteHandler;
+  private final ProjectConfigDeleteHandler pcHandler;
   private final Provider<CurrentUser> userProvider;
   private final String pluginName;
 
   @Inject
-  protected DeleteCommand(SitePaths site,
-      @GerritServerConfig Config cfg,
+  protected DeleteCommand(@GerritServerConfig Config cfg,
       AllProjectsNameProvider allProjectsNameProvider,
       DatabaseDeleteHandler databaseDeleteHandler,
       FilesystemDeleteHandler filesystemDeleteHandler,
       CacheDeleteHandler cacheDeleteHandler,
+      ProjectConfigDeleteHandler pcHandler,
       Provider<CurrentUser> userProvider,
       @PluginName String pluginName) {
-    this.site = site;
-    this.allProjectsName = allProjectsNameProvider.get();
     this.databaseDeleteHandler = databaseDeleteHandler;
     this.filesystemDeleteHandler = filesystemDeleteHandler;
     this.cacheDeleteHandler = cacheDeleteHandler;
+    this.pcHandler = pcHandler;
     this.userProvider = userProvider;
     this.pluginName = pluginName;
   }
@@ -97,9 +95,10 @@
     final Project project = projectControl.getProject();
     final String projectName = project.getName();
 
-    // Don't let people delete All-Projects, that's stupid
-    if (project.getNameKey().equals(allProjectsName)) {
-      throw new UnloggedFailure("Perhaps you meant to rm -fR " + site.site_path);
+    try {
+      pcHandler.assertCanDelete(new ProjectResource(projectControl));
+    } catch (CannotDeleteProjectException e) {
+      throw new UnloggedFailure(e.getMessage());
     }
 
     try {
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 1b2ee46..1e0b421 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
@@ -17,11 +17,6 @@
 import static com.googlesource.gerrit.plugins.deleteproject.DeleteOwnProjectCapability.DELETE_OWN_PROJECT;
 import static com.googlesource.gerrit.plugins.deleteproject.DeleteProjectCapability.DELETE_PROJECT;
 
-import java.io.IOException;
-import java.util.Collection;
-
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
@@ -38,11 +33,17 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+
 import com.googlesource.gerrit.plugins.deleteproject.DeleteProject.Input;
 import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
-import com.googlesource.gerrit.plugins.deleteproject.database.CannotDeleteProjectException;
 import com.googlesource.gerrit.plugins.deleteproject.database.DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.fs.FilesystemDeleteHandler;
+import com.googlesource.gerrit.plugins.deleteproject.projectconfig.ProjectConfigDeleteHandler;
+
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+import java.io.IOException;
+import java.util.Collection;
 
 class DeleteProject implements RestModifyView<ProjectResource, Input> {
   static class Input {
@@ -54,6 +55,7 @@
   private final DatabaseDeleteHandler dbHandler;
   private final FilesystemDeleteHandler fsHandler;
   private final CacheDeleteHandler cacheHandler;
+  private final ProjectConfigDeleteHandler pcHandler;
   private final Provider<CurrentUser> userProvider;
   private final String pluginName;
 
@@ -62,12 +64,14 @@
       DatabaseDeleteHandler dbHandler,
       FilesystemDeleteHandler fsHandler,
       CacheDeleteHandler cacheHandler,
+      ProjectConfigDeleteHandler pcHandler,
       Provider<CurrentUser> userProvider,
       @PluginName String pluginName) {
     this.allProjectsName = allProjectsNameProvider.get();
     this.dbHandler = dbHandler;
     this.fsHandler = fsHandler;
     this.cacheHandler = cacheHandler;
+    this.pcHandler = pcHandler;
     this.userProvider = userProvider;
     this.pluginName = pluginName;
   }
@@ -80,11 +84,13 @@
       throw new AuthException("not allowed to delete project");
     }
 
-    Project project = rsrc.getControl().getProject();
-    if (project.getNameKey().equals(allProjectsName)) {
-      throw new MethodNotAllowedException();
+    try {
+      pcHandler.assertCanDelete(rsrc);
+    } catch (CannotDeleteProjectException e) {
+      throw new MethodNotAllowedException(e.getMessage());
     }
 
+    Project project = rsrc.getControl().getProject();
     try {
       dbHandler.assertCanDelete(project);
     } catch (CannotDeleteProjectException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Module.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Module.java
index 047b3d9..e00e9f0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/Module.java
@@ -23,11 +23,13 @@
 import com.google.gerrit.extensions.restapi.RestApiModule;
 import com.google.gerrit.server.schema.SchemaVersion;
 import com.google.inject.AbstractModule;
+
 import com.googlesource.gerrit.plugins.deleteproject.cache.CacheDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.database.DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.database.Schema73DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.database.Schema77DatabaseDeleteHandler;
 import com.googlesource.gerrit.plugins.deleteproject.fs.FilesystemDeleteHandler;
+import com.googlesource.gerrit.plugins.deleteproject.projectconfig.ProjectConfigDeleteHandler;
 
 public class Module extends AbstractModule {
 
@@ -43,6 +45,7 @@
     bind(DatabaseDeleteHandler.class)
         .to(registerDatabaseHandler());
     bind(FilesystemDeleteHandler.class);
+    bind(ProjectConfigDeleteHandler.class);
     install(new RestApiModule() {
       @Override
       protected void configure() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
index 8793754..6f8d54e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
@@ -19,6 +19,8 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gwtorm.server.OrmException;
 
+import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
+
 /**
  * Handles deleting a project from the database for a specific schema.
  */
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema73DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema73DatabaseDeleteHandler.java
index b0248cf..6b5632a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema73DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema73DatabaseDeleteHandler.java
@@ -29,6 +29,8 @@
 import com.google.gwtorm.server.ResultSet;
 import com.google.inject.Inject;
 
+import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
+
 public class Schema73DatabaseDeleteHandler implements DatabaseDeleteHandler {
   private final ReviewDb db;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema77DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema77DatabaseDeleteHandler.java
index 9c7f7e0..169839c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema77DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/Schema77DatabaseDeleteHandler.java
@@ -19,6 +19,8 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
+import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
+
 public class Schema77DatabaseDeleteHandler
     extends Schema73DatabaseDeleteHandler {
   private final ReviewDb db;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/projectconfig/ProjectConfigDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/projectconfig/ProjectConfigDeleteHandler.java
new file mode 100644
index 0000000..2768ae8
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/projectconfig/ProjectConfigDeleteHandler.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2014 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.projectconfig;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+
+import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
+
+public class ProjectConfigDeleteHandler {
+
+  protected final AllProjectsName allProjectsName;
+
+  private final SitePaths site;
+
+  @Inject
+  public ProjectConfigDeleteHandler(SitePaths site,
+      AllProjectsNameProvider allProjectsNameProvider) {
+    this.site = site;
+    this.allProjectsName = allProjectsNameProvider.get();
+ }
+
+  public void assertCanDelete(ProjectResource rsrc)
+      throws CannotDeleteProjectException {
+    assertIsNotAllProjects(rsrc);
+  }
+
+  private void assertIsNotAllProjects(ProjectResource rsrc)
+      throws CannotDeleteProjectException {
+    Project project = rsrc.getControl().getProject();
+    if (project.getNameKey().equals(allProjectsName)) {
+      throw new CannotDeleteProjectException("Perhaps you meant to rm -fR "
+          + site.site_path);
+    }
+  }
+}