From: Simon Brandhof Date: Fri, 3 May 2013 21:41:09 +0000 (+0200) Subject: SONAR-3755 remove the resolution OPEN X-Git-Tag: 3.6~467 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c9a8ffa209eee86a051cab32989b8d948572839c;p=sonarqube.git SONAR-3755 remove the resolution OPEN --- diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/IssueTrackingTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/IssueTrackingTest.java index ba334f11769..bd3045632ee 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/IssueTrackingTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/IssueTrackingTest.java @@ -380,7 +380,7 @@ public class IssueTrackingTest { } private DefaultIssue newDefaultIssue(String message, Integer line, RuleKey ruleKey, String checksum) { - return new DefaultIssue().setDescription(message).setLine(line).setRuleKey(ruleKey).setChecksum(checksum).setResolution(Issue.RESOLUTION_OPEN).setStatus(Issue.STATUS_OPEN); + return new DefaultIssue().setDescription(message).setLine(line).setRuleKey(ruleKey).setChecksum(checksum).setStatus(Issue.STATUS_OPEN); } private IssueDto newReferenceIssue(String message, Integer lineId, int ruleId, String lineChecksum) { @@ -392,7 +392,7 @@ public class IssueTrackingTest { referenceIssue.setDescription(message); referenceIssue.setRuleId(ruleId); referenceIssue.setChecksum(lineChecksum); - referenceIssue.setResolution(Issue.RESOLUTION_OPEN); + referenceIssue.setResolution(null); referenceIssue.setStatus(Issue.STATUS_OPEN); return referenceIssue; } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java index 2e25531216e..e9728627628 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java @@ -160,12 +160,12 @@ public class DefaultIssue implements Issue { return this; } + @CheckForNull public String resolution() { return resolution; } - public DefaultIssue setResolution(String s) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(s), "Resolution must be set"); + public DefaultIssue setResolution(@Nullable String s) { this.resolution = s; return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java index 497e1f860af..e4184397938 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java @@ -131,7 +131,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder { issue.setAttributes(attributes); issue.setNew(true); issue.setAlive(true); - issue.setResolution(Issue.RESOLUTION_OPEN); + issue.setResolution(null); issue.setStatus(Issue.STATUS_OPEN); return issue; } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueDto.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueDto.java index 6625f8e821b..51fb8598ebe 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueDto.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueDto.java @@ -27,6 +27,7 @@ import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.KeyValueFormat; import org.sonar.core.issue.DefaultIssue; +import javax.annotation.CheckForNull; import javax.annotation.Nullable; import java.util.Date; @@ -103,6 +104,7 @@ public final class IssueDto { return this; } + @CheckForNull public String getSeverity() { return severity; } @@ -130,6 +132,7 @@ public final class IssueDto { return this; } + @CheckForNull public String getDescription() { return description; } @@ -139,6 +142,7 @@ public final class IssueDto { return this; } + @CheckForNull public Integer getLine() { return line; } @@ -148,6 +152,7 @@ public final class IssueDto { return this; } + @CheckForNull public Double getEffortToFix() { return effortToFix; } @@ -166,6 +171,7 @@ public final class IssueDto { return this; } + @CheckForNull public String getResolution() { return resolution; } @@ -175,15 +181,17 @@ public final class IssueDto { return this; } + @CheckForNull public String getChecksum() { return checksum; } - public IssueDto setChecksum(String checksum) { + public IssueDto setChecksum(@Nullable String checksum) { this.checksum = checksum; return this; } + @CheckForNull public String getUserLogin() { return userLogin; } 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 400dbabaa6d..578a3df0b24 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 @@ -21,10 +21,12 @@ package org.sonar.core.issue.workflow; import org.sonar.api.issue.Issue; +import javax.annotation.Nullable; + interface Function { interface Context { Issue issue(); - Context setResolution(String s); + Context setResolution(@Nullable String s); Context setCloseDate(boolean b); } 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 862402e7238..e5cd259df00 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 @@ -52,11 +52,11 @@ public class IssueWorkflow implements BatchComponent, ServerComponent, Startable .build()) .transition(Transition.builder(DefaultTransitions.REOPEN) .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_REOPENED) - .functions(new SetResolution(Issue.RESOLUTION_OPEN)) + .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.REOPEN) .from(Issue.STATUS_CLOSED).to(Issue.STATUS_REOPENED) - .functions(new SetResolution(Issue.RESOLUTION_OPEN), new SetCloseDate(false)) + .functions(new SetResolution(null), new SetCloseDate(false)) .build()) .transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE) .from(Issue.STATUS_OPEN).to(Issue.STATUS_RESOLVED) @@ -95,7 +95,7 @@ public class IssueWorkflow implements BatchComponent, ServerComponent, Startable .transition(Transition.builder("automaticreopen") .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_REOPENED) .conditions(new IsAlive(true), new HasResolution(Issue.RESOLUTION_FIXED)) - .functions(new SetResolution(Issue.RESOLUTION_OPEN)) + .functions(new SetResolution(null)) .automatic() .build()) .build(); diff --git a/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetResolution.java b/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetResolution.java index e5147d4bf99..b2dab4c98b1 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetResolution.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/workflow/SetResolution.java @@ -19,14 +19,12 @@ */ package org.sonar.core.issue.workflow; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; +import javax.annotation.Nullable; public class SetResolution implements Function { private final String resolution; - public SetResolution(String resolution) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(resolution), "Resolution must be set"); + public SetResolution(@Nullable String resolution) { this.resolution = resolution; } diff --git a/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueBuilderTest.java b/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueBuilderTest.java index 6ce91863110..e3bced3d361 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueBuilderTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueBuilderTest.java @@ -55,7 +55,7 @@ public class DefaultIssueBuilderTest { assertThat(issue.technicalUpdateDate()).isNotNull(); assertThat(issue.assignee()).isNull(); assertThat(issue.isNew()).isTrue(); - assertThat(issue.resolution()).isEqualTo(Issue.RESOLUTION_OPEN); + assertThat(issue.resolution()).isNull(); assertThat(issue.status()).isEqualTo(Issue.STATUS_OPEN); assertThat(issue.attribute("JIRA")).isEqualTo("FOO-123"); assertThat(issue.attribute("YOUTRACK")).isEqualTo("YT-123"); diff --git a/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java b/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java index 1ac246e0db3..23bf9b5a6a8 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java @@ -66,16 +66,6 @@ public class DefaultIssueTest { } } - @Test - public void should_fail_on_empty_resolution() { - try { - issue.setResolution(""); - fail(); - } catch (IllegalArgumentException e) { - assertThat(e).hasMessage("Resolution must be set"); - } - } - @Test public void should_fail_on_bad_severity() { try { diff --git a/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetResolutionTest.java b/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetResolutionTest.java new file mode 100644 index 00000000000..f89b19edc10 --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/issue/workflow/SetResolutionTest.java @@ -0,0 +1,36 @@ +/* + * 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 org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class SetResolutionTest { + @Test + public void execute() throws Exception { + SetResolution function = new SetResolution("FIXED"); + Function.Context context = mock(Function.Context.class); + function.execute(context); + verify(context, times(1)).setResolution("FIXED"); + } +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java index 5f30ec93678..c1c5ea4c95d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java @@ -39,7 +39,6 @@ public interface Issue extends Serializable { String STATUS_RESOLVED = "RESOLVED"; String STATUS_CLOSED = "CLOSED"; - String RESOLUTION_OPEN = "OPEN"; String RESOLUTION_FIXED = "FIXED"; String RESOLUTION_FALSE_POSITIVE = "FALSE-POSITIVE"; @@ -74,6 +73,10 @@ public interface Issue extends Serializable { String status(); + /** + * The type of resolution. Return null if the issue is not resolved. + */ + @CheckForNull String resolution(); @CheckForNull diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb index 76bfc42e2c5..5c6690ec503 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb @@ -181,9 +181,9 @@ class Api::IssuesController < Api::ApiController :key => issue.key, :component => issue.componentKey, :rule => issue.ruleKey.toString(), - :resolution => issue.resolution, :status => issue.status } + json[:resolution] = issue.resolution if issue.resolution json[:severity] = issue.severity if issue.severity json[:desc] = issue.description if issue.description json[:line] = issue.line.to_i if issue.line diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/Issue.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/Issue.java index 62929609cd9..d22ed22afbb 100644 --- a/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/Issue.java +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/Issue.java @@ -21,6 +21,7 @@ package org.sonar.wsclient.issue; import org.sonar.wsclient.unmarshallers.JsonUtils; +import javax.annotation.CheckForNull; import java.util.Collections; import java.util.Date; import java.util.Map; @@ -55,10 +56,12 @@ public class Issue { return JsonUtils.getString(json, "severity"); } + @CheckForNull public String description() { return JsonUtils.getString(json, "desc"); } + @CheckForNull public Integer line() { return JsonUtils.getInteger(json, "line"); } @@ -68,6 +71,7 @@ public class Issue { return JsonUtils.getDouble(json, "effortToFix"); } + @CheckForNull public Double effortToFix() { return JsonUtils.getDouble(json, "effortToFix"); } @@ -76,14 +80,26 @@ public class Issue { return JsonUtils.getString(json, "status"); } + /** + * The resolution type. Null if the issue is not resolved. + */ + @CheckForNull public String resolution() { return JsonUtils.getString(json, "resolution"); } + /** + * Login of the user who created the manual issue, else null. + */ + @CheckForNull public String userLogin() { return JsonUtils.getString(json, "userLogin"); } + /** + * Login of assignee. Null if issue is not assigned. + */ + @CheckForNull public String assignee() { return JsonUtils.getString(json, "assignee"); } @@ -96,10 +112,12 @@ public class Issue { return JsonUtils.getDateTime(json, "updateDate"); } + @CheckForNull public Date closeDate() { return JsonUtils.getDateTime(json, "closeDate"); } + @CheckForNull public String attribute(String key) { return attributes().get(key); } diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/issue/NewIssueTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/issue/NewIssueTest.java index f544c9ed0c9..a6e2e9d7d40 100644 --- a/sonar-ws-client/src/test/java/org/sonar/wsclient/issue/NewIssueTest.java +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/issue/NewIssueTest.java @@ -43,7 +43,7 @@ public class NewIssueTest { assertThat(newIssue.urlParams()).hasSize(7).includes( entry("component", "Action.java"), - entry("cost", 4.2), + entry("effortToFix", 4.2), entry("desc", "the desc"), entry("line", 123), entry("rule", "squid:AvoidCycle"),