Extract inserting link to original change into own import step

Change-Id: Icbb53014c21b082ef65bd82ad261df1c36e48de0
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java
new file mode 100644
index 0000000..0205745
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/InsertLinkToOriginalChangeStep.java
@@ -0,0 +1,109 @@
+//Copyright (C) 2015 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.importer;
+
+import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+import java.io.IOException;
+
+class InsertLinkToOriginalChangeStep {
+
+  private final CurrentUser currentUser;
+  private final ChangeUpdate.Factory updateFactory;
+  private final IdentifiedUser.GenericFactory genericUserFactory;
+  private final ChangeControl.GenericFactory changeControlFactory;
+  private final ReviewDb db;
+  private final ChangeMessagesUtil cmUtil;
+  private final String fromGerrit;
+  private final Change change;
+  private final ChangeInfo changeInfo;
+
+  interface Factory {
+    InsertLinkToOriginalChangeStep create(String fromGerrit, Change change,
+        ChangeInfo changeInfo);
+  }
+
+  @Inject
+  InsertLinkToOriginalChangeStep(CurrentUser currentUser,
+      ChangeUpdate.Factory updateFactory,
+      IdentifiedUser.GenericFactory genericUserFactory,
+      ChangeControl.GenericFactory changeControlFactory,
+      ReviewDb db,
+      ChangeMessagesUtil cmUtil,
+      @Assisted String fromGerrit,
+      @Assisted Change change,
+      @Assisted ChangeInfo changeInfo) {
+    this.currentUser = currentUser;
+    this.updateFactory = updateFactory;
+    this.genericUserFactory = genericUserFactory;
+    this.changeControlFactory = changeControlFactory;
+    this.db = db;
+    this.cmUtil = cmUtil;
+    this.fromGerrit = fromGerrit;
+    this.change = change;
+    this.changeInfo = changeInfo;
+  }
+
+  void insert() throws NoSuchChangeException, OrmException, IOException {
+    insertMessage(change, "Imported from " + changeUrl(changeInfo));
+  }
+
+  private String changeUrl(ChangeInfo c) {
+    StringBuilder url = new StringBuilder();
+    url.append(ensureSlash(fromGerrit)).append(c._number);
+    return url.toString();
+  }
+
+  private void insertMessage(Change change, String message)
+      throws NoSuchChangeException, OrmException, IOException {
+    Account.Id userId = ((IdentifiedUser) currentUser).getAccountId();
+    ChangeUpdate update = updateFactory.create(control(change, userId));
+    ChangeMessage cmsg =
+        new ChangeMessage(new ChangeMessage.Key(change.getId(),
+            ChangeUtil.messageUUID(db)), userId, TimeUtil.nowTs(),
+            change.currentPatchSetId());
+    cmsg.setMessage(message);
+    cmUtil.addChangeMessage(db, update, cmsg);
+    update.commit();
+  }
+
+  private ChangeControl control(Change change, Account.Id id)
+      throws NoSuchChangeException {
+    return changeControlFactory.controlFor(change,
+        genericUserFactory.create(id));
+  }
+
+  private static String ensureSlash(String in) {
+    if (in != null && !in.endsWith("/")) {
+      return in + "/";
+    }
+    return in;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
index 5f092d7..d61e68f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/Module.java
@@ -50,5 +50,6 @@
     install(new FactoryModuleBuilder().build(ReplayMessagesStep.Factory.class));
     install(new FactoryModuleBuilder().build(AddApprovalsStep.Factory.class));
     install(new FactoryModuleBuilder().build(AddHashtagsStep.Factory.class));
+    install(new FactoryModuleBuilder().build(InsertLinkToOriginalChangeStep.Factory.class));
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 8c6f07b..dafc7ba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -14,23 +14,14 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
-import com.google.gerrit.common.TimeUtil;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.index.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.project.NoSuchChangeException;
 import com.google.gerrit.server.validators.ValidationException;
 import com.google.gwtorm.server.OrmException;
@@ -61,14 +52,10 @@
   private final ReplayMessagesStep.Factory replayMessagesFactory;
   private final AddApprovalsStep.Factory addApprovalsFactory;
   private final AddHashtagsStep.Factory addHashtagsFactory;
+  private final InsertLinkToOriginalChangeStep.Factory insertLinkToOriginalFactory;
   private final AccountUtil accountUtil;
   private final ReviewDb db;
   private final ChangeIndexer indexer;
-  private final ChangeUpdate.Factory updateFactory;
-  private final ChangeMessagesUtil cmUtil;
-  private final CurrentUser currentUser;
-  private final IdentifiedUser.GenericFactory genericUserFactory;
-  private final ChangeControl.GenericFactory changeControlFactory;
   private final String fromGerrit;
   private final RemoteApi api;
   private final Repository repo;
@@ -81,14 +68,10 @@
       ReplayMessagesStep.Factory replayMessagesFactory,
       AddApprovalsStep.Factory addApprovalsFactory,
       AddHashtagsStep.Factory addHashtagsFactory,
+      InsertLinkToOriginalChangeStep.Factory insertLinkToOriginalFactory,
       AccountUtil accountUtil,
       ReviewDb db,
       ChangeIndexer indexer,
-      ChangeUpdate.Factory updateFactory,
-      ChangeMessagesUtil cmUtil,
-      CurrentUser currentUser,
-      IdentifiedUser.GenericFactory genericUserFactory,
-      ChangeControl.GenericFactory changeControlFactory,
       @Assisted("from") String fromGerrit,
       @Assisted("user") String user,
       @Assisted("password") String password,
@@ -99,14 +82,10 @@
     this.replayMessagesFactory = replayMessagesFactory;
     this.addApprovalsFactory = addApprovalsFactory;
     this.addHashtagsFactory = addHashtagsFactory;
+    this.insertLinkToOriginalFactory = insertLinkToOriginalFactory;
     this.accountUtil = accountUtil;
     this.db = db;
     this.indexer = indexer;
-    this.updateFactory = updateFactory;
-    this.cmUtil = cmUtil;
-    this.currentUser = currentUser;
-    this.genericUserFactory = genericUserFactory;
-    this.changeControlFactory = changeControlFactory;
     this.fromGerrit = fromGerrit;
     this.api = new RemoteApi(fromGerrit, user, password);
     this.repo = repo;
@@ -139,7 +118,7 @@
     addApprovalsFactory.create(change, c).add();
     addHashtagsFactory.create(change, c).add();
 
-    insertLinkToOriginalChange(change, c);
+    insertLinkToOriginalFactory.create(fromGerrit,change, c).insert();
 
     indexer.index(db, change);
   }
@@ -164,41 +143,4 @@
       return Constants.R_HEADS + branch;
     }
   }
-
-  private void insertLinkToOriginalChange(Change change,
-      ChangeInfo c) throws NoSuchChangeException, OrmException, IOException {
-    insertMessage(change, "Imported from " + changeUrl(c));
-  }
-
-  private String changeUrl(ChangeInfo c) {
-    StringBuilder url = new StringBuilder();
-    url.append(ensureSlash(fromGerrit)).append(c._number);
-    return url.toString();
-  }
-
-  private void insertMessage(Change change, String message)
-      throws NoSuchChangeException, OrmException, IOException {
-    Account.Id userId = ((IdentifiedUser) currentUser).getAccountId();
-    ChangeUpdate update = updateFactory.create(control(change, userId));
-    ChangeMessage cmsg =
-        new ChangeMessage(new ChangeMessage.Key(change.getId(),
-            ChangeUtil.messageUUID(db)), userId, TimeUtil.nowTs(),
-            change.currentPatchSetId());
-    cmsg.setMessage(message);
-    cmUtil.addChangeMessage(db, update, cmsg);
-    update.commit();
-  }
-
-  private ChangeControl control(Change change, Account.Id id)
-      throws NoSuchChangeException {
-    return changeControlFactory.controlFor(change,
-        genericUserFactory.create(id));
-  }
-
-  private static String ensureSlash(String in) {
-    if (in != null && !in.endsWith("/")) {
-      return in + "/";
-    }
-    return in;
-  }
 }