aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-core
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@gmail.com>2013-05-24 09:53:45 +0200
committerSimon Brandhof <simon.brandhof@gmail.com>2013-05-24 09:53:59 +0200
commit71981f0e621b12b7e82ed3d149a28be1ddb5180e (patch)
treedea5633be3aae4acc9ed25231aa5c001e37f5f5b /sonar-core
parentd969077cf266597edd11d0b36714a03081873816 (diff)
downloadsonarqube-71981f0e621b12b7e82ed3d149a28be1ddb5180e.tar.gz
sonarqube-71981f0e621b12b7e82ed3d149a28be1ddb5180e.zip
SONAR-4286 remove the assignee when resolving as false-positive
Diffstat (limited to 'sonar-core')
-rw-r--r--sonar-core/src/main/java/org/sonar/core/issue/workflow/Function.java1
-rw-r--r--sonar-core/src/main/java/org/sonar/core/issue/workflow/FunctionExecutor.java10
-rw-r--r--sonar-core/src/main/java/org/sonar/core/issue/workflow/IssueWorkflow.java8
-rw-r--r--sonar-core/src/main/java/org/sonar/core/issue/workflow/SetAssignee.java37
-rw-r--r--sonar-core/src/test/java/org/sonar/core/issue/workflow/IssueWorkflowTest.java21
-rw-r--r--sonar-core/src/test/java/org/sonar/core/issue/workflow/SetAssigneeTest.java24
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);
+ }
+}