@@ -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()); |
@@ -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 : |
@@ -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); | |||
} | |||
} |
@@ -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()); | |||
} | |||
@@ -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); |
@@ -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(); |
@@ -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()) { |
@@ -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) { |
@@ -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()); |
@@ -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) { |
@@ -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; | |||
} |
@@ -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)); |
@@ -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")); | |||
@@ -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() { |
@@ -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) { |
@@ -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); | |||
} | |||
@@ -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() { |
@@ -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) |
@@ -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); |
@@ -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)); | |||
@@ -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) { |
@@ -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); |
@@ -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") |
@@ -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"); |
@@ -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(); |
@@ -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") |
@@ -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) { |
@@ -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)); | |||
} | |||
} |
@@ -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(); | |||
} | |||
@@ -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; |
@@ -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; |
@@ -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; | |||
} | |||
@@ -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); |
@@ -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(); |
@@ -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); |
@@ -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(); | |||
} |
@@ -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); |
@@ -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 | |||
*/ |