InlineEdit: Extend change edit container with commit and patch set

Change-Id: Ic75adf1f6d98e052f1f06ea28644e17f081cb8f8
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java
index c3b4185..6f8b3a0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java
@@ -17,11 +17,13 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.RevId;
 import com.google.gerrit.server.IdentifiedUser;
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
 
 /**
  * A single user's edit for a change.
@@ -34,14 +36,21 @@
   private final IdentifiedUser user;
   private final Change change;
   private final Ref ref;
+  private final RevCommit editCommit;
+  private final PatchSet basePatchSet;
 
-  public ChangeEdit(IdentifiedUser user, Change change, Ref ref) {
+  public ChangeEdit(IdentifiedUser user, Change change, Ref ref,
+      RevCommit editCommit, PatchSet basePatchSet) {
     checkNotNull(user);
     checkNotNull(change);
     checkNotNull(ref);
+    checkNotNull(editCommit);
+    checkNotNull(basePatchSet);
     this.user = user;
     this.change = change;
     this.ref = ref;
+    this.editCommit = editCommit;
+    this.basePatchSet = basePatchSet;
   }
 
   public Change getChange() {
@@ -63,4 +72,12 @@
   public String getRefName() {
     return ChangeEditUtil.editRefName(user.getAccountId(), change.getId());
   }
+
+  public RevCommit getEditCommit() {
+    return editCommit;
+  }
+
+  public PatchSet getBasePatchSet() {
+    return basePatchSet;
+  }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index 2284087..914ccdb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -72,17 +72,14 @@
   private final TimeZone tz;
   private final GitRepositoryManager gitManager;
   private final Provider<CurrentUser> currentUser;
-  private final ChangeEditUtil editUtil;
 
   @Inject
   ChangeEditModifier(@GerritPersonIdent PersonIdent gerritIdent,
       GitRepositoryManager gitManager,
       Provider<ReviewDb> dbProvider,
-      Provider<CurrentUser> currentUser,
-      ChangeEditUtil editUtil) {
+      Provider<CurrentUser> currentUser) {
     this.gitManager = gitManager;
     this.currentUser = currentUser;
-    this.editUtil = editUtil;
     this.tz = gerritIdent.getTimeZone();
   }
 
@@ -193,7 +190,7 @@
       try {
         String refName = edit.getRefName();
         RevCommit prevEdit = rw.parseCommit(edit.getRef().getObjectId());
-        PatchSet basePs = editUtil.getBasePatchSet(edit, prevEdit);
+        PatchSet basePs = edit.getBasePatchSet();
 
         RevCommit base = rw.parseCommit(ObjectId.fromString(
             basePs.getRevision().get()));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index cf0785f..ba50776 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -86,19 +86,26 @@
    * @throws IOException
    */
   public Optional<ChangeEdit> byChange(Change change)
-      throws AuthException, IOException {
+      throws AuthException, IOException, InvalidChangeOperationException {
     if (!user.get().isIdentifiedUser()) {
       throw new AuthException("Authentication required");
     }
     Repository repo = gitManager.openRepository(change.getProject());
     try {
-      IdentifiedUser identifiedUser = (IdentifiedUser) user.get();
+      IdentifiedUser me = (IdentifiedUser) user.get();
       Ref ref = repo.getRefDatabase().getRef(editRefName(
-          identifiedUser.getAccountId(), change.getId()));
+          me.getAccountId(), change.getId()));
       if (ref == null) {
         return Optional.absent();
       }
-      return Optional.of(new ChangeEdit(identifiedUser, change, ref));
+      RevWalk rw = new RevWalk(repo);
+      try {
+        RevCommit commit = rw.parseCommit(ref.getObjectId());
+        PatchSet basePs = getBasePatchSet(change, commit);
+        return Optional.of(new ChangeEdit(me, change, ref, commit, basePs));
+      } finally {
+        rw.release();
+      }
     } finally {
       repo.close();
     }
@@ -125,19 +132,16 @@
       RevWalk rw = new RevWalk(repo);
       ObjectInserter inserter = repo.newObjectInserter();
       try {
-        RevCommit editCommit = rw.parseCommit(edit.getRef().getObjectId());
-        if (editCommit == null) {
-          throw new NoSuchChangeException(change.getId());
-        }
 
-        PatchSet basePatchSet = getBasePatchSet(edit, editCommit);
+        PatchSet basePatchSet = edit.getBasePatchSet();
         if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
           throw new ResourceConflictException(
               "only edit for current patch set can be published");
         }
 
         insertPatchSet(edit, change, repo, rw, basePatchSet,
-            squashEdit(repo, rw, inserter, editCommit, basePatchSet));
+            squashEdit(repo, rw, inserter, edit.getEditCommit(),
+                basePatchSet));
       } finally {
         inserter.release();
         rw.release();
@@ -167,41 +171,7 @@
     }
   }
 
-  /**
-   * Retrieve base patch set the edit was created on.
-   *
-   * @param edit change edit to retrieve base patch set for
-   * @return parent patch set of the edit
-   * @throws IOException
-   * @throws InvalidChangeOperationException
-   */
-  public PatchSet getBasePatchSet(ChangeEdit edit) throws IOException,
-      InvalidChangeOperationException {
-    Change change = edit.getChange();
-    Repository repo = gitManager.openRepository(change.getProject());
-    try {
-      RevWalk rw = new RevWalk(repo);
-      try {
-        return getBasePatchSet(edit, rw.parseCommit(
-            edit.getRef().getObjectId()));
-      } finally {
-        rw.release();
-      }
-    } finally {
-      repo.close();
-    }
-  }
-
-  /**
-   * Retrieve base patch set the edit was created on.
-   *
-   * @param edit change edit to retrieve base patch set for
-   * @param commit change edit commit
-   * @return parent patch set of the edit
-   * @throws IOException
-   * @throws InvalidChangeOperationException
-   */
-  public PatchSet getBasePatchSet(ChangeEdit edit, RevCommit commit)
+  private PatchSet getBasePatchSet(Change change, RevCommit commit)
       throws IOException, InvalidChangeOperationException {
     if (commit.getParentCount() != 1) {
       throw new InvalidChangeOperationException(
@@ -223,11 +193,11 @@
             rev.abbreviate(8).name()));
       }
       PatchSet parentPatchSet = Iterables.getOnlyElement(r);
-      if (!edit.getChange().getId().equals(
+      if (!change.getId().equals(
               parentPatchSet.getId().getParentKey())) {
         throw new InvalidChangeOperationException(String.format(
             "different change edit ID %d and its parent patch set %d",
-            edit.getChange().getId().get(),
+            change.getId().get(),
             parentPatchSet.getId().getParentKey().get()));
       }
       return parentPatchSet;