diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java new file mode 100644 index 0000000000..f22c6e4024 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java @@ -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); + } + } +} |