Check that parent project exists in target

Before importing a project check that its parent project exists in the
target system. If not, abort the import.

Change-Id: I1da1db747468103292e789ced35355c0ce774bfe
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
index c108ca0..2b35e50 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
@@ -19,11 +19,14 @@
 import com.google.common.base.Charsets;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.PluginData;
+import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.OutputFormat;
 import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
@@ -53,6 +56,7 @@
         @Assisted StringBuffer result);
   }
 
+  private final ProjectCache projectCache;
   private final OpenRepositoryStep openRepoStep;
   private final ConfigureRepositoryStep configRepoStep;
   private final GitFetchStep gitFetchStep;
@@ -68,7 +72,9 @@
   private LockFile lockFile;
 
   @Inject
-  ImportProjectTask(OpenRepositoryStep openRepoStep,
+  ImportProjectTask(
+      ProjectCache projectCache,
+      OpenRepositoryStep openRepoStep,
       ConfigureRepositoryStep configRepoStep,
       GitFetchStep gitFetchStep,
       ReplayChangesStep.Factory replayChangesFactory,
@@ -78,6 +84,7 @@
       @Assisted("user") String user,
       @Assisted("password") String password,
       @Assisted StringBuffer messages) {
+    this.projectCache = projectCache;
     this.openRepoStep = openRepoStep;
     this.configRepoStep = configRepoStep;
     this.gitFetchStep = gitFetchStep;
@@ -99,6 +106,12 @@
     }
 
     try {
+      checkPreconditions();
+    } catch (IOException | ValidationException e) {
+      handleError(e);
+    }
+
+    try {
       Repository repo = openRepoStep.open(name, messages);
       if (repo == null) {
         return;
@@ -128,6 +141,16 @@
     }
   }
 
+  private void checkPreconditions() throws IOException, ValidationException {
+    ProjectInfo p =
+        new RemoteApi(fromGerrit, user, password).getProject(name.get());
+    ProjectState parent = projectCache.get(new Project.NameKey(p.parent));
+    if (parent == null) {
+      throw new ValidationException(format(
+          "Parent project %s does not exist in target,", p.parent));
+    }
+  }
+
   static class Params {
     String from;
     String user;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
index 89d37d4..1125601 100755
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.extensions.client.ListChangesOption;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.common.RevisionInfo;
 import com.google.gerrit.server.OutputFormat;
 import com.google.gson.Gson;
@@ -35,6 +36,14 @@
     restSession = new RestSession(url, user, pass);
   }
 
+  public ProjectInfo getProject(String projectName) throws IOException {
+    String endPoint = "/projects/" + projectName;
+    RestResponse r = restSession.get(endPoint);
+    assertOK(r);
+    return newGson().fromJson(r.getReader(),
+        new TypeToken<ProjectInfo>() {}.getType());
+  }
+
   public List<ChangeInfo> queryChanges(String projectName) throws IOException {
     String endPoint =
         "/changes/?q=project:" + projectName +