From: Julien Lancelot Date: Mon, 1 Jul 2013 07:26:01 +0000 (+0200) Subject: SONAR-3714 Execute issue update only once per issue and not once per issue per action X-Git-Tag: 3.7~287 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d068651faaeb9f30a39cc23eec8bce710c92fd26;p=sonarqube.git SONAR-3714 Execute issue update only once per issue and not once per issue per action --- diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeResult.java b/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeResult.java index 67d764ae042..d401c0ed598 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeResult.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeResult.java @@ -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 issuesChanged = newArrayList(); - private List issuesNotChanged = newArrayList(); + private Set issuesChanged = newHashSet(); + private Set issuesNotChanged = newHashSet(); public void addIssueChanged(Issue issue){ this.issuesChanged.add(issue); @@ -39,11 +40,11 @@ public class IssueBulkChangeResult { this.issuesNotChanged.add(issue); } - public List issuesChanged() { + public Collection issuesChanged() { return issuesChanged; } - public List issuesNotChanged() { + public Collection issuesNotChanged() { return issuesNotChanged; } } diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java b/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java index 586280b143e..cc23710a2c6 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java @@ -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; } diff --git a/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java index afc79fa4902..0d42dc13c8c 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java @@ -57,6 +57,7 @@ public class IssueBulkChangeServiceTest { private IssueBulkChangeService service; private Action action = mock(Action.class); + private List 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 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 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 properties = newHashMap();