Convert DeleteDraftChange to BatchUpdate

Change-Id: Id4395f92b0c70e86970d479276e9c9e0cc8c7d8f
This commit is contained in:
Dave Borowitz
2015-12-04 11:49:18 -05:00
parent ce5649619c
commit a95a555dcb
3 changed files with 54 additions and 41 deletions

View File

@@ -36,7 +36,6 @@ import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.UpdateException; import com.google.gerrit.server.git.UpdateException;
import com.google.gerrit.server.git.validators.CommitValidators; 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.mail.RevertedSender;
import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
@@ -186,7 +185,6 @@ public class ChangeUtil {
private final ChangeInserter.Factory changeInserterFactory; private final ChangeInserter.Factory changeInserterFactory;
private final GitRepositoryManager gitManager; private final GitRepositoryManager gitManager;
private final GitReferenceUpdated gitRefUpdated; private final GitReferenceUpdated gitRefUpdated;
private final ChangeIndexer indexer;
private final BatchUpdate.Factory updateFactory; private final BatchUpdate.Factory updateFactory;
private final ChangeMessagesUtil changeMessagesUtil; private final ChangeMessagesUtil changeMessagesUtil;
private final ChangeUpdate.Factory changeUpdateFactory; private final ChangeUpdate.Factory changeUpdateFactory;
@@ -201,7 +199,6 @@ public class ChangeUtil {
ChangeInserter.Factory changeInserterFactory, ChangeInserter.Factory changeInserterFactory,
GitRepositoryManager gitManager, GitRepositoryManager gitManager,
GitReferenceUpdated gitRefUpdated, GitReferenceUpdated gitRefUpdated,
ChangeIndexer indexer,
BatchUpdate.Factory updateFactory, BatchUpdate.Factory updateFactory,
ChangeMessagesUtil changeMessagesUtil, ChangeMessagesUtil changeMessagesUtil,
ChangeUpdate.Factory changeUpdateFactory, ChangeUpdate.Factory changeUpdateFactory,
@@ -214,7 +211,6 @@ public class ChangeUtil {
this.changeInserterFactory = changeInserterFactory; this.changeInserterFactory = changeInserterFactory;
this.gitManager = gitManager; this.gitManager = gitManager;
this.gitRefUpdated = gitRefUpdated; this.gitRefUpdated = gitRefUpdated;
this.indexer = indexer;
this.updateFactory = updateFactory; this.updateFactory = updateFactory;
this.changeMessagesUtil = changeMessagesUtil; this.changeMessagesUtil = changeMessagesUtil;
this.changeUpdateFactory = changeUpdateFactory; 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) public void deleteDraftChange(Change change)
throws NoSuchChangeException, OrmException, IOException { throws NoSuchChangeException, OrmException, IOException {
ReviewDb db = this.db.get(); ReviewDb db = this.db.get();

View File

@@ -22,7 +22,9 @@ import com.google.gerrit.extensions.restapi.RestResource.HasETag;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Change; 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.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.ProjectState;
@@ -49,6 +51,10 @@ public class ChangeResource implements RestResource, HasETag {
return control; return control;
} }
public IdentifiedUser getUser() {
return getControl().getUser().asIdentifiedUser();
}
public Change.Id getId() { public Change.Id getId() {
return getControl().getId(); return getControl().getId();
} }
@@ -57,6 +63,10 @@ public class ChangeResource implements RestResource, HasETag {
return getControl().getChange(); return getControl().getChange();
} }
public Project.NameKey getProject() {
return getChange().getProject();
}
public ChangeNotes getNotes() { public ChangeNotes getNotes() {
return getControl().getNotes(); return getControl().getNotes();
} }

View File

@@ -14,18 +14,24 @@
package com.google.gerrit.server.change; 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.AuthException;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response; 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.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction; 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.client.Change.Status;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.change.DeleteDraftChange.Input; import com.google.gerrit.server.change.DeleteDraftChange.Input;
import com.google.gerrit.server.config.GerritServerConfig; 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.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -42,45 +48,59 @@ public class DeleteDraftChange implements
public static class Input { 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 ChangeUtil changeUtil;
private final boolean allowDrafts; private final boolean allowDrafts;
@Inject @Inject
public DeleteDraftChange(Provider<ReviewDb> dbProvider, public DeleteDraftChange(Provider<ReviewDb> db,
BatchUpdate.Factory updateFactory,
ChangeUtil changeUtil, ChangeUtil changeUtil,
@GerritServerConfig Config cfg) { @GerritServerConfig Config cfg) {
this.dbProvider = dbProvider; this.db = db;
this.updateFactory = updateFactory;
this.changeUtil = changeUtil; this.changeUtil = changeUtil;
this.allowDrafts = cfg.getBoolean("change", "allowDrafts", true); this.allowDrafts = cfg.getBoolean("change", "allowDrafts", true);
} }
@Override @Override
public Response<?> apply(ChangeResource rsrc, Input input) public Response<?> apply(ChangeResource rsrc, Input input)
throws ResourceConflictException, AuthException, throws RestApiException, UpdateException {
ResourceNotFoundException, MethodNotAllowedException, try (BatchUpdate bu = updateFactory.create(
OrmException, IOException { db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
if (rsrc.getChange().getStatus() != Status.DRAFT) { Change.Id id = rsrc.getChange().getId();
throw new ResourceConflictException("Change is not a draft"); 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(); 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 @Override
public UiAction.Description getDescription(ChangeResource rsrc) { public UiAction.Description getDescription(ChangeResource rsrc) {
try { try {
@@ -88,7 +108,7 @@ public class DeleteDraftChange implements
.setTitle("Delete draft change " + rsrc.getId()) .setTitle("Delete draft change " + rsrc.getId())
.setVisible(allowDrafts .setVisible(allowDrafts
&& rsrc.getChange().getStatus() == Status.DRAFT && rsrc.getChange().getStatus() == Status.DRAFT
&& rsrc.getControl().canDeleteDraft(dbProvider.get())); && rsrc.getControl().canDeleteDraft(db.get()));
} catch (OrmException e) { } catch (OrmException e) {
throw new IllegalStateException(e); throw new IllegalStateException(e);
} }