Convert DeleteDraftChange to BatchUpdate
Change-Id: Id4395f92b0c70e86970d479276e9c9e0cc8c7d8f
This commit is contained in:
@@ -36,7 +36,6 @@ import com.google.gerrit.server.git.BatchUpdate;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.UpdateException;
|
||||
import com.google.gerrit.server.git.validators.CommitValidators;
|
||||
import com.google.gerrit.server.index.ChangeIndexer;
|
||||
import com.google.gerrit.server.mail.RevertedSender;
|
||||
import com.google.gerrit.server.notedb.ChangeUpdate;
|
||||
import com.google.gerrit.server.project.ChangeControl;
|
||||
@@ -186,7 +185,6 @@ public class ChangeUtil {
|
||||
private final ChangeInserter.Factory changeInserterFactory;
|
||||
private final GitRepositoryManager gitManager;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
private final ChangeIndexer indexer;
|
||||
private final BatchUpdate.Factory updateFactory;
|
||||
private final ChangeMessagesUtil changeMessagesUtil;
|
||||
private final ChangeUpdate.Factory changeUpdateFactory;
|
||||
@@ -201,7 +199,6 @@ public class ChangeUtil {
|
||||
ChangeInserter.Factory changeInserterFactory,
|
||||
GitRepositoryManager gitManager,
|
||||
GitReferenceUpdated gitRefUpdated,
|
||||
ChangeIndexer indexer,
|
||||
BatchUpdate.Factory updateFactory,
|
||||
ChangeMessagesUtil changeMessagesUtil,
|
||||
ChangeUpdate.Factory changeUpdateFactory,
|
||||
@@ -214,7 +211,6 @@ public class ChangeUtil {
|
||||
this.changeInserterFactory = changeInserterFactory;
|
||||
this.gitManager = gitManager;
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
this.indexer = indexer;
|
||||
this.updateFactory = updateFactory;
|
||||
this.changeMessagesUtil = changeMessagesUtil;
|
||||
this.changeUpdateFactory = changeUpdateFactory;
|
||||
@@ -345,19 +341,6 @@ public class ChangeUtil {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(dborowitz): Delete after migrating DeleteDraftChange to BatchUpdate.
|
||||
public void deleteDraftChangeInNewTransaction(Change change)
|
||||
throws NoSuchChangeException, OrmException, IOException {
|
||||
db.get().changes().beginTransaction(change.getId());
|
||||
try {
|
||||
deleteDraftChange(change);
|
||||
db.get().commit();
|
||||
indexer.delete(change.getId());
|
||||
} finally {
|
||||
db.get().rollback();
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteDraftChange(Change change)
|
||||
throws NoSuchChangeException, OrmException, IOException {
|
||||
ReviewDb db = this.db.get();
|
||||
|
||||
@@ -22,7 +22,9 @@ import com.google.gerrit.extensions.restapi.RestResource.HasETag;
|
||||
import com.google.gerrit.extensions.restapi.RestView;
|
||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.notedb.ChangeNotes;
|
||||
import com.google.gerrit.server.project.ChangeControl;
|
||||
import com.google.gerrit.server.project.ProjectState;
|
||||
@@ -49,6 +51,10 @@ public class ChangeResource implements RestResource, HasETag {
|
||||
return control;
|
||||
}
|
||||
|
||||
public IdentifiedUser getUser() {
|
||||
return getControl().getUser().asIdentifiedUser();
|
||||
}
|
||||
|
||||
public Change.Id getId() {
|
||||
return getControl().getId();
|
||||
}
|
||||
@@ -57,6 +63,10 @@ public class ChangeResource implements RestResource, HasETag {
|
||||
return getControl().getChange();
|
||||
}
|
||||
|
||||
public Project.NameKey getProject() {
|
||||
return getChange().getProject();
|
||||
}
|
||||
|
||||
public ChangeNotes getNotes() {
|
||||
return getControl().getNotes();
|
||||
}
|
||||
|
||||
@@ -14,18 +14,24 @@
|
||||
|
||||
package com.google.gerrit.server.change;
|
||||
|
||||
import com.google.gerrit.common.TimeUtil;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||
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.extensions.webui.UiAction;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.Change.Status;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.change.DeleteDraftChange.Input;
|
||||
import com.google.gerrit.server.config.GerritServerConfig;
|
||||
import com.google.gerrit.server.git.BatchUpdate;
|
||||
import com.google.gerrit.server.git.BatchUpdate.ChangeContext;
|
||||
import com.google.gerrit.server.git.UpdateException;
|
||||
import com.google.gerrit.server.project.NoSuchChangeException;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
@@ -42,45 +48,59 @@ public class DeleteDraftChange implements
|
||||
public static class Input {
|
||||
}
|
||||
|
||||
protected final Provider<ReviewDb> dbProvider;
|
||||
private final Provider<ReviewDb> db;
|
||||
private final BatchUpdate.Factory updateFactory;
|
||||
private final ChangeUtil changeUtil;
|
||||
private final boolean allowDrafts;
|
||||
|
||||
@Inject
|
||||
public DeleteDraftChange(Provider<ReviewDb> dbProvider,
|
||||
public DeleteDraftChange(Provider<ReviewDb> db,
|
||||
BatchUpdate.Factory updateFactory,
|
||||
ChangeUtil changeUtil,
|
||||
@GerritServerConfig Config cfg) {
|
||||
this.dbProvider = dbProvider;
|
||||
this.db = db;
|
||||
this.updateFactory = updateFactory;
|
||||
this.changeUtil = changeUtil;
|
||||
this.allowDrafts = cfg.getBoolean("change", "allowDrafts", true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response<?> apply(ChangeResource rsrc, Input input)
|
||||
throws ResourceConflictException, AuthException,
|
||||
ResourceNotFoundException, MethodNotAllowedException,
|
||||
OrmException, IOException {
|
||||
if (rsrc.getChange().getStatus() != Status.DRAFT) {
|
||||
throw new ResourceConflictException("Change is not a draft");
|
||||
throws RestApiException, UpdateException {
|
||||
try (BatchUpdate bu = updateFactory.create(
|
||||
db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
|
||||
Change.Id id = rsrc.getChange().getId();
|
||||
bu.addOp(id, new Op());
|
||||
bu.execute();
|
||||
}
|
||||
|
||||
if (!rsrc.getControl().canDeleteDraft(dbProvider.get())) {
|
||||
throw new AuthException("Not permitted to delete this draft change");
|
||||
}
|
||||
|
||||
if (!allowDrafts) {
|
||||
throw new MethodNotAllowedException("draft workflow is disabled");
|
||||
}
|
||||
|
||||
try {
|
||||
changeUtil.deleteDraftChangeInNewTransaction(rsrc.getChange());
|
||||
} catch (NoSuchChangeException e) {
|
||||
throw new ResourceNotFoundException(e.getMessage());
|
||||
}
|
||||
|
||||
return Response.none();
|
||||
}
|
||||
|
||||
private class Op extends BatchUpdate.Op {
|
||||
@Override
|
||||
public void updateChange(ChangeContext ctx)
|
||||
throws RestApiException, OrmException, IOException {
|
||||
if (ctx.getChange().getStatus() != Status.DRAFT) {
|
||||
throw new ResourceConflictException("Change is not a draft");
|
||||
}
|
||||
|
||||
if (!ctx.getChangeControl().canDeleteDraft(ctx.getDb())) {
|
||||
throw new AuthException("Not permitted to delete this draft change");
|
||||
}
|
||||
|
||||
if (!allowDrafts) {
|
||||
throw new MethodNotAllowedException("draft workflow is disabled");
|
||||
}
|
||||
|
||||
try {
|
||||
changeUtil.deleteDraftChange(ctx.getChange());
|
||||
ctx.markDeleted();
|
||||
} catch (NoSuchChangeException e) {
|
||||
throw new ResourceNotFoundException(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public UiAction.Description getDescription(ChangeResource rsrc) {
|
||||
try {
|
||||
@@ -88,7 +108,7 @@ public class DeleteDraftChange implements
|
||||
.setTitle("Delete draft change " + rsrc.getId())
|
||||
.setVisible(allowDrafts
|
||||
&& rsrc.getChange().getStatus() == Status.DRAFT
|
||||
&& rsrc.getControl().canDeleteDraft(dbProvider.get()));
|
||||
&& rsrc.getControl().canDeleteDraft(db.get()));
|
||||
} catch (OrmException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user