diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/patch/RemoveReviewer.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/patch/RemoveReviewer.java | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/RemoveReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/RemoveReviewer.java new file mode 100644 index 0000000000..af9bb8c230 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/RemoveReviewer.java @@ -0,0 +1,130 @@ +// Copyright (C) 2009 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.patch; + +import com.google.gerrit.common.data.ReviewerResult; +import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.PatchSetApproval; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.account.AccountCache; +import com.google.gerrit.server.account.AccountState; +import com.google.gerrit.server.project.ChangeControl; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; + +public class RemoveReviewer implements Callable<ReviewerResult> { + private static final Logger log = + LoggerFactory.getLogger(RemoveReviewer.class); + + public interface Factory { + RemoveReviewer create(Change.Id changeId, Set<Account.Id> reviewerId); + } + + private final ChangeControl.Factory changeControlFactory; + private final ReviewDb db; + private final AccountCache accountCache; + private final Change.Id changeId; + private final Set<Account.Id> ids; + + @Inject + RemoveReviewer(ReviewDb db, ChangeControl.Factory changeControlFactory, + AccountCache accountCache, @Assisted Change.Id changeId, + @Assisted Set<Account.Id> ids) { + this.db = db; + this.changeControlFactory = changeControlFactory; + this.accountCache = accountCache; + this.changeId = changeId; + this.ids = ids; + } + + @Override + public ReviewerResult call() throws Exception { + ReviewerResult result = new ReviewerResult(); + ChangeControl ctl = changeControlFactory.validateFor(changeId); + Set<Account.Id> rejected = new HashSet<Account.Id>(); + + List<PatchSetApproval> current = db.patchSetApprovals().byChange(changeId).toList(); + for (PatchSetApproval psa : current) { + Account.Id who = psa.getAccountId(); + if (ids.contains(who) && !ctl.canRemoveReviewer(psa) && rejected.add(who)) { + result.addError(new ReviewerResult.Error( + ReviewerResult.Error.Type.REMOVE_NOT_PERMITTED, + formatUser(who))); + } + } + + List<PatchSetApproval> toDelete = new ArrayList<PatchSetApproval>(); + for (PatchSetApproval psa : current) { + Account.Id who = psa.getAccountId(); + if (ids.contains(who) && !rejected.contains(who)) { + toDelete.add(psa); + } + } + + try { + db.patchSetApprovals().delete(toDelete); + } catch (OrmException err) { + log.warn("Cannot remove reviewers from change "+changeId, err); + Set<Account.Id> failed = new HashSet<Account.Id>(); + for (PatchSetApproval psa : toDelete) { + failed.add(psa.getAccountId()); + } + for (Account.Id who : failed) { + result.addError(new ReviewerResult.Error( + ReviewerResult.Error.Type.COULD_NOT_REMOVE, + formatUser(who))); + } + } + + return result; + } + + private String formatUser(Account.Id who) { + AccountState state = accountCache.get(who); + if (state != null) { + return formatUser(state.getAccount(), who); + } else { + return who.toString(); + } + } + + static String formatUser(Account a, Object fallback) { + if (a.getFullName() != null && !a.getFullName().isEmpty()) { + return a.getFullName(); + } + + if (a.getPreferredEmail() != null && !a.getPreferredEmail().isEmpty()) { + return a.getPreferredEmail(); + } + + if (a.getUserName() != null && a.getUserName().isEmpty()) { + return a.getUserName(); + } + + return fallback.toString(); + } +} |