From 8d9eb9edf1ea931aabd94a4e6fe1cbe5343e93a3 Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Tue, 29 Jan 2013 17:37:57 +0100 Subject: [PATCH] SONAR-3959 Update NotifDispatchers to use new NotifManager method --- .../core/sensors/ReviewNotifications.java | 1 + .../alerts/AlertsOnMyFavouriteProject.java | 19 ++++-- .../NewViolationsOnMyFavouriteProject.java | 19 ++++-- ...ngesInReviewAssignedToMeOrCreatedByMe.java | 26 ++++++-- .../AlertsOnMyFavouriteProjectTest.java | 51 +++++++++++---- ...NewViolationsOnMyFavouriteProjectTest.java | 49 +++++++++++---- ...InReviewAssignedToMeOrCreatedByMeTest.java | 62 ++++++++++++++++--- .../DefaultNotificationManager.java | 3 +- .../DefaultNotificationManagerTest.java | 6 +- .../notifications/NotificationManager.java | 4 +- .../reviews/ReviewsNotificationManager.java | 10 +-- .../main/webapp/WEB-INF/app/models/review.rb | 1 + .../ReviewsNotificationManagerTest.java | 21 ++++--- 13 files changed, 207 insertions(+), 65 deletions(-) diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/ReviewNotifications.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/ReviewNotifications.java index 5122703ed7d..96a3a064e4b 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/ReviewNotifications.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/ReviewNotifications.java @@ -59,6 +59,7 @@ public class ReviewNotifications implements BatchExtension { return new Notification("review-changed") .setFieldValue("reviewId", String.valueOf(review.getId())) .setFieldValue("project", project.getRoot().getLongName()) + .setFieldValue("projectId", String.valueOf(project.getId())) .setFieldValue("resource", resource != null ? resource.getLongName() : null) .setFieldValue("title", review.getTitle()) .setFieldValue("creator", getCreator(review)) diff --git a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProject.java b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProject.java index 5b073afdd79..49c7da72e02 100644 --- a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProject.java +++ b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProject.java @@ -19,10 +19,14 @@ */ package org.sonar.plugins.emailnotifications.alerts; +import com.google.common.collect.Multimap; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; import org.sonar.core.properties.PropertiesDao; +import java.util.Collection; import java.util.List; /** @@ -32,19 +36,26 @@ import java.util.List; */ public class AlertsOnMyFavouriteProject extends NotificationDispatcher { + private NotificationManager notificationManager; private PropertiesDao propertiesDao; - public AlertsOnMyFavouriteProject(PropertiesDao propertiesDao) { + public AlertsOnMyFavouriteProject(NotificationManager notificationManager, PropertiesDao propertiesDao) { super("alerts"); + this.notificationManager = notificationManager; this.propertiesDao = propertiesDao; } @Override public void dispatch(Notification notification, Context context) { - Long projectId = Long.parseLong(notification.getFieldValue("projectId")); - List userLogins = propertiesDao.findUserIdsForFavouriteResource(projectId); + // "null" is passed as a 2nd argument because this dispatcher is not a per-project dispatcher + Multimap subscribedRecipients = notificationManager.findSubscribedRecipientsForDispatcher(this, null); + + List userLogins = propertiesDao.findUserIdsForFavouriteResource(Long.parseLong(notification.getFieldValue("projectId"))); for (String userLogin : userLogins) { - context.addUser(userLogin); + Collection channels = subscribedRecipients.get(userLogin); + for (NotificationChannel channel : channels) { + context.addUser(userLogin, channel); + } } } diff --git a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProject.java b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProject.java index cb101e4a023..1125bb02dee 100644 --- a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProject.java +++ b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProject.java @@ -19,10 +19,14 @@ */ package org.sonar.plugins.emailnotifications.newviolations; +import com.google.common.collect.Multimap; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; import org.sonar.core.properties.PropertiesDao; +import java.util.Collection; import java.util.List; /** @@ -32,19 +36,26 @@ import java.util.List; */ public class NewViolationsOnMyFavouriteProject extends NotificationDispatcher { + private NotificationManager notificationManager; private PropertiesDao propertiesDao; - public NewViolationsOnMyFavouriteProject(PropertiesDao propertiesDao) { + public NewViolationsOnMyFavouriteProject(NotificationManager notificationManager, PropertiesDao propertiesDao) { super("new-violations"); + this.notificationManager = notificationManager; this.propertiesDao = propertiesDao; } @Override public void dispatch(Notification notification, Context context) { - Long projectId = Long.parseLong(notification.getFieldValue("projectId")); - List userLogins = propertiesDao.findUserIdsForFavouriteResource(projectId); + // "null" is passed as a 2nd argument because this dispatcher is not a per-project dispatcher + Multimap subscribedRecipients = notificationManager.findSubscribedRecipientsForDispatcher(this, null); + + List userLogins = propertiesDao.findUserIdsForFavouriteResource(Long.parseLong(notification.getFieldValue("projectId"))); for (String userLogin : userLogins) { - context.addUser(userLogin); + Collection channels = subscribedRecipients.get(userLogin); + for (NotificationChannel channel : channels) { + context.addUser(userLogin, channel); + } } } diff --git a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMe.java b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMe.java index 582c21d7367..31b1952b1b3 100644 --- a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMe.java +++ b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMe.java @@ -19,9 +19,14 @@ */ package org.sonar.plugins.emailnotifications.reviews; +import com.google.common.collect.Multimap; import org.apache.commons.lang.StringUtils; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; + +import java.util.Collection; /** * This dispatcher means: "notify me when someone changes review assigned to me or created by me". @@ -30,24 +35,37 @@ import org.sonar.api.notifications.NotificationDispatcher; */ public class ChangesInReviewAssignedToMeOrCreatedByMe extends NotificationDispatcher { - public ChangesInReviewAssignedToMeOrCreatedByMe() { + private NotificationManager notificationManager; + + public ChangesInReviewAssignedToMeOrCreatedByMe(NotificationManager notificationManager) { super("review-changed"); + this.notificationManager = notificationManager; } @Override public void dispatch(Notification notification, Context context) { + int projectId = Integer.parseInt(notification.getFieldValue("projectId")); + Multimap subscribedRecipients = notificationManager.findSubscribedRecipientsForDispatcher(this, projectId); + String author = notification.getFieldValue("author"); String creator = notification.getFieldValue("creator"); String oldAssignee = notification.getFieldValue("old.assignee"); String assignee = notification.getFieldValue("assignee"); if (creator != null && !StringUtils.equals(author, creator)) { - context.addUser(creator); + addUserToContextIfSubscribed(context, creator, subscribedRecipients); } if (oldAssignee != null && !StringUtils.equals(author, oldAssignee)) { - context.addUser(oldAssignee); + addUserToContextIfSubscribed(context, oldAssignee, subscribedRecipients); } if (assignee != null && !StringUtils.equals(author, assignee)) { - context.addUser(assignee); + addUserToContextIfSubscribed(context, assignee, subscribedRecipients); + } + } + + private void addUserToContextIfSubscribed(Context context, String user, Multimap subscribedRecipients) { + Collection channels = subscribedRecipients.get(user); + for (NotificationChannel channel : channels) { + context.addUser(user, channel); } } diff --git a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProjectTest.java b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProjectTest.java index 7bf49f0c2ad..01887396b05 100644 --- a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProjectTest.java +++ b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/alerts/AlertsOnMyFavouriteProjectTest.java @@ -19,14 +19,20 @@ */ package org.sonar.plugins.emailnotifications.alerts; +import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; import org.sonar.core.properties.PropertiesDao; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -34,28 +40,49 @@ import static org.mockito.Mockito.when; public class AlertsOnMyFavouriteProjectTest { + @Mock + private NotificationManager notificationManager; + + @Mock + private PropertiesDao propertiesDao; + + @Mock + private NotificationDispatcher.Context context; + + @Mock + private NotificationChannel emailChannel; + + @Mock + private NotificationChannel twitterChannel; + + private AlertsOnMyFavouriteProject dispatcher; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + dispatcher = new AlertsOnMyFavouriteProject(notificationManager, propertiesDao); + } + @Test - public void shouldNotDispatchIfNotNewViolationsNotification() throws Exception { - NotificationDispatcher.Context context = mock(NotificationDispatcher.Context.class); - AlertsOnMyFavouriteProject dispatcher = new AlertsOnMyFavouriteProject(null); + public void shouldNotDispatchIfNotAlertsNotification() throws Exception { Notification notification = new Notification("other-notif"); dispatcher.performDispatch(notification, context); - verify(context, never()).addUser(any(String.class)); + verify(context, never()).addUser(any(String.class), any(NotificationChannel.class)); } @Test - public void shouldDispatchToUsersWhoHaveFlaggedProjectAsFavourite() { - NotificationDispatcher.Context context = mock(NotificationDispatcher.Context.class); - PropertiesDao propertiesDao = mock(PropertiesDao.class); - when(propertiesDao.findUserIdsForFavouriteResource(34L)).thenReturn(Lists.newArrayList("user1", "user2")); - AlertsOnMyFavouriteProject dispatcher = new AlertsOnMyFavouriteProject(propertiesDao); + public void shouldDispatchToUsersWhoHaveSubscribedAndFlaggedProjectAsFavourite() { + Multimap recipients = HashMultimap.create(); + recipients.put("user1", emailChannel); + recipients.put("user2", twitterChannel); + when(notificationManager.findSubscribedRecipientsForDispatcher(dispatcher, null)).thenReturn(recipients); + when(propertiesDao.findUserIdsForFavouriteResource(34L)).thenReturn(Lists.newArrayList("user2", "user3")); Notification notification = new Notification("alerts").setFieldValue("projectId", "34"); dispatcher.performDispatch(notification, context); - verify(context).addUser("user1"); - verify(context).addUser("user2"); + verify(context).addUser("user2", twitterChannel); verifyNoMoreInteractions(context); } diff --git a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProjectTest.java b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProjectTest.java index 4e8e66e002e..91de747a3e3 100644 --- a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProjectTest.java +++ b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/newviolations/NewViolationsOnMyFavouriteProjectTest.java @@ -19,14 +19,20 @@ */ package org.sonar.plugins.emailnotifications.newviolations; +import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; import org.sonar.core.properties.PropertiesDao; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -34,28 +40,49 @@ import static org.mockito.Mockito.when; public class NewViolationsOnMyFavouriteProjectTest { + @Mock + private NotificationManager notificationManager; + + @Mock + private PropertiesDao propertiesDao; + + @Mock + private NotificationDispatcher.Context context; + + @Mock + private NotificationChannel emailChannel; + + @Mock + private NotificationChannel twitterChannel; + + private NewViolationsOnMyFavouriteProject dispatcher; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + dispatcher = new NewViolationsOnMyFavouriteProject(notificationManager, propertiesDao); + } + @Test public void shouldNotDispatchIfNotNewViolationsNotification() throws Exception { - NotificationDispatcher.Context context = mock(NotificationDispatcher.Context.class); - NewViolationsOnMyFavouriteProject dispatcher = new NewViolationsOnMyFavouriteProject(null); Notification notification = new Notification("other-notif"); dispatcher.performDispatch(notification, context); - verify(context, never()).addUser(any(String.class)); + verify(context, never()).addUser(any(String.class), any(NotificationChannel.class)); } @Test - public void shouldDispatchToUsersWhoHaveFlaggedProjectAsFavourite() { - NotificationDispatcher.Context context = mock(NotificationDispatcher.Context.class); - PropertiesDao propertiesDao = mock(PropertiesDao.class); - when(propertiesDao.findUserIdsForFavouriteResource(34L)).thenReturn(Lists.newArrayList("user1", "user2")); - NewViolationsOnMyFavouriteProject dispatcher = new NewViolationsOnMyFavouriteProject(propertiesDao); + public void shouldDispatchToUsersWhoHaveSubscribedAndFlaggedProjectAsFavourite() { + Multimap recipients = HashMultimap.create(); + recipients.put("user1", emailChannel); + recipients.put("user2", twitterChannel); + when(notificationManager.findSubscribedRecipientsForDispatcher(dispatcher, null)).thenReturn(recipients); + when(propertiesDao.findUserIdsForFavouriteResource(34L)).thenReturn(Lists.newArrayList("user2", "user3")); Notification notification = new Notification("new-violations").setFieldValue("projectId", "34"); dispatcher.performDispatch(notification, context); - verify(context).addUser("user1"); - verify(context).addUser("user2"); + verify(context).addUser("user2", twitterChannel); verifyNoMoreInteractions(context); } diff --git a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMeTest.java b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMeTest.java index b0f89604bc4..a5b68352aa2 100644 --- a/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMeTest.java +++ b/plugins/sonar-email-notifications-plugin/src/test/java/org/sonar/plugins/emailnotifications/reviews/ChangesInReviewAssignedToMeOrCreatedByMeTest.java @@ -19,46 +19,90 @@ */ package org.sonar.plugins.emailnotifications.reviews; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.sonar.api.notifications.Notification; +import org.sonar.api.notifications.NotificationChannel; import org.sonar.api.notifications.NotificationDispatcher; +import org.sonar.api.notifications.NotificationManager; -import static org.mockito.Mockito.mock; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; public class ChangesInReviewAssignedToMeOrCreatedByMeTest { + @Mock + private NotificationManager notificationManager; + + @Mock private NotificationDispatcher.Context context; + + @Mock + private NotificationChannel emailChannel; + + @Mock + private NotificationChannel twitterChannel; + private ChangesInReviewAssignedToMeOrCreatedByMe dispatcher; @Before public void setUp() { - context = mock(NotificationDispatcher.Context.class); - dispatcher = new ChangesInReviewAssignedToMeOrCreatedByMe(); + MockitoAnnotations.initMocks(this); + + dispatcher = new ChangesInReviewAssignedToMeOrCreatedByMe(notificationManager); + } + + @Test + public void shouldNotDispatchIfNotNewViolationsNotification() throws Exception { + Notification notification = new Notification("other-notif"); + dispatcher.performDispatch(notification, context); + + verify(context, never()).addUser(any(String.class), any(NotificationChannel.class)); } @Test public void dispatchToCreatorAndAssignee() { + Multimap recipients = HashMultimap.create(); + recipients.put("simon", emailChannel); + recipients.put("freddy", twitterChannel); + recipients.put("godin", twitterChannel); + when(notificationManager.findSubscribedRecipientsForDispatcher(dispatcher, 42)).thenReturn(recipients); + Notification notification = new Notification("review-changed") + .setFieldValue("projectId", "42") .setFieldValue("author", "olivier") .setFieldValue("creator", "simon") .setFieldValue("old.assignee", "godin") .setFieldValue("assignee", "freddy"); dispatcher.performDispatch(notification, context); - verify(context).addUser("simon"); - verify(context).addUser("godin"); - verify(context).addUser("freddy"); + verify(context).addUser("simon", emailChannel); + verify(context).addUser("freddy", twitterChannel); + verify(context).addUser("godin", twitterChannel); verifyNoMoreInteractions(context); } @Test public void doNotDispatchToAuthorOfChanges() { - dispatcher.performDispatch(new Notification("review-changed").setFieldValue("author", "simon").setFieldValue("creator", "simon"), context); - dispatcher.performDispatch(new Notification("review-changed").setFieldValue("author", "simon").setFieldValue("assignee", "simon"), context); - dispatcher.performDispatch(new Notification("review-changed").setFieldValue("author", "simon").setFieldValue("old.assignee", "simon"), context); + Multimap recipients = HashMultimap.create(); + recipients.put("simon", emailChannel); + recipients.put("freddy", twitterChannel); + recipients.put("godin", twitterChannel); + when(notificationManager.findSubscribedRecipientsForDispatcher(dispatcher, 42)).thenReturn(recipients); + + dispatcher.performDispatch(new Notification("review-changed").setFieldValue("projectId", "42") + .setFieldValue("author", "simon").setFieldValue("creator", "simon"), context); + dispatcher.performDispatch(new Notification("review-changed").setFieldValue("projectId", "42") + .setFieldValue("author", "simon").setFieldValue("assignee", "simon"), context); + dispatcher.performDispatch(new Notification("review-changed").setFieldValue("projectId", "42") + .setFieldValue("author", "simon").setFieldValue("old.assignee", "simon"), context); verifyNoMoreInteractions(context); } diff --git a/sonar-core/src/main/java/org/sonar/core/notification/DefaultNotificationManager.java b/sonar-core/src/main/java/org/sonar/core/notification/DefaultNotificationManager.java index e7bf3d62ebb..49a276f2614 100644 --- a/sonar-core/src/main/java/org/sonar/core/notification/DefaultNotificationManager.java +++ b/sonar-core/src/main/java/org/sonar/core/notification/DefaultNotificationManager.java @@ -20,6 +20,7 @@ package org.sonar.core.notification; import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.google.common.collect.SetMultimap; import org.sonar.api.database.DatabaseSession; import org.sonar.api.notifications.Notification; @@ -102,7 +103,7 @@ public class DefaultNotificationManager implements NotificationManager { /** * {@inheritDoc} */ - public SetMultimap findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, Integer resourceId) { + public Multimap findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, Integer resourceId) { String dispatcherKey = dispatcher.getKey(); SetMultimap recipients = HashMultimap.create(); diff --git a/sonar-core/src/test/java/org/sonar/core/notification/DefaultNotificationManagerTest.java b/sonar-core/src/test/java/org/sonar/core/notification/DefaultNotificationManagerTest.java index 75a7b5f9d5b..242173b961f 100644 --- a/sonar-core/src/test/java/org/sonar/core/notification/DefaultNotificationManagerTest.java +++ b/sonar-core/src/test/java/org/sonar/core/notification/DefaultNotificationManagerTest.java @@ -20,7 +20,7 @@ package org.sonar.core.notification; import com.google.common.collect.Lists; -import com.google.common.collect.SetMultimap; +import com.google.common.collect.Multimap; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -98,7 +98,7 @@ public class DefaultNotificationManagerTest extends AbstractDbUnitTestCase { when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", null)).thenReturn(Lists.newArrayList("user3")); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", null)).thenReturn(Lists.newArrayList("user4")); - SetMultimap multiMap = manager.findSubscribedRecipientsForDispatcher(dispatcher, 45); + Multimap multiMap = manager.findSubscribedRecipientsForDispatcher(dispatcher, 45); assertThat(multiMap.entries()).hasSize(4); Map> map = multiMap.asMap(); @@ -116,7 +116,7 @@ public class DefaultNotificationManagerTest extends AbstractDbUnitTestCase { when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", null)).thenReturn(Lists.newArrayList("user3")); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", null)).thenReturn(Lists.newArrayList("user4")); - SetMultimap multiMap = manager.findSubscribedRecipientsForDispatcher(dispatcher, null); + Multimap multiMap = manager.findSubscribedRecipientsForDispatcher(dispatcher, null); assertThat(multiMap.entries()).hasSize(3); Map> map = multiMap.asMap(); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/notifications/NotificationManager.java b/sonar-plugin-api/src/main/java/org/sonar/api/notifications/NotificationManager.java index f03dd9b68e5..e2b3c43231d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/notifications/NotificationManager.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/notifications/NotificationManager.java @@ -19,7 +19,7 @@ */ package org.sonar.api.notifications; -import com.google.common.collect.SetMultimap; +import com.google.common.collect.Multimap; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; @@ -58,6 +58,6 @@ public interface NotificationManager extends ServerComponent, BatchComponent { * @param resourceId the optional resource which is concerned by this request * @return the list of user login along with the subscribed channels */ - SetMultimap findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, @Nullable Integer resourceId); + Multimap findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, @Nullable Integer resourceId); } diff --git a/sonar-server/src/main/java/org/sonar/server/notifications/reviews/ReviewsNotificationManager.java b/sonar-server/src/main/java/org/sonar/server/notifications/reviews/ReviewsNotificationManager.java index f40c92c05df..fc3e898ce8a 100644 --- a/sonar-server/src/main/java/org/sonar/server/notifications/reviews/ReviewsNotificationManager.java +++ b/sonar-server/src/main/java/org/sonar/server/notifications/reviews/ReviewsNotificationManager.java @@ -19,15 +19,14 @@ */ package org.sonar.server.notifications.reviews; -import java.util.Map; -import java.util.Set; - +import com.google.common.collect.Sets; import org.apache.commons.lang.StringUtils; import org.sonar.api.ServerComponent; import org.sonar.api.notifications.Notification; import org.sonar.api.notifications.NotificationManager; -import com.google.common.collect.Sets; +import java.util.Map; +import java.util.Set; /** * @since 2.10 @@ -50,6 +49,7 @@ public class ReviewsNotificationManager implements ServerComponent { Notification notification = new Notification("review-changed") .setFieldValue("reviewId", String.valueOf(reviewId)) .setFieldValue("project", newValues.get("project")) + .setFieldValue("projectId", newValues.get("projectId")) .setFieldValue("resource", newValues.get("resource")) .setFieldValue("title", newValues.get("title")) .setFieldValue("author", author) @@ -62,7 +62,7 @@ public class ReviewsNotificationManager implements ServerComponent { for (String field : fields) { String oldValue = oldValues.get(field); String newValue = newValues.get(field); - if ( !StringUtils.equals(oldValue, newValue)) { + if (!StringUtils.equals(oldValue, newValue)) { notification.setFieldValue("new." + field, newValue); notification.setFieldValue("old." + field, oldValue); } diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb index 20e38d3010f..26df00de9f6 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb @@ -127,6 +127,7 @@ class Review < ActiveRecord::Base java.util.HashMap.new( { "project" => project.long_name.to_java, + "projectId" => project.id.to_s.to_java, "resource" => resource.long_name.to_java, "title" => title.to_java, "creator" => user == nil ? nil : user.login.to_java, diff --git a/sonar-server/src/test/java/org/sonar/server/notifications/reviews/ReviewsNotificationManagerTest.java b/sonar-server/src/test/java/org/sonar/server/notifications/reviews/ReviewsNotificationManagerTest.java index f2b2cc8a5e3..45918e78826 100644 --- a/sonar-server/src/test/java/org/sonar/server/notifications/reviews/ReviewsNotificationManagerTest.java +++ b/sonar-server/src/test/java/org/sonar/server/notifications/reviews/ReviewsNotificationManagerTest.java @@ -19,15 +19,7 @@ */ package org.sonar.server.notifications.reviews; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; - -import java.util.Map; - +import com.google.common.collect.Maps; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -35,7 +27,14 @@ import org.mockito.stubbing.Answer; import org.sonar.api.notifications.Notification; import org.sonar.api.notifications.NotificationManager; -import com.google.common.collect.Maps; +import java.util.Map; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; public class ReviewsNotificationManagerTest { @@ -59,6 +58,7 @@ public class ReviewsNotificationManagerTest { Map oldValues = Maps.newHashMap(); Map newValues = Maps.newHashMap(); newValues.put("project", "Sonar"); + newValues.put("projectId", "42"); newValues.put("resource", "org.sonar.server.ui.DefaultPages"); newValues.put("title", "Utility classes should not have a public or default constructor."); newValues.put("creator", "olivier"); @@ -70,6 +70,7 @@ public class ReviewsNotificationManagerTest { assertThat(notification.getFieldValue("reviewId"), is("1")); assertThat(notification.getFieldValue("author"), is("freddy")); assertThat(notification.getFieldValue("project"), is("Sonar")); + assertThat(notification.getFieldValue("projectId"), is("42")); assertThat(notification.getFieldValue("resource"), is("org.sonar.server.ui.DefaultPages")); assertThat(notification.getFieldValue("title"), is("Utility classes should not have a public or default constructor.")); assertThat(notification.getFieldValue("creator"), is("olivier")); -- 2.39.5