Use BatchUpdate

Change I5cdaa7fa5 in Gerrit core removed ChangeUtil#updated in favor
of BatchUpdate.

Make the necessary adaptations.

Change-Id: I3f998f1bdf1edc99de4b5d41ca6a85d69230a43a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java b/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
index 45536ac..fcb809b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
@@ -15,7 +15,8 @@
 package com.googlesource.gerrit.plugins.wip;
 
 import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Change.Status;
 import com.google.gerrit.reviewdb.client.ChangeMessage;
@@ -23,8 +24,9 @@
 import com.google.gerrit.server.ChangeUtil;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.BatchUpdate;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.index.ChangeIndexer;
-import com.google.gwtorm.server.AtomicUpdate;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -40,41 +42,40 @@
   private final Provider<ReviewDb> dbProvider;
   private final Provider<CurrentUser> userProvider;
   private final ChangeIndexer indexer;
+  private final BatchUpdate.Factory batchUpdateFactory;
 
   @Inject
   BaseAction(Provider<ReviewDb> dbProvider,
       Provider<CurrentUser> userProvider,
-      ChangeIndexer indexer) {
+      ChangeIndexer indexer,
+      BatchUpdate.Factory batchUpdateFactory) {
     this.dbProvider = dbProvider;
     this.userProvider = userProvider;
     this.indexer = indexer;
+    this.batchUpdateFactory = batchUpdateFactory;
   }
 
   protected void changeStatus(Change change, Input input, final Status from,
-      final Status to) throws OrmException, ResourceConflictException,
-      IOException {
+      final Status to) throws OrmException, RestApiException,
+      IOException, UpdateException {
     ReviewDb db = dbProvider.get();
     Change.Id changeId = change.getId();
     db.changes().beginTransaction(changeId);
-    try {
-      change = db.changes().atomicUpdate(
-        changeId,
-        new AtomicUpdate<Change>() {
-          @Override
-          public Change update(Change change) {
-            if (change.getStatus() == from) {
-              change.setStatus(to);
-              ChangeUtil.updated(change);
-              return change;
-            }
-            return null;
+    try (BatchUpdate bu = batchUpdateFactory.create(
+        db, change.getProject(), userProvider.get(), TimeUtil.nowTs())) {
+      bu.addOp(change.getId(), new BatchUpdate.Op() {
+        @Override
+        public boolean updateChange(BatchUpdate.ChangeContext ctx) {
+          Change change = ctx.getChange();
+          if (change.getStatus() == from) {
+            change.setStatus(to);
+            ctx.saveChange();
+            return true;
           }
-        });
-
-      if (change == null) {
-        throw new ResourceConflictException("change is "
-            + status(db.changes().get(changeId)));
-      }
+          return false;
+        }
+      });
+      bu.execute();
 
       db.changeMessages().insert(Collections.singleton(
           newMessage(input, change)));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java b/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
index be1c4da..a098a35 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
@@ -18,6 +18,7 @@
 
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestModifyView;
 import com.google.gerrit.extensions.webui.UiAction;
 import com.google.gerrit.reviewdb.client.Change;
@@ -26,6 +27,8 @@
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.BatchUpdate;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.index.ChangeIndexer;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
@@ -38,13 +41,14 @@
   @Inject
   ReadyForReview(Provider<ReviewDb> dbProvider,
       Provider<CurrentUser> userProvider,
-      ChangeIndexer indexer) {
-    super(dbProvider, userProvider, indexer);
+      ChangeIndexer indexer,
+      BatchUpdate.Factory batchUpdateFactory) {
+    super(dbProvider, userProvider, indexer, batchUpdateFactory);
   }
 
   @Override
   public Object apply(RevisionResource rsrc, Input input)
-      throws ResourceConflictException, OrmException, IOException {
+      throws RestApiException, OrmException, IOException, UpdateException {
     Change change = rsrc.getChange();
     if (change.getStatus() != Status.DRAFT) {
       throw new ResourceConflictException("change is " + status(change));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java b/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
index 124d5b1..06d0285 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
@@ -15,10 +15,11 @@
 package com.googlesource.gerrit.plugins.wip;
 
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.server.change.ChangesCollection;
 import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.index.ChangeIndexer;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.sshd.CommandMetaData;
@@ -104,8 +105,8 @@
     for (PatchSet patchSet : patchSets) {
       try {
         mark(patchSet);
-      } catch (ResourceConflictException | IOException
-          | OrmException | ResourceNotFoundException e) {
+      } catch (RestApiException | IOException
+          | OrmException | UpdateException e) {
         ok = false;
         writeError("fatal: internal server error while approving "
             + patchSet.getId() + "\n");
@@ -119,7 +120,7 @@
   }
 
   private void mark(PatchSet patchSet) throws ResourceConflictException,
-      OrmException, IOException, ResourceNotFoundException {
+      OrmException, IOException, RestApiException, UpdateException {
     RevisionResource rsrc =
         new RevisionResource(changes.parse(patchSet.getId().getParentKey()),
             patchSet);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java b/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
index 41eda46..9cef879 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
@@ -18,6 +18,7 @@
 
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestModifyView;
 import com.google.gerrit.extensions.webui.UiAction;
 import com.google.gerrit.reviewdb.client.Change;
@@ -26,6 +27,8 @@
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.BatchUpdate;
+import com.google.gerrit.server.git.UpdateException;
 import com.google.gerrit.server.index.ChangeIndexer;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
@@ -38,13 +41,14 @@
   @Inject
   WorkInProgress(Provider<ReviewDb> dbProvider,
       Provider<CurrentUser> userProvider,
-      ChangeIndexer indexer) {
-    super(dbProvider, userProvider, indexer);
+      ChangeIndexer indexer,
+      BatchUpdate.Factory batchUpdateFactory) {
+    super(dbProvider, userProvider, indexer, batchUpdateFactory);
   }
 
   @Override
   public Object apply(RevisionResource rsrc, Input input)
-      throws ResourceConflictException, OrmException, IOException {
+      throws RestApiException, OrmException, IOException, UpdateException {
     Change change = rsrc.getChange();
     if (change.getStatus() != Status.NEW) {
       throw new ResourceConflictException("change is " + status(change));