Abandon: Use ChangeData instead of ChangeControl

Change-Id: I9b55bf37f8b0b53341a00213f474404b2fffcb34
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java
index cb9d705..52e1ea4 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java
@@ -33,7 +33,6 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.AbandonUtil;
-import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.testutil.TestTimeUtil;
 import com.google.inject.Inject;
@@ -64,14 +63,10 @@
   public void batchAbandon() throws Exception {
     CurrentUser user = atrScope.get().getUser();
     PushOneCommit.Result a = createChange();
-    List<ChangeControl> controlA = changeFinder.find(a.getChangeId(), user);
-    assertThat(controlA).hasSize(1);
     PushOneCommit.Result b = createChange();
-    List<ChangeControl> controlB = changeFinder.find(b.getChangeId(), user);
-    assertThat(controlB).hasSize(1);
-    List<ChangeControl> list = ImmutableList.of(controlA.get(0), controlB.get(0));
+    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
     changeAbandoner.batchAbandon(
-        batchUpdateFactory, controlA.get(0).getProject().getNameKey(), user, list, "deadbeef");
+        batchUpdateFactory, a.getChange().project(), user, list, "deadbeef");
 
     ChangeInfo info = get(a.getChangeId());
     assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
@@ -95,12 +90,8 @@
 
     CurrentUser user = atrScope.get().getUser();
     PushOneCommit.Result a = createChange(project1, "master", "x", "x", "x", "");
-    List<ChangeControl> controlA = changeFinder.find(a.getChangeId(), user);
-    assertThat(controlA).hasSize(1);
     PushOneCommit.Result b = createChange(project2, "master", "x", "x", "x", "");
-    List<ChangeControl> controlB = changeFinder.find(b.getChangeId(), user);
-    assertThat(controlB).hasSize(1);
-    List<ChangeControl> list = ImmutableList.of(controlA.get(0), controlB.get(0));
+    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
     exception.expect(ResourceConflictException.class);
     exception.expectMessage(
         String.format("Project name \"%s\" doesn't match \"%s\"", project2Name, project1Name));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
index cd0f34e..db13c14 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
@@ -35,7 +35,7 @@
 import com.google.gerrit.server.notedb.ChangeNotes;
 import com.google.gerrit.server.permissions.ChangePermission;
 import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.update.BatchUpdate;
 import com.google.gerrit.server.update.RetryHelper;
 import com.google.gerrit.server.update.RetryingRestModifyView;
@@ -138,31 +138,31 @@
    * should use the batch instead of abandoning one by one.
    *
    * <p>It's the caller's responsibility to ensure that all jobs inside the same batch have the
-   * matching project from its ChangeControl. Violations will result in a ResourceConflictException.
+   * matching project from its ChangeData. Violations will result in a ResourceConflictException.
    */
   public void batchAbandon(
       BatchUpdate.Factory updateFactory,
       Project.NameKey project,
       CurrentUser user,
-      Collection<ChangeControl> controls,
+      Collection<ChangeData> changes,
       String msgTxt,
       NotifyHandling notifyHandling,
       ListMultimap<RecipientType, Account.Id> accountsToNotify)
       throws RestApiException, UpdateException {
-    if (controls.isEmpty()) {
+    if (changes.isEmpty()) {
       return;
     }
     Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null;
     try (BatchUpdate u = updateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) {
-      for (ChangeControl control : controls) {
-        if (!project.equals(control.getProject().getNameKey())) {
+      for (ChangeData change : changes) {
+        if (!project.equals(change.project())) {
           throw new ResourceConflictException(
               String.format(
                   "Project name \"%s\" doesn't match \"%s\"",
-                  control.getProject().getNameKey().get(), project.get()));
+                  change.project().get(), project.get()));
         }
         u.addOp(
-            control.getId(),
+            change.getId(),
             abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify));
       }
       u.execute();
@@ -173,14 +173,14 @@
       BatchUpdate.Factory updateFactory,
       Project.NameKey project,
       CurrentUser user,
-      Collection<ChangeControl> controls,
+      Collection<ChangeData> changes,
       String msgTxt)
       throws RestApiException, UpdateException {
     batchAbandon(
         updateFactory,
         project,
         user,
-        controls,
+        changes,
         msgTxt,
         NotifyHandling.ALL,
         ImmutableListMultimap.of());
@@ -190,10 +190,10 @@
       BatchUpdate.Factory updateFactory,
       Project.NameKey project,
       CurrentUser user,
-      Collection<ChangeControl> controls)
+      Collection<ChangeData> changes)
       throws RestApiException, UpdateException {
     batchAbandon(
-        updateFactory, project, user, controls, "", NotifyHandling.ALL, ImmutableListMultimap.of());
+        updateFactory, project, user, changes, "", NotifyHandling.ALL, ImmutableListMultimap.of());
   }
 
   @Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
index 58a908d..3239813 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
@@ -20,7 +20,6 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.InternalUser;
 import com.google.gerrit.server.config.ChangeCleanupConfig;
-import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
 import com.google.gerrit.server.query.change.ChangeQueryProcessor;
@@ -74,24 +73,23 @@
 
       List<ChangeData> changesToAbandon =
           queryProvider.get().enforceVisibility(false).query(queryBuilder.parse(query)).entities();
-      ImmutableListMultimap.Builder<Project.NameKey, ChangeControl> builder =
+      ImmutableListMultimap.Builder<Project.NameKey, ChangeData> builder =
           ImmutableListMultimap.builder();
       for (ChangeData cd : changesToAbandon) {
-        ChangeControl control = cd.changeControl(internalUser);
-        builder.put(control.getProject().getNameKey(), control);
+        builder.put(cd.project(), cd);
       }
 
       int count = 0;
-      ListMultimap<Project.NameKey, ChangeControl> abandons = builder.build();
+      ListMultimap<Project.NameKey, ChangeData> abandons = builder.build();
       String message = cfg.getAbandonMessage();
       for (Project.NameKey project : abandons.keySet()) {
-        Collection<ChangeControl> changes = getValidChanges(abandons.get(project), query);
+        Collection<ChangeData> changes = getValidChanges(abandons.get(project), query);
         try {
           abandon.batchAbandon(updateFactory, project, internalUser, changes, message);
           count += changes.size();
         } catch (Throwable e) {
           StringBuilder msg = new StringBuilder("Failed to auto-abandon inactive change(s):");
-          for (ChangeControl change : changes) {
+          for (ChangeData change : changes) {
             msg.append(" ").append(change.getId().get());
           }
           msg.append(".");
@@ -104,12 +102,11 @@
     }
   }
 
-  private Collection<ChangeControl> getValidChanges(
-      Collection<ChangeControl> changeControls, String query)
+  private Collection<ChangeData> getValidChanges(Collection<ChangeData> changes, String query)
       throws OrmException, QueryParseException {
-    Collection<ChangeControl> validChanges = new ArrayList<>();
-    for (ChangeControl cc : changeControls) {
-      String newQuery = query + " change:" + cc.getId();
+    Collection<ChangeData> validChanges = new ArrayList<>();
+    for (ChangeData cd : changes) {
+      String newQuery = query + " change:" + cd.getId();
       List<ChangeData> changesToAbandon =
           queryProvider
               .get()
@@ -117,12 +114,12 @@
               .query(queryBuilder.parse(newQuery))
               .entities();
       if (!changesToAbandon.isEmpty()) {
-        validChanges.add(cc);
+        validChanges.add(cd);
       } else {
         log.debug(
             "Change data with id \"{}\" does not satisfy the query \"{}\""
                 + " any more, hence skipping it in clean up",
-            cc.getId(),
+            cd.getId(),
             query);
       }
     }