diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2013-05-24 09:53:45 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2013-05-24 09:53:59 +0200 |
commit | 71981f0e621b12b7e82ed3d149a28be1ddb5180e (patch) | |
tree | dea5633be3aae4acc9ed25231aa5c001e37f5f5b /sonar-core | |
parent | d969077cf266597edd11d0b36714a03081873816 (diff) | |
download | sonarqube-71981f0e621b12b7e82ed3d149a28be1ddb5180e.tar.gz sonarqube-71981f0e621b12b7e82ed3d149a28be1ddb5180e.zip |
SONAR-4286 remove the assignee when resolving as false-positive
Diffstat (limited to 'sonar-core')
6 files changed, 97 insertions, 4 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/issue/workflow/Function.java b/sonar-core/src/main/java/org/sonar/core/issue/workflow/Function.java index 578a3df0b24..556d5ac962a 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/workflow/Function.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/workflow/Function.java @@ -26,6 +26,7 @@ import javax.annotation.Nullable; interface Function { interface Context { Issue issue(); + Context setAssignee(@Nullable String s); Context setResolution(@Nullable String s); Context setCloseDate(boolean b); } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/workflow/FunctionExecutor.java b/sonar-core/src/main/java/org/sonar/core/issue/workflow/FunctionExecutor.java index c2d974e3def..22b22e21ef8 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/workflow/FunctionExecutor.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/workflow/FunctionExecutor.java @@ -26,6 +26,8 @@ import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.IssueChangeContext; import org.sonar.core.issue.IssueUpdater; +import javax.annotation.Nullable; + public class FunctionExecutor implements BatchComponent, ServerComponent { private final IssueUpdater updater; @@ -60,7 +62,13 @@ public class FunctionExecutor implements BatchComponent, ServerComponent { } @Override - public Function.Context setResolution(String s) { + public Function.Context setAssignee(@Nullable String s) { + updater.assign(issue, s, changeContext); + return this; + } + + @Override + public Function.Context setResolution(@Nullable String s) { updater.setResolution(issue, s, changeContext); return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/workflow/IssueWorkflow.java b/sonar-core/src/main/java/org/sonar/core/issue/workflow/IssueWorkflow.java index ff308798a0c..4b4780f4122 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/workflow/IssueWorkflow.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/workflow/IssueWorkflow.java @@ -80,20 +80,22 @@ public class IssueWorkflow implements BatchComponent, ServerComponent, Startable .from(Issue.STATUS_CLOSED).to(Issue.STATUS_REOPENED) .functions(new SetResolution(null), new SetCloseDate(false)) .build()) + + // resolve as false-positive .transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE) .from(Issue.STATUS_OPEN).to(Issue.STATUS_RESOLVED) .conditions(new IsManual(false)) - .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE)) + .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE), SetAssignee.UNASSIGN) .build()) .transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_RESOLVED) .conditions(new IsManual(false)) - .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE)) + .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE), SetAssignee.UNASSIGN) .build()) .transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_RESOLVED) .conditions(new IsManual(false)) - .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE)) + .functions(new SetResolution(Issue.RESOLUTION_FALSE_POSITIVE), SetAssignee.UNASSIGN) .build()) // automatic transitions diff --git a/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetAssignee.java b/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetAssignee.java new file mode 100644 index 00000000000..a9116a6313d --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetAssignee.java @@ -0,0 +1,37 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.core.issue.workflow; + +import javax.annotation.Nullable; + +public class SetAssignee implements Function { + public static final SetAssignee UNASSIGN = new SetAssignee(null); + + private final String assignee; + + public SetAssignee(@Nullable String assignee) { + this.assignee = assignee; + } + + @Override + public void execute(Context context) { + context.setAssignee(assignee); + } +} diff --git a/sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java b/sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java index 8d5e3bbeb22..ae976307c3c 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java @@ -22,8 +22,11 @@ package org.sonar.core.issue.workflow; import com.google.common.base.Function; import com.google.common.collect.Collections2; import org.junit.Test; +import org.sonar.api.issue.DefaultTransitions; import org.sonar.api.issue.Issue; +import org.sonar.api.rule.RuleKey; import org.sonar.core.issue.DefaultIssue; +import org.sonar.core.issue.DefaultIssueBuilder; import org.sonar.core.issue.IssueChangeContext; import org.sonar.core.issue.IssueUpdater; @@ -191,7 +194,25 @@ public class IssueWorkflowTest { } catch (IllegalStateException e) { assertThat(e).hasMessage("Unknown status: xxx [issue=ABCDE]"); } + } + + @Test + public void should_flag_as_false_positive() throws Exception { + DefaultIssue issue = new DefaultIssue() + .setKey("ABCDE") + .setStatus(Issue.STATUS_OPEN) + .setRuleKey(RuleKey.of("squid", "AvoidCycle")) + .setAssignee("morgan") + .setReporter("simon"); + + workflow.start(); + workflow.doTransition(issue, DefaultTransitions.FALSE_POSITIVE, IssueChangeContext.createScan(new Date())); + + assertThat(issue.resolution()).isEqualTo(Issue.RESOLUTION_FALSE_POSITIVE); + assertThat(issue.status()).isEqualTo(Issue.STATUS_RESOLVED); + // should remove assignee + assertThat(issue.assignee()).isNull(); } private Collection<String> keys(List<Transition> transitions) { diff --git a/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetAssigneeTest.java b/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetAssigneeTest.java new file mode 100644 index 00000000000..943cfb4f12c --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetAssigneeTest.java @@ -0,0 +1,24 @@ +package org.sonar.core.issue.workflow; + +import org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class SetAssigneeTest { + @Test + public void assign() throws Exception { + SetAssignee function = new SetAssignee("eric"); + Function.Context context = mock(Function.Context.class); + function.execute(context); + verify(context, times(1)).setAssignee("eric"); + } + + @Test + public void unassign() throws Exception { + Function.Context context = mock(Function.Context.class); + SetAssignee.UNASSIGN.execute(context); + verify(context, times(1)).setAssignee(null); + } +} |