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.core.sensors; 021 022 import org.sonar.api.BatchExtension; 023 import org.sonar.api.database.model.User; 024 import org.sonar.api.notifications.Notification; 025 import org.sonar.api.notifications.NotificationManager; 026 import org.sonar.api.resources.Project; 027 import org.sonar.api.resources.Resource; 028 import org.sonar.api.security.UserFinder; 029 import org.sonar.core.review.ReviewDto; 030 031 import javax.annotation.Nullable; 032 033 public class ReviewNotifications implements BatchExtension { 034 private NotificationManager notificationManager; 035 private UserFinder userFinder; 036 037 public ReviewNotifications(NotificationManager notificationManager, UserFinder userFinder) { 038 this.notificationManager = notificationManager; 039 this.userFinder = userFinder; 040 } 041 042 void notifyReopened(ReviewDto review, Project project, Resource resource) { 043 Notification notification = createReviewNotification(review, project, resource) 044 .setFieldValue("old.status", review.getStatus()) 045 .setFieldValue("new.status", ReviewDto.STATUS_REOPENED) 046 .setFieldValue("old.resolution", review.getResolution()) 047 .setFieldValue("new.resolution", null); 048 notificationManager.scheduleForSending(notification); 049 } 050 051 void notifyClosed(ReviewDto review, Project project, @Nullable Resource resource) { 052 Notification notification = createReviewNotification(review, project, resource) 053 .setFieldValue("old.status", review.getStatus()) 054 .setFieldValue("new.status", ReviewDto.STATUS_CLOSED); 055 notificationManager.scheduleForSending(notification); 056 } 057 058 private Notification createReviewNotification(ReviewDto review, Project project, @Nullable Resource resource) { 059 return new Notification("review-changed") 060 .setFieldValue("reviewId", String.valueOf(review.getId())) 061 .setFieldValue("project", project.getRoot().getLongName()) 062 .setFieldValue("resource", resource != null ? resource.getLongName() : null) 063 .setFieldValue("title", review.getTitle()) 064 .setFieldValue("creator", getCreator(review)) 065 .setFieldValue("assignee", getAssignee(review)); 066 } 067 068 private @Nullable String getCreator(ReviewDto review) { 069 if (review.getUserId() == null) { // no creator and in fact this should never happen in real-life, however happens during unit tests 070 return null; 071 } 072 User user = userFinder.findById(review.getUserId()); 073 return user != null ? user.getLogin() : null; 074 } 075 076 private @Nullable String getAssignee(ReviewDto review) { 077 if (review.getAssigneeId() == null) { // not assigned 078 return null; 079 } 080 User user = userFinder.findById(review.getAssigneeId()); 081 return user != null ? user.getLogin() : null; 082 } 083 }