]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3714 Execute issue update only once per issue and not once per issue per action
authorJulien Lancelot <julien.lancelot@gmail.com>
Mon, 1 Jul 2013 07:26:01 +0000 (09:26 +0200)
committerJulien Lancelot <julien.lancelot@gmail.com>
Tue, 2 Jul 2013 15:08:08 +0000 (17:08 +0200)
sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeResult.java
sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java
sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java

index 67d764ae0423fe65c7a371212d9f39e4798916b5..d401c0ed59870dc9b8397feb43fd39944ec17d7c 100644 (file)
@@ -22,14 +22,15 @@ package org.sonar.server.issue;
 
 import org.sonar.api.issue.Issue;
 
-import java.util.List;
+import java.util.Collection;
+import java.util.Set;
 
-import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Sets.newHashSet;
 
 public class IssueBulkChangeResult {
 
-  private List<Issue> issuesChanged = newArrayList();
-  private List<Issue> issuesNotChanged = newArrayList();
+  private Set<Issue> issuesChanged = newHashSet();
+  private Set<Issue> issuesNotChanged = newHashSet();
 
   public void addIssueChanged(Issue issue){
     this.issuesChanged.add(issue);
@@ -39,11 +40,11 @@ public class IssueBulkChangeResult {
     this.issuesNotChanged.add(issue);
   }
 
-  public List<Issue> issuesChanged() {
+  public Collection<Issue> issuesChanged() {
     return issuesChanged;
   }
 
-  public List<Issue> issuesNotChanged() {
+  public Collection<Issue> issuesNotChanged() {
     return issuesNotChanged;
   }
 }
index 586280b143e3455e42a4504a4ccac0d6d61915e6..cc23710a2c662124ea83e07f3e65f5040f61b4bc 100644 (file)
@@ -35,6 +35,7 @@ import org.sonar.core.issue.db.IssueStorage;
 import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
+
 import java.util.Date;
 import java.util.List;
 
@@ -75,12 +76,10 @@ public class IssueBulkChangeService {
 
     IssueChangeContext issueChangeContext = IssueChangeContext.createUser(new Date(), userSession.login());
     for (Issue issue : issues) {
+      ActionContext actionContext = new ActionContext(issue, issueChangeContext);
       for (Action action : bulkActions) {
         try {
-          ActionContext actionContext = new ActionContext(issue, issueChangeContext);
           if (action.supports(issue) && action.execute(issueBulkChangeQuery.properties(action.key()), actionContext)) {
-            issueStorage.save((DefaultIssue) issue);
-            issueNotifications.sendChanges((DefaultIssue) issue, issueChangeContext, issueQueryResult);
             result.addIssueChanged(issue);
           } else {
             result.addIssueNotChanged(issue);
@@ -90,6 +89,10 @@ public class IssueBulkChangeService {
           LOG.info("An error occur when trying to apply the action : "+ action.key() + " on issue : "+ issue.key() + ". This issue has been ignored.", e);
         }
       }
+      if (result.issuesChanged().contains(issue)) {
+        issueStorage.save((DefaultIssue) issue);
+        issueNotifications.sendChanges((DefaultIssue) issue, issueChangeContext, issueQueryResult);
+      }
     }
     return result;
   }
index afc79fa4902433be8a9d141f4ba10f2cd2038eb4..0d42dc13c8c92a9ee976b2f85bf8fd143d933546 100644 (file)
@@ -57,6 +57,7 @@ public class IssueBulkChangeServiceTest {
   private IssueBulkChangeService service;
 
   private Action action = mock(Action.class);
+  private List<Action> actions;
 
   @Before
   public void before() {
@@ -67,9 +68,8 @@ public class IssueBulkChangeServiceTest {
     when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
     when(issueQueryResult.issues()).thenReturn(newArrayList((Issue) issue));
 
+    actions = newArrayList();
     when(action.key()).thenReturn("assign");
-
-    List<Action> actions = newArrayList();
     actions.add(action);
 
     service = new IssueBulkChangeService(finder, issueStorage, issueNotifications, actions);
@@ -97,6 +97,37 @@ public class IssueBulkChangeServiceTest {
     verifyNoMoreInteractions(issueNotifications);
   }
 
+  @Test
+  public void should_do_sve_once_per_issue() {
+    Map<String, Object> properties = newHashMap();
+    properties.put("issues", "ABCD");
+    properties.put("actions", "assign,set_severity");
+    properties.put("assign.assignee", "fred");
+    properties.put("set_severity.severity", "MINOR");
+
+    Action setSeverityAction = mock(Action.class);
+    when(setSeverityAction.key()).thenReturn("set_severity");
+    actions.add(setSeverityAction);
+
+    when(action.supports(any(Issue.class))).thenReturn(true);
+    when(action.execute(anyMap(), any(IssueBulkChangeService.ActionContext.class))).thenReturn(true);
+    when(action.execute(eq(properties), any(IssueBulkChangeService.ActionContext.class))).thenReturn(true);
+
+    when(setSeverityAction.supports(any(Issue.class))).thenReturn(true);
+    when(setSeverityAction.execute(anyMap(), any(IssueBulkChangeService.ActionContext.class))).thenReturn(true);
+    when(setSeverityAction.execute(eq(properties), any(IssueBulkChangeService.ActionContext.class))).thenReturn(true);
+
+    IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(properties);
+    IssueBulkChangeResult result = service.execute(issueBulkChangeQuery, userSession);
+    assertThat(result.issuesChanged()).hasSize(1);
+    assertThat(result.issuesNotChanged()).isEmpty();
+
+    verify(issueStorage, times(1)).save(eq(issue));
+    verifyNoMoreInteractions(issueStorage);
+    verify(issueNotifications, times(1)).sendChanges(eq(issue), any(IssueChangeContext.class), eq(issueQueryResult));
+    verifyNoMoreInteractions(issueNotifications);
+  }
+
   @Test
   public void should_load_issues_from_issue_keys_with_maximum_page_size() {
     Map<String, Object> properties = newHashMap();