Line data Source code
1 : // Copyright (C) 2017 The Android Open Source Project 2 : // 3 : // Licensed under the Apache License, Version 2.0 (the "License"); 4 : // you may not use this file except in compliance with the License. 5 : // You may obtain a copy of the License at 6 : // 7 : // http://www.apache.org/licenses/LICENSE-2.0 8 : // 9 : // Unless required by applicable law or agreed to in writing, software 10 : // distributed under the License is distributed on an "AS IS" BASIS, 11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : // See the License for the specific language governing permissions and 13 : // limitations under the License. 14 : 15 : package com.google.gerrit.server.change; 16 : 17 : import com.google.common.flogger.FluentLogger; 18 : import com.google.gerrit.entities.Address; 19 : import com.google.gerrit.entities.Change; 20 : import com.google.gerrit.entities.PatchSet; 21 : import com.google.gerrit.server.ChangeMessagesUtil; 22 : import com.google.gerrit.server.mail.send.DeleteReviewerSender; 23 : import com.google.gerrit.server.mail.send.MessageIdGenerator; 24 : import com.google.gerrit.server.notedb.ChangeUpdate; 25 : import com.google.gerrit.server.update.ChangeContext; 26 : import com.google.gerrit.server.update.PostUpdateContext; 27 : import com.google.inject.Inject; 28 : import com.google.inject.assistedinject.Assisted; 29 : import java.util.Collections; 30 : 31 : public class DeleteReviewerByEmailOp extends ReviewerOp { 32 7 : private static final FluentLogger logger = FluentLogger.forEnclosingClass(); 33 : 34 : public interface Factory { 35 : DeleteReviewerByEmailOp create(Address reviewer); 36 : } 37 : 38 : private final DeleteReviewerSender.Factory deleteReviewerSenderFactory; 39 : private final MessageIdGenerator messageIdGenerator; 40 : private final ChangeMessagesUtil changeMessagesUtil; 41 : 42 : private final Address reviewer; 43 : private String mailMessage; 44 : private Change change; 45 : 46 : @Inject 47 : DeleteReviewerByEmailOp( 48 : DeleteReviewerSender.Factory deleteReviewerSenderFactory, 49 : MessageIdGenerator messageIdGenerator, 50 : ChangeMessagesUtil changeMessagesUtil, 51 7 : @Assisted Address reviewer) { 52 7 : this.deleteReviewerSenderFactory = deleteReviewerSenderFactory; 53 7 : this.messageIdGenerator = messageIdGenerator; 54 7 : this.changeMessagesUtil = changeMessagesUtil; 55 7 : this.reviewer = reviewer; 56 7 : } 57 : 58 : @Override 59 : public boolean updateChange(ChangeContext ctx) { 60 7 : change = ctx.getChange(); 61 7 : PatchSet.Id psId = ctx.getChange().currentPatchSetId(); 62 7 : ChangeUpdate update = ctx.getUpdate(psId); 63 7 : update.removeReviewerByEmail(reviewer); 64 : // The reviewer is not a registered Gerrit user, thus the email address can be used in 65 : // ChangeMessage without replacement (it does not classify as Gerrit user identifiable 66 : // information). 67 7 : String msg = "Removed reviewer " + reviewer; 68 7 : mailMessage = 69 7 : changeMessagesUtil.setChangeMessage(ctx, msg, ChangeMessagesUtil.TAG_DELETE_REVIEWER); 70 7 : return true; 71 : } 72 : 73 : @Override 74 : public void postUpdate(PostUpdateContext ctx) { 75 7 : opResult = Result.builder().setDeletedReviewerByEmail(reviewer).build(); 76 7 : if (sendEmail) { 77 : try { 78 7 : NotifyResolver.Result notify = ctx.getNotify(change.getId()); 79 7 : if (!notify.shouldNotify()) { 80 6 : return; 81 : } 82 2 : DeleteReviewerSender emailSender = 83 2 : deleteReviewerSenderFactory.create(ctx.getProject(), change.getId()); 84 2 : emailSender.setFrom(ctx.getAccountId()); 85 2 : emailSender.addReviewersByEmail(Collections.singleton(reviewer)); 86 2 : emailSender.setChangeMessage(mailMessage, ctx.getWhen()); 87 2 : emailSender.setNotify(notify); 88 2 : emailSender.setMessageId( 89 2 : messageIdGenerator.fromChangeUpdate(ctx.getRepoView(), change.currentPatchSetId())); 90 2 : emailSender.send(); 91 0 : } catch (Exception err) { 92 0 : logger.atSevere().withCause(err).log("Cannot email update for change %s", change.getId()); 93 2 : } 94 : } 95 2 : } 96 : }