Browse Source

SONAR-7345 Rename Issue debt to effort in API

tags/5.5-M10
Julien Lancelot 8 years ago
parent
commit
79de4ddfda
38 changed files with 258 additions and 132 deletions
  1. 1
    1
      server/sonar-server-benchmarks/src/test/java/org/sonar/server/benchmark/IssueIndexBenchmarkTest.java
  2. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/EffortAggregator.java
  3. 5
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueAssigner.java
  4. 6
    6
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueLifecycle.java
  5. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/NewEffortAggregator.java
  6. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/NewEffortCalculator.java
  7. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/TrackerRawInputFactory.java
  8. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/UpdateConflictResolver.java
  9. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/issue/commonrule/CommonRule.java
  10. 14
    14
      server/sonar-server/src/main/java/org/sonar/server/issue/IssueUpdater.java
  11. 14
    1
      server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueDoc.java
  12. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResultSetIterator.java
  13. 4
    4
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java
  14. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/EffortAggregatorTest.java
  15. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java
  16. 5
    5
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueLifecycleTest.java
  17. 4
    4
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/NewEffortAggregatorTest.java
  18. 4
    4
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/NewEffortCalculatorTest.java
  19. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/computation/issue/TrackerRawInputFactoryTest.java
  20. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java
  21. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/computation/qualitymodel/QualityModelMeasuresVisitorForReportTest.java
  22. 3
    3
      server/sonar-server/src/test/java/org/sonar/server/computation/step/SendIssueNotificationsStepTest.java
  23. 5
    5
      server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java
  24. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/issue/IssueTesting.java
  25. 11
    11
      server/sonar-server/src/test/java/org/sonar/server/issue/IssueUpdaterTest.java
  26. 2
    2
      server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java
  27. 2
    2
      server/sonar-server/src/test/java/org/sonar/server/issue/notification/NewIssuesNotificationTest.java
  28. 2
    2
      server/sonar-server/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java
  29. 17
    6
      sonar-batch/src/main/java/org/sonar/batch/issue/DeprecatedIssueAdapterForFilter.java
  30. 14
    0
      sonar-batch/src/main/java/org/sonar/batch/issue/DeprecatedIssueWrapper.java
  31. 18
    0
      sonar-batch/src/main/java/org/sonar/batch/issue/TrackedIssueAdapter.java
  32. 33
    12
      sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java
  33. 1
    1
      sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java
  34. 3
    3
      sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java
  35. 8
    8
      sonar-db/src/main/java/org/sonar/db/issue/IssueDto.java
  36. 10
    1
      sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Issue.java
  37. 38
    13
      sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestIssue.java
  38. 18
    3
      sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java

+ 1
- 1
server/sonar-server-benchmarks/src/test/java/org/sonar/server/benchmark/IssueIndexBenchmarkTest.java View File

@@ -190,7 +190,7 @@ public class IssueIndexBenchmarkTest {
issue.setFuncCloseDate(null);
issue.setAttributes(null);
issue.setDebt(1000L);
issue.setEffortToFix(3.14);
issue.setGap(3.14);
issue.setLanguage("php");
issue.setReporter(users.next());
issue.setRuleKey(rules.next());

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/issue/EffortAggregator.java View File

@@ -126,7 +126,7 @@ public class EffortAggregator extends IssueVisitor {
private long securityEffort = 0L;

void add(DefaultIssue issue) {
Long issueEffort = issue.debtInMinutes();
Long issueEffort = issue.effortInMinutes();
if (issueEffort != null && issueEffort != 0L) {
switch (issue.type()) {
case CODE_SMELL :

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueAssigner.java View File

@@ -28,11 +28,11 @@ import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.computation.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.scm.ScmInfo;
import org.sonar.server.computation.scm.ScmInfoRepository;
import org.sonar.server.issue.IssueUpdater;

import static org.apache.commons.lang.StringUtils.defaultIfEmpty;
import static org.sonar.core.issue.IssueChangeContext.createScan;
@@ -51,7 +51,7 @@ public class IssueAssigner extends IssueVisitor {
private static final Logger LOGGER = Loggers.get(IssueAssigner.class);

private final ScmInfoRepository scmInfoRepository;
private final DefaultAssignee defaultAssigne;
private final DefaultAssignee defaultAssignee;
private final IssueUpdater issueUpdater;
private final ScmAccountToUser scmAccountToUser;
private final IssueChangeContext changeContext;
@@ -59,11 +59,11 @@ public class IssueAssigner extends IssueVisitor {
private String lastCommitAuthor = null;
private ScmInfo scmChangesets = null;

public IssueAssigner(AnalysisMetadataHolder analysisMetadataHolder, ScmInfoRepository scmInfoRepository, ScmAccountToUser scmAccountToUser, DefaultAssignee defaultAssigne,
public IssueAssigner(AnalysisMetadataHolder analysisMetadataHolder, ScmInfoRepository scmInfoRepository, ScmAccountToUser scmAccountToUser, DefaultAssignee defaultAssignee,
IssueUpdater issueUpdater) {
this.scmInfoRepository = scmInfoRepository;
this.scmAccountToUser = scmAccountToUser;
this.defaultAssigne = defaultAssigne;
this.defaultAssignee = defaultAssignee;
this.issueUpdater = issueUpdater;
this.changeContext = createScan(new Date(analysisMetadataHolder.getAnalysisDate()));
}
@@ -80,7 +80,7 @@ public class IssueAssigner extends IssueVisitor {
}
}
if (authorWasSet && issue.assignee() == null) {
String assigneeLogin = StringUtils.defaultIfEmpty(scmAccountToUser.getNullable(issue.authorLogin()), defaultAssigne.getLogin());
String assigneeLogin = StringUtils.defaultIfEmpty(scmAccountToUser.getNullable(issue.authorLogin()), defaultAssignee.getLogin());
issueUpdater.setNewAssignee(issue, assigneeLogin, changeContext);
}
}

+ 6
- 6
server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueLifecycle.java View File

@@ -25,10 +25,10 @@ import javax.annotation.Nullable;
import org.sonar.api.issue.Issue;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.issue.workflow.IssueWorkflow;
import org.sonar.core.util.Uuids;
import org.sonar.server.computation.analysis.AnalysisMetadataHolder;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.issue.workflow.IssueWorkflow;

/**
* Sets the appropriate fields when an issue is :
@@ -62,7 +62,7 @@ public class IssueLifecycle {
issue.setCreationDate(changeContext.date());
issue.setUpdateDate(changeContext.date());
issue.setStatus(Issue.STATUS_OPEN);
issue.setDebt(debtCalculator.calculate(issue));
issue.setEffort(debtCalculator.calculate(issue));
}

public void mergeExistingOpenIssue(DefaultIssue raw, DefaultIssue base) {
@@ -79,7 +79,7 @@ public class IssueLifecycle {
raw.setAuthorLogin(base.authorLogin());
raw.setTags(base.tags());
raw.setAttributes(base.attributes());
raw.setDebt(debtCalculator.calculate(raw));
raw.setEffort(debtCalculator.calculate(raw));
raw.setOnDisabledRule(base.isOnDisabledRule());
if (base.manualSeverity()) {
raw.setManualSeverity(true);
@@ -92,8 +92,8 @@ public class IssueLifecycle {
updater.setPastLine(raw, base.getLine());
updater.setPastLocations(raw, base.getLocations());
updater.setPastMessage(raw, base.getMessage(), changeContext);
updater.setPastEffortToFix(raw, base.effortToFix(), changeContext);
updater.setPastTechnicalDebt(raw, base.debt(), changeContext);
updater.setPastGap(raw, base.effortToFix(), changeContext);
updater.setPastEffort(raw, base.debt(), changeContext);
raw.setSelectedAt(base.selectedAt());
}


+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/issue/NewEffortAggregator.java View File

@@ -94,7 +94,7 @@ public class NewEffortAggregator extends IssueVisitor {

@Override
public void onIssue(Component component, DefaultIssue issue) {
if (issue.resolution() == null && issue.debtInMinutes() != null && !periodsHolder.getPeriods().isEmpty()) {
if (issue.resolution() == null && issue.effortInMinutes() != null && !periodsHolder.getPeriods().isEmpty()) {
List<IssueChangeDto> changelog = changesByIssueUuid.get(issue.key());
for (Period period : periodsHolder.getPeriods()) {
counter.add(issue, period, changelog);

+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/computation/issue/NewEffortCalculator.java View File

@@ -50,7 +50,7 @@ public class NewEffortCalculator {

public long calculate(DefaultIssue issue, Collection<IssueChangeDto> debtChangelog, Period period) {
if (issue.creationDate().getTime() > period.getSnapshotDate() + 1000L) {
return Objects.firstNonNull(issue.debtInMinutes(), 0L);
return Objects.firstNonNull(issue.effortInMinutes(), 0L);
}
return calculateFromChangelog(issue, debtChangelog, period.getSnapshotDate());
}
@@ -62,7 +62,7 @@ public class NewEffortCalculator {
debtDiffs = Lists.newArrayList(debtDiffs);
debtDiffs.add(currentChange);
}
long newDebt = issue.debtInMinutes();
long newDebt = issue.effortInMinutes();

for (Iterator<FieldDiffs> it = debtDiffs.iterator(); it.hasNext();) {
FieldDiffs diffs = it.next();

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/issue/TrackerRawInputFactory.java View File

@@ -126,7 +126,7 @@ public class TrackerRawInputFactory {
issue.setSeverity(reportIssue.getSeverity().name());
}
if (reportIssue.hasEffortToFix()) {
issue.setEffortToFix(reportIssue.getEffortToFix());
issue.setGap(reportIssue.getEffortToFix());
}
DbIssues.Locations.Builder dbLocationsBuilder = DbIssues.Locations.newBuilder();
if (reportIssue.hasTextRange()) {

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/issue/UpdateConflictResolver.java View File

@@ -63,7 +63,7 @@ public class UpdateConflictResolver {
}

private void resolveEffortToFix(IssueDto dbIssue, DefaultIssue issue) {
issue.setEffortToFix(dbIssue.getGap());
issue.setGap(dbIssue.getGap());
}

private void resolveSeverity(IssueDto dbIssue, DefaultIssue issue) {

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/issue/commonrule/CommonRule.java View File

@@ -49,7 +49,7 @@ public abstract class CommonRule {
CommonRuleIssue cri = doProcessFile(file, activeRule.get());
if (cri != null) {
issue = new DefaultIssue();
issue.setEffortToFix(cri.effortToFix);
issue.setGap(cri.effortToFix);
issue.setMessage(cri.message);
issue.setRuleKey(ruleKey);
issue.setSeverity(activeRule.get().getSeverity());

+ 14
- 14
server/sonar-server/src/main/java/org/sonar/server/issue/IssueUpdater.java View File

@@ -255,9 +255,9 @@ public class IssueUpdater {
}
}

public boolean setEffortToFix(DefaultIssue issue, @Nullable Double d, IssueChangeContext context) {
if (!Objects.equal(d, issue.effortToFix())) {
issue.setEffortToFix(d);
public boolean setGap(DefaultIssue issue, @Nullable Double d, IssueChangeContext context) {
if (!Objects.equal(d, issue.gap())) {
issue.setGap(d);
issue.setUpdateDate(context.date());
issue.setChanged(true);
// Do not send notifications to prevent spam when installing the SQALE plugin,
@@ -267,16 +267,16 @@ public class IssueUpdater {
return false;
}

public boolean setPastEffortToFix(DefaultIssue issue, @Nullable Double previousEffort, IssueChangeContext context) {
Double currentEffort = issue.effortToFix();
issue.setEffortToFix(previousEffort);
return setEffortToFix(issue, currentEffort, context);
public boolean setPastGap(DefaultIssue issue, @Nullable Double previousGap, IssueChangeContext context) {
Double currentGap = issue.gap();
issue.setGap(previousGap);
return setGap(issue, currentGap, context);
}

public boolean setTechnicalDebt(DefaultIssue issue, @Nullable Duration value, IssueChangeContext context) {
Duration oldValue = issue.debt();
public boolean setEffort(DefaultIssue issue, @Nullable Duration value, IssueChangeContext context) {
Duration oldValue = issue.effort();
if (!Objects.equal(value, oldValue)) {
issue.setDebt(value != null ? value : null);
issue.setEffort(value != null ? value : null);
issue.setFieldChange(context, TECHNICAL_DEBT, oldValue != null ? oldValue.toMinutes() : null, value != null ? value.toMinutes() : null);
issue.setUpdateDate(context.date());
issue.setChanged(true);
@@ -285,10 +285,10 @@ public class IssueUpdater {
return false;
}

public boolean setPastTechnicalDebt(DefaultIssue issue, @Nullable Duration previousTechnicalDebt, IssueChangeContext context) {
Duration currentTechnicalDebt = issue.debt();
issue.setDebt(previousTechnicalDebt);
return setTechnicalDebt(issue, currentTechnicalDebt, context);
public boolean setPastEffort(DefaultIssue issue, @Nullable Duration previousEffort, IssueChangeContext context) {
Duration currentEffort = issue.effort();
issue.setEffort(previousEffort);
return setEffort(issue, currentEffort, context);
}

public boolean setAttribute(DefaultIssue issue, String key, @Nullable String value, IssueChangeContext context) {

+ 14
- 1
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueDoc.java View File

@@ -117,9 +117,16 @@ public class IssueDoc extends BaseDoc implements Issue {
return getNullableField(IssueIndexDefinition.FIELD_ISSUE_LINE);
}

@Deprecated
@Override
@CheckForNull
public Double effortToFix() {
throw new UnsupportedOperationException("effortToFix is replaced by gap");
}

@Override
@CheckForNull
public Double gap() {
return getNullableField(IssueIndexDefinition.FIELD_ISSUE_EFFORT);
}

@@ -218,6 +225,12 @@ public class IssueDoc extends BaseDoc implements Issue {
@Override
@CheckForNull
public Duration debt() {
throw new UnsupportedOperationException("debt is replaced by effort");
}

@Override
@CheckForNull
public Duration effort() {
Number debt = getNullableField(IssueIndexDefinition.FIELD_ISSUE_DEBT);
return (debt != null) ? Duration.create(debt.longValue()) : null;
}
@@ -288,7 +301,7 @@ public class IssueDoc extends BaseDoc implements Issue {
return this;
}

public IssueDoc setEffortToFix(@Nullable Double d) {
public IssueDoc setGap(@Nullable Double d) {
setField(IssueIndexDefinition.FIELD_ISSUE_EFFORT, d);
return this;
}

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueResultSetIterator.java View File

@@ -164,7 +164,7 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> {
doc.setTechnicalUpdateDate(new Date(rs.getLong(3)));
doc.setActionPlanKey(rs.getString(4));
doc.setAssignee(rs.getString(5));
doc.setEffortToFix(DatabaseUtils.getDouble(rs, 6));
doc.setGap(DatabaseUtils.getDouble(rs, 6));
doc.setAttributes(rs.getString(7));
doc.setLine(DatabaseUtils.getInt(rs, 8));
doc.setMessage(rs.getString(9));

+ 4
- 4
server/sonar-server/src/test/java/org/sonar/server/computation/issue/DebtCalculatorTest.java View File

@@ -69,7 +69,7 @@ public class DebtCalculatorTest {
public void linear_function() {
double effortToFix = 3.0;
int coefficient = 2;
issue.setEffortToFix(effortToFix);
issue.setGap(effortToFix);
rule.setFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.LINEAR, coefficient + "min", null));

assertThat(underTest.calculate(issue).toMinutes()).isEqualTo((int) (coefficient * effortToFix));
@@ -78,7 +78,7 @@ public class DebtCalculatorTest {
@Test
public void constant_function() {
int constant = 2;
issue.setEffortToFix(null);
issue.setGap(null);
rule.setFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE, null, constant + "min"));

assertThat(underTest.calculate(issue).toMinutes()).isEqualTo(2);
@@ -87,7 +87,7 @@ public class DebtCalculatorTest {
@Test(expected = IllegalArgumentException.class)
public void effort_to_fix_must_not_be_set_with_constant_function() {
int constant = 2;
issue.setEffortToFix(3.0);
issue.setGap(3.0);
rule.setFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE, null, constant + "min"));

underTest.calculate(issue);
@@ -98,7 +98,7 @@ public class DebtCalculatorTest {
double effortToFix = 3.0;
int coefficient = 2;
int offset = 5;
issue.setEffortToFix(effortToFix);
issue.setGap(effortToFix);
rule.setFunction(new DefaultDebtRemediationFunction(
DebtRemediationFunction.Type.LINEAR_OFFSET, coefficient + "min", offset + "min"));


+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/computation/issue/EffortAggregatorTest.java View File

@@ -217,15 +217,15 @@ public class EffortAggregatorTest {
}

private static DefaultIssue newCodeSmellIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(CODE_SMELL);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(CODE_SMELL);
}

private static DefaultIssue newBugIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(BUG);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(BUG);
}

private static DefaultIssue newVulnerabilityIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(VULNERABILITY);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(VULNERABILITY);
}

private static DefaultIssue newCodeSmellIssueWithoutEffort() {

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java View File

@@ -181,7 +181,7 @@ public class IssueAssignerTest {
underTest.onIssue(FILE, issue);

assertThat(logTester.logs(LoggerLevel.WARN)).containsOnly(
"No SCM info has been found for issue DefaultIssue[key=<null>,type=VULNERABILITY,componentUuid=<null>,componentKey=<null>,moduleUuid=<null>,moduleUuidPath=<null>,projectUuid=<null>,projectKey=<null>,ruleKey=<null>,language=<null>,severity=<null>,manualSeverity=false,message=<null>,line=2,effortToFix=<null>,debt=<null>,status=<null>,resolution=<null>,reporter=<null>,assignee=<null>,checksum=<null>,attributes=<null>,authorLogin=<null>,actionPlanKey=<null>,comments=<null>,tags=<null>,locations=<null>,creationDate=<null>,updateDate=<null>,closeDate=<null>,currentChange=<null>,changes=<null>,isNew=true,beingClosed=false,onDisabledRule=false,isChanged=false,sendNotifications=false,selectedAt=<null>]");
"No SCM info has been found for issue DefaultIssue[key=<null>,type=VULNERABILITY,componentUuid=<null>,componentKey=<null>,moduleUuid=<null>,moduleUuidPath=<null>,projectUuid=<null>,projectKey=<null>,ruleKey=<null>,language=<null>,severity=<null>,manualSeverity=false,message=<null>,line=2,gap=<null>,effort=<null>,status=<null>,resolution=<null>,reporter=<null>,assignee=<null>,checksum=<null>,attributes=<null>,authorLogin=<null>,actionPlanKey=<null>,comments=<null>,tags=<null>,locations=<null>,creationDate=<null>,updateDate=<null>,closeDate=<null>,currentChange=<null>,changes=<null>,isNew=true,beingClosed=false,onDisabledRule=false,isChanged=false,sendNotifications=false,selectedAt=<null>]");
}

private void setSingleChangeset(String author, Long date, String revision) {

+ 5
- 5
server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueLifecycleTest.java View File

@@ -25,10 +25,10 @@ import org.junit.Test;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.issue.workflow.IssueWorkflow;
import org.sonar.db.protobuf.DbCommons;
import org.sonar.db.protobuf.DbIssues;
import org.sonar.server.issue.IssueUpdater;
import org.sonar.server.issue.workflow.IssueWorkflow;

import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
@@ -121,8 +121,8 @@ public class IssueLifecycleTest {
.setSelectedAt(1000L)
.setLine(10)
.setMessage("message")
.setEffortToFix(15d)
.setDebt(Duration.create(15L))
.setGap(15d)
.setEffort(Duration.create(15L))
.setManualSeverity(false)
.setLocations(issueLocations);

@@ -148,7 +148,7 @@ public class IssueLifecycleTest {
verify(updater).setPastSeverity(raw, BLOCKER, issueChangeContext);
verify(updater).setPastLine(raw, 10);
verify(updater).setPastMessage(raw, "message", issueChangeContext);
verify(updater).setPastTechnicalDebt(raw, Duration.create(15L), issueChangeContext);
verify(updater).setPastEffort(raw, Duration.create(15L), issueChangeContext);
verify(updater).setPastLocations(raw, issueLocations);
}


+ 4
- 4
server/sonar-server/src/test/java/org/sonar/server/computation/issue/NewEffortAggregatorTest.java View File

@@ -247,7 +247,7 @@ public class NewEffortAggregatorTest {
@Test
public void no_measures_if_no_periods() {
periodsHolder.setPeriods();
DefaultIssue unresolved = new DefaultIssue().setDebt(Duration.create(10));
DefaultIssue unresolved = new DefaultIssue().setEffort(Duration.create(10));
verifyZeroInteractions(calculator);

underTest.beforeComponent(FILE);
@@ -264,15 +264,15 @@ public class NewEffortAggregatorTest {
}

private static DefaultIssue newCodeSmellIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(RuleType.CODE_SMELL);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(RuleType.CODE_SMELL);
}

private static DefaultIssue newBugIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(RuleType.BUG);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(RuleType.BUG);
}

private static DefaultIssue newVulnerabilityIssue(long effort) {
return newCodeSmellIssueWithoutEffort().setDebt(Duration.create(effort)).setType(RuleType.VULNERABILITY);
return newCodeSmellIssueWithoutEffort().setEffort(Duration.create(effort)).setType(RuleType.VULNERABILITY);
}

private static DefaultIssue newCodeSmellIssueWithoutEffort() {

+ 4
- 4
server/sonar-server/src/test/java/org/sonar/server/computation/issue/NewEffortCalculatorTest.java View File

@@ -54,7 +54,7 @@ public class NewEffortCalculatorTest {
*/
@Test
public void total_debt_if_issue_created_during_period() {
issue.setDebt(TWO_DAYS).setCreationDate(new Date(PERIOD_DATE + 10000));
issue.setEffort(TWO_DAYS).setCreationDate(new Date(PERIOD_DATE + 10000));

long newDebt = underTest.calculate(issue, Collections.<IssueChangeDto>emptyList(), PERIOD);

@@ -67,7 +67,7 @@ public class NewEffortCalculatorTest {
// before period: increased to 2d
// after period: increased to 5d, decreased to 4d then increased to 10d
// -> new debt is 10d - 2d = 8d
issue.setDebt(TEN_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
issue.setEffort(TEN_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
List<IssueChangeDto> changelog = Arrays.asList(
newDebtChangelog(ONE_DAY.toMinutes(), TWO_DAYS.toMinutes(), PERIOD_DATE - 9000),
newDebtChangelog(TWO_DAYS.toMinutes(), FIVE_DAYS.toMinutes(), PERIOD_DATE + 10000),
@@ -86,7 +86,7 @@ public class NewEffortCalculatorTest {
// before period: increased to 10d
// after period: decreased to 2d
// -> new debt is 2d - 10d = -8d -> 0d
issue.setDebt(TWO_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
issue.setEffort(TWO_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
List<IssueChangeDto> changelog = Arrays.asList(
newDebtChangelog(ONE_DAY.toMinutes(), TEN_DAYS.toMinutes(), PERIOD_DATE - 9000),
newDebtChangelog(TEN_DAYS.toMinutes(), TWO_DAYS.toMinutes(), PERIOD_DATE + 30000)
@@ -102,7 +102,7 @@ public class NewEffortCalculatorTest {
// creation: 1d
// after period: increased to 2d, then to 5d
// -> new debt is 5d - 1d = 4d
issue.setDebt(FIVE_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
issue.setEffort(FIVE_DAYS).setCreationDate(new Date(PERIOD_DATE - 10000));
List<IssueChangeDto> changelog = Arrays.asList(
newDebtChangelog(ONE_DAY.toMinutes(), TWO_DAYS.toMinutes(), PERIOD_DATE + 20000),
newDebtChangelog(TWO_DAYS.toMinutes(), FIVE_DAYS.toMinutes(), PERIOD_DATE + 30000)

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/issue/TrackerRawInputFactoryTest.java View File

@@ -137,7 +137,7 @@ public class TrackerRawInputFactoryTest {
DefaultIssue ceIssue = new DefaultIssue()
.setRuleKey(RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "InsufficientCoverage"))
.setMessage("not enough coverage")
.setEffortToFix(10.0);
.setGap(10.0);
when(commonRuleEngine.process(FILE)).thenReturn(asList(ceIssue));

Input<DefaultIssue> input = underTest.create(FILE);

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java View File

@@ -256,7 +256,7 @@ public class MeasureComputerContextImplTest {
.setSeverity("MAJOR")
.setStatus("CLOSED")
.setResolution("FIXED")
.setDebt(Duration.create(10l));
.setEffort(Duration.create(10l));

MeasureComputerContextImpl underTest = newContext(PROJECT_REF, Arrays.asList(issue));


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/qualitymodel/QualityModelMeasuresVisitorForReportTest.java View File

@@ -573,7 +573,7 @@ public class QualityModelMeasuresVisitorForReportTest {

private static DefaultIssue newIssue(long effort, String severity, RuleType type) {
return newIssue(severity, type)
.setDebt(Duration.create(effort));
.setEffort(Duration.create(effort));
}

private static DefaultIssue newIssue(String severity, RuleType type) {

+ 3
- 3
server/sonar-server/src/test/java/org/sonar/server/computation/step/SendIssueNotificationsStepTest.java View File

@@ -106,7 +106,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest {
@Test
public void send_global_new_issues_notification() throws Exception {
issueCache.newAppender().append(
new DefaultIssue().setSeverity(Severity.BLOCKER).setDebt(ISSUE_DURATION)
new DefaultIssue().setSeverity(Severity.BLOCKER).setEffort(ISSUE_DURATION)
).close();

when(notificationService.hasProjectSubscribersForTypes(PROJECT_UUID, SendIssueNotificationsStep.NOTIF_TYPES)).thenReturn(true);
@@ -123,7 +123,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest {
@Test
public void send_new_issues_notification_to_user() throws Exception {
issueCache.newAppender().append(
new DefaultIssue().setSeverity(Severity.BLOCKER).setDebt(ISSUE_DURATION).setAssignee(ISSUE_ASSIGNEE)
new DefaultIssue().setSeverity(Severity.BLOCKER).setEffort(ISSUE_DURATION).setAssignee(ISSUE_ASSIGNEE)
).close();

when(notificationService.hasProjectSubscribersForTypes(PROJECT_UUID, SendIssueNotificationsStep.NOTIF_TYPES)).thenReturn(true);
@@ -140,7 +140,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest {

@Test
public void send_issues_change_notification() throws Exception {
DefaultIssue issue = new DefaultIssue().setSeverity(Severity.BLOCKER).setDebt(ISSUE_DURATION).setChanged(true).setSendNotifications(true);
DefaultIssue issue = new DefaultIssue().setSeverity(Severity.BLOCKER).setEffort(ISSUE_DURATION).setChanged(true).setSendNotifications(true);
issueCache.newAppender().append(issue).close();

when(notificationService.hasProjectSubscribersForTypes(PROJECT_UUID, SendIssueNotificationsStep.NOTIF_TYPES)).thenReturn(true);

+ 5
- 5
server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java View File

@@ -66,7 +66,7 @@ public class IssueStorageTest {

.setRuleKey(RuleKey.of("squid", "AvoidCycle"))
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setReporter("emmerik")
.setResolution("OPEN")
.setStatus("OPEN")
@@ -103,7 +103,7 @@ public class IssueStorageTest {

.setRuleKey(RuleKey.of("squid", "AvoidCycle"))
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setReporter("emmerik")
.setResolution("OPEN")
.setStatus("OPEN")
@@ -143,7 +143,7 @@ public class IssueStorageTest {

.setRuleKey(RuleKey.of("squid", "AvoidCycle"))
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setReporter("emmerik")
.setResolution("OPEN")
.setStatus("OPEN")
@@ -184,7 +184,7 @@ public class IssueStorageTest {

// updated fields
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setChecksum("FFFFF")
.setAuthorLogin("simon")
.setAssignee("loic")
@@ -231,7 +231,7 @@ public class IssueStorageTest {

// updated fields
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setChecksum("FFFFF")
.setAuthorLogin("simon")
.setAssignee("loic")

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/issue/IssueTesting.java View File

@@ -70,7 +70,7 @@ public class IssueTesting {
doc.setAuthorLogin("roger");
doc.setLanguage("xoo");
doc.setComponentUuid("FILE_1");
doc.setEffortToFix(3.14);
doc.setGap(3.14);
doc.setFilePath("src/Foo.xoo");
doc.setDirectoryPath("/src");
doc.setMessage("the message");

+ 11
- 11
server/sonar-server/src/test/java/org/sonar/server/issue/IssueUpdaterTest.java View File

@@ -411,7 +411,7 @@ public class IssueUpdaterTest {

@Test
public void set_effort_to_fix() {
boolean updated = updater.setEffortToFix(issue, 3.14, context);
boolean updated = updater.setGap(issue, 3.14, context);
assertThat(updated).isTrue();
assertThat(issue.isChanged()).isTrue();
assertThat(issue.effortToFix()).isEqualTo(3.14);
@@ -420,8 +420,8 @@ public class IssueUpdaterTest {

@Test
public void not_set_effort_to_fix_if_unchanged() {
issue.setEffortToFix(3.14);
boolean updated = updater.setEffortToFix(issue, 3.14, context);
issue.setGap(3.14);
boolean updated = updater.setGap(issue, 3.14, context);
assertThat(updated).isFalse();
assertThat(issue.isChanged()).isFalse();
assertThat(issue.effortToFix()).isEqualTo(3.14);
@@ -430,8 +430,8 @@ public class IssueUpdaterTest {

@Test
public void set_past_effort() {
issue.setEffortToFix(3.14);
boolean updated = updater.setPastEffortToFix(issue, 1.0, context);
issue.setGap(3.14);
boolean updated = updater.setPastGap(issue, 1.0, context);
assertThat(updated).isTrue();
assertThat(issue.effortToFix()).isEqualTo(3.14);

@@ -444,8 +444,8 @@ public class IssueUpdaterTest {
public void set_past_technical_debt() {
Duration newDebt = Duration.create(15 * 8 * 60);
Duration previousDebt = Duration.create(10 * 8 * 60);
issue.setDebt(newDebt);
boolean updated = updater.setPastTechnicalDebt(issue, previousDebt, context);
issue.setEffort(newDebt);
boolean updated = updater.setPastEffort(issue, previousDebt, context);
assertThat(updated).isTrue();
assertThat(issue.debt()).isEqualTo(newDebt);
assertThat(issue.mustSendNotifications()).isFalse();
@@ -458,8 +458,8 @@ public class IssueUpdaterTest {
@Test
public void set_past_technical_debt_without_previous_value() {
Duration newDebt = Duration.create(15 * 8 * 60);
issue.setDebt(newDebt);
boolean updated = updater.setPastTechnicalDebt(issue, null, context);
issue.setEffort(newDebt);
boolean updated = updater.setPastEffort(issue, null, context);
assertThat(updated).isTrue();
assertThat(issue.debt()).isEqualTo(newDebt);
assertThat(issue.mustSendNotifications()).isFalse();
@@ -471,9 +471,9 @@ public class IssueUpdaterTest {

@Test
public void set_past_technical_debt_with_null_new_value() {
issue.setDebt(null);
issue.setEffort(null);
Duration previousDebt = Duration.create(10 * 8 * 60);
boolean updated = updater.setPastTechnicalDebt(issue, previousDebt, context);
boolean updated = updater.setPastEffort(issue, previousDebt, context);
assertThat(updated).isTrue();
assertThat(issue.debt()).isNull();
assertThat(issue.mustSendNotifications()).isFalse();

+ 2
- 2
server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java View File

@@ -94,7 +94,7 @@ public class ServerIssueStorageTest {
.setRuleKey(RuleKey.of("squid", "AvoidCycle"))
.setProjectKey("struts")
.setLine(5000)
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setReporter("emmerik")
.setResolution("OPEN")
.setStatus("OPEN")
@@ -133,7 +133,7 @@ public class ServerIssueStorageTest {
// updated fields
.setLine(5000)
.setProjectUuid("CDEF")
.setDebt(Duration.create(10L))
.setEffort(Duration.create(10L))
.setChecksum("FFFFF")
.setAuthorLogin("simon")
.setAssignee("loic")

+ 2
- 2
server/sonar-server/src/test/java/org/sonar/server/issue/notification/NewIssuesNotificationTest.java View File

@@ -127,7 +127,7 @@ public class NewIssuesNotificationTest {
.setSeverity(Severity.INFO)
.setTags(Lists.newArrayList("bug", "owasp"))
.setRuleKey(RuleKey.of("SonarQube", "rule-the-world"))
.setDebt(Duration.create(5L));
.setEffort(Duration.create(5L));
}

private DefaultIssue newIssue2() {
@@ -137,7 +137,7 @@ public class NewIssuesNotificationTest {
.setSeverity(Severity.BLOCKER)
.setTags(Lists.newArrayList("owasp"))
.setRuleKey(RuleKey.of("SonarQube", "rule-the-universe"))
.setDebt(Duration.create(10L));
.setEffort(Duration.create(10L));
}

private RuleDto newRule(String name, String language) {

+ 2
- 2
server/sonar-server/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java View File

@@ -21,10 +21,10 @@ package org.sonar.server.issue.notification;

import com.google.common.collect.Lists;
import org.junit.Test;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.issue.notification.NewIssuesStatistics.Metric;

import static org.assertj.core.api.Assertions.assertThat;
@@ -76,6 +76,6 @@ public class NewIssuesStatisticsTest {
.setSeverity(Severity.INFO)
.setRuleKey(RuleKey.of("SonarQube", "rule-the-world"))
.setTags(Lists.newArrayList("bug", "owasp"))
.setDebt(Duration.create(5L));
.setEffort(Duration.create(5L));
}
}

+ 17
- 6
sonar-batch/src/main/java/org/sonar/batch/issue/DeprecatedIssueAdapterForFilter.java View File

@@ -19,17 +19,16 @@
*/
package org.sonar.batch.issue;

import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueComment;
import org.sonar.api.resources.Project;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.utils.Duration;

import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueComment;
import org.sonar.api.resources.Project;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.utils.Duration;

/**
* @deprecated since 5.3
@@ -82,7 +81,13 @@ class DeprecatedIssueAdapterForFilter implements Issue {
}

@Override
@Deprecated
public Double effortToFix() {
return gap();
}

@Override
public Double gap() {
return rawIssue.hasEffortToFix() ? rawIssue.getEffortToFix() : null;
}

@@ -151,8 +156,14 @@ class DeprecatedIssueAdapterForFilter implements Issue {
throw unsupported();
}

@Deprecated
@Override
public Duration debt() {
return effort();
}

@Override
public Duration effort() {
throw unsupported();
}


+ 14
- 0
sonar-batch/src/main/java/org/sonar/batch/issue/DeprecatedIssueWrapper.java View File

@@ -81,8 +81,17 @@ public class DeprecatedIssueWrapper implements Issue {
return textRange != null ? textRange.start().line() : null;
}

/**
* @deprecated since 5.5, replaced by {@link #gap()}
*/
@Override
@Deprecated
public Double effortToFix() {
return gap();
}

@Override
public Double gap() {
return newIssue.effortToFix();
}

@@ -156,6 +165,11 @@ public class DeprecatedIssueWrapper implements Issue {
return null;
}

@Override
public Duration effort() {
return null;
}

@Override
public String projectKey() {
return null;

+ 18
- 0
sonar-batch/src/main/java/org/sonar/batch/issue/TrackedIssueAdapter.java View File

@@ -68,8 +68,17 @@ public class TrackedIssueAdapter implements Issue {
return issue.startLine();
}

/**
* @deprecated since 5.5, replaced by {@link #gap()}
*/
@Override
@Deprecated
public Double effortToFix() {
return gap();
}

@Override
public Double gap() {
return issue.effortToFix();
}

@@ -143,11 +152,20 @@ public class TrackedIssueAdapter implements Issue {
return new ArrayList<>();
}

/**
* @deprecated since 5.5, replaced by {@link #effort()}
*/
@Override
@Deprecated
public Duration debt() {
return null;
}

@Override
public Duration effort() {
return null;
}

@Override
public String projectKey() {
return null;

+ 33
- 12
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java View File

@@ -71,8 +71,8 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.
private boolean manualSeverity = false;
private String message;
private Integer line;
private Double effortToFix;
private Duration debt;
private Double gap;
private Duration effort;
private String status;
private String resolution;
private String reporter;
@@ -267,34 +267,55 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.
return this;
}

/**
* @deprecated since5.5, replaced by {@link #gap()}
*/
@Deprecated
@Override
@CheckForNull
public Double effortToFix() {
return effortToFix;
return gap();
}

@Override
@CheckForNull
public Double gap() {
return gap;
}

public DefaultIssue setEffortToFix(@Nullable Double d) {
Preconditions.checkArgument(d == null || d >= 0, format("Effort to fix must be greater than or equal 0 (got %s)", d));
this.effortToFix = d;
public DefaultIssue setGap(@Nullable Double d) {
Preconditions.checkArgument(d == null || d >= 0, format("Gap must be greater than or equal 0 (got %s)", d));
this.gap = d;
return this;
}

/**
* Elapsed time to fix the issue
* @deprecated since5.5, replaced by {@link #effort()}
*/
@Deprecated
@Override
@CheckForNull
public Duration debt() {
return debt;
return effort();
}

/**
* Elapsed time to fix the issue
*/
@Override
@CheckForNull
public Duration effort() {
return effort;
}


@CheckForNull
public Long debtInMinutes() {
return debt != null ? debt.toMinutes() : null;
public Long effortInMinutes() {
return effort != null ? effort.toMinutes() : null;
}

public DefaultIssue setDebt(@Nullable Duration t) {
this.debt = t;
public DefaultIssue setEffort(@Nullable Duration t) {
this.effort = t;
return this;
}


+ 1
- 1
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java View File

@@ -155,7 +155,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder {
issue.setMessage(message);
issue.setSeverity(severity);
issue.setManualSeverity(false);
issue.setEffortToFix(effortToFix);
issue.setGap(effortToFix);
issue.setLine(line);
issue.setReporter(reporter);
issue.setAssignee(assignee);

+ 3
- 3
sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueTest.java View File

@@ -49,8 +49,8 @@ public class DefaultIssueTest {
.setManualSeverity(true)
.setMessage("a message")
.setLine(7)
.setEffortToFix(1.2d)
.setDebt(Duration.create(28800L))
.setGap(1.2d)
.setEffort(Duration.create(28800L))
.setActionPlanKey("BCDE")
.setStatus(Issue.STATUS_CLOSED)
.setResolution(Issue.RESOLUTION_FIXED)
@@ -174,7 +174,7 @@ public class DefaultIssueTest {

@Test
public void test_nullable_fields() throws Exception {
issue.setEffortToFix(null).setSeverity(null).setLine(null);
issue.setGap(null).setSeverity(null).setLine(null);
assertThat(issue.effortToFix()).isNull();
assertThat(issue.severity()).isNull();
assertThat(issue.line()).isNull();

+ 8
- 8
sonar-db/src/main/java/org/sonar/db/issue/IssueDto.java View File

@@ -109,8 +109,8 @@ public final class IssueDto implements Serializable {
.setLine(issue.line())
.setLocations((DbIssues.Locations) issue.getLocations())
.setMessage(issue.message())
.setGap(issue.effortToFix())
.setEffort(issue.debtInMinutes())
.setGap(issue.gap())
.setEffort(issue.effortInMinutes())
.setResolution(issue.resolution())
.setStatus(issue.status())
.setSeverity(issue.severity())
@@ -158,8 +158,8 @@ public final class IssueDto implements Serializable {
.setLine(issue.line())
.setLocations((DbIssues.Locations) issue.getLocations())
.setMessage(issue.message())
.setGap(issue.effortToFix())
.setEffort(issue.debtInMinutes())
.setGap(issue.gap())
.setEffort(issue.effortInMinutes())
.setResolution(issue.resolution())
.setStatus(issue.status())
.setSeverity(issue.severity())
@@ -302,7 +302,7 @@ public final class IssueDto implements Serializable {
}

public IssueDto setGap(@Nullable Double d) {
checkArgument(d == null || d >= 0, "Value of issue effort to fix must be positive: %d", d);
checkArgument(d == null || d >= 0, "Value of issue gap must be positive: %d", d);
this.gap = d;
return this;
}
@@ -313,7 +313,7 @@ public final class IssueDto implements Serializable {
}

public IssueDto setEffort(@Nullable Long l) {
checkArgument(l == null || l >= 0, "Value of issue debt must be positive: %d", l);
checkArgument(l == null || l >= 0, "Value of issue effort must be positive: %d", l);
this.effort = l;
return this;
}
@@ -726,8 +726,8 @@ public final class IssueDto implements Serializable {
issue.setStatus(status);
issue.setResolution(resolution);
issue.setMessage(message);
issue.setEffortToFix(gap);
issue.setDebt(effort != null ? Duration.create(effort) : null);
issue.setGap(gap);
issue.setEffort(effort != null ? Duration.create(effort) : null);
issue.setLine(line);
issue.setChecksum(checksum);
issue.setSeverity(severity);

+ 10
- 1
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Issue.java View File

@@ -51,9 +51,18 @@ public interface Issue {
*/
String severity();

@CheckForNull
/**
* @deprecated since 5.5, replaced by {@link #effort()}
*/
@Deprecated
Duration debt();

/**
* @since 5.5
*/
@CheckForNull
Duration effort();

RuleType type();

}

+ 38
- 13
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestIssue.java View File

@@ -39,7 +39,7 @@ public class TestIssue implements Issue {
private String resolution;
private String severity;
private RuleKey ruleKey;
private Duration debt;
private Duration effort;
private RuleType type;

private TestIssue(Builder builder) {
@@ -48,7 +48,7 @@ public class TestIssue implements Issue {
this.resolution = builder.resolution;
this.severity = builder.severity;
this.ruleKey = builder.ruleKey;
this.debt = builder.debt;
this.effort = builder.effort;
this.type = builder.type;
}

@@ -78,16 +78,27 @@ public class TestIssue implements Issue {
return severity;
}

/**
* @deprecated since 5.5, replaced by {@link #effort}
*/
@Override
@CheckForNull
@Deprecated
public Duration debt() {
return debt;
return effort();
}

/**
* @since 5.5
*/
@Override
public Duration effort() {
return debt;
return effort;
}

/**
* @since 5.5
*/
@Override
public RuleType type() {
return type;
@@ -99,7 +110,7 @@ public class TestIssue implements Issue {
private String resolution;
private String severity;
private RuleKey ruleKey;
private Duration debt;
private Duration effort;
private RuleType type;

public Builder setKey(String key) {
@@ -127,49 +138,63 @@ public class TestIssue implements Issue {
return this;
}

/**
* @deprecated since 5.5, use {@link #setEffort(Duration)} instead
*/
@Deprecated
public Builder setDebt(@Nullable Duration debt) {
this.debt = debt;
return setEffort(debt);
}

/**
* @since 5.5
*/
public Builder setEffort(@Nullable Duration effort) {
this.effort = effort;
return this;
}

/**
* @since 5.5
*/
public Builder setType(RuleType type) {
this.type = validateType(type);
return this;
}

private static String validateKey(String key){
private static String validateKey(String key) {
checkNotNull(key, "key cannot be null");
return key;
}

private static RuleKey validateRuleKey(RuleKey ruleKey){
private static RuleKey validateRuleKey(RuleKey ruleKey) {
checkNotNull(ruleKey, "ruleKey cannot be null");
return ruleKey;
}

private static String validateResolution(@Nullable String resolution){
private static String validateResolution(@Nullable String resolution) {
checkArgument(resolution == null || org.sonar.api.issue.Issue.RESOLUTIONS.contains(resolution), String.format("resolution '%s' is invalid", resolution));
return resolution;
}

private static String validateSeverity(String severity){
private static String validateSeverity(String severity) {
checkNotNull(severity, "severity cannot be null");
checkArgument(Severity.ALL.contains(severity), String.format("severity '%s' is invalid", severity));
return severity;
}

private static String validateStatus(String status){
private static String validateStatus(String status) {
checkNotNull(status, "status cannot be null");
checkArgument(org.sonar.api.issue.Issue.STATUSES.contains(status), String.format("status '%s' is invalid", status));
return status;
}

private static RuleType validateType(RuleType type){
private static RuleType validateType(RuleType type) {
checkNotNull(type, "type cannot be null");
return type;
}

public Issue build(){
public Issue build() {
validateKey(key);
validateResolution(resolution);
validateSeverity(severity);

+ 18
- 3
sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java View File

@@ -105,6 +105,13 @@ public interface Issue extends Serializable {
@CheckForNull
Integer line();

/**
* @deprecated since 5.5, replaced by {@link #gap()}
*/
@Deprecated
@CheckForNull
Double effortToFix();

/**
* Arbitrary distance to threshold for resolving the issue.
* <p/>
@@ -114,9 +121,11 @@ public interface Issue extends Serializable {
* <li>for the rule "Avoid Duplications" : number of duplicated blocks</li>
* <li>for the rule "Insufficient Line Coverage" : number of lines to cover to reach the accepted threshold</li>
* </ul>
*
* @since 5.5
*/
@CheckForNull
Double effortToFix();
Double gap();

/**
* See constant values in {@link Issue}.
@@ -186,11 +195,17 @@ public interface Issue extends Serializable {
boolean isNew();

/**
* @since 5.0
* @deprecated since 5.5, replaced by {@link #effort()}
*/
@CheckForNull
@Deprecated
Duration debt();

/**
* @since 5.5
*/
@CheckForNull
Duration effort();

/**
* @since 5.0
*/

Loading…
Cancel
Save