Convert most ChangeApi handlers to retrying wrappers
Excludes a few that will require more work to plumb the BatchUpdate.Factory into the class that actually does the work. Change-Id: Id8c679c91ed8ea142f1856fcc2d976c4fb609dc5
This commit is contained in:
		@@ -366,7 +366,8 @@ public class ChangeIT extends AbstractDaemonTest {
 | 
			
		||||
    List<ChangeControl> controlB = changeFinder.find(b.getChangeId(), user);
 | 
			
		||||
    assertThat(controlB).hasSize(1);
 | 
			
		||||
    List<ChangeControl> list = ImmutableList.of(controlA.get(0), controlB.get(0));
 | 
			
		||||
    changeAbandoner.batchAbandon(controlA.get(0).getProject().getNameKey(), user, list, "deadbeef");
 | 
			
		||||
    changeAbandoner.batchAbandon(
 | 
			
		||||
        batchUpdateFactory, controlA.get(0).getProject().getNameKey(), user, list, "deadbeef");
 | 
			
		||||
 | 
			
		||||
    ChangeInfo info = get(a.getChangeId());
 | 
			
		||||
    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
 | 
			
		||||
@@ -399,7 +400,7 @@ public class ChangeIT extends AbstractDaemonTest {
 | 
			
		||||
    exception.expect(ResourceConflictException.class);
 | 
			
		||||
    exception.expectMessage(
 | 
			
		||||
        String.format("Project name \"%s\" doesn't match \"%s\"", project2Name, project1Name));
 | 
			
		||||
    changeAbandoner.batchAbandon(new Project.NameKey(project1Name), user, list);
 | 
			
		||||
    changeAbandoner.batchAbandon(batchUpdateFactory, new Project.NameKey(project1Name), user, list);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.httpd.rpc.project;
 | 
			
		||||
 | 
			
		||||
import com.google.common.base.Throwables;
 | 
			
		||||
import com.google.gerrit.common.Nullable;
 | 
			
		||||
import com.google.gerrit.common.TimeUtil;
 | 
			
		||||
import com.google.gerrit.common.data.AccessSection;
 | 
			
		||||
@@ -38,7 +39,6 @@ import com.google.gerrit.server.config.AllProjectsName;
 | 
			
		||||
import com.google.gerrit.server.git.MetaDataUpdate;
 | 
			
		||||
import com.google.gerrit.server.git.ProjectConfig;
 | 
			
		||||
import com.google.gerrit.server.group.SystemGroupBackend;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectCache;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectControl;
 | 
			
		||||
import com.google.gerrit.server.project.RefControl;
 | 
			
		||||
@@ -175,13 +175,10 @@ public class ReviewProjectAccess extends ProjectAccessHandler<Change.Id> {
 | 
			
		||||
      AddReviewerInput input = new AddReviewerInput();
 | 
			
		||||
      input.reviewer = projectOwners;
 | 
			
		||||
      reviewersProvider.get().apply(rsrc, input);
 | 
			
		||||
    } catch (IOException
 | 
			
		||||
        | OrmException
 | 
			
		||||
        | RestApiException
 | 
			
		||||
        | UpdateException
 | 
			
		||||
        | PermissionBackendException e) {
 | 
			
		||||
    } catch (Exception e) {
 | 
			
		||||
      // one of the owner groups is not visible to the user and this it why it
 | 
			
		||||
      // can't be added as reviewer
 | 
			
		||||
      Throwables.throwIfUnchecked(e);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -198,12 +195,9 @@ public class ReviewProjectAccess extends ProjectAccessHandler<Change.Id> {
 | 
			
		||||
        AddReviewerInput input = new AddReviewerInput();
 | 
			
		||||
        input.reviewer = r.getGroup().getUUID().get();
 | 
			
		||||
        reviewersProvider.get().apply(rsrc, input);
 | 
			
		||||
      } catch (IOException
 | 
			
		||||
          | OrmException
 | 
			
		||||
          | RestApiException
 | 
			
		||||
          | UpdateException
 | 
			
		||||
          | PermissionBackendException e) {
 | 
			
		||||
      } catch (Exception e) {
 | 
			
		||||
        // ignore
 | 
			
		||||
        Throwables.throwIfUnchecked(e);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -607,6 +607,8 @@ class ChangeApiImpl implements ChangeApi {
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeInfo check(FixInput fix) throws RestApiException {
 | 
			
		||||
    try {
 | 
			
		||||
      // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
 | 
			
		||||
      // ConsistencyChecker.
 | 
			
		||||
      return check.apply(change, fix).value();
 | 
			
		||||
    } catch (Exception e) {
 | 
			
		||||
      throw asRestApiException("Cannot check change", e);
 | 
			
		||||
@@ -624,6 +626,8 @@ class ChangeApiImpl implements ChangeApi {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void ignore(boolean ignore) throws RestApiException {
 | 
			
		||||
    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
 | 
			
		||||
    // StarredChangesUtil.
 | 
			
		||||
    if (ignore) {
 | 
			
		||||
      this.ignore.apply(change, new Ignore.Input());
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -633,6 +637,8 @@ class ChangeApiImpl implements ChangeApi {
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void mute(boolean mute) throws RestApiException {
 | 
			
		||||
    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
 | 
			
		||||
    // StarredChangesUtil.
 | 
			
		||||
    if (mute) {
 | 
			
		||||
      this.mute.apply(change, new Mute.Input());
 | 
			
		||||
    } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import com.google.gerrit.extensions.api.changes.RecipientType;
 | 
			
		||||
import com.google.gerrit.extensions.common.ChangeInfo;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
 | 
			
		||||
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.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
@@ -35,6 +34,8 @@ 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.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -43,11 +44,10 @@ import com.google.inject.Singleton;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class Abandon
 | 
			
		||||
    implements RestModifyView<ChangeResource, AbandonInput>, UiAction<ChangeResource> {
 | 
			
		||||
public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput, ChangeInfo>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private final Provider<ReviewDb> dbProvider;
 | 
			
		||||
  private final ChangeJson.Factory json;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final AbandonOp.Factory abandonOpFactory;
 | 
			
		||||
  private final NotifyUtil notifyUtil;
 | 
			
		||||
 | 
			
		||||
@@ -55,23 +55,25 @@ public class Abandon
 | 
			
		||||
  Abandon(
 | 
			
		||||
      Provider<ReviewDb> dbProvider,
 | 
			
		||||
      ChangeJson.Factory json,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      AbandonOp.Factory abandonOpFactory,
 | 
			
		||||
      NotifyUtil notifyUtil) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.dbProvider = dbProvider;
 | 
			
		||||
    this.json = json;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.abandonOpFactory = abandonOpFactory;
 | 
			
		||||
    this.notifyUtil = notifyUtil;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeInfo apply(ChangeResource req, AbandonInput input)
 | 
			
		||||
  protected ChangeInfo applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, AbandonInput input)
 | 
			
		||||
      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
 | 
			
		||||
    req.permissions().database(dbProvider).check(ChangePermission.ABANDON);
 | 
			
		||||
 | 
			
		||||
    Change change =
 | 
			
		||||
        abandon(
 | 
			
		||||
            updateFactory,
 | 
			
		||||
            req.getControl(),
 | 
			
		||||
            input.message,
 | 
			
		||||
            input.notify,
 | 
			
		||||
@@ -79,16 +81,18 @@ public class Abandon
 | 
			
		||||
    return json.noOptions().format(change);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Change abandon(ChangeControl control) throws RestApiException, UpdateException {
 | 
			
		||||
    return abandon(control, "", NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
  public Change abandon(BatchUpdate.Factory updateFactory, ChangeControl control)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    return abandon(updateFactory, control, "", NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Change abandon(ChangeControl control, String msgTxt)
 | 
			
		||||
  public Change abandon(BatchUpdate.Factory updateFactory, ChangeControl control, String msgTxt)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    return abandon(control, msgTxt, NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
    return abandon(updateFactory, control, msgTxt, NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Change abandon(
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      ChangeControl control,
 | 
			
		||||
      String msgTxt,
 | 
			
		||||
      NotifyHandling notifyHandling,
 | 
			
		||||
@@ -98,7 +102,7 @@ public class Abandon
 | 
			
		||||
    Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null;
 | 
			
		||||
    AbandonOp op = abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify);
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(),
 | 
			
		||||
            control.getProject().getNameKey(),
 | 
			
		||||
            control.getUser(),
 | 
			
		||||
@@ -116,6 +120,7 @@ public class Abandon
 | 
			
		||||
   * matching project from its ChangeControl. Violations will result in a ResourceConflictException.
 | 
			
		||||
   */
 | 
			
		||||
  public void batchAbandon(
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      Project.NameKey project,
 | 
			
		||||
      CurrentUser user,
 | 
			
		||||
      Collection<ChangeControl> controls,
 | 
			
		||||
@@ -127,8 +132,7 @@ public class Abandon
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null;
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) {
 | 
			
		||||
    try (BatchUpdate u = updateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) {
 | 
			
		||||
      for (ChangeControl control : controls) {
 | 
			
		||||
        if (!project.equals(control.getProject().getNameKey())) {
 | 
			
		||||
          throw new ResourceConflictException(
 | 
			
		||||
@@ -145,15 +149,30 @@ public class Abandon
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void batchAbandon(
 | 
			
		||||
      Project.NameKey project, CurrentUser user, Collection<ChangeControl> controls, String msgTxt)
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      Project.NameKey project,
 | 
			
		||||
      CurrentUser user,
 | 
			
		||||
      Collection<ChangeControl> controls,
 | 
			
		||||
      String msgTxt)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    batchAbandon(project, user, controls, msgTxt, NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
    batchAbandon(
 | 
			
		||||
        updateFactory,
 | 
			
		||||
        project,
 | 
			
		||||
        user,
 | 
			
		||||
        controls,
 | 
			
		||||
        msgTxt,
 | 
			
		||||
        NotifyHandling.ALL,
 | 
			
		||||
        ImmutableListMultimap.of());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void batchAbandon(
 | 
			
		||||
      Project.NameKey project, CurrentUser user, Collection<ChangeControl> controls)
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      Project.NameKey project,
 | 
			
		||||
      CurrentUser user,
 | 
			
		||||
      Collection<ChangeControl> controls)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    batchAbandon(project, user, controls, "", NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
    batchAbandon(
 | 
			
		||||
        updateFactory, project, user, controls, "", NotifyHandling.ALL, ImmutableListMultimap.of());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ import com.google.gerrit.server.query.QueryParseException;
 | 
			
		||||
import com.google.gerrit.server.query.change.ChangeData;
 | 
			
		||||
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
 | 
			
		||||
import com.google.gerrit.server.query.change.ChangeQueryProcessor;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Singleton;
 | 
			
		||||
@@ -38,6 +39,7 @@ import org.slf4j.LoggerFactory;
 | 
			
		||||
public class AbandonUtil {
 | 
			
		||||
  private static final Logger log = LoggerFactory.getLogger(AbandonUtil.class);
 | 
			
		||||
 | 
			
		||||
  private final BatchUpdate.Factory updateFactory;
 | 
			
		||||
  private final ChangeCleanupConfig cfg;
 | 
			
		||||
  private final ChangeQueryProcessor queryProcessor;
 | 
			
		||||
  private final ChangeQueryBuilder queryBuilder;
 | 
			
		||||
@@ -46,11 +48,13 @@ public class AbandonUtil {
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  AbandonUtil(
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      ChangeCleanupConfig cfg,
 | 
			
		||||
      InternalUser.Factory internalUserFactory,
 | 
			
		||||
      ChangeQueryProcessor queryProcessor,
 | 
			
		||||
      ChangeQueryBuilder queryBuilder,
 | 
			
		||||
      Abandon abandon) {
 | 
			
		||||
    this.updateFactory = updateFactory;
 | 
			
		||||
    this.cfg = cfg;
 | 
			
		||||
    this.queryProcessor = queryProcessor;
 | 
			
		||||
    this.queryBuilder = queryBuilder;
 | 
			
		||||
@@ -85,7 +89,7 @@ public class AbandonUtil {
 | 
			
		||||
      for (Project.NameKey project : abandons.keySet()) {
 | 
			
		||||
        Collection<ChangeControl> changes = getValidChanges(abandons.get(project), query);
 | 
			
		||||
        try {
 | 
			
		||||
          abandon.batchAbandon(project, internalUser, changes, message);
 | 
			
		||||
          abandon.batchAbandon(updateFactory, project, internalUser, changes, message);
 | 
			
		||||
          count += changes.size();
 | 
			
		||||
        } catch (Throwable e) {
 | 
			
		||||
          StringBuilder msg = new StringBuilder("Failed to auto-abandon inactive change(s):");
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ import com.google.gerrit.extensions.restapi.MergeConflictException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 | 
			
		||||
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.reviewdb.client.Branch;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.PatchSet;
 | 
			
		||||
@@ -46,6 +45,8 @@ import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.InvalidChangeOperationException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectControl;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -65,7 +66,8 @@ import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
import org.eclipse.jgit.util.ChangeIdUtil;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class CreateMergePatchSet implements RestModifyView<ChangeResource, MergePatchSetInput> {
 | 
			
		||||
public class CreateMergePatchSet
 | 
			
		||||
    extends RetryingRestModifyView<ChangeResource, MergePatchSetInput, Response<ChangeInfo>> {
 | 
			
		||||
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
  private final GitRepositoryManager gitManager;
 | 
			
		||||
@@ -74,7 +76,6 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
 | 
			
		||||
  private final ChangeJson.Factory jsonFactory;
 | 
			
		||||
  private final PatchSetUtil psUtil;
 | 
			
		||||
  private final MergeUtil.Factory mergeUtilFactory;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final PatchSetInserter.Factory patchSetInserterFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
@@ -86,8 +87,9 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
 | 
			
		||||
      ChangeJson.Factory json,
 | 
			
		||||
      PatchSetUtil psUtil,
 | 
			
		||||
      MergeUtil.Factory mergeUtilFactory,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      PatchSetInserter.Factory patchSetInserterFactory) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.gitManager = gitManager;
 | 
			
		||||
    this.serverTimeZone = myIdent.getTimeZone();
 | 
			
		||||
@@ -95,12 +97,12 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
 | 
			
		||||
    this.jsonFactory = json;
 | 
			
		||||
    this.psUtil = psUtil;
 | 
			
		||||
    this.mergeUtilFactory = mergeUtilFactory;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.patchSetInserterFactory = patchSetInserterFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<ChangeInfo> apply(ChangeResource req, MergePatchSetInput in)
 | 
			
		||||
  protected Response<ChangeInfo> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, MergePatchSetInput in)
 | 
			
		||||
      throws OrmException, IOException, InvalidChangeOperationException, RestApiException,
 | 
			
		||||
          UpdateException {
 | 
			
		||||
    if (in.merge == null) {
 | 
			
		||||
@@ -157,7 +159,7 @@ public class CreateMergePatchSet implements RestModifyView<ChangeResource, Merge
 | 
			
		||||
 | 
			
		||||
      PatchSet.Id nextPsId = ChangeUtil.nextPatchSetId(ps.getId());
 | 
			
		||||
      PatchSetInserter psInserter = patchSetInserterFactory.create(ctl, nextPsId, newCommit);
 | 
			
		||||
      try (BatchUpdate bu = batchUpdateFactory.create(db.get(), project, me, now)) {
 | 
			
		||||
      try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
 | 
			
		||||
        bu.setRepository(git, rw, oi);
 | 
			
		||||
        bu.addOp(
 | 
			
		||||
            ctl.getId(),
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ import com.google.gerrit.common.TimeUtil;
 | 
			
		||||
import com.google.gerrit.extensions.common.AccountInfo;
 | 
			
		||||
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.reviewdb.client.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.ChangeMessage;
 | 
			
		||||
@@ -35,6 +34,8 @@ import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
import com.google.gerrit.server.update.ChangeContext;
 | 
			
		||||
import com.google.gerrit.server.update.Context;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -42,10 +43,10 @@ import com.google.inject.Provider;
 | 
			
		||||
import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class DeleteAssignee implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
public class DeleteAssignee
 | 
			
		||||
    extends RetryingRestModifyView<ChangeResource, Input, Response<AccountInfo>> {
 | 
			
		||||
  public static class Input {}
 | 
			
		||||
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
  private final AssigneeChanged assigneeChanged;
 | 
			
		||||
@@ -54,13 +55,13 @@ public class DeleteAssignee implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  DeleteAssignee(
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      ChangeMessagesUtil cmUtil,
 | 
			
		||||
      Provider<ReviewDb> db,
 | 
			
		||||
      AssigneeChanged assigneeChanged,
 | 
			
		||||
      IdentifiedUser.GenericFactory userFactory,
 | 
			
		||||
      AccountLoader.Factory accountLoaderFactory) {
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.assigneeChanged = assigneeChanged;
 | 
			
		||||
@@ -69,12 +70,13 @@ public class DeleteAssignee implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<AccountInfo> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
  protected Response<AccountInfo> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
 | 
			
		||||
    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      Op op = new Op();
 | 
			
		||||
      bu.addOp(rsrc.getChange().getId(), op);
 | 
			
		||||
      bu.execute();
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,13 @@ import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
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.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.ChangeMessagesUtil;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
@@ -32,25 +33,23 @@ import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class DeletePrivate
 | 
			
		||||
    implements RestModifyView<ChangeResource, DeletePrivate.Input>, UiAction<ChangeResource> {
 | 
			
		||||
    extends RetryingRestModifyView<ChangeResource, DeletePrivate.Input, Response<String>>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  public static class Input {}
 | 
			
		||||
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final Provider<ReviewDb> dbProvider;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  DeletePrivate(
 | 
			
		||||
      Provider<ReviewDb> dbProvider,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      ChangeMessagesUtil cmUtil) {
 | 
			
		||||
  DeletePrivate(Provider<ReviewDb> dbProvider, RetryHelper retryHelper, ChangeMessagesUtil cmUtil) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.dbProvider = dbProvider;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<String> apply(ChangeResource rsrc, DeletePrivate.Input input)
 | 
			
		||||
  protected Response<String> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, DeletePrivate.Input input)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    if (!rsrc.isUserOwner()) {
 | 
			
		||||
      throw new AuthException("not allowed to unmark private");
 | 
			
		||||
@@ -63,7 +62,7 @@ public class DeletePrivate
 | 
			
		||||
    ChangeControl control = rsrc.getControl();
 | 
			
		||||
    SetPrivateOp op = new SetPrivateOp(cmUtil, false);
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(),
 | 
			
		||||
            control.getProject().getNameKey(),
 | 
			
		||||
            control.getUser(),
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,6 @@ package com.google.gerrit.server.change;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.Response;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestModifyView;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.server.change.Index.Input;
 | 
			
		||||
@@ -24,6 +23,9 @@ import com.google.gerrit.server.index.change.ChangeIndexer;
 | 
			
		||||
import com.google.gerrit.server.permissions.GlobalPermission;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackend;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
@@ -31,7 +33,7 @@ import com.google.inject.Singleton;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class Index implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
public class Index extends RetryingRestModifyView<ChangeResource, Input, Response<?>> {
 | 
			
		||||
  public static class Input {}
 | 
			
		||||
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
@@ -42,9 +44,11 @@ public class Index implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
  @Inject
 | 
			
		||||
  Index(
 | 
			
		||||
      Provider<ReviewDb> db,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      PermissionBackend permissionBackend,
 | 
			
		||||
      Provider<CurrentUser> user,
 | 
			
		||||
      ChangeIndexer indexer) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.permissionBackend = permissionBackend;
 | 
			
		||||
    this.user = user;
 | 
			
		||||
@@ -52,7 +56,8 @@ public class Index implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<?> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
  protected Response<?> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
      throws IOException, AuthException, OrmException, PermissionBackendException {
 | 
			
		||||
    permissionBackend.user(user).check(GlobalPermission.MAINTAIN_SERVER);
 | 
			
		||||
    indexer.index(db.get(), rsrc.getChange());
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import com.google.gerrit.extensions.common.ChangeInfo;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestApiException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestModifyView;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Branch;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change.Status;
 | 
			
		||||
@@ -42,6 +41,8 @@ import com.google.gerrit.server.query.change.InternalChangeQuery;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
import com.google.gerrit.server.update.ChangeContext;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -55,13 +56,12 @@ import org.eclipse.jgit.revwalk.RevCommit;
 | 
			
		||||
import org.eclipse.jgit.revwalk.RevWalk;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class Move implements RestModifyView<ChangeResource, MoveInput> {
 | 
			
		||||
public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, ChangeInfo> {
 | 
			
		||||
  private final Provider<ReviewDb> dbProvider;
 | 
			
		||||
  private final ChangeJson.Factory json;
 | 
			
		||||
  private final GitRepositoryManager repoManager;
 | 
			
		||||
  private final Provider<InternalChangeQuery> queryProvider;
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final PatchSetUtil psUtil;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
@@ -71,19 +71,20 @@ public class Move implements RestModifyView<ChangeResource, MoveInput> {
 | 
			
		||||
      GitRepositoryManager repoManager,
 | 
			
		||||
      Provider<InternalChangeQuery> queryProvider,
 | 
			
		||||
      ChangeMessagesUtil cmUtil,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      PatchSetUtil psUtil) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.dbProvider = dbProvider;
 | 
			
		||||
    this.json = json;
 | 
			
		||||
    this.repoManager = repoManager;
 | 
			
		||||
    this.queryProvider = queryProvider;
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.psUtil = psUtil;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeInfo apply(ChangeResource req, MoveInput input)
 | 
			
		||||
  protected ChangeInfo applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, MoveInput input)
 | 
			
		||||
      throws RestApiException, OrmException, UpdateException {
 | 
			
		||||
    ChangeControl control = req.getControl();
 | 
			
		||||
    input.destinationBranch = RefNames.fullName(input.destinationBranch);
 | 
			
		||||
@@ -92,7 +93,7 @@ public class Move implements RestModifyView<ChangeResource, MoveInput> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(), req.getChange().getProject(), control.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      u.addOp(req.getChange().getId(), new Op(input));
 | 
			
		||||
      u.execute();
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,13 @@ import com.google.gerrit.common.TimeUtil;
 | 
			
		||||
import com.google.gerrit.extensions.api.changes.HashtagsInput;
 | 
			
		||||
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.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.permissions.ChangePermission;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
@@ -32,28 +33,28 @@ import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class PostHashtags
 | 
			
		||||
    implements RestModifyView<ChangeResource, HashtagsInput>, UiAction<ChangeResource> {
 | 
			
		||||
    extends RetryingRestModifyView<
 | 
			
		||||
        ChangeResource, HashtagsInput, Response<ImmutableSortedSet<String>>>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final SetHashtagsOp.Factory hashtagsFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  PostHashtags(
 | 
			
		||||
      Provider<ReviewDb> db,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      SetHashtagsOp.Factory hashtagsFactory) {
 | 
			
		||||
      Provider<ReviewDb> db, RetryHelper retryHelper, SetHashtagsOp.Factory hashtagsFactory) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.hashtagsFactory = hashtagsFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<ImmutableSortedSet<String>> apply(ChangeResource req, HashtagsInput input)
 | 
			
		||||
  protected Response<ImmutableSortedSet<String>> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, HashtagsInput input)
 | 
			
		||||
      throws RestApiException, UpdateException, PermissionBackendException {
 | 
			
		||||
    req.permissions().check(ChangePermission.EDIT_HASHTAGS);
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            db.get(), req.getChange().getProject(), req.getControl().getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      SetHashtagsOp op = hashtagsFactory.create(input);
 | 
			
		||||
      bu.addOp(req.getId(), op);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@ import com.google.gerrit.extensions.common.AccountInfo;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.BadRequestException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestApiException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestModifyView;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.AccountGroup;
 | 
			
		||||
@@ -65,6 +64,8 @@ import com.google.gerrit.server.project.NoSuchProjectException;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectCache;
 | 
			
		||||
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;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -78,7 +79,8 @@ import java.util.Set;
 | 
			
		||||
import org.eclipse.jgit.lib.Config;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class PostReviewers implements RestModifyView<ChangeResource, AddReviewerInput> {
 | 
			
		||||
public class PostReviewers
 | 
			
		||||
    extends RetryingRestModifyView<ChangeResource, AddReviewerInput, AddReviewerResult> {
 | 
			
		||||
 | 
			
		||||
  public static final int DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK = 10;
 | 
			
		||||
  public static final int DEFAULT_MAX_REVIEWERS = 20;
 | 
			
		||||
@@ -92,7 +94,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
  private final AccountLoader.Factory accountLoaderFactory;
 | 
			
		||||
  private final Provider<ReviewDb> dbProvider;
 | 
			
		||||
  private final ChangeData.Factory changeDataFactory;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final IdentifiedUser.GenericFactory identifiedUserFactory;
 | 
			
		||||
  private final Config cfg;
 | 
			
		||||
  private final ReviewerJson json;
 | 
			
		||||
@@ -113,7 +114,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
      AccountLoader.Factory accountLoaderFactory,
 | 
			
		||||
      Provider<ReviewDb> db,
 | 
			
		||||
      ChangeData.Factory changeDataFactory,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      IdentifiedUser.GenericFactory identifiedUserFactory,
 | 
			
		||||
      @GerritServerConfig Config cfg,
 | 
			
		||||
      ReviewerJson json,
 | 
			
		||||
@@ -123,6 +124,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
      Provider<AnonymousUser> anonymousProvider,
 | 
			
		||||
      PostReviewersOp.Factory postReviewersOpFactory,
 | 
			
		||||
      OutgoingEmailValidator validator) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.accounts = accounts;
 | 
			
		||||
    this.reviewerFactory = reviewerFactory;
 | 
			
		||||
    this.permissionBackend = permissionBackend;
 | 
			
		||||
@@ -131,7 +133,6 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
    this.accountLoaderFactory = accountLoaderFactory;
 | 
			
		||||
    this.dbProvider = db;
 | 
			
		||||
    this.changeDataFactory = changeDataFactory;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.identifiedUserFactory = identifiedUserFactory;
 | 
			
		||||
    this.cfg = cfg;
 | 
			
		||||
    this.json = json;
 | 
			
		||||
@@ -144,7 +145,8 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public AddReviewerResult apply(ChangeResource rsrc, AddReviewerInput input)
 | 
			
		||||
  protected AddReviewerResult applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AddReviewerInput input)
 | 
			
		||||
      throws IOException, OrmException, RestApiException, UpdateException,
 | 
			
		||||
          PermissionBackendException {
 | 
			
		||||
    if (input.reviewer == null) {
 | 
			
		||||
@@ -156,7 +158,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
 | 
			
		||||
      return addition.result;
 | 
			
		||||
    }
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      Change.Id id = rsrc.getChange().getId();
 | 
			
		||||
      bu.addOp(id, addition.op);
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,8 @@ import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
import com.google.gerrit.server.update.ChangeContext;
 | 
			
		||||
import com.google.gerrit.server.update.Context;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -131,16 +133,19 @@ public class PublishDraftPatchSet
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class CurrentRevision implements RestModifyView<ChangeResource, Input> {
 | 
			
		||||
  public static class CurrentRevision
 | 
			
		||||
      extends RetryingRestModifyView<ChangeResource, Input, Response<?>> {
 | 
			
		||||
    private final PublishDraftPatchSet publish;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    CurrentRevision(PublishDraftPatchSet publish) {
 | 
			
		||||
    CurrentRevision(RetryHelper retryHelper, PublishDraftPatchSet publish) {
 | 
			
		||||
      super(retryHelper);
 | 
			
		||||
      this.publish = publish;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Response<?> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
    protected Response<?> applyImpl(
 | 
			
		||||
        BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
        throws RestApiException, UpdateException {
 | 
			
		||||
      return publish.apply(
 | 
			
		||||
          rsrc.getControl().getUser(),
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@ import com.google.gerrit.extensions.common.AccountInfo;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.BadRequestException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestApiException;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestModifyView;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 | 
			
		||||
import com.google.gerrit.extensions.webui.UiAction;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
@@ -35,6 +34,8 @@ import com.google.gerrit.server.change.PostReviewers.Addition;
 | 
			
		||||
import com.google.gerrit.server.permissions.ChangePermission;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -43,12 +44,11 @@ import com.google.inject.Singleton;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class PutAssignee
 | 
			
		||||
    implements RestModifyView<ChangeResource, AssigneeInput>, UiAction<ChangeResource> {
 | 
			
		||||
public class PutAssignee extends RetryingRestModifyView<ChangeResource, AssigneeInput, AccountInfo>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
 | 
			
		||||
  private final AccountsCollection accounts;
 | 
			
		||||
  private final SetAssigneeOp.Factory assigneeFactory;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
  private final PostReviewers postReviewers;
 | 
			
		||||
  private final AccountLoader.Factory accountLoaderFactory;
 | 
			
		||||
@@ -57,20 +57,21 @@ public class PutAssignee
 | 
			
		||||
  PutAssignee(
 | 
			
		||||
      AccountsCollection accounts,
 | 
			
		||||
      SetAssigneeOp.Factory assigneeFactory,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      Provider<ReviewDb> db,
 | 
			
		||||
      PostReviewers postReviewers,
 | 
			
		||||
      AccountLoader.Factory accountLoaderFactory) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.accounts = accounts;
 | 
			
		||||
    this.assigneeFactory = assigneeFactory;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.postReviewers = postReviewers;
 | 
			
		||||
    this.accountLoaderFactory = accountLoaderFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public AccountInfo apply(ChangeResource rsrc, AssigneeInput input)
 | 
			
		||||
  protected AccountInfo applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AssigneeInput input)
 | 
			
		||||
      throws RestApiException, UpdateException, OrmException, IOException,
 | 
			
		||||
          PermissionBackendException {
 | 
			
		||||
    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
 | 
			
		||||
@@ -91,7 +92,7 @@ public class PutAssignee
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            db.get(),
 | 
			
		||||
            rsrc.getChange().getProject(),
 | 
			
		||||
            rsrc.getControl().getUser(),
 | 
			
		||||
 
 | 
			
		||||
@@ -18,13 +18,14 @@ import com.google.gerrit.common.TimeUtil;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
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;
 | 
			
		||||
import com.google.gerrit.reviewdb.server.ReviewDb;
 | 
			
		||||
import com.google.gerrit.server.ChangeMessagesUtil;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
@@ -32,25 +33,23 @@ import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class PutPrivate
 | 
			
		||||
    implements RestModifyView<ChangeResource, PutPrivate.Input>, UiAction<ChangeResource> {
 | 
			
		||||
    extends RetryingRestModifyView<ChangeResource, PutPrivate.Input, Response<String>>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  public static class Input {}
 | 
			
		||||
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final Provider<ReviewDb> dbProvider;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  PutPrivate(
 | 
			
		||||
      Provider<ReviewDb> dbProvider,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      ChangeMessagesUtil cmUtil) {
 | 
			
		||||
  PutPrivate(Provider<ReviewDb> dbProvider, RetryHelper retryHelper, ChangeMessagesUtil cmUtil) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.dbProvider = dbProvider;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<String> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
  protected Response<String> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    if (!rsrc.isUserOwner()) {
 | 
			
		||||
      throw new AuthException("not allowed to mark private");
 | 
			
		||||
@@ -63,7 +62,7 @@ public class PutPrivate
 | 
			
		||||
    ChangeControl control = rsrc.getControl();
 | 
			
		||||
    SetPrivateOp op = new SetPrivateOp(cmUtil, true);
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(),
 | 
			
		||||
            control.getProject().getNameKey(),
 | 
			
		||||
            control.getUser(),
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,8 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.server.project.ChangeControl;
 | 
			
		||||
import com.google.gerrit.server.project.NoSuchChangeException;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -210,18 +212,21 @@ public class Rebase
 | 
			
		||||
        .setEnabled(enabled);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static class CurrentRevision implements RestModifyView<ChangeResource, RebaseInput> {
 | 
			
		||||
  public static class CurrentRevision
 | 
			
		||||
      extends RetryingRestModifyView<ChangeResource, RebaseInput, ChangeInfo> {
 | 
			
		||||
    private final PatchSetUtil psUtil;
 | 
			
		||||
    private final Rebase rebase;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    CurrentRevision(PatchSetUtil psUtil, Rebase rebase) {
 | 
			
		||||
    CurrentRevision(RetryHelper retryHelper, PatchSetUtil psUtil, Rebase rebase) {
 | 
			
		||||
      super(retryHelper);
 | 
			
		||||
      this.psUtil = psUtil;
 | 
			
		||||
      this.rebase = rebase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ChangeInfo apply(ChangeResource rsrc, RebaseInput input)
 | 
			
		||||
    protected ChangeInfo applyImpl(
 | 
			
		||||
        BatchUpdate.Factory updateFactory, ChangeResource rsrc, RebaseInput input)
 | 
			
		||||
        throws EmailException, OrmException, UpdateException, RestApiException, IOException,
 | 
			
		||||
            PermissionBackendException {
 | 
			
		||||
      PatchSet ps = psUtil.current(rebase.dbProvider.get(), rsrc.getNotes());
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ import com.google.gerrit.extensions.api.changes.RestoreInput;
 | 
			
		||||
import com.google.gerrit.extensions.common.ChangeInfo;
 | 
			
		||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
 | 
			
		||||
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;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change.Status;
 | 
			
		||||
@@ -41,6 +40,8 @@ import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
import com.google.gerrit.server.update.ChangeContext;
 | 
			
		||||
import com.google.gerrit.server.update.Context;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -50,8 +51,8 @@ import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class Restore
 | 
			
		||||
    implements RestModifyView<ChangeResource, RestoreInput>, UiAction<ChangeResource> {
 | 
			
		||||
public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput, ChangeInfo>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private static final Logger log = LoggerFactory.getLogger(Restore.class);
 | 
			
		||||
 | 
			
		||||
  private final RestoredSender.Factory restoredSenderFactory;
 | 
			
		||||
@@ -59,7 +60,6 @@ public class Restore
 | 
			
		||||
  private final ChangeJson.Factory json;
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final PatchSetUtil psUtil;
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
  private final ChangeRestored changeRestored;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
@@ -69,26 +69,27 @@ public class Restore
 | 
			
		||||
      ChangeJson.Factory json,
 | 
			
		||||
      ChangeMessagesUtil cmUtil,
 | 
			
		||||
      PatchSetUtil psUtil,
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      ChangeRestored changeRestored) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.restoredSenderFactory = restoredSenderFactory;
 | 
			
		||||
    this.dbProvider = dbProvider;
 | 
			
		||||
    this.json = json;
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.psUtil = psUtil;
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
    this.changeRestored = changeRestored;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeInfo apply(ChangeResource req, RestoreInput input)
 | 
			
		||||
  protected ChangeInfo applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, RestoreInput input)
 | 
			
		||||
      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
 | 
			
		||||
    req.permissions().database(dbProvider).check(ChangePermission.RESTORE);
 | 
			
		||||
 | 
			
		||||
    ChangeControl ctl = req.getControl();
 | 
			
		||||
    Op op = new Op(input);
 | 
			
		||||
    try (BatchUpdate u =
 | 
			
		||||
        batchUpdateFactory.create(
 | 
			
		||||
        updateFactory.create(
 | 
			
		||||
            dbProvider.get(), req.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      u.addOp(req.getId(), op).execute();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
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.extensions.restapi.RestModifyView;
 | 
			
		||||
import com.google.gerrit.extensions.webui.UiAction;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Account;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
@@ -50,6 +49,8 @@ import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdateOp;
 | 
			
		||||
import com.google.gerrit.server.update.ChangeContext;
 | 
			
		||||
import com.google.gerrit.server.update.Context;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
@@ -74,15 +75,14 @@ import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class Revert
 | 
			
		||||
    implements RestModifyView<ChangeResource, RevertInput>, UiAction<ChangeResource> {
 | 
			
		||||
public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput, ChangeInfo>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private static final Logger log = LoggerFactory.getLogger(Revert.class);
 | 
			
		||||
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
  private final GitRepositoryManager repoManager;
 | 
			
		||||
  private final ChangeInserter.Factory changeInserterFactory;
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final BatchUpdate.Factory updateFactory;
 | 
			
		||||
  private final Sequences seq;
 | 
			
		||||
  private final PatchSetUtil psUtil;
 | 
			
		||||
  private final RevertedSender.Factory revertedSenderFactory;
 | 
			
		||||
@@ -97,7 +97,7 @@ public class Revert
 | 
			
		||||
      GitRepositoryManager repoManager,
 | 
			
		||||
      ChangeInserter.Factory changeInserterFactory,
 | 
			
		||||
      ChangeMessagesUtil cmUtil,
 | 
			
		||||
      BatchUpdate.Factory updateFactory,
 | 
			
		||||
      RetryHelper retryHelper,
 | 
			
		||||
      Sequences seq,
 | 
			
		||||
      PatchSetUtil psUtil,
 | 
			
		||||
      RevertedSender.Factory revertedSenderFactory,
 | 
			
		||||
@@ -105,11 +105,11 @@ public class Revert
 | 
			
		||||
      @GerritPersonIdent PersonIdent serverIdent,
 | 
			
		||||
      ApprovalsUtil approvalsUtil,
 | 
			
		||||
      ChangeReverted changeReverted) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.db = db;
 | 
			
		||||
    this.repoManager = repoManager;
 | 
			
		||||
    this.changeInserterFactory = changeInserterFactory;
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.updateFactory = updateFactory;
 | 
			
		||||
    this.seq = seq;
 | 
			
		||||
    this.psUtil = psUtil;
 | 
			
		||||
    this.revertedSenderFactory = revertedSenderFactory;
 | 
			
		||||
@@ -120,7 +120,8 @@ public class Revert
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public ChangeInfo apply(ChangeResource req, RevertInput input)
 | 
			
		||||
  protected ChangeInfo applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource req, RevertInput input)
 | 
			
		||||
      throws IOException, OrmException, RestApiException, UpdateException, NoSuchChangeException {
 | 
			
		||||
    RefControl refControl = req.getControl().getRefControl();
 | 
			
		||||
    ProjectControl projectControl = req.getControl().getProjectControl();
 | 
			
		||||
@@ -137,11 +138,12 @@ public class Revert
 | 
			
		||||
      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Change.Id revertedChangeId = revert(req.getControl(), Strings.emptyToNull(input.message));
 | 
			
		||||
    Change.Id revertedChangeId =
 | 
			
		||||
        revert(updateFactory, req.getControl(), Strings.emptyToNull(input.message));
 | 
			
		||||
    return json.noOptions().format(req.getProject(), revertedChangeId);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Change.Id revert(ChangeControl ctl, String message)
 | 
			
		||||
  private Change.Id revert(BatchUpdate.Factory updateFactory, ChangeControl ctl, String message)
 | 
			
		||||
      throws OrmException, IOException, RestApiException, UpdateException {
 | 
			
		||||
    Change.Id changeIdToRevert = ctl.getChange().getId();
 | 
			
		||||
    PatchSet.Id patchSetId = ctl.getChange().currentPatchSetId();
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
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;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change.Status;
 | 
			
		||||
@@ -28,28 +27,29 @@ import com.google.gerrit.server.ChangeMessagesUtil;
 | 
			
		||||
import com.google.gerrit.server.ChangeUtil;
 | 
			
		||||
import com.google.gerrit.server.change.WorkInProgressOp.Input;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class SetReadyForReview
 | 
			
		||||
    implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
public class SetReadyForReview extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  SetReadyForReview(
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory, ChangeMessagesUtil cmUtil, Provider<ReviewDb> db) {
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
  SetReadyForReview(RetryHelper retryHelper, ChangeMessagesUtil cmUtil, Provider<ReviewDb> db) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.db = db;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<?> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
  protected Response<?> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    Change change = rsrc.getChange();
 | 
			
		||||
    if (!rsrc.isUserOwner()) {
 | 
			
		||||
@@ -65,7 +65,7 @@ public class SetReadyForReview
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      bu.addOp(rsrc.getChange().getId(), new WorkInProgressOp(cmUtil, false, input));
 | 
			
		||||
      bu.execute();
 | 
			
		||||
      return Response.ok("");
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ import com.google.gerrit.extensions.restapi.AuthException;
 | 
			
		||||
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;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change.Status;
 | 
			
		||||
@@ -28,28 +27,29 @@ import com.google.gerrit.server.ChangeMessagesUtil;
 | 
			
		||||
import com.google.gerrit.server.ChangeUtil;
 | 
			
		||||
import com.google.gerrit.server.change.WorkInProgressOp.Input;
 | 
			
		||||
import com.google.gerrit.server.update.BatchUpdate;
 | 
			
		||||
import com.google.gerrit.server.update.RetryHelper;
 | 
			
		||||
import com.google.gerrit.server.update.RetryingRestModifyView;
 | 
			
		||||
import com.google.gerrit.server.update.UpdateException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
import com.google.inject.Singleton;
 | 
			
		||||
 | 
			
		||||
@Singleton
 | 
			
		||||
public class SetWorkInProgress
 | 
			
		||||
    implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
 | 
			
		||||
  private final BatchUpdate.Factory batchUpdateFactory;
 | 
			
		||||
public class SetWorkInProgress extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
 | 
			
		||||
    implements UiAction<ChangeResource> {
 | 
			
		||||
  private final ChangeMessagesUtil cmUtil;
 | 
			
		||||
  private final Provider<ReviewDb> db;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  SetWorkInProgress(
 | 
			
		||||
      BatchUpdate.Factory batchUpdateFactory, ChangeMessagesUtil cmUtil, Provider<ReviewDb> db) {
 | 
			
		||||
    this.batchUpdateFactory = batchUpdateFactory;
 | 
			
		||||
  SetWorkInProgress(RetryHelper retryHelper, ChangeMessagesUtil cmUtil, Provider<ReviewDb> db) {
 | 
			
		||||
    super(retryHelper);
 | 
			
		||||
    this.cmUtil = cmUtil;
 | 
			
		||||
    this.db = db;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Response<?> apply(ChangeResource rsrc, Input input)
 | 
			
		||||
  protected Response<?> applyImpl(
 | 
			
		||||
      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
 | 
			
		||||
      throws RestApiException, UpdateException {
 | 
			
		||||
    Change change = rsrc.getChange();
 | 
			
		||||
    if (!rsrc.isUserOwner()) {
 | 
			
		||||
@@ -65,7 +65,7 @@ public class SetWorkInProgress
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try (BatchUpdate bu =
 | 
			
		||||
        batchUpdateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
 | 
			
		||||
      bu.addOp(rsrc.getChange().getId(), new WorkInProgressOp(cmUtil, true, input));
 | 
			
		||||
      bu.execute();
 | 
			
		||||
      return Response.ok("");
 | 
			
		||||
 
 | 
			
		||||
@@ -14,17 +14,14 @@
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.sshd.commands;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.extensions.restapi.RestApiException;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.server.change.ChangeResource;
 | 
			
		||||
import com.google.gerrit.server.change.Index;
 | 
			
		||||
import com.google.gerrit.server.permissions.PermissionBackendException;
 | 
			
		||||
import com.google.gerrit.sshd.ChangeArgumentParser;
 | 
			
		||||
import com.google.gerrit.sshd.CommandMetaData;
 | 
			
		||||
import com.google.gerrit.sshd.SshCommand;
 | 
			
		||||
import com.google.gwtorm.server.OrmException;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import org.kohsuke.args4j.Argument;
 | 
			
		||||
@@ -58,7 +55,7 @@ final class IndexChangesCommand extends SshCommand {
 | 
			
		||||
    for (ChangeResource rsrc : changes.values()) {
 | 
			
		||||
      try {
 | 
			
		||||
        index.apply(rsrc, new Index.Input());
 | 
			
		||||
      } catch (IOException | RestApiException | OrmException | PermissionBackendException e) {
 | 
			
		||||
      } catch (Exception e) {
 | 
			
		||||
        ok = false;
 | 
			
		||||
        writeError(
 | 
			
		||||
            "error", String.format("failed to index change %s: %s", rsrc.getId(), e.getMessage()));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user