001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2012 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.plugins.emailnotifications.reviews; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.sonar.api.database.model.User; 024 import org.sonar.api.notifications.Notification; 025 import org.sonar.api.security.UserFinder; 026 import org.sonar.plugins.emailnotifications.EmailConfiguration; 027 import org.sonar.plugins.emailnotifications.api.EmailMessage; 028 import org.sonar.plugins.emailnotifications.api.EmailTemplate; 029 030 /** 031 * Creates email message for notification "review-changed". 032 * 033 * @since 2.10 034 */ 035 public class ReviewEmailTemplate extends EmailTemplate { 036 037 private EmailConfiguration configuration; 038 private UserFinder userFinder; 039 040 public ReviewEmailTemplate(EmailConfiguration configuration, UserFinder userFinder) { 041 this.configuration = configuration; 042 this.userFinder = userFinder; 043 } 044 045 @Override 046 public EmailMessage format(Notification notification) { 047 if (!"review-changed".equals(notification.getType())) { 048 return null; 049 } 050 String reviewId = notification.getFieldValue("reviewId"); 051 String author = notification.getFieldValue("author"); 052 StringBuilder sb = new StringBuilder(); 053 054 append(sb, "Project", null, notification.getFieldValue("project")); 055 append(sb, "Resource", null, notification.getFieldValue("resource")); 056 sb.append('\n'); 057 append(sb, null, null, notification.getFieldValue("title")); 058 sb.append('\n'); 059 append(sb, "Status", notification.getFieldValue("old.status"), notification.getFieldValue("new.status")); 060 append(sb, "Resolution", notification.getFieldValue("old.resolution"), notification.getFieldValue("new.resolution")); 061 append(sb, "Assignee", getUserFullName(notification.getFieldValue("old.assignee")), getUserFullName(notification.getFieldValue("new.assignee"))); 062 appendComment(sb, notification); 063 appendFooter(sb, notification); 064 065 EmailMessage message = new EmailMessage() 066 .setMessageId("review/" + reviewId) 067 .setSubject("Review #" + reviewId) 068 .setMessage(sb.toString()); 069 if (author != null) { 070 message.setFrom(getUserFullName(author)); 071 } 072 return message; 073 } 074 075 private void append(StringBuilder sb, String name, String oldValue, String newValue) { 076 if (oldValue != null || newValue != null) { 077 if (name != null) { 078 sb.append(name).append(": "); 079 } 080 if (newValue != null) { 081 sb.append(newValue); 082 } 083 if (oldValue != null) { 084 sb.append(" (was ").append(oldValue).append(")"); 085 } 086 sb.append('\n'); 087 } 088 } 089 090 private void appendComment(StringBuilder sb, Notification notification) { 091 String newComment = notification.getFieldValue("new.comment"); 092 String oldComment = notification.getFieldValue("old.comment"); 093 094 if (newComment != null) { // comment was added or modified 095 sb.append("Comment:\n ").append(newComment).append('\n'); 096 if (oldComment != null) { // comment was modified 097 sb.append("Was:\n ").append(oldComment).append('\n'); 098 } 099 } else if (oldComment != null) { // comment was deleted 100 sb.append("Comment deleted, was:\n ").append(oldComment).append('\n'); 101 } 102 } 103 104 private void appendFooter(StringBuilder sb, Notification notification) { 105 String reviewId = notification.getFieldValue("reviewId"); 106 sb.append("\n") 107 .append("See it in Sonar: ").append(configuration.getServerBaseURL()).append("/reviews/view/").append(reviewId).append('\n'); 108 } 109 110 /** 111 * Visibility has been relaxed for tests. 112 */ 113 String getUserFullName(String login) { 114 if (login == null) { 115 return null; 116 } 117 User user = userFinder.findByLogin(login); 118 if (user == null) { // most probably user was deleted 119 return login; 120 } 121 return StringUtils.defaultIfBlank(user.getName(), login); 122 } 123 124 }