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    }