@@ -29,7 +29,7 @@ import javax.annotation.Nullable; | |||
import org.sonar.api.issue.Issue; | |||
import org.sonar.api.measures.CoreMetrics; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.measure.Measure; | |||
import org.sonar.server.computation.measure.MeasureRepository; | |||
@@ -94,15 +94,15 @@ public class IssueCounter extends IssueVisitor { | |||
INFO, NEW_INFO_VIOLATIONS_KEY | |||
); | |||
private static final Map<IssueType, String> TYPE_TO_METRIC_KEY = ImmutableMap.<IssueType, String>builder() | |||
.put(IssueType.CODE_SMELL, CoreMetrics.CODE_SMELLS_KEY) | |||
.put(IssueType.BUG, CoreMetrics.BUGS_KEY) | |||
.put(IssueType.VULNERABILITY, CoreMetrics.VULNERABILITIES_KEY) | |||
private static final Map<RuleType, String> TYPE_TO_METRIC_KEY = ImmutableMap.<RuleType, String>builder() | |||
.put(RuleType.CODE_SMELL, CoreMetrics.CODE_SMELLS_KEY) | |||
.put(RuleType.BUG, CoreMetrics.BUGS_KEY) | |||
.put(RuleType.VULNERABILITY, CoreMetrics.VULNERABILITIES_KEY) | |||
.build(); | |||
private static final Map<IssueType, String> TYPE_TO_NEW_METRIC_KEY = ImmutableMap.<IssueType, String>builder() | |||
.put(IssueType.CODE_SMELL, CoreMetrics.NEW_CODE_SMELLS_KEY) | |||
.put(IssueType.BUG, CoreMetrics.NEW_BUGS_KEY) | |||
.put(IssueType.VULNERABILITY, CoreMetrics.NEW_VULNERABILITIES_KEY) | |||
private static final Map<RuleType, String> TYPE_TO_NEW_METRIC_KEY = ImmutableMap.<RuleType, String>builder() | |||
.put(RuleType.CODE_SMELL, CoreMetrics.NEW_CODE_SMELLS_KEY) | |||
.put(RuleType.BUG, CoreMetrics.NEW_BUGS_KEY) | |||
.put(RuleType.VULNERABILITY, CoreMetrics.NEW_VULNERABILITIES_KEY) | |||
.build(); | |||
private final PeriodsHolder periodsHolder; | |||
@@ -170,7 +170,7 @@ public class IssueCounter extends IssueVisitor { | |||
} | |||
private void addMeasuresByType(Component component) { | |||
for (Map.Entry<IssueType, String> entry : TYPE_TO_METRIC_KEY.entrySet()) { | |||
for (Map.Entry<RuleType, String> entry : TYPE_TO_METRIC_KEY.entrySet()) { | |||
addMeasure(component, entry.getValue(), currentCounters.counter().typeBag.count(entry.getKey())); | |||
} | |||
} | |||
@@ -206,12 +206,12 @@ public class IssueCounter extends IssueVisitor { | |||
// waiting for Java 8 lambda in order to factor this loop with the previous one | |||
// (see call currentCounters.counterForPeriod(period.getIndex()).xxx with xxx as severityBag or typeBag) | |||
for (Map.Entry<IssueType, String> entry : TYPE_TO_NEW_METRIC_KEY.entrySet()) { | |||
IssueType type = entry.getKey(); | |||
for (Map.Entry<RuleType, String> entry : TYPE_TO_NEW_METRIC_KEY.entrySet()) { | |||
RuleType type = entry.getKey(); | |||
String metricKey = entry.getValue(); | |||
Double[] variations = new Double[PeriodsHolder.MAX_NUMBER_OF_PERIODS]; | |||
for (Period period : periodsHolder.getPeriods()) { | |||
Multiset<IssueType> bag = currentCounters.counterForPeriod(period.getIndex()).typeBag; | |||
Multiset<RuleType> bag = currentCounters.counterForPeriod(period.getIndex()).typeBag; | |||
variations[period.getIndex() - 1] = (double) bag.count(type); | |||
} | |||
Metric metric = metricRepository.getByKey(metricKey); | |||
@@ -232,7 +232,7 @@ public class IssueCounter extends IssueVisitor { | |||
private int confirmed = 0; | |||
private int falsePositives = 0; | |||
private final Multiset<String> severityBag = HashMultiset.create(); | |||
private final EnumMultiset<IssueType> typeBag = EnumMultiset.create(IssueType.class); | |||
private final EnumMultiset<RuleType> typeBag = EnumMultiset.create(RuleType.class); | |||
void add(Counter counter) { | |||
unresolved += counter.unresolved; |
@@ -24,7 +24,7 @@ import javax.annotation.CheckForNull; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.server.debt.DebtRemediationFunction; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
public interface Rule { | |||
@@ -36,7 +36,7 @@ public interface Rule { | |||
RuleStatus getStatus(); | |||
IssueType getType(); | |||
RuleType getType(); | |||
/** | |||
* Get all tags, whatever system or user tags. |
@@ -28,7 +28,7 @@ import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.server.debt.DebtRemediationFunction; | |||
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.rule.RuleDto; | |||
import static com.google.common.collect.Sets.union; | |||
@@ -42,7 +42,7 @@ public class RuleImpl implements Rule { | |||
private final RuleStatus status; | |||
private final Set<String> tags; | |||
private final DebtRemediationFunction remediationFunction; | |||
private final IssueType type; | |||
private final RuleType type; | |||
public RuleImpl(RuleDto dto) { | |||
this.id = dto.getId(); | |||
@@ -52,7 +52,7 @@ public class RuleImpl implements Rule { | |||
this.tags = union(dto.getSystemTags(), dto.getTags()); | |||
this.remediationFunction = effectiveRemediationFunction(dto); | |||
// TODO get rule type | |||
this.type = IssueType.CODE_SMELL; | |||
this.type = RuleType.CODE_SMELL; | |||
} | |||
@Override | |||
@@ -86,7 +86,7 @@ public class RuleImpl implements Rule { | |||
} | |||
@Override | |||
public IssueType getType() { | |||
public RuleType getType() { | |||
return type; | |||
} | |||
@@ -34,7 +34,7 @@ import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.Duration; | |||
import org.sonar.api.utils.KeyValueFormat; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.server.search.BaseDoc; | |||
public class IssueDoc extends BaseDoc implements Issue { | |||
@@ -197,10 +197,10 @@ public class IssueDoc extends BaseDoc implements Issue { | |||
} | |||
@CheckForNull | |||
public IssueType type() { | |||
public RuleType type() { | |||
String type = getNullableField(IssueIndexDefinition.FIELD_ISSUE_TYPE); | |||
if (type != null) { | |||
return IssueType.valueOf(type); | |||
return RuleType.valueOf(type); | |||
} | |||
return null; | |||
} | |||
@@ -383,7 +383,7 @@ public class IssueDoc extends BaseDoc implements Issue { | |||
return this; | |||
} | |||
public IssueDoc setType(IssueType type) { | |||
public IssueDoc setType(RuleType type) { | |||
setField(IssueIndexDefinition.FIELD_ISSUE_TYPE, type.toString()); | |||
return this; | |||
} |
@@ -33,7 +33,7 @@ import javax.annotation.Nullable; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.sonar.api.resources.Scopes; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DatabaseUtils; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
@@ -193,7 +193,7 @@ class IssueResultSetIterator extends ResultSetIterator<IssueDoc> { | |||
doc.setDirectoryPath(extractDirPath(doc.filePath(), scope)); | |||
String tags = rs.getString(28); | |||
doc.setTags(ImmutableList.copyOf(TAGS_SPLITTER.split(tags == null ? "" : tags))); | |||
doc.setType(IssueType.valueOf(rs.getInt(29))); | |||
doc.setType(RuleType.valueOf(rs.getInt(29))); | |||
return doc; | |||
} | |||
} |
@@ -36,7 +36,7 @@ import org.sonar.api.server.ws.Response; | |||
import org.sonar.api.server.ws.WebService; | |||
import org.sonar.api.server.ws.WebService.Param; | |||
import org.sonar.api.utils.Paging; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.server.es.Facets; | |||
import org.sonar.server.es.SearchOptions; | |||
import org.sonar.server.es.SearchResult; | |||
@@ -165,8 +165,8 @@ public class SearchAction implements IssuesWsAction { | |||
action.createParam(IssueFilterParameters.TYPES) | |||
.setDescription("Comma-separated list of types.") | |||
.setSince("5.5") | |||
.setPossibleValues(IssueType.values()) | |||
.setExampleValue(format("%s,%s", IssueType.CODE_SMELL, IssueType.BUG)); | |||
.setPossibleValues(RuleType.values()) | |||
.setExampleValue(format("%s,%s", RuleType.CODE_SMELL, RuleType.BUG)); | |||
action.createParam(ACTION_PLANS) | |||
.setDescription("Comma-separated list of action plan keys (not names)") | |||
.setExampleValue("3f19de90-1521-4482-a737-a311758ff513"); | |||
@@ -346,7 +346,7 @@ public class SearchAction implements IssuesWsAction { | |||
addMandatoryValuesToFacet(facets, IssueFilterParameters.RULES, request.getRules()); | |||
addMandatoryValuesToFacet(facets, IssueFilterParameters.LANGUAGES, request.getLanguages()); | |||
addMandatoryValuesToFacet(facets, IssueFilterParameters.TAGS, request.getTags()); | |||
addMandatoryValuesToFacet(facets, IssueFilterParameters.TYPES, IssueType.ALL_NAMES); | |||
addMandatoryValuesToFacet(facets, IssueFilterParameters.TYPES, RuleType.ALL_NAMES); | |||
List<String> actionPlans = Lists.newArrayList(""); | |||
List<String> actionPlansFromRequest = request.getActionPlans(); | |||
if (actionPlansFromRequest != null) { |
@@ -25,7 +25,7 @@ import javax.annotation.Nullable; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.server.debt.DebtRemediationFunction; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import static java.util.Objects.requireNonNull; | |||
@@ -34,7 +34,7 @@ public class DumbRule implements Rule { | |||
private RuleKey key; | |||
private String name; | |||
private RuleStatus status = RuleStatus.READY; | |||
private IssueType type = IssueType.CODE_SMELL; | |||
private RuleType type = RuleType.CODE_SMELL; | |||
private Set<String> tags = new HashSet<>(); | |||
private DebtRemediationFunction function; | |||
@@ -69,7 +69,7 @@ public class DumbRule implements Rule { | |||
} | |||
@Override | |||
public IssueType getType() { | |||
public RuleType getType() { | |||
return type; | |||
} | |||
@@ -102,7 +102,7 @@ public class DumbRule implements Rule { | |||
this.tags = tags; | |||
} | |||
public void setType(IssueType type) { | |||
public void setType(RuleType type) { | |||
this.type = type; | |||
} | |||
} |
@@ -23,12 +23,12 @@ import org.junit.Test; | |||
import org.sonar.api.utils.log.LogTester; | |||
import org.sonar.api.utils.log.LoggerLevel; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.server.issue.IssueUpdater; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.server.computation.analysis.AnalysisMetadataHolderRule; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.scm.Changeset; | |||
import org.sonar.server.computation.scm.ScmInfoRepositoryRule; | |||
import org.sonar.server.issue.IssueUpdater; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
@@ -176,7 +176,7 @@ public class IssueAssignerTest { | |||
@Test | |||
public void display_warning_when_line_is_above_max_size() throws Exception { | |||
setSingleChangeset("john", 123456789L, "rev-1"); | |||
DefaultIssue issue = new DefaultIssue().setLine(2).setType(IssueType.VULNERABILITY); | |||
DefaultIssue issue = new DefaultIssue().setLine(2).setType(RuleType.VULNERABILITY); | |||
underTest.onIssue(FILE, issue); | |||
@@ -27,7 +27,7 @@ import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.measures.CoreMetrics; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.computation.batch.BatchReportReaderRule; | |||
import org.sonar.server.computation.batch.TreeRootHolderRule; | |||
@@ -223,13 +223,13 @@ public class IssueCounterTest { | |||
// bottom-up traversal -> from files to project | |||
// file1 : one open code smell, one closed code smell (which will be excluded from metric) | |||
underTest.beforeComponent(FILE1); | |||
underTest.onIssue(FILE1, createIssue(null, STATUS_OPEN, BLOCKER).setType(IssueType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssue(RESOLUTION_FIXED, STATUS_CLOSED, MAJOR).setType(IssueType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssue(null, STATUS_OPEN, BLOCKER).setType(RuleType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssue(RESOLUTION_FIXED, STATUS_CLOSED, MAJOR).setType(RuleType.CODE_SMELL)); | |||
underTest.afterComponent(FILE1); | |||
// file2 : one bug | |||
underTest.beforeComponent(FILE2); | |||
underTest.onIssue(FILE2, createIssue(null, STATUS_CONFIRMED, BLOCKER).setType(IssueType.BUG)); | |||
underTest.onIssue(FILE2, createIssue(null, STATUS_CONFIRMED, BLOCKER).setType(RuleType.BUG)); | |||
underTest.afterComponent(FILE2); | |||
underTest.beforeComponent(PROJECT); | |||
@@ -255,13 +255,13 @@ public class IssueCounterTest { | |||
underTest.beforeComponent(FILE1); | |||
// created before -> existing issues (so ignored) | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, BLOCKER, period.getSnapshotDate() - 1000000L).setType(IssueType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, BLOCKER, period.getSnapshotDate() - 1000000L).setType(RuleType.CODE_SMELL)); | |||
// created during the first analysis starting the period -> existing issues (so ignored) | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, BLOCKER, period.getSnapshotDate()).setType(IssueType.BUG)); | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, BLOCKER, period.getSnapshotDate()).setType(RuleType.BUG)); | |||
// created after -> 3 new issues but 1 is closed | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, CRITICAL, period.getSnapshotDate() + 100000L).setType(IssueType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, CRITICAL, period.getSnapshotDate() + 100000L).setType(IssueType.BUG)); | |||
underTest.onIssue(FILE1, createIssueAt(RESOLUTION_FIXED, STATUS_CLOSED, MAJOR, period.getSnapshotDate() + 200000L).setType(IssueType.BUG)); | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, CRITICAL, period.getSnapshotDate() + 100000L).setType(RuleType.CODE_SMELL)); | |||
underTest.onIssue(FILE1, createIssueAt(null, STATUS_OPEN, CRITICAL, period.getSnapshotDate() + 100000L).setType(RuleType.BUG)); | |||
underTest.onIssue(FILE1, createIssueAt(RESOLUTION_FIXED, STATUS_CLOSED, MAJOR, period.getSnapshotDate() + 200000L).setType(RuleType.BUG)); | |||
underTest.afterComponent(FILE1); | |||
underTest.beforeComponent(FILE2); | |||
@@ -296,7 +296,7 @@ public class IssueCounterTest { | |||
return new DefaultIssue() | |||
.setResolution(resolution).setStatus(status) | |||
.setSeverity(severity).setRuleKey(RuleTesting.XOO_X1) | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setCreationDate(new Date()); | |||
} | |||
@@ -304,7 +304,7 @@ public class IssueCounterTest { | |||
return new DefaultIssue() | |||
.setResolution(resolution).setStatus(status) | |||
.setSeverity(severity).setRuleKey(RuleTesting.XOO_X1) | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setCreationDate(new Date(creationDate)); | |||
} | |||
@@ -21,7 +21,7 @@ package org.sonar.server.computation.issue; | |||
import org.junit.Test; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.server.computation.component.Component; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
@@ -40,20 +40,20 @@ public class RuleTypeCopierTest { | |||
@Test | |||
public void copy_rule_type_if_missing() { | |||
rule.setType(IssueType.BUG); | |||
rule.setType(RuleType.BUG); | |||
underTest.onIssue(mock(Component.class), issue); | |||
assertThat(issue.type()).isEqualTo(IssueType.BUG); | |||
assertThat(issue.type()).isEqualTo(RuleType.BUG); | |||
} | |||
@Test | |||
public void do_not_copy_type_if_present() { | |||
rule.setType(IssueType.BUG); | |||
issue.setType(IssueType.VULNERABILITY); | |||
rule.setType(RuleType.BUG); | |||
issue.setType(RuleType.VULNERABILITY); | |||
underTest.onIssue(mock(Component.class), issue); | |||
assertThat(issue.type()).isEqualTo(IssueType.VULNERABILITY); | |||
assertThat(issue.type()).isEqualTo(RuleType.VULNERABILITY); | |||
} | |||
} |
@@ -26,7 +26,7 @@ import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.DateUtils; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.issue.IssueDto; | |||
import org.sonar.db.issue.IssueMapper; | |||
@@ -41,7 +41,7 @@ public class UpdateConflictResolverTest { | |||
public void should_reload_issue_and_resolve_conflict() { | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleKey(RuleKey.of("squid", "AvoidCycles")) | |||
.setComponentKey("struts:org.apache.struts.Action") | |||
.setNew(false) | |||
@@ -52,7 +52,7 @@ public class UpdateConflictResolverTest { | |||
when(mapper.selectByKey("ABCDE")).thenReturn( | |||
new IssueDto() | |||
.setKee("ABCDE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleId(10) | |||
.setRuleKey("squid", "AvoidCycles") | |||
.setComponentKey("struts:org.apache.struts.Action") |
@@ -32,7 +32,7 @@ import org.sonar.batch.protocol.output.BatchReport; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.DefaultIssueComment; | |||
import org.sonar.core.issue.FieldDiffs; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
@@ -94,7 +94,7 @@ public class PersistIssuesStepTest extends BaseStepTest { | |||
issueCache.newAppender().append(new DefaultIssue() | |||
.setKey("ISSUE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleKey(RuleKey.of("xoo", "S01")) | |||
.setComponentUuid("COMPONENT") | |||
.setProjectUuid("PROJECT") | |||
@@ -114,7 +114,7 @@ public class PersistIssuesStepTest extends BaseStepTest { | |||
issueCache.newAppender().append(new DefaultIssue() | |||
.setKey("ISSUE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleKey(RuleKey.of("xoo", "S01")) | |||
.setComponentUuid("COMPONENT") | |||
.setProjectUuid("PROJECT") | |||
@@ -137,7 +137,7 @@ public class PersistIssuesStepTest extends BaseStepTest { | |||
issueCache.newAppender().append(new DefaultIssue() | |||
.setKey("ISSUE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleKey(RuleKey.of("xoo", "S01")) | |||
.setComponentUuid("COMPONENT") | |||
.setProjectUuid("PROJECT") | |||
@@ -166,7 +166,7 @@ public class PersistIssuesStepTest extends BaseStepTest { | |||
issueCache.newAppender().append(new DefaultIssue() | |||
.setKey("ISSUE") | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setRuleKey(RuleKey.of("xoo", "S01")) | |||
.setComponentUuid("COMPONENT") | |||
.setProjectUuid("PROJECT") |
@@ -32,7 +32,7 @@ import org.sonar.api.utils.System2; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.DefaultIssueComment; | |||
import org.sonar.core.issue.IssueChangeContext; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
@@ -61,7 +61,7 @@ public class IssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(true) | |||
.setRuleKey(RuleKey.of("squid", "AvoidCycle")) | |||
@@ -98,7 +98,7 @@ public class IssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(true) | |||
.setRuleKey(RuleKey.of("squid", "AvoidCycle")) | |||
@@ -138,7 +138,7 @@ public class IssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(true) | |||
.setRuleKey(RuleKey.of("squid", "AvoidCycle")) | |||
@@ -178,7 +178,7 @@ public class IssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(false) | |||
.setChanged(true) | |||
@@ -225,7 +225,7 @@ public class IssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(false) | |||
.setChanged(true) | |||
@@ -24,13 +24,13 @@ import org.sonar.api.issue.Issue; | |||
import org.sonar.api.resources.Scopes; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.DateUtils; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.core.util.Uuids; | |||
import org.sonar.db.component.ComponentDto; | |||
import org.sonar.db.issue.IssueDto; | |||
import org.sonar.db.rule.RuleDto; | |||
import org.sonar.server.issue.index.IssueDoc; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.issue.index.IssueDoc; | |||
public class IssueTesting { | |||
@@ -46,7 +46,7 @@ public class IssueTesting { | |||
return new IssueDto() | |||
.setKee(Uuids.create()) | |||
.setRule(rule) | |||
.setType(IssueType.CODE_SMELL) | |||
.setType(RuleType.CODE_SMELL) | |||
.setComponent(file) | |||
.setProject(project) | |||
.setStatus(Issue.STATUS_OPEN) | |||
@@ -63,7 +63,7 @@ public class IssueTesting { | |||
IssueDoc doc = new IssueDoc(Maps.<String, Object>newHashMap()); | |||
doc.setKey("ABC"); | |||
doc.setRuleKey(RuleTesting.XOO_X1.toString()); | |||
doc.setType(IssueType.CODE_SMELL); | |||
doc.setType(RuleType.CODE_SMELL); | |||
doc.setActionPlanKey(null); | |||
doc.setReporter(null); | |||
doc.setAssignee("steve"); |
@@ -33,7 +33,7 @@ import org.sonar.api.utils.System2; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.DefaultIssueComment; | |||
import org.sonar.core.issue.IssueChangeContext; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.server.issue.index.IssueIndexer; | |||
@@ -88,7 +88,7 @@ public class ServerIssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(true) | |||
.setRuleKey(RuleKey.of("squid", "AvoidCycle")) | |||
@@ -126,7 +126,7 @@ public class ServerIssueStorageTest { | |||
Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); | |||
DefaultIssue issue = new DefaultIssue() | |||
.setKey("ABCDE") | |||
.setType(IssueType.BUG) | |||
.setType(RuleType.BUG) | |||
.setNew(false) | |||
.setChanged(true) | |||
@@ -34,9 +34,7 @@ import org.sonar.core.issue.ActionPlanStats; | |||
import org.sonar.core.issue.DefaultActionPlan; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueChangeContext; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.server.issue.IssueTesting; | |||
import org.sonar.server.issue.IssueUpdater; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.component.ResourceDao; | |||
@@ -51,6 +49,7 @@ import org.sonar.db.issue.IssueDto; | |||
import org.sonar.server.exceptions.ForbiddenException; | |||
import org.sonar.server.exceptions.NotFoundException; | |||
import org.sonar.server.issue.IssueStorage; | |||
import org.sonar.server.issue.IssueUpdater; | |||
import org.sonar.server.tester.MockUserSession; | |||
import org.sonar.server.user.UserSession; | |||
@@ -163,7 +162,7 @@ public class ActionPlanServiceTest { | |||
when(actionPlanDao.selectByKey("ABCD")).thenReturn(new ActionPlanDto().setKey("ABCD").setProjectKey_unit_test_only(PROJECT_KEY)); | |||
when(resourceDao.selectResource(any(ResourceQuery.class))).thenReturn(new ResourceDto().setKey(PROJECT_KEY).setId(1l)); | |||
IssueDto issueDto = new IssueDto().setId(100L).setStatus(Issue.STATUS_OPEN).setRuleKey("squid", "s100").setIssueCreationDate(new Date()).setType(IssueType.BUG); | |||
IssueDto issueDto = new IssueDto().setId(100L).setStatus(Issue.STATUS_OPEN).setRuleKey("squid", "s100").setIssueCreationDate(new Date()).setType(RuleType.BUG); | |||
when(issueDao.selectByActionPlan(session, "ABCD")).thenReturn(newArrayList(issueDto)); | |||
when(issueUpdater.plan(any(DefaultIssue.class), eq((ActionPlan) null), any(IssueChangeContext.class))).thenReturn(true); | |||
@@ -26,20 +26,6 @@ import com.google.common.collect.ImmutableList; | |||
import com.google.common.collect.ImmutableMap; | |||
import com.google.common.collect.ImmutableSet; | |||
import com.google.common.collect.Maps; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.commons.lang.builder.ToStringBuilder; | |||
import org.apache.commons.lang.builder.ToStringStyle; | |||
import org.apache.commons.lang.time.DateUtils; | |||
import org.sonar.api.issue.Issue; | |||
import org.sonar.api.issue.IssueComment; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.Duration; | |||
import org.sonar.core.issue.tracking.Trackable; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import java.io.Serializable; | |||
import java.util.ArrayList; | |||
import java.util.Calendar; | |||
@@ -50,13 +36,26 @@ import java.util.LinkedHashSet; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.commons.lang.builder.ToStringBuilder; | |||
import org.apache.commons.lang.builder.ToStringStyle; | |||
import org.apache.commons.lang.time.DateUtils; | |||
import org.sonar.api.issue.Issue; | |||
import org.sonar.api.issue.IssueComment; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.Duration; | |||
import org.sonar.core.issue.tracking.Trackable; | |||
import org.sonar.core.rule.RuleType; | |||
import static java.lang.String.format; | |||
public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.Issue { | |||
private String key; | |||
private IssueType type; | |||
private RuleType type; | |||
private String componentUuid; | |||
private String componentKey; | |||
@@ -127,11 +126,11 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure. | |||
return this; | |||
} | |||
public IssueType type() { | |||
public RuleType type() { | |||
return type; | |||
} | |||
public DefaultIssue setType(IssueType type) { | |||
public DefaultIssue setType(RuleType type) { | |||
this.type = type; | |||
return this; | |||
} |
@@ -29,6 +29,7 @@ import org.sonar.api.issue.Issuable; | |||
import org.sonar.api.issue.Issuable.IssueBuilder; | |||
import org.sonar.api.issue.Issue; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.core.util.Uuids; | |||
public class DefaultIssueBuilder implements Issuable.IssueBuilder { | |||
@@ -42,7 +43,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder { | |||
private Double effortToFix; | |||
private String reporter; | |||
private String assignee; | |||
private IssueType type; | |||
private RuleType type; | |||
private Map<String, String> attributes; | |||
public DefaultIssueBuilder() { | |||
@@ -124,7 +125,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder { | |||
return this; | |||
} | |||
public DefaultIssueBuilder type(@Nullable IssueType type) { | |||
public DefaultIssueBuilder type(@Nullable RuleType type) { | |||
this.type = type; | |||
return this; | |||
} | |||
@@ -147,7 +148,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder { | |||
DefaultIssue issue = new DefaultIssue(); | |||
String key = Uuids.create(); | |||
issue.setKey(key); | |||
issue.setType(Objects.firstNonNull(type, IssueType.CODE_SMELL)); | |||
issue.setType(Objects.firstNonNull(type, RuleType.CODE_SMELL)); | |||
issue.setComponentKey(componentKey); | |||
issue.setProjectKey(projectKey); | |||
issue.setRuleKey(ruleKey); |
@@ -17,7 +17,7 @@ | |||
* 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; | |||
package org.sonar.core.rule; | |||
import com.google.common.base.Enums; | |||
import com.google.common.collect.Lists; | |||
@@ -25,12 +25,12 @@ import java.util.List; | |||
import static java.lang.String.format; | |||
public enum IssueType { | |||
public enum RuleType { | |||
CODE_SMELL(1), BUG(2), VULNERABILITY(3); | |||
private final int dbConstant; | |||
IssueType(int dbConstant) { | |||
RuleType(int dbConstant) { | |||
this.dbConstant = dbConstant; | |||
} | |||
@@ -41,15 +41,15 @@ public enum IssueType { | |||
/** | |||
* Returns the enum constant of the specified DB column value. | |||
*/ | |||
public static IssueType valueOf(int dbConstant) { | |||
public static RuleType valueOf(int dbConstant) { | |||
// iterating the array is fast-enough as size is small. No need for a map. | |||
for (IssueType type : values()) { | |||
for (RuleType type : values()) { | |||
if (type.getDbConstant() == dbConstant) { | |||
return type; | |||
} | |||
} | |||
throw new IllegalArgumentException(format("Unsupported value for db column ISSUES.ISSUE_TYPE: %d", dbConstant)); | |||
throw new IllegalArgumentException(format("Unsupported type value : %d", dbConstant)); | |||
} | |||
public static final List<String> ALL_NAMES = Lists.transform(Lists.newArrayList(values()), Enums.stringConverter(IssueType.class).reverse()); | |||
public static final List<String> ALL_NAMES = Lists.transform(Lists.newArrayList(values()), Enums.stringConverter(RuleType.class).reverse()); | |||
} |
@@ -17,7 +17,7 @@ | |||
* 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; | |||
package org.sonar.core.rule; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
@@ -25,32 +25,32 @@ import org.junit.rules.ExpectedException; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class IssueTypeTest { | |||
public class RuleTypeTest { | |||
@Rule | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
@Test | |||
public void test_valueOf_db_constant() { | |||
assertThat(IssueType.valueOf(1)).isEqualTo(IssueType.CODE_SMELL); | |||
assertThat(IssueType.valueOf(2)).isEqualTo(IssueType.BUG); | |||
assertThat(RuleType.valueOf(1)).isEqualTo(RuleType.CODE_SMELL); | |||
assertThat(RuleType.valueOf(2)).isEqualTo(RuleType.BUG); | |||
} | |||
@Test | |||
public void valueOf_throws_ISE_if_unsupported_db_constant() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
expectedException.expectMessage("Unsupported value for db column ISSUES.ISSUE_TYPE: 4"); | |||
IssueType.valueOf(4); | |||
expectedException.expectMessage("Unsupported type value : 4"); | |||
RuleType.valueOf(4); | |||
} | |||
@Test | |||
public void test_ALL_NAMES() { | |||
assertThat(IssueType.ALL_NAMES).containsOnly("BUG", "VULNERABILITY", "CODE_SMELL"); | |||
assertThat(RuleType.ALL_NAMES).containsOnly("BUG", "VULNERABILITY", "CODE_SMELL"); | |||
} | |||
@Test | |||
public void ALL_NAMES_is_immutable() { | |||
expectedException.expect(UnsupportedOperationException.class); | |||
IssueType.ALL_NAMES.add("foo"); | |||
RuleType.ALL_NAMES.add("foo"); | |||
} | |||
} |
@@ -38,7 +38,7 @@ import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.utils.Duration; | |||
import org.sonar.api.utils.KeyValueFormat; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.core.util.Uuids; | |||
import org.sonar.db.component.ComponentDto; | |||
import org.sonar.db.protobuf.DbIssues; | |||
@@ -709,7 +709,7 @@ public final class IssueDto implements Serializable { | |||
return this; | |||
} | |||
public IssueDto setType(IssueType type) { | |||
public IssueDto setType(RuleType type) { | |||
this.type = type.getDbConstant(); | |||
return this; | |||
} | |||
@@ -722,7 +722,7 @@ public final class IssueDto implements Serializable { | |||
public DefaultIssue toDefaultIssue() { | |||
DefaultIssue issue = new DefaultIssue(); | |||
issue.setKey(kee); | |||
issue.setType(IssueType.valueOf(type)); | |||
issue.setType(RuleType.valueOf(type)); | |||
issue.setStatus(status); | |||
issue.setResolution(resolution); | |||
issue.setMessage(message); |
@@ -19,12 +19,13 @@ | |||
*/ | |||
package org.sonar.db.version.v55; | |||
import com.google.common.annotations.VisibleForTesting; | |||
import com.google.common.base.Joiner; | |||
import com.google.common.base.Splitter; | |||
import java.sql.SQLException; | |||
import java.util.List; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.Database; | |||
import org.sonar.db.version.BaseDataChange; | |||
import org.sonar.db.version.MassUpdate; | |||
@@ -43,47 +44,56 @@ import static org.apache.commons.lang.StringUtils.defaultString; | |||
*/ | |||
public class FeedIssueTypes extends BaseDataChange { | |||
private final long now; | |||
private static final Splitter TAG_SPLITTER = Splitter.on(','); | |||
private static final Joiner TAG_JOINER = Joiner.on(',').skipNulls(); | |||
private final System2 system; | |||
public FeedIssueTypes(Database db, System2 system) { | |||
super(db); | |||
this.now = system.now(); | |||
this.system = system; | |||
} | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
final Splitter tagSplitter = Splitter.on(','); | |||
final Joiner tagJoiner = Joiner.on(',').skipNulls(); | |||
MassUpdate update = context.prepareMassUpdate().rowPluralName("issues"); | |||
update.select("SELECT id, tags FROM issues WHERE issue_type IS NULL OR issue_type=0"); | |||
update.update("UPDATE issues SET issue_type=?, tags=?, updated_at=? WHERE id=?"); | |||
update.execute(new Handler() { | |||
@Override | |||
public boolean handle(Row row, SqlStatement update) throws SQLException { | |||
long id = row.getLong(1); | |||
update.execute(new MigrationHandler(system.now())); | |||
} | |||
private static final class MigrationHandler implements Handler { | |||
private final long now; | |||
// See algorithm to deduce type from tags in RuleTagsToTypeConverter | |||
List<String> tags = newArrayList(tagSplitter.split(defaultString(row.getNullableString(2)))); | |||
IssueType type = tagsToType(tags); | |||
tags.remove("bug"); | |||
tags.remove("security"); | |||
public MigrationHandler(long now) { | |||
this.now = now; | |||
} | |||
@Override | |||
public boolean handle(Row row, SqlStatement update) throws SQLException { | |||
long id = row.getLong(1); | |||
update.setInt(1, type.getDbConstant()); | |||
update.setString(2, tagJoiner.join(tags)); | |||
update.setLong(3, now); | |||
update.setLong(4, id); | |||
return true; | |||
} | |||
}); | |||
// See algorithm to deduce type from tags in RuleTagsToTypeConverter | |||
List<String> tags = newArrayList(TAG_SPLITTER.split(defaultString(row.getNullableString(2)))); | |||
RuleType type = tagsToType(tags); | |||
tags.remove("bug"); | |||
tags.remove("security"); | |||
update.setInt(1, type.getDbConstant()); | |||
update.setString(2, TAG_JOINER.join(tags)); | |||
update.setLong(3, now); | |||
update.setLong(4, id); | |||
return true; | |||
} | |||
} | |||
static IssueType tagsToType(List<String> tags) { | |||
IssueType type = IssueType.CODE_SMELL; | |||
@VisibleForTesting | |||
static RuleType tagsToType(List<String> tags) { | |||
RuleType type = RuleType.CODE_SMELL; | |||
if (tags.contains("bug")) { | |||
type = IssueType.BUG; | |||
type = RuleType.BUG; | |||
} else if (tags.contains("security")) { | |||
type = IssueType.VULNERABILITY; | |||
type = RuleType.VULNERABILITY; | |||
} | |||
return type; | |||
} |
@@ -29,7 +29,7 @@ import org.junit.rules.ExpectedException; | |||
import org.sonar.api.issue.Issue; | |||
import org.sonar.api.utils.Duration; | |||
import org.sonar.core.issue.DefaultIssue; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.rule.RuleDto; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
@@ -59,7 +59,7 @@ public class IssueDtoTest { | |||
IssueDto dto = new IssueDto() | |||
.setKee("100") | |||
.setType(IssueType.VULNERABILITY) | |||
.setType(RuleType.VULNERABILITY) | |||
.setRuleId(1) | |||
.setRuleKey("squid", "AvoidCycle") | |||
.setLanguage("xoo") | |||
@@ -87,7 +87,7 @@ public class IssueDtoTest { | |||
DefaultIssue issue = dto.toDefaultIssue(); | |||
assertThat(issue.key()).isEqualTo("100"); | |||
assertThat(issue.type()).isEqualTo(IssueType.VULNERABILITY); | |||
assertThat(issue.type()).isEqualTo(RuleType.VULNERABILITY); | |||
assertThat(issue.ruleKey().toString()).isEqualTo("squid:AvoidCycle"); | |||
assertThat(issue.language()).isEqualTo("xoo"); | |||
assertThat(issue.componentUuid()).isEqualTo("CDEF"); |
@@ -24,7 +24,7 @@ import java.util.Collections; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.core.issue.IssueType; | |||
import org.sonar.core.rule.RuleType; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.issue.IssueDto; | |||
@@ -42,15 +42,15 @@ public class FeedIssueTypesTest { | |||
@Test | |||
public void test_tagsToType() { | |||
assertThat(tagsToType(asList("misra", "bug"))).isEqualTo(IssueType.BUG); | |||
assertThat(tagsToType(asList("misra", "security"))).isEqualTo(IssueType.VULNERABILITY); | |||
assertThat(tagsToType(asList("misra", "bug"))).isEqualTo(RuleType.BUG); | |||
assertThat(tagsToType(asList("misra", "security"))).isEqualTo(RuleType.VULNERABILITY); | |||
// "bug" has priority on "security" | |||
assertThat(tagsToType(asList("security", "bug"))).isEqualTo(IssueType.BUG); | |||
assertThat(tagsToType(asList("security", "bug"))).isEqualTo(RuleType.BUG); | |||
// default is "code smell" | |||
assertThat(tagsToType(asList("clumsy", "spring"))).isEqualTo(IssueType.CODE_SMELL); | |||
assertThat(tagsToType(Collections.<String>emptyList())).isEqualTo(IssueType.CODE_SMELL); | |||
assertThat(tagsToType(asList("clumsy", "spring"))).isEqualTo(RuleType.CODE_SMELL); | |||
assertThat(tagsToType(Collections.<String>emptyList())).isEqualTo(RuleType.CODE_SMELL); | |||
} | |||
@Test | |||
@@ -65,13 +65,13 @@ public class FeedIssueTypesTest { | |||
MigrationStep underTest = new FeedIssueTypes(db.database(), mock(System2.class)); | |||
underTest.execute(); | |||
assertType("code_smell", IssueType.CODE_SMELL); | |||
assertType("without_tags", IssueType.CODE_SMELL); | |||
assertType("bug", IssueType.BUG); | |||
assertType("code_smell", RuleType.CODE_SMELL); | |||
assertType("without_tags", RuleType.CODE_SMELL); | |||
assertType("bug", RuleType.BUG); | |||
} | |||
} | |||
private void assertType(String issueKey, IssueType expectedType) { | |||
private void assertType(String issueKey, RuleType expectedType) { | |||
Number type = (Number)db.selectFirst("select * from issues where kee='" + issueKey + "'").get("ISSUE_TYPE"); | |||
assertThat(type.intValue()).isEqualTo(expectedType.getDbConstant()); | |||
} |