Retry requests in RestApiServlet, no more retrying for Java API

Instead of implementing retrying of REST requests in base classes of
REST endpoints, implement retrying of requests once in RestApiServlet.

This has the following advantages:
- We now automatically retry all modifying REST requests (not only
  change related modifying REST requests)
- The implementations of the REST endpoints get easier (no longer need
  to extend a Retrying* base class, RetryHelper no longer needs to be
  injected).
- It's no longer possible to forget to enable retrying for a REST
  endpoint (e.g. by just implementing the interface without extending a
  Retrying* base class)
- Follow-up changes can easily add retrying for other types of requests
  (e.g. read requests or create/delete on collection). Before this
  change we would have needed to add another Retrying* base class and
  adapt all relevant REST endpoints to extend that base class.
- In case of auto-retry-with-trace we do not need a complicated way to
  return the trace ID from the REST endpoint implementation back to
  RestApiServlet (means we can simplify the existing code in a
  follow-up change).
- In RestApiServlet we have more information about the REST endpoint
  available and may include this information into traces on auto-retry
  (e.g. URL of the invoked REST endpoint).

One important change in behavior with this change is that we are no
longer retrying calls that are made through the Java extension API. This
is actually good, because it prevents amplifying of retries when this
API is used by plugins. Examples:

- A plugin implements a new REST endpoint and uses the Java extension
  API to implement it. With the old behavior we would have retrying on
  the REST endpoint and retrying on each call to the Java extension API.
  However we would prefer to have retrying only on one level.

- A plugin implements an extension point that is invoked from a REST
  endpoint and uses the Java extension API to implement it. With the old
  behavior we would have retrying on the REST endpoint and retrying on
  each call to the Java extension API. However we would prefer to have
  retrying only on one level.

In addition it's also better for our tests (that mostly use the Java
extension API) that retrying is not done, since the retry logic may
obfuscate flaky behavior.

RetryingRestModifyView and RetryingRestCollectionModifyView are now no
longer needed and are removed. There was one small complication with
removing RetryingRestModifyView. NoteDbUtil.guessRestApiHandler() was
using this class as a marker to find the REST endpoint class from a
stacktrace if the call was done through the Java API and not via REST.
Instead of looking for RetryingRestModifyView in the stacktrace, we now
watch out for a "com.google.gerrit.server.api.*ApiImpl" class. This may
look a little fragile, but API classes are not supposed to change and if
they do and this breaks we have a test that catches this
(ReflogIT#guessRestApiInReflog). For reference here are sample
stacktraces from before [1] and after this change [2].

[1]
com.google.gerrit.server.notedb.NoteDbUtil.guessRestApiHandler(NoteDbUtil.java:74)
  at com.google.gerrit.server.notedb.NoteDbUpdateManager.execute(NoteDbUpdateManager.java:340)
  at com.google.gerrit.server.notedb.NoteDbUpdateManager.execute(NoteDbUpdateManager.java:305)
  at com.google.gerrit.server.update.BatchUpdate$ChangesHandle.execute(BatchUpdate.java:508)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:141)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:357)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:361)
  at com.google.gerrit.server.restapi.change.PutTopic.applyImpl(PutTopic.java:78)
  at com.google.gerrit.server.restapi.change.PutTopic.applyImpl(PutTopic.java:1)
  at com.google.gerrit.server.update.RetryingRestModifyView.lambda$1(RetryingRestModifyView.java:43)
  at com.google.gerrit.server.update.RetryHelper.lambda$1(RetryHelper.java:274)
  at com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(AttemptTimeLimiters.java:78)
  at com.github.rholder.retry.Retryer.call(Retryer.java:160)
  at com.google.gerrit.server.update.RetryHelper.executeWithTimeoutCount(RetryHelper.java:375)
  at com.google.gerrit.server.update.RetryHelper.executeWithAttemptAndTimeoutCount(RetryHelper.java:353)
  at com.google.gerrit.server.update.RetryHelper.execute(RetryHelper.java:257)
  at com.google.gerrit.server.update.RetryHelper.execute(RetryHelper.java:272)
  at com.google.gerrit.server.update.RetryingRestModifyView.apply(RetryingRestModifyView.java:43)
  at com.google.gerrit.server.api.changes.ChangeApiImpl.topic(ChangeApiImpl.java:430)
  at com.google.gerrit.acceptance.server.project.ReflogIT.guessRestApiInReflog(ReflogIT.java:60)
  ...

[2]
com.google.gerrit.server.notedb.NoteDbUtil.guessRestApiHandler(NoteDbUtil.java:72)
  at com.google.gerrit.server.notedb.NoteDbUpdateManager.execute(NoteDbUpdateManager.java:340)
  at com.google.gerrit.server.notedb.NoteDbUpdateManager.execute(NoteDbUpdateManager.java:305)
  at com.google.gerrit.server.update.BatchUpdate$ChangesHandle.execute(BatchUpdate.java:508)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:141)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:357)
  at com.google.gerrit.server.update.BatchUpdate.execute(BatchUpdate.java:361)
  at com.google.gerrit.server.restapi.change.PutTopic.apply(PutTopic.java:77)
  at com.google.gerrit.server.api.changes.ChangeApiImpl.topic(ChangeApiImpl.java:430)
  at com.google.gerrit.acceptance.server.project.ReflogIT.guessRestApiInReflog(ReflogIT.java:60)
  ...

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: Ief5ee42aea9aad575e6927ee54e0b770fd14dc88
This commit is contained in:
Edwin Kempin
2019-10-22 13:38:43 +02:00
committed by David Pursehouse
parent 880a438c90
commit cec334a06f
40 changed files with 207 additions and 404 deletions

View File

@@ -123,6 +123,9 @@ import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.gerrit.server.quota.QuotaException;
import com.google.gerrit.server.restapi.change.ChangesCollection;
import com.google.gerrit.server.restapi.project.ProjectsCollection;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryHelper.Action;
import com.google.gerrit.server.update.RetryHelper.ActionType;
import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gerrit.util.http.CacheHeaders;
@@ -241,6 +244,7 @@ public class RestApiServlet extends HttpServlet {
final Config config;
final DynamicSet<PerformanceLogger> performanceLoggers;
final ChangeFinder changeFinder;
final RetryHelper retryHelper;
@Inject
Globals(
@@ -254,7 +258,8 @@ public class RestApiServlet extends HttpServlet {
RestApiQuotaEnforcer quotaChecker,
@GerritServerConfig Config config,
DynamicSet<PerformanceLogger> performanceLoggers,
ChangeFinder changeFinder) {
ChangeFinder changeFinder,
RetryHelper retryHelper) {
this.currentUser = currentUser;
this.webSession = webSession;
this.paramParser = paramParser;
@@ -266,6 +271,7 @@ public class RestApiServlet extends HttpServlet {
this.config = config;
this.performanceLoggers = performanceLoggers;
this.changeFinder = changeFinder;
this.retryHelper = retryHelper;
allowOrigin = makeAllowOrigin(config);
}
@@ -503,7 +509,9 @@ public class RestApiServlet extends HttpServlet {
Type type = inputType(m);
inputRequestBody = parseRequest(req, type);
response = m.apply(rsrc, inputRequestBody);
response =
invokeRestModifyViewWithRetry(traceContext, viewData, m, rsrc, inputRequestBody);
if (inputRequestBody instanceof RawInput) {
try (InputStream is = req.getInputStream()) {
ServletUtils.consumeRequestBody(is);
@@ -542,7 +550,9 @@ public class RestApiServlet extends HttpServlet {
Type type = inputType(m);
inputRequestBody = parseRequest(req, type);
response = m.apply(rsrc, inputRequestBody);
response =
invokeRestCollectionModifyViewWithRetry(
traceContext, viewData, m, rsrc, inputRequestBody);
if (inputRequestBody instanceof RawInput) {
try (InputStream is = req.getInputStream()) {
ServletUtils.consumeRequestBody(is);
@@ -661,8 +671,7 @@ public class RestApiServlet extends HttpServlet {
status = SC_INTERNAL_SERVER_ERROR;
responseBytes = handleException(e, req, res);
} finally {
String metric =
viewData != null && viewData.view != null ? globals.metrics.view(viewData) : "_unknown";
String metric = getViewName(viewData);
globals.metrics.count.increment(metric);
if (status >= SC_BAD_REQUEST) {
globals.metrics.errorCount.increment(metric, status);
@@ -688,6 +697,55 @@ public class RestApiServlet extends HttpServlet {
}
}
private Response<?> invokeRestModifyViewWithRetry(
TraceContext traceContext,
ViewData viewData,
RestModifyView<RestResource, Object> view,
RestResource rsrc,
Object inputRequestBody)
throws Exception {
return invokeRestEndpointWithRetry(
traceContext, viewData, () -> view.apply(rsrc, inputRequestBody));
}
private Response<?> invokeRestCollectionModifyViewWithRetry(
TraceContext traceContext,
ViewData viewData,
RestCollectionModifyView<RestResource, RestResource, Object> view,
RestResource rsrc,
Object inputRequestBody)
throws Exception {
return invokeRestEndpointWithRetry(
traceContext, viewData, () -> view.apply(rsrc, inputRequestBody));
}
private Response<?> invokeRestEndpointWithRetry(
TraceContext traceContext, ViewData viewData, Action<Response<?>> action) throws Exception {
RetryHelper.Options.Builder retryOptionsBuilder =
RetryHelper.options().caller(getViewName(viewData));
if (!traceContext.isTracing()) {
// enable automatic retry with tracing in case of non-recoverable failure
retryOptionsBuilder =
retryOptionsBuilder
.retryWithTrace(t -> !(t instanceof RestApiException))
.onAutoTrace(autoTraceId -> traceId = Optional.of(autoTraceId));
}
return globals.retryHelper.execute(
ActionType.REST_REQUEST,
action,
retryOptionsBuilder.build(),
t -> {
if (t instanceof UpdateException) {
t = t.getCause();
}
return t instanceof LockFailureException;
});
}
private String getViewName(ViewData viewData) {
return viewData != null && viewData.view != null ? globals.metrics.view(viewData) : "_unknown";
}
private static HttpServletRequest applyXdOverrides(HttpServletRequest req, QueryParams qp)
throws BadRequestException {
if (!isPost(req)) {

View File

@@ -20,7 +20,6 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.primitives.Ints;
import com.google.gerrit.entities.Account;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.server.update.RetryingRestModifyView;
import java.sql.Timestamp;
import java.util.Optional;
import org.eclipse.jgit.lib.PersonIdent;
@@ -34,8 +33,7 @@ public class NoteDbUtil {
private static final ImmutableList<String> PACKAGE_PREFIXES =
ImmutableList.of("com.google.gerrit.server.", "com.google.gerrit.");
private static final ImmutableSet<String> SERVLET_NAMES =
ImmutableSet.of(
"com.google.gerrit.httpd.restapi.RestApiServlet", RetryingRestModifyView.class.getName());
ImmutableSet.of("com.google.gerrit.httpd.restapi.RestApiServlet");
/** Returns an AccountId for the given email address. */
public static Optional<Account.Id> parseIdent(PersonIdent ident) {
@@ -73,6 +71,9 @@ public class NoteDbUtil {
static String guessRestApiHandler() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int i = findRestApiServlet(trace);
if (i < 0) {
i = findApiImpl(trace);
}
if (i < 0) {
return null;
}
@@ -80,7 +81,7 @@ public class NoteDbUtil {
for (i--; i >= 0; i--) {
String cn = trace[i].getClassName();
Class<?> cls = Class.forName(cn);
if (RestModifyView.class.isAssignableFrom(cls) && cls != RetryingRestModifyView.class) {
if (RestModifyView.class.isAssignableFrom(cls)) {
return viewName(cn);
}
}
@@ -110,6 +111,16 @@ public class NoteDbUtil {
return -1;
}
private static int findApiImpl(StackTraceElement[] trace) {
for (int i = 0; i < trace.length; i++) {
String clazz = trace[i].getClassName();
if (clazz.startsWith("com.google.gerrit.server.api.") && clazz.endsWith("ApiImpl")) {
return i;
}
}
return -1;
}
private static String viewName(String cn) {
String impl = cn.replace('$', '.');
for (String p : PACKAGE_PREFIXES) {

View File

@@ -22,6 +22,7 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.common.ChangeInfo;
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.server.CurrentUser;
import com.google.gerrit.server.PatchSetUtil;
@@ -34,8 +35,6 @@ import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.permissions.ChangePermission;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -44,8 +43,8 @@ import java.io.IOException;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput, ChangeInfo>
implements UiAction<ChangeResource> {
public class Abandon
implements RestModifyView<ChangeResource, AbandonInput>, UiAction<ChangeResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final BatchUpdate.Factory updateFactory;
@@ -58,11 +57,9 @@ public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput
Abandon(
BatchUpdate.Factory updateFactory,
ChangeJson.Factory json,
RetryHelper retryHelper,
AbandonOp.Factory abandonOpFactory,
NotifyResolver notifyResolver,
PatchSetUtil patchSetUtil) {
super(retryHelper);
this.updateFactory = updateFactory;
this.json = json;
this.abandonOpFactory = abandonOpFactory;
@@ -71,7 +68,7 @@ public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput
}
@Override
protected Response<ChangeInfo> applyImpl(ChangeResource rsrc, AbandonInput input)
public Response<ChangeInfo> apply(ChangeResource rsrc, AbandonInput input)
throws RestApiException, UpdateException, PermissionBackendException, IOException,
ConfigInvalidException {
// Not allowed to abandon if the current patch set is locked.

View File

@@ -25,6 +25,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.server.change.ChangeJson;
import com.google.gerrit.server.change.RevisionResource;
@@ -39,8 +40,6 @@ import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.submit.IntegrationException;
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.Singleton;
@@ -49,8 +48,7 @@ import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class CherryPick
extends RetryingRestModifyView<RevisionResource, CherryPickInput, CherryPickChangeInfo>
implements UiAction<RevisionResource> {
implements RestModifyView<RevisionResource, CherryPickInput>, UiAction<RevisionResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final PermissionBackend permissionBackend;
@@ -62,14 +60,12 @@ public class CherryPick
@Inject
CherryPick(
RetryHelper retryHelper,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
CherryPickChange cherryPickChange,
ChangeJson.Factory json,
ContributorAgreementsChecker contributorAgreements,
ProjectCache projectCache) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.cherryPickChange = cherryPickChange;
@@ -79,7 +75,7 @@ public class CherryPick
}
@Override
public Response<CherryPickChangeInfo> applyImpl(RevisionResource rsrc, CherryPickInput input)
public Response<CherryPickChangeInfo> apply(RevisionResource rsrc, CherryPickInput input)
throws IOException, UpdateException, RestApiException, PermissionBackendException,
ConfigInvalidException, NoSuchProjectException {
input.parent = input.parent == null ? 1 : input.parent;

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.server.CurrentUser;
import com.google.gerrit.server.change.ChangeJson;
import com.google.gerrit.server.permissions.PermissionBackend;
@@ -35,8 +36,6 @@ import com.google.gerrit.server.project.InvalidChangeOperationException;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.submit.IntegrationException;
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;
@@ -45,8 +44,7 @@ import java.io.IOException;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class CherryPickCommit
extends RetryingRestModifyView<CommitResource, CherryPickInput, CherryPickChangeInfo> {
public class CherryPickCommit implements RestModifyView<CommitResource, CherryPickInput> {
private final PermissionBackend permissionBackend;
private final BatchUpdate.Factory updateFactory;
private final Provider<CurrentUser> user;
@@ -56,14 +54,12 @@ public class CherryPickCommit
@Inject
CherryPickCommit(
RetryHelper retryHelper,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
Provider<CurrentUser> user,
CherryPickChange cherryPickChange,
ChangeJson.Factory json,
ContributorAgreementsChecker contributorAgreements) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.user = user;
@@ -73,7 +69,7 @@ public class CherryPickCommit
}
@Override
public Response<CherryPickChangeInfo> applyImpl(CommitResource rsrc, CherryPickInput input)
public Response<CherryPickChangeInfo> apply(CommitResource rsrc, CherryPickInput input)
throws IOException, UpdateException, RestApiException, PermissionBackendException,
ConfigInvalidException, NoSuchProjectException {
String destination = Strings.nullToEmpty(input.destination).trim();

View File

@@ -40,6 +40,7 @@ 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.RestCollectionModifyView;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.server.CurrentUser;
@@ -69,8 +70,6 @@ import com.google.gerrit.server.query.change.InternalChangeQuery;
import com.google.gerrit.server.restapi.project.CommitsCollection;
import com.google.gerrit.server.restapi.project.ProjectsCollection;
import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestCollectionModifyView;
import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -103,8 +102,7 @@ import org.eclipse.jgit.util.ChangeIdUtil;
@Singleton
public class CreateChange
extends RetryingRestCollectionModifyView<
TopLevelResource, ChangeResource, ChangeInput, ChangeInfo> {
implements RestCollectionModifyView<TopLevelResource, ChangeResource, ChangeInput> {
private final BatchUpdate.Factory updateFactory;
private final String anonymousCowardName;
private final GitRepositoryManager gitManager;
@@ -127,7 +125,6 @@ public class CreateChange
@Inject
CreateChange(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
@AnonymousCowardName String anonymousCowardName,
GitRepositoryManager gitManager,
@@ -146,7 +143,6 @@ public class CreateChange
MergeUtil.Factory mergeUtilFactory,
NotifyResolver notifyResolver,
ContributorAgreementsChecker contributorAgreements) {
super(retryHelper);
this.updateFactory = updateFactory;
this.anonymousCowardName = anonymousCowardName;
this.gitManager = gitManager;
@@ -169,7 +165,7 @@ public class CreateChange
}
@Override
protected Response<ChangeInfo> applyImpl(TopLevelResource parent, ChangeInput input)
public Response<ChangeInfo> apply(TopLevelResource parent, ChangeInput input)
throws IOException, InvalidChangeOperationException, RestApiException, UpdateException,
PermissionBackendException, ConfigInvalidException {
if (!user.get().isIdentifiedUser()) {

View File

@@ -25,6 +25,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.server.CommentsUtil;
@@ -36,8 +37,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -46,8 +45,7 @@ import com.google.inject.Singleton;
import java.util.Collections;
@Singleton
public class CreateDraftComment
extends RetryingRestModifyView<RevisionResource, DraftInput, CommentInfo> {
public class CreateDraftComment implements RestModifyView<RevisionResource, DraftInput> {
private final BatchUpdate.Factory updateFactory;
private final Provider<CommentJson> commentJson;
private final CommentsUtil commentsUtil;
@@ -56,13 +54,11 @@ public class CreateDraftComment
@Inject
CreateDraftComment(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
Provider<CommentJson> commentJson,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.commentJson = commentJson;
this.commentsUtil = commentsUtil;
@@ -71,7 +67,7 @@ public class CreateDraftComment
}
@Override
protected Response<CommentInfo> applyImpl(RevisionResource rsrc, DraftInput in)
public Response<CommentInfo> apply(RevisionResource rsrc, DraftInput in)
throws RestApiException, UpdateException, PermissionBackendException {
if (Strings.isNullOrEmpty(in.path)) {
throw new BadRequestException("path must be non-empty");

View File

@@ -31,6 +31,7 @@ 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.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.CurrentUser;
@@ -53,8 +54,6 @@ import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.restapi.project.CommitsCollection;
import com.google.gerrit.server.submit.MergeIdenticalTreeException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -75,8 +74,7 @@ import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.ChangeIdUtil;
@Singleton
public class CreateMergePatchSet
extends RetryingRestModifyView<ChangeResource, MergePatchSetInput, ChangeInfo> {
public class CreateMergePatchSet implements RestModifyView<ChangeResource, MergePatchSetInput> {
private final BatchUpdate.Factory updateFactory;
private final GitRepositoryManager gitManager;
private final CommitsCollection commits;
@@ -100,12 +98,10 @@ public class CreateMergePatchSet
ChangeJson.Factory json,
PatchSetUtil psUtil,
MergeUtil.Factory mergeUtilFactory,
RetryHelper retryHelper,
PatchSetInserter.Factory patchSetInserterFactory,
ProjectCache projectCache,
ChangeFinder changeFinder,
PermissionBackend permissionBackend) {
super(retryHelper);
this.updateFactory = updateFactory;
this.gitManager = gitManager;
this.commits = commits;
@@ -121,7 +117,7 @@ public class CreateMergePatchSet
}
@Override
protected Response<ChangeInfo> applyImpl(ChangeResource rsrc, MergePatchSetInput in)
public Response<ChangeInfo> apply(ChangeResource rsrc, MergePatchSetInput in)
throws IOException, RestApiException, UpdateException, PermissionBackendException {
// Not allowed to create a new patch set if the current patch set is locked.
psUtil.checkPatchSetNotLocked(rsrc.getNotes());

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.Input;
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.server.ChangeMessagesUtil;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountLoader;
@@ -34,15 +35,13 @@ 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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class DeleteAssignee extends RetryingRestModifyView<ChangeResource, Input, AccountInfo> {
public class DeleteAssignee implements RestModifyView<ChangeResource, Input> {
private final BatchUpdate.Factory updateFactory;
private final ChangeMessagesUtil cmUtil;
private final AssigneeChanged assigneeChanged;
@@ -51,13 +50,11 @@ public class DeleteAssignee extends RetryingRestModifyView<ChangeResource, Input
@Inject
DeleteAssignee(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeMessagesUtil cmUtil,
AssigneeChanged assigneeChanged,
IdentifiedUser.GenericFactory userFactory,
AccountLoader.Factory accountLoaderFactory) {
super(retryHelper);
this.updateFactory = updateFactory;
this.cmUtil = cmUtil;
this.assigneeChanged = assigneeChanged;
@@ -66,7 +63,7 @@ public class DeleteAssignee extends RetryingRestModifyView<ChangeResource, Input
}
@Override
protected Response<AccountInfo> applyImpl(ChangeResource rsrc, Input input)
public Response<AccountInfo> apply(ChangeResource rsrc, Input input)
throws RestApiException, UpdateException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.common.Input;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
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.server.change.ChangeResource;
import com.google.gerrit.server.change.DeleteChangeOp;
@@ -28,31 +29,25 @@ import com.google.gerrit.server.permissions.ChangePermission;
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.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class DeleteChange extends RetryingRestModifyView<ChangeResource, Input, Object>
implements UiAction<ChangeResource> {
public class DeleteChange
implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final DeleteChangeOp.Factory opFactory;
@Inject
public DeleteChange(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
DeleteChangeOp.Factory opFactory) {
super(retryHelper);
public DeleteChange(BatchUpdate.Factory updateFactory, DeleteChangeOp.Factory opFactory) {
this.updateFactory = updateFactory;
this.opFactory = opFactory;
}
@Override
protected Response<Object> applyImpl(ChangeResource rsrc, Input input)
public Response<Object> apply(ChangeResource rsrc, Input input)
throws RestApiException, UpdateException, PermissionBackendException {
if (!isChangeDeletable(rsrc)) {
throw new MethodNotAllowedException("delete not permitted");

View File

@@ -40,8 +40,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -53,8 +51,7 @@ import java.util.List;
/** Deletes a change message by rewriting history. */
@Singleton
public class DeleteChangeMessage
extends RetryingRestModifyView<
ChangeMessageResource, DeleteChangeMessageInput, ChangeMessageInfo> {
implements RestModifyView<ChangeMessageResource, DeleteChangeMessageInput> {
private final Provider<CurrentUser> userProvider;
private final PermissionBackend permissionBackend;
@@ -70,9 +67,7 @@ public class DeleteChangeMessage
BatchUpdate.Factory updateFactory,
ChangeMessagesUtil changeMessagesUtil,
AccountLoader.Factory accountLoaderFactory,
ChangeNotes.Factory notesFactory,
RetryHelper retryHelper) {
super(retryHelper);
ChangeNotes.Factory notesFactory) {
this.userProvider = userProvider;
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
@@ -82,7 +77,7 @@ public class DeleteChangeMessage
}
@Override
public Response<ChangeMessageInfo> applyImpl(
public Response<ChangeMessageInfo> apply(
ChangeMessageResource resource, DeleteChangeMessageInput input)
throws RestApiException, PermissionBackendException, UpdateException, IOException {
CurrentUser user = userProvider.get();
@@ -158,7 +153,7 @@ public class DeleteChangeMessage
@Override
public Response<ChangeMessageInfo> apply(ChangeMessageResource resource, Input input)
throws RestApiException {
throws RestApiException, PermissionBackendException, UpdateException, IOException {
return deleteChangeMessage.apply(resource, new DeleteChangeMessageInput());
}
}

View File

@@ -23,6 +23,7 @@ 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.server.CommentsUtil;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.change.CommentResource;
@@ -33,8 +34,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -46,8 +45,7 @@ import java.util.Optional;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class DeleteComment
extends RetryingRestModifyView<CommentResource, DeleteCommentInput, CommentInfo> {
public class DeleteComment implements RestModifyView<CommentResource, DeleteCommentInput> {
private final Provider<CurrentUser> userProvider;
private final PermissionBackend permissionBackend;
@@ -58,14 +56,12 @@ public class DeleteComment
@Inject
public DeleteComment(
RetryHelper retryHelper,
Provider<CurrentUser> userProvider,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
CommentsUtil commentsUtil,
Provider<CommentJson> commentJson,
ChangeNotes.Factory notesFactory) {
super(retryHelper);
this.userProvider = userProvider;
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
@@ -75,7 +71,7 @@ public class DeleteComment
}
@Override
public Response<CommentInfo> applyImpl(CommentResource rsrc, DeleteCommentInput input)
public Response<CommentInfo> apply(CommentResource rsrc, DeleteCommentInput input)
throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException,
UpdateException {
CurrentUser user = userProvider.get();

View File

@@ -23,6 +23,7 @@ import com.google.gerrit.extensions.common.Input;
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.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.change.DraftCommentResource;
@@ -31,8 +32,6 @@ import com.google.gerrit.server.patch.PatchListNotAvailableException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -41,8 +40,7 @@ import java.util.Collections;
import java.util.Optional;
@Singleton
public class DeleteDraftComment
extends RetryingRestModifyView<DraftCommentResource, Input, CommentInfo> {
public class DeleteDraftComment implements RestModifyView<DraftCommentResource, Input> {
private final BatchUpdate.Factory updateFactory;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
@@ -53,9 +51,7 @@ public class DeleteDraftComment
BatchUpdate.Factory updateFactory,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
RetryHelper retryHelper,
PatchListCache patchListCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
@@ -63,7 +59,7 @@ public class DeleteDraftComment
}
@Override
protected Response<CommentInfo> applyImpl(DraftCommentResource rsrc, Input input)
public Response<CommentInfo> apply(DraftCommentResource rsrc, Input input)
throws RestApiException, UpdateException {
try (BatchUpdate bu =
updateFactory.create(rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {

View File

@@ -23,39 +23,35 @@ 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.server.change.ChangeResource;
import com.google.gerrit.server.change.SetPrivateOp;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class DeletePrivate
extends RetryingRestModifyView<ChangeResource, InputWithMessage, String> {
public class DeletePrivate implements RestModifyView<ChangeResource, InputWithMessage> {
private final PermissionBackend permissionBackend;
private final BatchUpdate.Factory updateFactory;
private final SetPrivateOp.Factory setPrivateOpFactory;
@Inject
DeletePrivate(
RetryHelper retryHelper,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
SetPrivateOp.Factory setPrivateOpFactory) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.setPrivateOpFactory = setPrivateOpFactory;
}
@Override
protected Response<String> applyImpl(ChangeResource rsrc, @Nullable InputWithMessage input)
public Response<String> apply(ChangeResource rsrc, @Nullable InputWithMessage input)
throws RestApiException, UpdateException {
if (!canDeletePrivate(rsrc).value()) {
throw new AuthException("not allowed to unmark private");

View File

@@ -21,7 +21,6 @@ import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.change.SetPrivateOp;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.RetryHelper;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -29,11 +28,10 @@ import com.google.inject.Singleton;
public class DeletePrivateByPost extends DeletePrivate implements UiAction<ChangeResource> {
@Inject
DeletePrivateByPost(
RetryHelper retryHelper,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
SetPrivateOp.Factory setPrivateOpFactory) {
super(retryHelper, permissionBackend, updateFactory, setPrivateOpFactory);
super(permissionBackend, updateFactory, setPrivateOpFactory);
}
@Override

View File

@@ -19,40 +19,36 @@ import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
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.server.change.DeleteReviewerByEmailOp;
import com.google.gerrit.server.change.DeleteReviewerOp;
import com.google.gerrit.server.change.NotifyResolver;
import com.google.gerrit.server.change.ReviewerResource;
import com.google.gerrit.server.update.BatchUpdate;
import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class DeleteReviewer
extends RetryingRestModifyView<ReviewerResource, DeleteReviewerInput, Object> {
public class DeleteReviewer implements RestModifyView<ReviewerResource, DeleteReviewerInput> {
private final BatchUpdate.Factory updateFactory;
private final DeleteReviewerOp.Factory deleteReviewerOpFactory;
private final DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory;
@Inject
DeleteReviewer(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
DeleteReviewerOp.Factory deleteReviewerOpFactory,
DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory) {
super(retryHelper);
this.updateFactory = updateFactory;
this.deleteReviewerOpFactory = deleteReviewerOpFactory;
this.deleteReviewerByEmailOpFactory = deleteReviewerByEmailOpFactory;
}
@Override
protected Response<Object> applyImpl(ReviewerResource rsrc, DeleteReviewerInput input)
public Response<Object> apply(ReviewerResource rsrc, DeleteReviewerInput input)
throws RestApiException, UpdateException {
if (input == null) {
input = new DeleteReviewerInput();

View File

@@ -32,6 +32,7 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
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.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.IdentifiedUser;
@@ -51,8 +52,6 @@ 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.gerrit.server.util.LabelVote;
import com.google.gerrit.server.util.time.TimeUtil;
@@ -64,7 +63,7 @@ import java.util.Map;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteInput, Object> {
public class DeleteVote implements RestModifyView<VoteResource, DeleteVoteInput> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final BatchUpdate.Factory updateFactory;
@@ -80,7 +79,6 @@ public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteI
@Inject
DeleteVote(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ApprovalsUtil approvalsUtil,
PatchSetUtil psUtil,
@@ -91,7 +89,6 @@ public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteI
NotifyResolver notifyResolver,
RemoveReviewerControl removeReviewerControl,
ProjectCache projectCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.approvalsUtil = approvalsUtil;
this.psUtil = psUtil;
@@ -105,7 +102,7 @@ public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteI
}
@Override
protected Response<Object> applyImpl(VoteResource rsrc, DeleteVoteInput input)
public Response<Object> apply(VoteResource rsrc, DeleteVoteInput input)
throws RestApiException, UpdateException, IOException, ConfigInvalidException {
if (input == null) {
input = new DeleteVoteInput();

View File

@@ -17,31 +17,29 @@ package com.google.gerrit.server.restapi.change;
import com.google.gerrit.extensions.common.Input;
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.server.change.ChangeResource;
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.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
@Singleton
public class Index extends RetryingRestModifyView<ChangeResource, Input, Object> {
public class Index implements RestModifyView<ChangeResource, Input> {
private final PermissionBackend permissionBackend;
private final ChangeIndexer indexer;
@Inject
Index(RetryHelper retryHelper, PermissionBackend permissionBackend, ChangeIndexer indexer) {
super(retryHelper);
Index(PermissionBackend permissionBackend, ChangeIndexer indexer) {
this.permissionBackend = permissionBackend;
this.indexer = indexer;
}
@Override
protected Response<Object> applyImpl(ChangeResource rsrc, Input input)
public Response<Object> apply(ChangeResource rsrc, Input input)
throws IOException, AuthException, PermissionBackendException {
permissionBackend.currentUser().check(GlobalPermission.MAINTAIN_SERVER);
indexer.index(rsrc.getChange());

View File

@@ -40,6 +40,7 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
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.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
@@ -59,8 +60,6 @@ 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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -76,8 +75,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@Singleton
public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, ChangeInfo>
implements UiAction<ChangeResource> {
public class Move implements RestModifyView<ChangeResource, MoveInput>, UiAction<ChangeResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final PermissionBackend permissionBackend;
@@ -99,12 +97,10 @@ public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, Chan
GitRepositoryManager repoManager,
Provider<InternalChangeQuery> queryProvider,
ChangeMessagesUtil cmUtil,
RetryHelper retryHelper,
PatchSetUtil psUtil,
ApprovalsUtil approvalsUtil,
ProjectCache projectCache,
@GerritServerConfig Config gerritConfig) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.json = json;
@@ -118,7 +114,7 @@ public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, Chan
}
@Override
protected Response<ChangeInfo> applyImpl(ChangeResource rsrc, MoveInput input)
public Response<ChangeInfo> apply(ChangeResource rsrc, MoveInput input)
throws RestApiException, UpdateException, PermissionBackendException, IOException {
if (!moveEnabled) {
// This will be removed with the above config once we reach consensus for the move change

View File

@@ -18,14 +18,13 @@ import com.google.common.collect.ImmutableSortedSet;
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.server.change.ChangeResource;
import com.google.gerrit.server.change.SetHashtagsOp;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -33,23 +32,18 @@ import com.google.inject.Singleton;
@Singleton
public class PostHashtags
extends RetryingRestModifyView<ChangeResource, HashtagsInput, ImmutableSortedSet<String>>
implements UiAction<ChangeResource> {
implements RestModifyView<ChangeResource, HashtagsInput>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final SetHashtagsOp.Factory hashtagsFactory;
@Inject
PostHashtags(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
SetHashtagsOp.Factory hashtagsFactory) {
super(retryHelper);
PostHashtags(BatchUpdate.Factory updateFactory, SetHashtagsOp.Factory hashtagsFactory) {
this.updateFactory = updateFactory;
this.hashtagsFactory = hashtagsFactory;
}
@Override
protected Response<ImmutableSortedSet<String>> applyImpl(ChangeResource req, HashtagsInput input)
public Response<ImmutableSortedSet<String>> apply(ChangeResource req, HashtagsInput input)
throws RestApiException, UpdateException, PermissionBackendException {
req.permissions().check(ChangePermission.EDIT_HASHTAGS);

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
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.server.change.ChangeResource;
import com.google.gerrit.server.change.SetPrivateOp;
@@ -31,8 +32,6 @@ import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -40,8 +39,8 @@ import com.google.inject.Singleton;
import org.eclipse.jgit.lib.Config;
@Singleton
public class PostPrivate extends RetryingRestModifyView<ChangeResource, InputWithMessage, String>
implements UiAction<ChangeResource> {
public class PostPrivate
implements RestModifyView<ChangeResource, InputWithMessage>, UiAction<ChangeResource> {
private final PermissionBackend permissionBackend;
private final BatchUpdate.Factory updateFactory;
private final SetPrivateOp.Factory setPrivateOpFactory;
@@ -49,12 +48,10 @@ public class PostPrivate extends RetryingRestModifyView<ChangeResource, InputWit
@Inject
PostPrivate(
RetryHelper retryHelper,
PermissionBackend permissionBackend,
BatchUpdate.Factory updateFactory,
SetPrivateOp.Factory setPrivateOpFactory,
@GerritServerConfig Config config) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.setPrivateOpFactory = setPrivateOpFactory;
@@ -62,7 +59,7 @@ public class PostPrivate extends RetryingRestModifyView<ChangeResource, InputWit
}
@Override
public Response<String> applyImpl(ChangeResource rsrc, InputWithMessage input)
public Response<String> apply(ChangeResource rsrc, InputWithMessage input)
throws RestApiException, UpdateException {
if (disablePrivateChanges) {
throw new MethodNotAllowedException("private changes are disabled");

View File

@@ -73,6 +73,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.extensions.validators.CommentForValidation;
@@ -120,8 +121,6 @@ import com.google.gerrit.server.update.BatchUpdateOp;
import com.google.gerrit.server.update.ChangeContext;
import com.google.gerrit.server.update.CommentsRejectedException;
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.gerrit.server.util.LabelVote;
import com.google.gerrit.server.util.time.TimeUtil;
@@ -150,8 +149,7 @@ import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
@Singleton
public class PostReview
extends RetryingRestModifyView<RevisionResource, ReviewInput, ReviewResult> {
public class PostReview implements RestModifyView<RevisionResource, ReviewInput> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final String ERROR_ADDING_REVIEWER = "error adding reviewer";
@@ -187,7 +185,6 @@ public class PostReview
@Inject
PostReview(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeResource.Factory changeResourceFactory,
ChangeData.Factory changeDataFactory,
@@ -208,7 +205,6 @@ public class PostReview
ProjectCache projectCache,
PermissionBackend permissionBackend,
PluginSetContext<CommentValidator> commentValidators) {
super(retryHelper);
this.updateFactory = updateFactory;
this.changeResourceFactory = changeResourceFactory;
this.changeDataFactory = changeDataFactory;
@@ -233,7 +229,7 @@ public class PostReview
}
@Override
protected Response<ReviewResult> applyImpl(RevisionResource revision, ReviewInput input)
public Response<ReviewResult> apply(RevisionResource revision, ReviewInput input)
throws RestApiException, UpdateException, IOException, PermissionBackendException,
ConfigInvalidException, PatchListNotAvailableException {
return apply(revision, input, TimeUtil.nowTs());

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.change.NotifyResolver;
import com.google.gerrit.server.change.ReviewerAdder;
@@ -29,8 +30,6 @@ import com.google.gerrit.server.change.ReviewerResource;
import com.google.gerrit.server.permissions.PermissionBackendException;
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.RetryingRestCollectionModifyView;
import com.google.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -40,8 +39,7 @@ import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class PostReviewers
extends RetryingRestCollectionModifyView<
ChangeResource, ReviewerResource, AddReviewerInput, AddReviewerResult> {
implements RestCollectionModifyView<ChangeResource, ReviewerResource, AddReviewerInput> {
private final BatchUpdate.Factory updateFactory;
private final ChangeData.Factory changeDataFactory;
private final NotifyResolver notifyResolver;
@@ -49,12 +47,10 @@ public class PostReviewers
@Inject
PostReviewers(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeData.Factory changeDataFactory,
NotifyResolver notifyResolver,
ReviewerAdder reviewerAdder) {
super(retryHelper);
this.updateFactory = updateFactory;
this.changeDataFactory = changeDataFactory;
this.notifyResolver = notifyResolver;
@@ -62,7 +58,7 @@ public class PostReviewers
}
@Override
protected Response<AddReviewerResult> applyImpl(ChangeResource rsrc, AddReviewerInput input)
public Response<AddReviewerResult> apply(ChangeResource rsrc, AddReviewerInput input)
throws IOException, RestApiException, UpdateException, PermissionBackendException,
ConfigInvalidException {
if (input.reviewer == null) {

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
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.server.change.ChangeResource;
import com.google.gerrit.server.change.NotifyResolver;
import com.google.gerrit.server.edit.ChangeEdit;
@@ -28,8 +29,6 @@ import com.google.gerrit.server.edit.ChangeEditUtil;
import com.google.gerrit.server.project.ContributorAgreementsChecker;
import com.google.gerrit.server.project.NoSuchProjectException;
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.Singleton;
@@ -38,8 +37,7 @@ import java.util.Optional;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class PublishChangeEdit
extends RetryingRestModifyView<ChangeResource, PublishChangeEditInput, Object> {
public class PublishChangeEdit implements RestModifyView<ChangeResource, PublishChangeEditInput> {
private final BatchUpdate.Factory updateFactory;
private final ChangeEditUtil editUtil;
private final NotifyResolver notifyResolver;
@@ -47,12 +45,10 @@ public class PublishChangeEdit
@Inject
PublishChangeEdit(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeEditUtil editUtil,
NotifyResolver notifyResolver,
ContributorAgreementsChecker contributorAgreementsChecker) {
super(retryHelper);
this.updateFactory = updateFactory;
this.editUtil = editUtil;
this.notifyResolver = notifyResolver;
@@ -60,7 +56,7 @@ public class PublishChangeEdit
}
@Override
protected Response<Object> applyImpl(ChangeResource rsrc, PublishChangeEditInput in)
public Response<Object> apply(ChangeResource rsrc, PublishChangeEditInput in)
throws IOException, RestApiException, UpdateException, ConfigInvalidException,
NoSuchProjectException {
contributorAgreementsChecker.check(rsrc.getProject(), rsrc.getUser());

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
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.server.ApprovalsUtil;
import com.google.gerrit.server.IdentifiedUser;
@@ -38,8 +39,6 @@ import com.google.gerrit.server.permissions.ChangePermission;
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.gerrit.server.update.UpdateException;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -48,8 +47,8 @@ import java.io.IOException;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class PutAssignee extends RetryingRestModifyView<ChangeResource, AssigneeInput, AccountInfo>
implements UiAction<ChangeResource> {
public class PutAssignee
implements RestModifyView<ChangeResource, AssigneeInput>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final AccountResolver accountResolver;
@@ -64,12 +63,10 @@ public class PutAssignee extends RetryingRestModifyView<ChangeResource, Assignee
BatchUpdate.Factory updateFactory,
AccountResolver accountResolver,
SetAssigneeOp.Factory assigneeFactory,
RetryHelper retryHelper,
ReviewerAdder reviewerAdder,
AccountLoader.Factory accountLoaderFactory,
PermissionBackend permissionBackend,
ApprovalsUtil approvalsUtil) {
super(retryHelper);
this.updateFactory = updateFactory;
this.accountResolver = accountResolver;
this.assigneeFactory = assigneeFactory;
@@ -80,7 +77,7 @@ public class PutAssignee extends RetryingRestModifyView<ChangeResource, Assignee
}
@Override
protected Response<AccountInfo> applyImpl(ChangeResource rsrc, AssigneeInput input)
public Response<AccountInfo> apply(ChangeResource rsrc, AssigneeInput input)
throws RestApiException, UpdateException, IOException, PermissionBackendException,
ConfigInvalidException {
rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);

View File

@@ -20,6 +20,7 @@ import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.extensions.common.DescriptionInput;
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.server.ChangeMessagesUtil;
import com.google.gerrit.server.PatchSetUtil;
@@ -30,8 +31,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -39,26 +38,21 @@ import com.google.inject.Singleton;
@Singleton
public class PutDescription
extends RetryingRestModifyView<RevisionResource, DescriptionInput, String>
implements UiAction<RevisionResource> {
implements RestModifyView<RevisionResource, DescriptionInput>, UiAction<RevisionResource> {
private final BatchUpdate.Factory updateFactory;
private final ChangeMessagesUtil cmUtil;
private final PatchSetUtil psUtil;
@Inject
PutDescription(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeMessagesUtil cmUtil,
PatchSetUtil psUtil) {
super(retryHelper);
BatchUpdate.Factory updateFactory, ChangeMessagesUtil cmUtil, PatchSetUtil psUtil) {
this.updateFactory = updateFactory;
this.cmUtil = cmUtil;
this.psUtil = psUtil;
}
@Override
protected Response<String> applyImpl(RevisionResource rsrc, DescriptionInput input)
public Response<String> apply(RevisionResource rsrc, DescriptionInput input)
throws UpdateException, RestApiException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.EDIT_DESCRIPTION);

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.restapi.Url;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
@@ -35,8 +36,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -47,8 +46,7 @@ import java.util.Collections;
import java.util.Optional;
@Singleton
public class PutDraftComment
extends RetryingRestModifyView<DraftCommentResource, DraftInput, CommentInfo> {
public class PutDraftComment implements RestModifyView<DraftCommentResource, DraftInput> {
private final BatchUpdate.Factory updateFactory;
private final DeleteDraftComment delete;
private final CommentsUtil commentsUtil;
@@ -58,14 +56,12 @@ public class PutDraftComment
@Inject
PutDraftComment(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
DeleteDraftComment delete,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
Provider<CommentJson> commentJson,
PatchListCache patchListCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.delete = delete;
this.commentsUtil = commentsUtil;
@@ -75,10 +71,10 @@ public class PutDraftComment
}
@Override
protected Response<CommentInfo> applyImpl(DraftCommentResource rsrc, DraftInput in)
public Response<CommentInfo> apply(DraftCommentResource rsrc, DraftInput in)
throws RestApiException, UpdateException, PermissionBackendException {
if (in == null || in.message == null || in.message.trim().isEmpty()) {
return delete.applyImpl(rsrc, null);
return delete.apply(rsrc, null);
} else if (in.id != null && !rsrc.getId().equals(in.id)) {
throw new BadRequestException("id must match URL");
} else if (in.line != null && in.line < 0) {

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
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.server.ChangeUtil;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.GerritPersonIdent;
@@ -38,8 +39,6 @@ import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.ProjectCache;
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.gerrit.server.util.CommitMessageUtil;
import com.google.gerrit.server.util.time.TimeUtil;
@@ -61,7 +60,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@Singleton
public class PutMessage extends RetryingRestModifyView<ChangeResource, CommitMessageInput, String> {
public class PutMessage implements RestModifyView<ChangeResource, CommitMessageInput> {
private final BatchUpdate.Factory updateFactory;
private final GitRepositoryManager repositoryManager;
@@ -75,7 +74,6 @@ public class PutMessage extends RetryingRestModifyView<ChangeResource, CommitMes
@Inject
PutMessage(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
GitRepositoryManager repositoryManager,
Provider<CurrentUser> userProvider,
@@ -85,7 +83,6 @@ public class PutMessage extends RetryingRestModifyView<ChangeResource, CommitMes
PatchSetUtil psUtil,
NotifyResolver notifyResolver,
ProjectCache projectCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.repositoryManager = repositoryManager;
this.userProvider = userProvider;
@@ -98,7 +95,7 @@ public class PutMessage extends RetryingRestModifyView<ChangeResource, CommitMes
}
@Override
protected Response<String> applyImpl(ChangeResource resource, CommitMessageInput input)
public Response<String> apply(ChangeResource resource, CommitMessageInput input)
throws IOException, RestApiException, UpdateException, PermissionBackendException,
ConfigInvalidException {
PatchSet ps = psUtil.current(resource.getNotes());

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.api.changes.TopicInput;
import com.google.gerrit.extensions.restapi.BadRequestException;
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.server.ChangeMessagesUtil;
import com.google.gerrit.server.ChangeUtil;
@@ -33,34 +34,27 @@ 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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class PutTopic extends RetryingRestModifyView<ChangeResource, TopicInput, String>
implements UiAction<ChangeResource> {
public class PutTopic
implements RestModifyView<ChangeResource, TopicInput>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final ChangeMessagesUtil cmUtil;
private final TopicEdited topicEdited;
@Inject
PutTopic(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
ChangeMessagesUtil cmUtil,
TopicEdited topicEdited) {
super(retryHelper);
PutTopic(BatchUpdate.Factory updateFactory, ChangeMessagesUtil cmUtil, TopicEdited topicEdited) {
this.updateFactory = updateFactory;
this.cmUtil = cmUtil;
this.topicEdited = topicEdited;
}
@Override
protected Response<String> applyImpl(ChangeResource req, TopicInput input)
public Response<String> apply(ChangeResource req, TopicInput input)
throws UpdateException, RestApiException, PermissionBackendException {
req.permissions().check(ChangePermission.EDIT_TOPIC_NAME);

View File

@@ -47,8 +47,6 @@ import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.ProjectCache;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -63,7 +61,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@Singleton
public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput, ChangeInfo>
public class Rebase
implements RestModifyView<RevisionResource, RebaseInput>, UiAction<RevisionResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -81,7 +79,6 @@ public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput
@Inject
public Rebase(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
GitRepositoryManager repoManager,
RebaseChangeOp.Factory rebaseFactory,
@@ -90,7 +87,6 @@ public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput
PermissionBackend permissionBackend,
ProjectCache projectCache,
PatchSetUtil patchSetUtil) {
super(retryHelper);
this.updateFactory = updateFactory;
this.repoManager = repoManager;
this.rebaseFactory = rebaseFactory;
@@ -102,7 +98,7 @@ public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput
}
@Override
protected Response<ChangeInfo> applyImpl(RevisionResource rsrc, RebaseInput input)
public Response<ChangeInfo> apply(RevisionResource rsrc, RebaseInput input)
throws UpdateException, RestApiException, IOException, PermissionBackendException {
// Not allowed to rebase if the current patch set is locked.
patchSetUtil.checkPatchSetNotLocked(rsrc.getNotes());

View File

@@ -19,35 +19,30 @@ import com.google.gerrit.extensions.common.Input;
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.RestModifyView;
import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.edit.ChangeEditModifier;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.InvalidChangeOperationException;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
import org.eclipse.jgit.lib.Repository;
@Singleton
public class RebaseChangeEdit extends RetryingRestModifyView<ChangeResource, Input, Object> {
public class RebaseChangeEdit implements RestModifyView<ChangeResource, Input> {
private final GitRepositoryManager repositoryManager;
private final ChangeEditModifier editModifier;
@Inject
RebaseChangeEdit(
RetryHelper retryHelper,
GitRepositoryManager repositoryManager,
ChangeEditModifier editModifier) {
super(retryHelper);
RebaseChangeEdit(GitRepositoryManager repositoryManager, ChangeEditModifier editModifier) {
this.repositoryManager = repositoryManager;
this.editModifier = editModifier;
}
@Override
protected Response<Object> applyImpl(ChangeResource rsrc, Input in)
public Response<Object> apply(ChangeResource rsrc, Input in)
throws AuthException, ResourceConflictException, IOException, PermissionBackendException {
Project.NameKey project = rsrc.getProject();
try (Repository repository = repositoryManager.openRepository(project)) {

View File

@@ -26,6 +26,7 @@ import com.google.gerrit.extensions.common.ChangeInfo;
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.server.ChangeMessagesUtil;
import com.google.gerrit.server.ChangeUtil;
@@ -43,8 +44,6 @@ 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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -52,8 +51,8 @@ import com.google.inject.Singleton;
import java.io.IOException;
@Singleton
public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput, ChangeInfo>
implements UiAction<ChangeResource> {
public class Restore
implements RestModifyView<ChangeResource, RestoreInput>, UiAction<ChangeResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final BatchUpdate.Factory updateFactory;
@@ -71,10 +70,8 @@ public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput
ChangeJson.Factory json,
ChangeMessagesUtil cmUtil,
PatchSetUtil psUtil,
RetryHelper retryHelper,
ChangeRestored changeRestored,
ProjectCache projectCache) {
super(retryHelper);
this.updateFactory = updateFactory;
this.restoredSenderFactory = restoredSenderFactory;
this.json = json;
@@ -85,7 +82,7 @@ public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput
}
@Override
protected Response<ChangeInfo> applyImpl(ChangeResource rsrc, RestoreInput input)
public Response<ChangeInfo> apply(ChangeResource rsrc, RestoreInput input)
throws RestApiException, UpdateException, PermissionBackendException, IOException {
// Not allowed to restore if the current patch set is locked.
psUtil.checkPatchSetNotLocked(rsrc.getNotes());

View File

@@ -31,6 +31,7 @@ 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.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
@@ -59,8 +60,6 @@ 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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
@@ -79,8 +78,8 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
@Singleton
public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput, ChangeInfo>
implements UiAction<ChangeResource> {
public class Revert
implements RestModifyView<ChangeResource, RevertInput>, UiAction<ChangeResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final PermissionBackend permissionBackend;
@@ -106,7 +105,6 @@ public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput,
GitRepositoryManager repoManager,
ChangeInserter.Factory changeInserterFactory,
ChangeMessagesUtil cmUtil,
RetryHelper retryHelper,
Sequences seq,
PatchSetUtil psUtil,
RevertedSender.Factory revertedSenderFactory,
@@ -117,7 +115,6 @@ public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput,
ProjectCache projectCache,
NotifyResolver notifyResolver,
CommitUtil commitUtil) {
super(retryHelper);
this.permissionBackend = permissionBackend;
this.updateFactory = updateFactory;
this.repoManager = repoManager;
@@ -136,7 +133,7 @@ public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput,
}
@Override
public Response<ChangeInfo> applyImpl(ChangeResource rsrc, RevertInput input)
public Response<ChangeInfo> apply(ChangeResource rsrc, RevertInput input)
throws IOException, RestApiException, UpdateException, NoSuchChangeException,
PermissionBackendException, NoSuchProjectException, ConfigInvalidException {
Change change = rsrc.getChange();

View File

@@ -25,6 +25,7 @@ import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.RevertSubmissionInfo;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.CurrentUser;
@@ -36,8 +37,6 @@ import com.google.gerrit.server.project.ContributorAgreementsChecker;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.InternalChangeQuery;
import com.google.gerrit.server.update.RetryHelper;
import com.google.gerrit.server.update.RetryingRestModifyView;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@@ -48,8 +47,7 @@ import org.apache.commons.lang.RandomStringUtils;
@Singleton
public class RevertSubmission
extends RetryingRestModifyView<ChangeResource, RevertInput, RevertSubmissionInfo>
implements UiAction<ChangeResource> {
implements RestModifyView<ChangeResource, RevertInput>, UiAction<ChangeResource> {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final Revert revert;
@@ -63,7 +61,6 @@ public class RevertSubmission
@Inject
RevertSubmission(
RetryHelper retryHelper,
Revert revert,
Provider<InternalChangeQuery> queryProvider,
ChangeResource.Factory changeResourceFactory,
@@ -72,7 +69,6 @@ public class RevertSubmission
ProjectCache projectCache,
PatchSetUtil psUtil,
ContributorAgreementsChecker contributorAgreements) {
super(retryHelper);
this.revert = revert;
this.queryProvider = queryProvider;
this.changeResourceFactory = changeResourceFactory;
@@ -84,7 +80,7 @@ public class RevertSubmission
}
@Override
public Response<RevertSubmissionInfo> applyImpl(ChangeResource changeResource, RevertInput input)
public Response<RevertSubmissionInfo> apply(ChangeResource changeResource, RevertInput input)
throws Exception {
if (!changeResource.getChange().isMerged()) {

View File

@@ -22,6 +22,7 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling;
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.server.ChangeUtil;
import com.google.gerrit.server.change.ChangeResource;
@@ -31,31 +32,25 @@ import com.google.gerrit.server.change.WorkInProgressOp.Input;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class SetReadyForReview extends RetryingRestModifyView<ChangeResource, Input, String>
implements UiAction<ChangeResource> {
public class SetReadyForReview
implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final WorkInProgressOp.Factory opFactory;
@Inject
SetReadyForReview(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
WorkInProgressOp.Factory opFactory) {
super(retryHelper);
SetReadyForReview(BatchUpdate.Factory updateFactory, WorkInProgressOp.Factory opFactory) {
this.updateFactory = updateFactory;
this.opFactory = opFactory;
}
@Override
protected Response<String> applyImpl(ChangeResource rsrc, Input input)
public Response<String> apply(ChangeResource rsrc, Input input)
throws RestApiException, UpdateException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.TOGGLE_WORK_IN_PROGRESS_STATE);

View File

@@ -22,6 +22,7 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling;
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.server.ChangeUtil;
import com.google.gerrit.server.change.ChangeResource;
@@ -31,31 +32,25 @@ import com.google.gerrit.server.change.WorkInProgressOp.Input;
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.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class SetWorkInProgress extends RetryingRestModifyView<ChangeResource, Input, String>
implements UiAction<ChangeResource> {
public class SetWorkInProgress
implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
private final BatchUpdate.Factory updateFactory;
private final WorkInProgressOp.Factory opFactory;
@Inject
SetWorkInProgress(
RetryHelper retryHelper,
BatchUpdate.Factory updateFactory,
WorkInProgressOp.Factory opFactory) {
super(retryHelper);
SetWorkInProgress(BatchUpdate.Factory updateFactory, WorkInProgressOp.Factory opFactory) {
this.updateFactory = updateFactory;
this.opFactory = opFactory;
}
@Override
protected Response<String> applyImpl(ChangeResource rsrc, Input input)
public Response<String> apply(ChangeResource rsrc, Input input)
throws RestApiException, UpdateException, PermissionBackendException {
rsrc.permissions().check(ChangePermission.TOGGLE_WORK_IN_PROGRESS_STATE);

View File

@@ -18,13 +18,11 @@ import com.google.common.collect.Lists;
import com.google.gerrit.extensions.api.projects.BanCommitInput;
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.UnprocessableEntityException;
import com.google.gerrit.server.git.BanCommitResult;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.restapi.project.BanCommit.BanResultInfo;
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.Singleton;
@@ -34,18 +32,16 @@ import java.util.List;
import org.eclipse.jgit.lib.ObjectId;
@Singleton
public class BanCommit
extends RetryingRestModifyView<ProjectResource, BanCommitInput, BanResultInfo> {
public class BanCommit implements RestModifyView<ProjectResource, BanCommitInput> {
private final com.google.gerrit.server.git.BanCommit banCommit;
@Inject
BanCommit(RetryHelper retryHelper, com.google.gerrit.server.git.BanCommit banCommit) {
super(retryHelper);
BanCommit(com.google.gerrit.server.git.BanCommit banCommit) {
this.banCommit = banCommit;
}
@Override
protected Response<BanResultInfo> applyImpl(ProjectResource rsrc, BanCommitInput input)
public Response<BanResultInfo> apply(ProjectResource rsrc, BanCommitInput input)
throws RestApiException, UpdateException, IOException, PermissionBackendException {
BanResultInfo r = new BanResultInfo();
if (input != null && input.commits != null && !input.commits.isEmpty()) {

View File

@@ -101,7 +101,7 @@ public class RetryHelper {
@Nullable
abstract Duration timeout();
abstract Optional<Class<?>> caller();
abstract Optional<String> caller();
abstract Optional<Predicate<Throwable>> retryWithTrace();
@@ -113,7 +113,11 @@ public class RetryHelper {
public abstract Builder timeout(Duration timeout);
public abstract Builder caller(Class<?> caller);
public abstract Builder caller(String caller);
public Builder caller(Class<?> caller) {
return caller(caller.getSimpleName());
}
public abstract Builder retryWithTrace(Predicate<Throwable> exceptionPredicate);
@@ -328,7 +332,7 @@ public class RetryHelper {
if (retryWithTraceOnFailure
&& opts.retryWithTrace().isPresent()
&& opts.retryWithTrace().get().test(t)) {
String caller = opts.caller().map(Class::getSimpleName).orElse("N/A");
String caller = opts.caller().orElse("N/A");
if (!traceContext.isTracing()) {
String traceId = "retry-on-failure-" + new RequestId();
traceContext.addTag(RequestId.Type.TRACE_ID, traceId).forceLogging();

View File

@@ -1,68 +0,0 @@
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.update;
import com.google.common.base.Throwables;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
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.RestCollectionModifyView;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.git.LockFailureException;
import com.google.gerrit.server.update.RetryHelper.ActionType;
import java.util.concurrent.atomic.AtomicReference;
public abstract class RetryingRestCollectionModifyView<
P extends RestResource, C extends RestResource, I, O>
implements RestCollectionModifyView<P, C, I> {
private final RetryHelper retryHelper;
protected RetryingRestCollectionModifyView(RetryHelper retryHelper) {
this.retryHelper = retryHelper;
}
@Override
public final Response<O> apply(P parentResource, I input)
throws AuthException, BadRequestException, ResourceConflictException, Exception {
AtomicReference<String> traceId = new AtomicReference<>(null);
try {
RetryHelper.Options retryOptions =
RetryHelper.options()
.caller(getClass())
.retryWithTrace(t -> !(t instanceof RestApiException))
.onAutoTrace(traceId::set)
.build();
return retryHelper
.execute(
ActionType.REST_REQUEST,
() -> applyImpl(parentResource, input),
retryOptions,
t -> {
if (t instanceof UpdateException) {
t = t.getCause();
}
return t instanceof LockFailureException;
})
.traceId(traceId.get());
} catch (Exception e) {
Throwables.throwIfInstanceOf(e, RestApiException.class);
return Response.<O>internalServerError(e).traceId(traceId.get());
}
}
protected abstract Response<O> applyImpl(P parentResource, I input) throws Exception;
}

View File

@@ -1,63 +0,0 @@
// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.update;
import com.google.common.base.Throwables;
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.RestResource;
import com.google.gerrit.git.LockFailureException;
import com.google.gerrit.server.update.RetryHelper.ActionType;
import java.util.concurrent.atomic.AtomicReference;
public abstract class RetryingRestModifyView<R extends RestResource, I, O>
implements RestModifyView<R, I> {
private final RetryHelper retryHelper;
protected RetryingRestModifyView(RetryHelper retryHelper) {
this.retryHelper = retryHelper;
}
@Override
public final Response<O> apply(R resource, I input) throws RestApiException {
AtomicReference<String> traceId = new AtomicReference<>(null);
try {
RetryHelper.Options retryOptions =
RetryHelper.options()
.caller(getClass())
.retryWithTrace(t -> !(t instanceof RestApiException))
.onAutoTrace(traceId::set)
.build();
return retryHelper
.execute(
ActionType.REST_REQUEST,
() -> applyImpl(resource, input),
retryOptions,
t -> {
if (t instanceof UpdateException) {
t = t.getCause();
}
return t instanceof LockFailureException;
})
.traceId(traceId.get());
} catch (Exception e) {
Throwables.throwIfInstanceOf(e, RestApiException.class);
return Response.<O>internalServerError(e).traceId(traceId.get());
}
}
protected abstract Response<O> applyImpl(R resource, I input) throws Exception;
}