Convert PostReviewers to use PermissionBackend
Pass along the ChangeData instead of ChangeControl for every reviewer. Change-Id: I41f06a71439d643ffb0cdb4f5056f306335b7a9f
This commit is contained in:
@@ -338,10 +338,10 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
|
|||||||
List<Address> ccByEmail = new ArrayList<>();
|
List<Address> ccByEmail = new ArrayList<>();
|
||||||
for (PostReviewers.Addition addition : reviewerAdditions) {
|
for (PostReviewers.Addition addition : reviewerAdditions) {
|
||||||
if (addition.state == ReviewerState.REVIEWER) {
|
if (addition.state == ReviewerState.REVIEWER) {
|
||||||
to.addAll(addition.reviewers.keySet());
|
to.addAll(addition.reviewers);
|
||||||
toByEmail.addAll(addition.reviewersByEmail);
|
toByEmail.addAll(addition.reviewersByEmail);
|
||||||
} else if (addition.state == ReviewerState.CC) {
|
} else if (addition.state == ReviewerState.CC) {
|
||||||
cc.addAll(addition.reviewers.keySet());
|
cc.addAll(addition.reviewers);
|
||||||
ccByEmail.addAll(addition.reviewersByEmail);
|
ccByEmail.addAll(addition.reviewersByEmail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,13 @@
|
|||||||
|
|
||||||
package com.google.gerrit.server.change;
|
package com.google.gerrit.server.change;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.gerrit.extensions.client.ReviewerState.CC;
|
import static com.google.gerrit.extensions.client.ReviewerState.CC;
|
||||||
import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
|
import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableListMultimap;
|
import com.google.common.collect.ImmutableListMultimap;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.ListMultimap;
|
import com.google.common.collect.ListMultimap;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.gerrit.common.Nullable;
|
import com.google.gerrit.common.Nullable;
|
||||||
@@ -33,6 +34,7 @@ import com.google.gerrit.extensions.api.changes.RecipientType;
|
|||||||
import com.google.gerrit.extensions.api.changes.ReviewerInfo;
|
import com.google.gerrit.extensions.api.changes.ReviewerInfo;
|
||||||
import com.google.gerrit.extensions.client.ReviewerState;
|
import com.google.gerrit.extensions.client.ReviewerState;
|
||||||
import com.google.gerrit.extensions.common.AccountInfo;
|
import com.google.gerrit.extensions.common.AccountInfo;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
import com.google.gerrit.extensions.restapi.RestApiException;
|
import com.google.gerrit.extensions.restapi.RestApiException;
|
||||||
import com.google.gerrit.extensions.restapi.RestModifyView;
|
import com.google.gerrit.extensions.restapi.RestModifyView;
|
||||||
@@ -53,12 +55,15 @@ import com.google.gerrit.server.group.GroupsCollection;
|
|||||||
import com.google.gerrit.server.group.SystemGroupBackend;
|
import com.google.gerrit.server.group.SystemGroupBackend;
|
||||||
import com.google.gerrit.server.mail.Address;
|
import com.google.gerrit.server.mail.Address;
|
||||||
import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
|
import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
|
||||||
|
import com.google.gerrit.server.notedb.ChangeNotes;
|
||||||
import com.google.gerrit.server.notedb.NotesMigration;
|
import com.google.gerrit.server.notedb.NotesMigration;
|
||||||
import com.google.gerrit.server.permissions.PermissionBackend;
|
import com.google.gerrit.server.permissions.PermissionBackend;
|
||||||
import com.google.gerrit.server.permissions.PermissionBackendException;
|
import com.google.gerrit.server.permissions.PermissionBackendException;
|
||||||
|
import com.google.gerrit.server.permissions.RefPermission;
|
||||||
import com.google.gerrit.server.project.ChangeControl;
|
import com.google.gerrit.server.project.ChangeControl;
|
||||||
import com.google.gerrit.server.project.NoSuchProjectException;
|
import com.google.gerrit.server.project.NoSuchProjectException;
|
||||||
import com.google.gerrit.server.project.ProjectCache;
|
import com.google.gerrit.server.project.ProjectCache;
|
||||||
|
import com.google.gerrit.server.query.change.ChangeData;
|
||||||
import com.google.gerrit.server.update.BatchUpdate;
|
import com.google.gerrit.server.update.BatchUpdate;
|
||||||
import com.google.gerrit.server.update.UpdateException;
|
import com.google.gerrit.server.update.UpdateException;
|
||||||
import com.google.gwtorm.server.OrmException;
|
import com.google.gwtorm.server.OrmException;
|
||||||
@@ -68,8 +73,7 @@ import com.google.inject.Singleton;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.eclipse.jgit.lib.Config;
|
import org.eclipse.jgit.lib.Config;
|
||||||
|
|
||||||
@@ -87,6 +91,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
private final GroupMembers.Factory groupMembersFactory;
|
private final GroupMembers.Factory groupMembersFactory;
|
||||||
private final AccountLoader.Factory accountLoaderFactory;
|
private final AccountLoader.Factory accountLoaderFactory;
|
||||||
private final Provider<ReviewDb> dbProvider;
|
private final Provider<ReviewDb> dbProvider;
|
||||||
|
private final ChangeData.Factory changeDataFactory;
|
||||||
private final BatchUpdate.Factory batchUpdateFactory;
|
private final BatchUpdate.Factory batchUpdateFactory;
|
||||||
private final IdentifiedUser.GenericFactory identifiedUserFactory;
|
private final IdentifiedUser.GenericFactory identifiedUserFactory;
|
||||||
private final Config cfg;
|
private final Config cfg;
|
||||||
@@ -106,6 +111,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
GroupMembers.Factory groupMembersFactory,
|
GroupMembers.Factory groupMembersFactory,
|
||||||
AccountLoader.Factory accountLoaderFactory,
|
AccountLoader.Factory accountLoaderFactory,
|
||||||
Provider<ReviewDb> db,
|
Provider<ReviewDb> db,
|
||||||
|
ChangeData.Factory changeDataFactory,
|
||||||
BatchUpdate.Factory batchUpdateFactory,
|
BatchUpdate.Factory batchUpdateFactory,
|
||||||
IdentifiedUser.GenericFactory identifiedUserFactory,
|
IdentifiedUser.GenericFactory identifiedUserFactory,
|
||||||
@GerritServerConfig Config cfg,
|
@GerritServerConfig Config cfg,
|
||||||
@@ -122,6 +128,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
this.groupMembersFactory = groupMembersFactory;
|
this.groupMembersFactory = groupMembersFactory;
|
||||||
this.accountLoaderFactory = accountLoaderFactory;
|
this.accountLoaderFactory = accountLoaderFactory;
|
||||||
this.dbProvider = db;
|
this.dbProvider = db;
|
||||||
|
this.changeDataFactory = changeDataFactory;
|
||||||
this.batchUpdateFactory = batchUpdateFactory;
|
this.batchUpdateFactory = batchUpdateFactory;
|
||||||
this.identifiedUserFactory = identifiedUserFactory;
|
this.identifiedUserFactory = identifiedUserFactory;
|
||||||
this.cfg = cfg;
|
this.cfg = cfg;
|
||||||
@@ -158,7 +165,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
|
|
||||||
public Addition prepareApplication(
|
public Addition prepareApplication(
|
||||||
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup)
|
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup)
|
||||||
throws OrmException, RestApiException, IOException {
|
throws OrmException, RestApiException, IOException, PermissionBackendException {
|
||||||
boolean allowByEmail = projectCache.checkedGet(rsrc.getProject()).isEnableReviewerByEmail();
|
boolean allowByEmail = projectCache.checkedGet(rsrc.getProject()).isEnableReviewerByEmail();
|
||||||
|
|
||||||
Addition byAccountId = addByAccountId(rsrc, input, allowGroup, allowByEmail);
|
Addition byAccountId = addByAccountId(rsrc, input, allowGroup, allowByEmail);
|
||||||
@@ -178,7 +185,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
return new Addition(
|
return new Addition(
|
||||||
user.getUserName(),
|
user.getUserName(),
|
||||||
revision.getChangeResource(),
|
revision.getChangeResource(),
|
||||||
ImmutableMap.of(user.getAccountId(), revision.getControl()),
|
ImmutableSet.of(user.getAccountId()),
|
||||||
null,
|
null,
|
||||||
CC,
|
CC,
|
||||||
NotifyHandling.NONE,
|
NotifyHandling.NONE,
|
||||||
@@ -188,7 +195,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Addition addByAccountId(
|
private Addition addByAccountId(
|
||||||
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup, boolean allowByEmail)
|
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup, boolean allowByEmail)
|
||||||
throws OrmException, RestApiException {
|
throws OrmException, RestApiException, PermissionBackendException {
|
||||||
Account.Id accountId = null;
|
Account.Id accountId = null;
|
||||||
try {
|
try {
|
||||||
accountId = accounts.parse(input.reviewer).getAccountId();
|
accountId = accounts.parse(input.reviewer).getAccountId();
|
||||||
@@ -212,7 +219,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Addition addWholeGroup(
|
private Addition addWholeGroup(
|
||||||
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup, boolean allowByEmail)
|
ChangeResource rsrc, AddReviewerInput input, boolean allowGroup, boolean allowByEmail)
|
||||||
throws OrmException, RestApiException, IOException {
|
throws OrmException, RestApiException, IOException, PermissionBackendException {
|
||||||
if (!allowGroup) {
|
if (!allowGroup) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -245,14 +252,15 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
ReviewerState state,
|
ReviewerState state,
|
||||||
NotifyHandling notify,
|
NotifyHandling notify,
|
||||||
ListMultimap<RecipientType, Account.Id> accountsToNotify)
|
ListMultimap<RecipientType, Account.Id> accountsToNotify)
|
||||||
throws UnprocessableEntityException {
|
throws UnprocessableEntityException, PermissionBackendException {
|
||||||
Account member = rsrc.getReviewerUser().getAccount();
|
Account member = rsrc.getReviewerUser().getAccount();
|
||||||
ChangeControl control = rsrc.getReviewerControl();
|
PermissionBackend.ForRef perm =
|
||||||
if (isValidReviewer(member, control)) {
|
permissionBackend.user(rsrc.getReviewerUser()).ref(rsrc.getChange().getDest());
|
||||||
|
if (isValidReviewer(member, perm)) {
|
||||||
return new Addition(
|
return new Addition(
|
||||||
reviewer,
|
reviewer,
|
||||||
rsrc.getChangeResource(),
|
rsrc.getChangeResource(),
|
||||||
ImmutableMap.of(member.getId(), control),
|
ImmutableSet.of(member.getId()),
|
||||||
null,
|
null,
|
||||||
state,
|
state,
|
||||||
notify,
|
notify,
|
||||||
@@ -291,7 +299,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Addition putGroup(ChangeResource rsrc, AddReviewerInput input)
|
private Addition putGroup(ChangeResource rsrc, AddReviewerInput input)
|
||||||
throws RestApiException, OrmException, IOException {
|
throws RestApiException, OrmException, IOException, PermissionBackendException {
|
||||||
GroupDescription.Basic group = groupsCollection.parseInternal(input.reviewer);
|
GroupDescription.Basic group = groupsCollection.parseInternal(input.reviewer);
|
||||||
if (!isLegalReviewerGroup(group.getGroupUUID())) {
|
if (!isLegalReviewerGroup(group.getGroupUUID())) {
|
||||||
return fail(
|
return fail(
|
||||||
@@ -299,7 +307,7 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, group.getName()));
|
MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, group.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<Account.Id, ChangeControl> reviewers = new HashMap<>();
|
Set<Account.Id> reviewers = new HashSet<>();
|
||||||
ChangeControl control = rsrc.getControl();
|
ChangeControl control = rsrc.getControl();
|
||||||
Set<Account> members;
|
Set<Account> members;
|
||||||
try {
|
try {
|
||||||
@@ -335,9 +343,11 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
ChangeMessages.get().groupManyMembersConfirmation, group.getName(), members.size()));
|
ChangeMessages.get().groupManyMembersConfirmation, group.getName(), members.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PermissionBackend.ForRef perm =
|
||||||
|
permissionBackend.user(rsrc.getUser()).ref(rsrc.getChange().getDest());
|
||||||
for (Account member : members) {
|
for (Account member : members) {
|
||||||
if (isValidReviewer(member, control)) {
|
if (isValidReviewer(member, perm)) {
|
||||||
reviewers.put(member.getId(), control);
|
reviewers.add(member.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,12 +361,18 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
notifyUtil.resolveAccounts(input.notifyDetails));
|
notifyUtil.resolveAccounts(input.notifyDetails));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isValidReviewer(Account member, ChangeControl control) {
|
private boolean isValidReviewer(Account member, PermissionBackend.ForRef perm)
|
||||||
|
throws PermissionBackendException {
|
||||||
if (member.isActive()) {
|
if (member.isActive()) {
|
||||||
IdentifiedUser user = identifiedUserFactory.create(member.getId());
|
IdentifiedUser user = identifiedUserFactory.create(member.getId());
|
||||||
// Does not account for draft status as a user might want to let a
|
// Does not account for draft status as a user might want to let a
|
||||||
// reviewer see a draft.
|
// reviewer see a draft.
|
||||||
return control.forUser(user).isRefVisible();
|
try {
|
||||||
|
perm.user(user).check(RefPermission.READ);
|
||||||
|
return true;
|
||||||
|
} catch (AuthException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -375,46 +391,64 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
public class Addition {
|
public class Addition {
|
||||||
final AddReviewerResult result;
|
final AddReviewerResult result;
|
||||||
final PostReviewersOp op;
|
final PostReviewersOp op;
|
||||||
final Map<Account.Id, ChangeControl> reviewers;
|
final Set<Account.Id> reviewers;
|
||||||
final Collection<Address> reviewersByEmail;
|
final Collection<Address> reviewersByEmail;
|
||||||
final ReviewerState state;
|
final ReviewerState state;
|
||||||
|
final ChangeNotes notes;
|
||||||
|
final IdentifiedUser caller;
|
||||||
|
|
||||||
protected Addition(String reviewer) {
|
Addition(String reviewer) {
|
||||||
this(reviewer, null, null, null, REVIEWER, null, ImmutableListMultimap.of());
|
result = new AddReviewerResult(reviewer);
|
||||||
|
op = null;
|
||||||
|
reviewers = ImmutableSet.of();
|
||||||
|
reviewersByEmail = ImmutableSet.of();
|
||||||
|
state = REVIEWER;
|
||||||
|
notes = null;
|
||||||
|
caller = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Addition(
|
protected Addition(
|
||||||
String reviewer,
|
String reviewer,
|
||||||
ChangeResource rsrc,
|
ChangeResource rsrc,
|
||||||
@Nullable Map<Account.Id, ChangeControl> reviewers,
|
@Nullable Set<Account.Id> reviewers,
|
||||||
@Nullable Collection<Address> reviewersByEmail,
|
@Nullable Collection<Address> reviewersByEmail,
|
||||||
ReviewerState state,
|
ReviewerState state,
|
||||||
@Nullable NotifyHandling notify,
|
@Nullable NotifyHandling notify,
|
||||||
ListMultimap<RecipientType, Account.Id> accountsToNotify) {
|
ListMultimap<RecipientType, Account.Id> accountsToNotify) {
|
||||||
|
checkArgument(
|
||||||
|
reviewers != null || reviewersByEmail != null,
|
||||||
|
"must have either reviewers or reviewersByEmail");
|
||||||
|
|
||||||
result = new AddReviewerResult(reviewer);
|
result = new AddReviewerResult(reviewer);
|
||||||
this.reviewers = reviewers == null ? ImmutableMap.of() : reviewers;
|
this.reviewers = reviewers == null ? ImmutableSet.of() : reviewers;
|
||||||
this.reviewersByEmail = reviewersByEmail == null ? ImmutableList.of() : reviewersByEmail;
|
this.reviewersByEmail = reviewersByEmail == null ? ImmutableList.of() : reviewersByEmail;
|
||||||
this.state = state;
|
this.state = state;
|
||||||
if (reviewers == null && reviewersByEmail == null) {
|
notes = rsrc.getNotes();
|
||||||
op = null;
|
caller = rsrc.getUser();
|
||||||
return;
|
|
||||||
}
|
|
||||||
op =
|
op =
|
||||||
postReviewersOpFactory.create(
|
postReviewersOpFactory.create(
|
||||||
rsrc, this.reviewers, this.reviewersByEmail, state, notify, accountsToNotify);
|
rsrc, this.reviewers, this.reviewersByEmail, state, notify, accountsToNotify);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gatherResults() throws OrmException, PermissionBackendException {
|
void gatherResults() throws OrmException, PermissionBackendException {
|
||||||
|
if (notes == null || caller == null) {
|
||||||
|
// When notes or caller is missing this is likely just carrying an error message
|
||||||
|
// in the contained AddReviewerResult.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChangeData cd = changeDataFactory.create(dbProvider.get(), notes);
|
||||||
|
PermissionBackend.ForChange perm =
|
||||||
|
permissionBackend.user(caller).database(dbProvider).change(cd);
|
||||||
|
|
||||||
// Generate result details and fill AccountLoader. This occurs outside
|
// Generate result details and fill AccountLoader. This occurs outside
|
||||||
// the Op because the accounts are in a different table.
|
// the Op because the accounts are in a different table.
|
||||||
PostReviewersOp.Result opResult = op.getResult();
|
PostReviewersOp.Result opResult = op.getResult();
|
||||||
if (migration.readChanges() && state == CC) {
|
if (migration.readChanges() && state == CC) {
|
||||||
result.ccs = Lists.newArrayListWithCapacity(opResult.addedCCs().size());
|
result.ccs = Lists.newArrayListWithCapacity(opResult.addedCCs().size());
|
||||||
for (Account.Id accountId : opResult.addedCCs()) {
|
for (Account.Id accountId : opResult.addedCCs()) {
|
||||||
ChangeControl ctl = reviewers.get(accountId);
|
IdentifiedUser u = identifiedUserFactory.create(accountId);
|
||||||
PermissionBackend.ForChange perm =
|
result.ccs.add(json.format(new ReviewerInfo(accountId.get()), perm.user(u), cd));
|
||||||
permissionBackend.user(ctl.getUser()).database(dbProvider).change(ctl.getNotes());
|
|
||||||
result.ccs.add(json.format(new ReviewerInfo(accountId.get()), perm, ctl));
|
|
||||||
}
|
}
|
||||||
accountLoaderFactory.create(true).fill(result.ccs);
|
accountLoaderFactory.create(true).fill(result.ccs);
|
||||||
for (Address a : reviewersByEmail) {
|
for (Address a : reviewersByEmail) {
|
||||||
@@ -424,12 +458,13 @@ public class PostReviewers implements RestModifyView<ChangeResource, AddReviewer
|
|||||||
result.reviewers = Lists.newArrayListWithCapacity(opResult.addedReviewers().size());
|
result.reviewers = Lists.newArrayListWithCapacity(opResult.addedReviewers().size());
|
||||||
for (PatchSetApproval psa : opResult.addedReviewers()) {
|
for (PatchSetApproval psa : opResult.addedReviewers()) {
|
||||||
// New reviewers have value 0, don't bother normalizing.
|
// New reviewers have value 0, don't bother normalizing.
|
||||||
ChangeControl ctl = reviewers.get(psa.getAccountId());
|
IdentifiedUser u = identifiedUserFactory.create(psa.getAccountId());
|
||||||
PermissionBackend.ForChange perm =
|
|
||||||
permissionBackend.user(ctl.getUser()).database(dbProvider).change(ctl.getNotes());
|
|
||||||
result.reviewers.add(
|
result.reviewers.add(
|
||||||
json.format(
|
json.format(
|
||||||
new ReviewerInfo(psa.getAccountId().get()), perm, ctl, ImmutableList.of(psa)));
|
new ReviewerInfo(psa.getAccountId().get()),
|
||||||
|
perm.user(u),
|
||||||
|
cd,
|
||||||
|
ImmutableList.of(psa)));
|
||||||
}
|
}
|
||||||
accountLoaderFactory.create(true).fill(result.reviewers);
|
accountLoaderFactory.create(true).fill(result.reviewers);
|
||||||
for (Address a : reviewersByEmail) {
|
for (Address a : reviewersByEmail) {
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import com.google.gerrit.extensions.api.changes.RecipientType;
|
|||||||
import com.google.gerrit.extensions.client.ReviewerState;
|
import com.google.gerrit.extensions.client.ReviewerState;
|
||||||
import com.google.gerrit.extensions.restapi.RestApiException;
|
import com.google.gerrit.extensions.restapi.RestApiException;
|
||||||
import com.google.gerrit.reviewdb.client.Account;
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
import com.google.gerrit.reviewdb.client.Account.Id;
|
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
||||||
@@ -43,7 +42,6 @@ import com.google.gerrit.server.mail.Address;
|
|||||||
import com.google.gerrit.server.mail.send.AddReviewerSender;
|
import com.google.gerrit.server.mail.send.AddReviewerSender;
|
||||||
import com.google.gerrit.server.notedb.NotesMigration;
|
import com.google.gerrit.server.notedb.NotesMigration;
|
||||||
import com.google.gerrit.server.notedb.ReviewerStateInternal;
|
import com.google.gerrit.server.notedb.ReviewerStateInternal;
|
||||||
import com.google.gerrit.server.project.ChangeControl;
|
|
||||||
import com.google.gerrit.server.update.BatchUpdateOp;
|
import com.google.gerrit.server.update.BatchUpdateOp;
|
||||||
import com.google.gerrit.server.update.ChangeContext;
|
import com.google.gerrit.server.update.ChangeContext;
|
||||||
import com.google.gerrit.server.update.Context;
|
import com.google.gerrit.server.update.Context;
|
||||||
@@ -55,7 +53,7 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Set;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -65,7 +63,7 @@ public class PostReviewersOp implements BatchUpdateOp {
|
|||||||
public interface Factory {
|
public interface Factory {
|
||||||
PostReviewersOp create(
|
PostReviewersOp create(
|
||||||
ChangeResource rsrc,
|
ChangeResource rsrc,
|
||||||
Map<Account.Id, ChangeControl> reviewers,
|
Set<Account.Id> reviewers,
|
||||||
Collection<Address> reviewersByEmail,
|
Collection<Address> reviewersByEmail,
|
||||||
ReviewerState state,
|
ReviewerState state,
|
||||||
@Nullable NotifyHandling notify,
|
@Nullable NotifyHandling notify,
|
||||||
@@ -101,11 +99,11 @@ public class PostReviewersOp implements BatchUpdateOp {
|
|||||||
private final Provider<IdentifiedUser> user;
|
private final Provider<IdentifiedUser> user;
|
||||||
private final Provider<ReviewDb> dbProvider;
|
private final Provider<ReviewDb> dbProvider;
|
||||||
private final ChangeResource rsrc;
|
private final ChangeResource rsrc;
|
||||||
private final Map<Id, ChangeControl> reviewers;
|
private final Set<Account.Id> reviewers;
|
||||||
private final Collection<Address> reviewersByEmail;
|
private final Collection<Address> reviewersByEmail;
|
||||||
private final ReviewerState state;
|
private final ReviewerState state;
|
||||||
private final NotifyHandling notify;
|
private final NotifyHandling notify;
|
||||||
private final ListMultimap<RecipientType, Id> accountsToNotify;
|
private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
|
||||||
|
|
||||||
private List<PatchSetApproval> addedReviewers = new ArrayList<>();
|
private List<PatchSetApproval> addedReviewers = new ArrayList<>();
|
||||||
private Collection<Account.Id> addedCCs = new ArrayList<>();
|
private Collection<Account.Id> addedCCs = new ArrayList<>();
|
||||||
@@ -124,7 +122,7 @@ public class PostReviewersOp implements BatchUpdateOp {
|
|||||||
Provider<IdentifiedUser> user,
|
Provider<IdentifiedUser> user,
|
||||||
Provider<ReviewDb> dbProvider,
|
Provider<ReviewDb> dbProvider,
|
||||||
@Assisted ChangeResource rsrc,
|
@Assisted ChangeResource rsrc,
|
||||||
@Assisted Map<Account.Id, ChangeControl> reviewers,
|
@Assisted Set<Account.Id> reviewers,
|
||||||
@Assisted Collection<Address> reviewersByEmail,
|
@Assisted Collection<Address> reviewersByEmail,
|
||||||
@Assisted ReviewerState state,
|
@Assisted ReviewerState state,
|
||||||
@Assisted @Nullable NotifyHandling notify,
|
@Assisted @Nullable NotifyHandling notify,
|
||||||
@@ -153,9 +151,7 @@ public class PostReviewersOp implements BatchUpdateOp {
|
|||||||
if (migration.readChanges() && state == CC) {
|
if (migration.readChanges() && state == CC) {
|
||||||
addedCCs =
|
addedCCs =
|
||||||
approvalsUtil.addCcs(
|
approvalsUtil.addCcs(
|
||||||
ctx.getNotes(),
|
ctx.getNotes(), ctx.getUpdate(ctx.getChange().currentPatchSetId()), reviewers);
|
||||||
ctx.getUpdate(ctx.getChange().currentPatchSetId()),
|
|
||||||
reviewers.keySet());
|
|
||||||
if (addedCCs.isEmpty()) {
|
if (addedCCs.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -167,7 +163,7 @@ public class PostReviewersOp implements BatchUpdateOp {
|
|||||||
ctx.getUpdate(ctx.getChange().currentPatchSetId()),
|
ctx.getUpdate(ctx.getChange().currentPatchSetId()),
|
||||||
rsrc.getControl().getLabelTypes(),
|
rsrc.getControl().getLabelTypes(),
|
||||||
rsrc.getChange(),
|
rsrc.getChange(),
|
||||||
reviewers.keySet());
|
reviewers);
|
||||||
if (addedReviewers.isEmpty()) {
|
if (addedReviewers.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public class PutAssignee
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Addition addAssigneeAsCC(ChangeResource rsrc, String assignee)
|
private Addition addAssigneeAsCC(ChangeResource rsrc, String assignee)
|
||||||
throws OrmException, RestApiException, IOException {
|
throws OrmException, RestApiException, IOException, PermissionBackendException {
|
||||||
AddReviewerInput reviewerInput = new AddReviewerInput();
|
AddReviewerInput reviewerInput = new AddReviewerInput();
|
||||||
reviewerInput.reviewer = assignee;
|
reviewerInput.reviewer = assignee;
|
||||||
reviewerInput.state = ReviewerState.CC;
|
reviewerInput.state = ReviewerState.CC;
|
||||||
|
|||||||
@@ -69,15 +69,16 @@ public class ReviewerJson {
|
|||||||
throws OrmException, PermissionBackendException {
|
throws OrmException, PermissionBackendException {
|
||||||
List<ReviewerInfo> infos = Lists.newArrayListWithCapacity(rsrcs.size());
|
List<ReviewerInfo> infos = Lists.newArrayListWithCapacity(rsrcs.size());
|
||||||
AccountLoader loader = accountLoaderFactory.create(true);
|
AccountLoader loader = accountLoaderFactory.create(true);
|
||||||
|
ChangeData cd = null;
|
||||||
for (ReviewerResource rsrc : rsrcs) {
|
for (ReviewerResource rsrc : rsrcs) {
|
||||||
|
if (cd == null || !cd.getId().equals(rsrc.getChangeId())) {
|
||||||
|
cd = changeDataFactory.create(db.get(), rsrc.getControl().getNotes());
|
||||||
|
}
|
||||||
ReviewerInfo info =
|
ReviewerInfo info =
|
||||||
format(
|
format(
|
||||||
new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()),
|
new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()),
|
||||||
permissionBackend
|
permissionBackend.user(rsrc.getReviewerUser()).database(db).change(cd),
|
||||||
.user(rsrc.getReviewerUser())
|
cd);
|
||||||
.database(db)
|
|
||||||
.change(rsrc.getChangeResource().getNotes()),
|
|
||||||
rsrc.getReviewerControl());
|
|
||||||
loader.put(info);
|
loader.put(info);
|
||||||
infos.add(info);
|
infos.add(info);
|
||||||
}
|
}
|
||||||
@@ -90,29 +91,29 @@ public class ReviewerJson {
|
|||||||
return format(ImmutableList.<ReviewerResource>of(rsrc));
|
return format(ImmutableList.<ReviewerResource>of(rsrc));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReviewerInfo format(ReviewerInfo out, PermissionBackend.ForChange perm, ChangeControl ctl)
|
public ReviewerInfo format(ReviewerInfo out, PermissionBackend.ForChange perm, ChangeData cd)
|
||||||
throws OrmException, PermissionBackendException {
|
throws OrmException, PermissionBackendException {
|
||||||
PatchSet.Id psId = ctl.getChange().currentPatchSetId();
|
PatchSet.Id psId = cd.change().currentPatchSetId();
|
||||||
|
ChangeControl ctl = cd.changeControl().forUser(perm.user());
|
||||||
return format(
|
return format(
|
||||||
out,
|
out,
|
||||||
perm,
|
perm,
|
||||||
ctl,
|
cd,
|
||||||
approvalsUtil.byPatchSetUser(db.get(), ctl, psId, new Account.Id(out._accountId)));
|
approvalsUtil.byPatchSetUser(db.get(), ctl, psId, new Account.Id(out._accountId)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReviewerInfo format(
|
public ReviewerInfo format(
|
||||||
ReviewerInfo out,
|
ReviewerInfo out,
|
||||||
PermissionBackend.ForChange perm,
|
PermissionBackend.ForChange perm,
|
||||||
ChangeControl ctl,
|
ChangeData cd,
|
||||||
Iterable<PatchSetApproval> approvals)
|
Iterable<PatchSetApproval> approvals)
|
||||||
throws OrmException, PermissionBackendException {
|
throws OrmException, PermissionBackendException {
|
||||||
ChangeData cd = changeDataFactory.create(db.get(), ctl);
|
|
||||||
LabelTypes labelTypes = cd.getLabelTypes();
|
LabelTypes labelTypes = cd.getLabelTypes();
|
||||||
|
|
||||||
// Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167.
|
// Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167.
|
||||||
out.approvals = new TreeMap<>(labelTypes.nameComparator());
|
out.approvals = new TreeMap<>(labelTypes.nameComparator());
|
||||||
for (PatchSetApproval ca : approvals) {
|
for (PatchSetApproval ca : approvals) {
|
||||||
for (PermissionRange pr : ctl.getLabelRanges()) {
|
for (PermissionRange pr : cd.changeControl().getLabelRanges()) {
|
||||||
if (!pr.isEmpty()) {
|
if (!pr.isEmpty()) {
|
||||||
LabelType at = labelTypes.byLabel(ca.getLabelId());
|
LabelType at = labelTypes.byLabel(ca.getLabelId());
|
||||||
if (at != null) {
|
if (at != null) {
|
||||||
|
|||||||
@@ -220,11 +220,6 @@ public class ChangeControl {
|
|||||||
if (getChange().getStatus() == Change.Status.DRAFT && !isDraftVisible(db, cd)) {
|
if (getChange().getStatus() == Change.Status.DRAFT && !isDraftVisible(db, cd)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return isRefVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Can the user see this change? Does not account for draft status */
|
|
||||||
public boolean isRefVisible() {
|
|
||||||
return getRefControl().isVisible();
|
return getRefControl().isVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user