Make calculation of mail recipients for new changes/patchsets reusable
The code to calculate the recipients for notification mails on upload of a new change and patch set was very similar. Move the code into a util class so that the same code can be reused from both places. Having it in a util class allows further reuse from other places and also makes the ReceiveCommits class a little leaner. Change-Id: I20cb011b7b1f8a7194a362464426eb577a524bff Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
committed by
David Pursehouse
parent
fc416956d2
commit
986f2cbe96
@@ -0,0 +1,131 @@
|
||||
// Copyright (C) 2013 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.mail;
|
||||
|
||||
import com.google.gerrit.common.errors.NoSuchAccountException;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
||||
import com.google.gerrit.server.account.AccountResolver;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
|
||||
import org.eclipse.jgit.revwalk.FooterKey;
|
||||
import org.eclipse.jgit.revwalk.FooterLine;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class MailUtil {
|
||||
private static final FooterKey REVIEWED_BY = new FooterKey("Reviewed-by");
|
||||
private static final FooterKey TESTED_BY = new FooterKey("Tested-by");
|
||||
|
||||
public static MailRecipients getRecipientsFromFooters(
|
||||
final AccountResolver accountResolver, final PatchSet ps,
|
||||
final List<FooterLine> footerLines) throws OrmException {
|
||||
final MailRecipients recipients = new MailRecipients();
|
||||
if (!ps.isDraft()) {
|
||||
for (final FooterLine footerLine : footerLines) {
|
||||
try {
|
||||
if (isReviewer(footerLine)) {
|
||||
recipients.reviewers.add(toAccountId(accountResolver, footerLine
|
||||
.getValue().trim()));
|
||||
} else if (footerLine.matches(FooterKey.CC)) {
|
||||
recipients.cc.add(toAccountId(accountResolver, footerLine
|
||||
.getValue().trim()));
|
||||
}
|
||||
} catch (NoSuchAccountException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return recipients;
|
||||
}
|
||||
|
||||
public static MailRecipients getRecipientsFromApprovals(
|
||||
final List<PatchSetApproval> approvals) {
|
||||
final MailRecipients recipients = new MailRecipients();
|
||||
for (PatchSetApproval a : approvals) {
|
||||
if (a.getValue() != 0) {
|
||||
recipients.reviewers.add(a.getAccountId());
|
||||
} else {
|
||||
recipients.cc.add(a.getAccountId());
|
||||
}
|
||||
}
|
||||
return recipients;
|
||||
}
|
||||
|
||||
private static Account.Id toAccountId(final AccountResolver accountResolver,
|
||||
final String nameOrEmail) throws OrmException, NoSuchAccountException {
|
||||
final Account a = accountResolver.findByNameOrEmail(nameOrEmail);
|
||||
if (a == null) {
|
||||
throw new NoSuchAccountException("\"" + nameOrEmail
|
||||
+ "\" is not registered");
|
||||
}
|
||||
return a.getId();
|
||||
}
|
||||
|
||||
private static boolean isReviewer(final FooterLine candidateFooterLine) {
|
||||
return candidateFooterLine.matches(FooterKey.SIGNED_OFF_BY)
|
||||
|| candidateFooterLine.matches(FooterKey.ACKED_BY)
|
||||
|| candidateFooterLine.matches(REVIEWED_BY)
|
||||
|| candidateFooterLine.matches(TESTED_BY);
|
||||
}
|
||||
|
||||
public static class MailRecipients {
|
||||
private final Set<Account.Id> reviewers;
|
||||
private final Set<Account.Id> cc;
|
||||
|
||||
public MailRecipients() {
|
||||
this.reviewers = new HashSet<Account.Id>();
|
||||
this.cc = new HashSet<Account.Id>();
|
||||
}
|
||||
|
||||
public MailRecipients(final Set<Account.Id> reviewers,
|
||||
final Set<Account.Id> cc) {
|
||||
this.reviewers = new HashSet<Account.Id>(reviewers);
|
||||
this.cc = new HashSet<Account.Id>(cc);
|
||||
}
|
||||
|
||||
public void add(final MailRecipients recipients) {
|
||||
reviewers.addAll(recipients.reviewers);
|
||||
cc.addAll(recipients.cc);
|
||||
}
|
||||
|
||||
public void remove(final Account.Id toRemove) {
|
||||
reviewers.remove(toRemove);
|
||||
cc.remove(toRemove);
|
||||
}
|
||||
|
||||
public Set<Account.Id> getReviewers() {
|
||||
return Collections.unmodifiableSet(reviewers);
|
||||
}
|
||||
|
||||
public Set<Account.Id> getCcOnly() {
|
||||
final Set<Account.Id> cc = new HashSet<Account.Id>(this.cc);
|
||||
cc.removeAll(reviewers);
|
||||
return Collections.unmodifiableSet(cc);
|
||||
}
|
||||
|
||||
public Set<Account.Id> getAll() {
|
||||
final Set<Account.Id> all =
|
||||
new HashSet<Account.Id>(reviewers.size() + cc.size());
|
||||
all.addAll(reviewers);
|
||||
all.addAll(cc);
|
||||
return Collections.unmodifiableSet(all);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user