diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java index 85cae58e60..868094e1f6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java @@ -81,7 +81,7 @@ class ChangeApiImpl implements ChangeApi { private final GetTopic getTopic; private final PutTopic putTopic; private final PostReviewers postReviewers; - private final Provider changeJson; + private final ChangeJson.Factory changeJson; private final PostHashtags postHashtags; private final GetHashtags getHashtags; private final ListChangeComments listComments; @@ -102,7 +102,7 @@ class ChangeApiImpl implements ChangeApi { GetTopic getTopic, PutTopic putTopic, PostReviewers postReviewers, - Provider changeJson, + ChangeJson.Factory changeJson, PostHashtags postHashtags, GetHashtags getHashtags, ListChangeComments listComments, @@ -276,7 +276,7 @@ class ChangeApiImpl implements ChangeApi { if (u.isIdentifiedUser()) { ((IdentifiedUser) u).clearStarredChanges(); } - return changeJson.get().addOptions(s).format(change); + return changeJson.create(s).format(change); } catch (OrmException e) { throw new RestApiException("Cannot retrieve change", e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java index 5a6b274919..6723db8df0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java @@ -53,7 +53,7 @@ public class Abandon implements RestModifyView, private final ChangeHooks hooks; private final AbandonedSender.Factory abandonedSenderFactory; private final Provider dbProvider; - private final ChangeJson json; + private final ChangeJson.Factory json; private final ChangeIndexer indexer; private final ChangeUpdate.Factory updateFactory; private final ChangeMessagesUtil cmUtil; @@ -62,7 +62,7 @@ public class Abandon implements RestModifyView, Abandon(ChangeHooks hooks, AbandonedSender.Factory abandonedSenderFactory, Provider dbProvider, - ChangeJson json, + ChangeJson.Factory json, ChangeIndexer indexer, ChangeUpdate.Factory updateFactory, ChangeMessagesUtil cmUtil) { @@ -90,8 +90,7 @@ public class Abandon implements RestModifyView, throw new ResourceConflictException("draft changes cannot be abandoned"); } change = abandon(control, input.message, caller.getAccount()); - ChangeInfo result = json.format(change); - return result; + return json.create(ChangeJson.NO_OPTIONS).format(change); } public Change abandon(ChangeControl control, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java index a9e4d54f83..0c38c29e78 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java @@ -98,8 +98,9 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeData.ChangedLines; import com.google.gerrit.server.query.change.QueryResult; import com.google.gwtorm.server.OrmException; -import com.google.inject.Inject; import com.google.inject.Provider; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; @@ -122,6 +123,12 @@ import java.util.TreeMap; public class ChangeJson { private static final Logger log = LoggerFactory.getLogger(ChangeJson.class); + public static final Set NO_OPTIONS = + Collections.emptySet(); + + public interface Factory { + ChangeJson create(Set options); + } private final Provider db; private final LabelNormalizer labelNormalizer; @@ -145,7 +152,7 @@ public class ChangeJson { private AccountLoader accountLoader; private FixInput fix; - @Inject + @AssistedInject ChangeJson( Provider db, LabelNormalizer ln, @@ -163,7 +170,8 @@ public class ChangeJson { WebLinks webLinks, ChangeMessagesUtil cmUtil, Provider checkerProvider, - ActionJson actionJson) { + ActionJson actionJson, + @Assisted Set options) { this.db = db; this.labelNormalizer = ln; this.userProvider = user; @@ -181,17 +189,9 @@ public class ChangeJson { this.cmUtil = cmUtil; this.checkerProvider = checkerProvider; this.actionJson = actionJson; - options = EnumSet.noneOf(ListChangesOption.class); - } - - public ChangeJson addOption(ListChangesOption o) { - options.add(o); - return this; - } - - public ChangeJson addOptions(Collection o) { - options.addAll(o); - return this; + this.options = options.isEmpty() + ? EnumSet.noneOf(ListChangesOption.class) + : EnumSet.copyOf(options); } public ChangeJson fix(FixInput fix) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java index 5958f21a04..f4b2f4ea9b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java @@ -25,19 +25,20 @@ import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import java.util.EnumSet; + public class Check implements RestReadView, RestModifyView { - private final ChangeJson json; + private final ChangeJson.Factory jsonFactory; @Inject - Check(ChangeJson json) { - this.json = json; - json.addOption(ListChangesOption.CHECK); + Check(ChangeJson.Factory json) { + this.jsonFactory = json; } @Override public Response apply(ChangeResource rsrc) throws OrmException { - return Response.withMustRevalidate(json.format(rsrc)); + return Response.withMustRevalidate(newChangeJson().format(rsrc)); } @Override @@ -49,6 +50,10 @@ public class Check implements RestReadView, && !ctl.getCurrentUser().getCapabilities().canMaintainServer()) { throw new AuthException("Cannot fix change"); } - return Response.withMustRevalidate(json.fix(input).format(rsrc)); + return Response.withMustRevalidate(newChangeJson().fix(input).format(rsrc)); + } + + private ChangeJson newChangeJson() { + return jsonFactory.create(EnumSet.of(ListChangesOption.CHECK)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java index 5aaea3e4a1..08117d1a1c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java @@ -43,12 +43,12 @@ public class CherryPick implements RestModifyView { private final Provider dbProvider; private final CherryPickChange cherryPickChange; - private final ChangeJson json; + private final ChangeJson.Factory json; @Inject CherryPick(Provider dbProvider, CherryPickChange cherryPickChange, - ChangeJson json) { + ChangeJson.Factory json) { this.dbProvider = dbProvider; this.cherryPickChange = cherryPickChange; this.json = json; @@ -84,7 +84,7 @@ public class CherryPick implements RestModifyView { - private final ChangeJson json; + private final ChangeJson.Factory json; + private final EnumSet options = + EnumSet.noneOf(ListChangesOption.class); @Option(name = "-o", usage = "Output options") void addOption(ListChangesOption o) { - json.addOption(o); + options.add(o); } @Option(name = "-O", usage = "Output option flags, in hex") void setOptionFlagsHex(String hex) { - json.addOptions(ListChangesOption.fromBits(Integer.parseInt(hex, 16))); + options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16))); } @Inject - GetChange(ChangeJson json) { + GetChange(ChangeJson.Factory json) { this.json = json; } @Override public Response apply(ChangeResource rsrc) throws OrmException { - return Response.withMustRevalidate(json.format(rsrc)); + return Response.withMustRevalidate(json.create(options).format(rsrc)); } Response apply(RevisionResource rsrc) throws OrmException { - return Response.withMustRevalidate(json.format(rsrc)); + return Response.withMustRevalidate(json.create(options).format(rsrc)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java index 0f0a6a2d0e..a7f8dea31f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java @@ -33,14 +33,13 @@ import java.util.concurrent.TimeUnit; public class GetCommit implements RestReadView { private final GitRepositoryManager repoManager; - private final ChangeJson json; + private final ChangeJson.Factory json; @Option(name = "--links", usage = "Add weblinks") private boolean addLinks; @Inject - GetCommit(GitRepositoryManager repoManager, - ChangeJson json) { + GetCommit(GitRepositoryManager repoManager, ChangeJson.Factory json) { this.repoManager = repoManager; this.json = json; } @@ -53,8 +52,9 @@ public class GetCommit implements RestReadView { String rev = rsrc.getPatchSet().getRevision().get(); RevCommit commit = rw.parseCommit(ObjectId.fromString(rev)); rw.parseBody(commit); - Response r = Response.ok( - json.toCommit(rsrc.getControl(), rw, commit, addLinks)); + CommitInfo info = json.create(ChangeJson.NO_OPTIONS) + .toCommit(rsrc.getControl(), rw, commit, addLinks); + Response r = Response.ok(info); if (rsrc.isCacheable()) { r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java index 49f9bb92c0..2083c276c1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java @@ -47,28 +47,29 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.EnumSet; @Singleton public class Rebase implements RestModifyView, UiAction { - private static final Logger log = LoggerFactory.getLogger(Rebase.class); + private static final EnumSet OPTIONS = EnumSet.of( + ListChangesOption.CURRENT_REVISION, + ListChangesOption.CURRENT_COMMIT); private final GitRepositoryManager repoManager; private final Provider rebaseChange; - private final ChangeJson json; + private final ChangeJson.Factory json; private final Provider dbProvider; @Inject public Rebase(GitRepositoryManager repoManager, Provider rebaseChange, - ChangeJson json, + ChangeJson.Factory json, Provider dbProvider) { this.repoManager = repoManager; this.rebaseChange = rebaseChange; - this.json = json - .addOption(ListChangesOption.CURRENT_REVISION) - .addOption(ListChangesOption.CURRENT_COMMIT); + this.json = json; this.dbProvider = dbProvider; } @@ -97,7 +98,7 @@ public class Rebase implements RestModifyView, throw new ResourceNotFoundException(change.getId().toString()); } - return json.format(change.getId()); + return json.create(OPTIONS).format(change.getId()); } private String findBaseRev(RevWalk rw, RevisionResource rsrc, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java index 46d73d7d83..c09aa3b251 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java @@ -53,7 +53,7 @@ public class Restore implements RestModifyView, private final ChangeHooks hooks; private final RestoredSender.Factory restoredSenderFactory; private final Provider dbProvider; - private final ChangeJson json; + private final ChangeJson.Factory json; private final ChangeIndexer indexer; private final ChangeMessagesUtil cmUtil; private final ChangeUpdate.Factory updateFactory; @@ -62,7 +62,7 @@ public class Restore implements RestModifyView, Restore(ChangeHooks hooks, RestoredSender.Factory restoredSenderFactory, Provider dbProvider, - ChangeJson json, + ChangeJson.Factory json, ChangeIndexer indexer, ChangeMessagesUtil cmUtil, ChangeUpdate.Factory updateFactory) { @@ -136,8 +136,7 @@ public class Restore implements RestModifyView, db.patchSets().get(change.currentPatchSetId()), Strings.emptyToNull(input.message), dbProvider.get()); - ChangeInfo result = json.format(change); - return result; + return json.create(ChangeJson.NO_OPTIONS).format(change); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java index e6846e0abe..aaae6f0a73 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java @@ -44,12 +44,12 @@ import java.io.IOException; @Singleton public class Revert implements RestModifyView, UiAction { - private final ChangeJson json; + private final ChangeJson.Factory json; private final ChangeUtil changeUtil; private final PersonIdent myIdent; @Inject - Revert(ChangeJson json, + Revert(ChangeJson.Factory json, ChangeUtil changeUtil, @GerritPersonIdent PersonIdent myIdent) { this.json = json; @@ -69,18 +69,19 @@ public class Revert implements RestModifyView, throw new ResourceConflictException("change is " + status(change)); } + Change.Id revertedChangeId; try { - Change.Id revertedChangeId = - changeUtil.revert(control, change.currentPatchSetId(), - Strings.emptyToNull(input.message), - new PersonIdent(myIdent, TimeUtil.nowTs()), new NoSshInfo()); - - return json.format(revertedChangeId); + revertedChangeId = changeUtil.revert(control, + change.currentPatchSetId(), + Strings.emptyToNull(input.message), + new PersonIdent(myIdent, TimeUtil.nowTs()), + new NoSshInfo()); } catch (InvalidChangeOperationException e) { throw new BadRequestException(e.getMessage()); } catch (NoSuchChangeException e) { throw new ResourceNotFoundException(e.getMessage()); } + return json.create(ChangeJson.NO_OPTIONS).format(revertedChangeId); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java index c30002c9f5..3d4dc26e7b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java @@ -472,12 +472,12 @@ public class Submit implements RestModifyView, RestModifyView { private final Provider dbProvider; private final Submit submit; - private final ChangeJson json; + private final ChangeJson.Factory json; @Inject CurrentRevision(Provider dbProvider, Submit submit, - ChangeJson json) { + ChangeJson.Factory json) { this.dbProvider = dbProvider; this.submit = submit; this.json = json; @@ -495,8 +495,9 @@ public class Submit implements RestModifyView, } else if (!rsrc.getControl().isPatchVisible(ps, dbProvider.get())) { throw new AuthException("current revision not accessible"); } + Output out = submit.apply(new RevisionResource(rsrc, ps), input); - return json.format(out.change); + return json.create(ChangeJson.NO_OPTIONS).format(out.change); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java index c909239c9a..2a7d03efb1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java @@ -40,13 +40,12 @@ public class SubmittedTogether implements RestReadView { private static final Logger log = LoggerFactory.getLogger( SubmittedTogether.class); - private final ChangeJson json; - + private final ChangeJson.Factory json; private final Provider dbProvider; private final MergeSuperSet mergeSuperSet; @Inject - SubmittedTogether(ChangeJson json, + SubmittedTogether(ChangeJson.Factory json, Provider dbProvider, MergeSuperSet mergeSuperSet) { this.json = json; @@ -61,12 +60,12 @@ public class SubmittedTogether implements RestReadView { try { ChangeSet cs = mergeSuperSet.completeChangeSet(dbProvider.get(), ChangeSet.create(resource.getChange())); - json.addOptions(EnumSet.of( + return json.create(EnumSet.of( ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT, ListChangesOption.DETAILED_LABELS, - ListChangesOption.LABELS)); - return json.format(cs.ids()); + ListChangesOption.LABELS)) + .format(cs.ids()); } catch (OrmException | IOException e) { log.error("Error on getting a ChangeSet", e); throw e; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java index c8360a9102..970bb41096 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java @@ -69,6 +69,7 @@ import com.google.gerrit.server.auth.AuthBackend; import com.google.gerrit.server.auth.UniversalAuthBackend; import com.google.gerrit.server.avatar.AvatarProvider; import com.google.gerrit.server.cache.CacheRemovalListener; +import com.google.gerrit.server.change.ChangeJson; import com.google.gerrit.server.change.ChangeKindCacheImpl; import com.google.gerrit.server.change.MergeabilityCacheImpl; import com.google.gerrit.server.events.EventFactory; @@ -186,6 +187,7 @@ public class GerritGlobalModule extends FactoryModule { factory(AddReviewerSender.Factory.class); factory(CapabilityControl.Factory.class); factory(ChangeData.Factory.class); + factory(ChangeJson.Factory.class); factory(CreateChangeSender.Factory.class); factory(GroupDetailFactory.Factory.class); factory(GroupInfoCacheFactory.Factory.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java index 299f0f19d4..bd6b297382 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java @@ -38,7 +38,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class QueryChanges implements RestReadView { - private final ChangeJson json; + private final ChangeJson.Factory json; private final ChangeQueryBuilder qb; private final QueryProcessor imp; private final Provider user; @@ -68,7 +68,7 @@ public class QueryChanges implements RestReadView { } @Inject - QueryChanges(ChangeJson json, + QueryChanges(ChangeJson.Factory json, ChangeQueryBuilder qb, QueryProcessor qp, Provider user) { @@ -141,7 +141,7 @@ public class QueryChanges implements RestReadView { QueryParseException { int cnt = queries.size(); List results = imp.queryChanges(qb.parse(queries)); - List> res = json.addOptions(options) + List> res = json.create(options) .formatQueryResults(results); for (int n = 0; n < cnt; n++) { List info = res.get(n);