Skip to content

Commit 782fa15

Browse files
committed
Update rules handling
1 parent 0494164 commit 782fa15

File tree

23 files changed

+360
-274
lines changed

23 files changed

+360
-274
lines changed

src/sonar-sql-plugin/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>org.sonar.plugins</groupId>
77
<artifactId>sonar-sql-plugin</artifactId>
8-
<version>1.0.2</version>
8+
<version>1.0.3</version>
99
<packaging>sonar-plugin</packaging>
1010

1111
<name>SQL language plugin</name>

src/sonar-sql-plugin/src/main/java/org/antlr/sql/sca/IssuesProvider.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package org.antlr.sql.sca;
22

3-
import java.util.ArrayList;
43
import java.util.List;
54
import java.util.Map;
65

76
import org.antlr.sql.models.AntlrContext;
87
import org.antlr.sql.sca.nodes.IParsedNode;
98
import org.antlr.sql.visitors.RulesMatchingVisitor;
109
import org.sonar.plugins.sql.issues.SqlIssue;
10+
import org.sonar.plugins.sql.issues.SqlIssuesList;
1111
import org.sonar.plugins.sql.models.rules.RuleImplementation;
1212

1313
public class IssuesProvider {
1414
ViolationsAnalyzer violationsAnalyzer = new ViolationsAnalyzer();
1515
ViolationsSearcher searcher = new ViolationsSearcher();
1616

17-
public List<SqlIssue> analyze(AntlrContext ctx) {
18-
List<SqlIssue> foundIssues = new ArrayList<>();
17+
public SqlIssuesList analyze(AntlrContext ctx) {
18+
SqlIssuesList list = new SqlIssuesList();
19+
1920
RulesMatchingVisitor visitor = new RulesMatchingVisitor(ctx.getRules());
2021
visitor.visit(ctx.root);
2122

@@ -34,10 +35,11 @@ public List<SqlIssue> analyze(AntlrContext ctx) {
3435
e.isAdhoc = m.sqlRules.isIsAdhoc();
3536
e.message = m.rule.getRuleImplementation().getRuleViolationMessage();
3637
e.name = m.rule.getName();
37-
foundIssues.add(e);
38+
e.isExternal = m.sqlRules.getIsExternal();
39+
list.addIssue(e);
3840
}
3941

4042
}
41-
return foundIssues;
43+
return list;
4244
}
4345
}

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public final class Constants {
1313

1414
public static final String PLUGIN_SQL_EXTERNAL_RULES_SUFFIX = "sonar.sql.rules.suffixes";
1515

16+
public static final String PLUGIN_SQL_RULES_SKIP= "sonar.sql.rules.skip";
17+
1618
public static final String PLUGIN_SQL_EXTERNAL_RULES_SEARCH_PATH = "sonar.sql.rules.path";
1719

1820
public static final String PLUGIN_SQL_EXTERNAL_RULES_SEARCH_PATH_DEFAULT = ".";

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/SQLPlugin.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public void define(Context context) {
2020
.name("Custom rules search path").description("Path/File to custom rules").multiValues(true)
2121
.defaultValue(Constants.PLUGIN_SQL_EXTERNAL_RULES_SEARCH_PATH_DEFAULT).type(PropertyType.STRING)
2222
.build());
23+
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SQL_RULES_SKIP).name("Skipped rules")
24+
.description("List of 'repo:ruleKey' keys of repo:key of rules to skip reporting, i.e. tsql-cg:ST008").multiValues(true)
25+
.type(PropertyType.STRING).build());
2326

2427
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SQL_EXTERNAL_RULES_SUFFIX)
2528
.name("Custom rules file suffixes").description("Custom rules suffix")
@@ -42,23 +45,20 @@ public void define(Context context) {
4245
.description("File/Search suffix for MS T-SQL analysis report")
4346
.defaultValue(Constants.TSQL_MS_ISSUES_DEFAULT).type(PropertyType.STRING).build());
4447

45-
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SUFFIXES)
46-
.name("File suffixes").description("File suffixes which will be reported belonging to SQL langauge").multiValues(true)
47-
.defaultValue(".sql").type(PropertyType.STRING)
48-
.build());
49-
50-
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SQL_SCA_TIMEOUT)
51-
.name("SCA timeout")
48+
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SUFFIXES).name("File suffixes")
49+
.description("File suffixes which will be reported belonging to SQL langauge").multiValues(true)
50+
.defaultValue(".sql").type(PropertyType.STRING).build());
51+
52+
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SQL_SCA_TIMEOUT).name("SCA timeout")
5253
.description("Timeout value for full code analysis done by plugin in seconds")
53-
.defaultValue(Constants.PLUGIN_SQL_SCA_TIMEOUT_DEFAULT+"").type(PropertyType.INTEGER).build());
54-
54+
.defaultValue(Constants.PLUGIN_SQL_SCA_TIMEOUT_DEFAULT + "").type(PropertyType.INTEGER).build());
55+
5556
context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SQL_SCA_MAX_FILE_SIZE)
56-
.name("SCA file size limit")
57-
.description("Limit in bytes for files to be analyzed by plugin")
57+
.name("SCA file size limit").description("Limit in bytes for files to be analyzed by plugin")
5858
.defaultValue(Constants.PLUGIN_SQL_SCA_MAX_FILE_SIZE_DEFAULT + "").type(PropertyType.INTEGER).build());
59-
60-
context.addExtensions(SQLLanguage.class, SQLRulesDefinition.class,
61-
MsRulesDefinition.class, SQLQualityProfile.class);
59+
60+
context.addExtensions(SQLLanguage.class, SQLRulesDefinition.class, MsRulesDefinition.class,
61+
SQLQualityProfile.class);
6262
context.addExtensions(SQLSensor.class, MSIssuesSensor.class, CGIssuesSensor.class, SqlCoverCoverageSensor.class,
6363
SqlCheckSensor.class);
6464

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/adhoc/AdhocRulesProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ protected static SqlRules read(final File file) throws Exception {
176176
rules.setDialect(XmlHelper.readAttribute(root, "dialect", "tsql"));
177177
rules.setRepoName(XmlHelper.readAttribute(root, "repoName", null));
178178
rules.setRepoKey(XmlHelper.readAttribute(root, "repoKey", null));
179-
rules.setIsAdhoc(Boolean.parseBoolean(XmlHelper.readAttribute(root, "isAdhoc", "true")));
180-
179+
rules.setIsAdhoc(true);
180+
rules.setIsExternal(true);
181181
NodeList list = doc.getElementsByTagName("rule");
182182
for (int i = 0; i < list.getLength(); i++) {
183183
try {

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/fillers/CpdTokensFiller.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
import org.antlr.sql.models.AntlrContext;
66
import org.antlr.v4.runtime.Token;
7+
import org.apache.commons.lang3.StringUtils;
78
import org.sonar.api.batch.fs.InputFile;
9+
import org.sonar.api.batch.fs.TextRange;
810
import org.sonar.api.batch.fs.internal.DefaultInputFile;
911
import org.sonar.api.batch.sensor.SensorContext;
1012
import org.sonar.api.batch.sensor.cpd.NewCpdTokens;
@@ -24,19 +26,26 @@ public void fill(InputFile file, SensorContext context, AntlrContext antlrContex
2426
List<? extends Token> tokens = antlrContext.getAllTokens();
2527
DefaultInputFile defaultInputFile = (DefaultInputFile) file;
2628
for (Token token : tokens) {
27-
if (token.getStopIndex() <= token.getStartIndex()) {
28-
continue;
29-
}
3029
try {
31-
newCpdTokens.addToken(defaultInputFile.newRange(token.getStartIndex(), token.getStopIndex() + 1),
32-
token.getText());
30+
final String text = token.getText();
31+
if (token.getType() == -1 || token.getStartIndex() >= token.getStopIndex()
32+
|| StringUtils.isEmpty(text)) {
33+
continue;
34+
}
35+
36+
final TextRange range = defaultInputFile.newRange(token.getStartIndex(), token.getStopIndex() + 1);
37+
defaultInputFile.validate(range);
38+
newCpdTokens.addToken(range, text);
39+
3340
} catch (Throwable e) {
34-
e.printStackTrace();
41+
if (LOGGER.isDebugEnabled()) {
42+
LOGGER.debug("Cannot add range: {} on file {} for token {}", e, file, token);
43+
}
3544
}
3645
}
37-
38-
newCpdTokens.save();
39-
46+
synchronized (context) {
47+
newCpdTokens.save();
48+
}
4049
} catch (Throwable e) {
4150
LOGGER.warn("Error adding cpd tokens on " + file, e);
4251

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/fillers/HighlighterFiller.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.antlr.sql.models.AntlrContext;
66
import org.antlr.v4.runtime.Token;
7+
import org.apache.commons.lang3.StringUtils;
78
import org.sonar.api.batch.fs.InputFile;
89
import org.sonar.api.batch.sensor.SensorContext;
910
import org.sonar.api.batch.sensor.highlighting.NewHighlighting;
@@ -23,9 +24,12 @@ public void fill(InputFile file, SensorContext context, AntlrContext antlrContex
2324
List<? extends Token> tokens = antlrContext.getAllTokens();
2425
for (Token token : tokens) {
2526
try {
26-
if (token.getStopIndex() <= token.getStartIndex()) {
27+
final String text = token.getText();
28+
if (token.getType() == -1 || token.getStartIndex() >= token.getStopIndex()
29+
|| StringUtils.isEmpty(text)) {
2730
continue;
2831
}
32+
2933
if (antlrContext.isComment(token)) {
3034
newHighlighting.highlight(token.getStartIndex(), token.getStopIndex() + 1, TypeOfText.COMMENT);
3135
continue;

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/fillers/IssuesFiller.java

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,28 @@
11
package org.sonar.plugins.sql.fillers;
22

3-
import java.util.List;
3+
import java.io.IOException;
44

55
import org.antlr.sql.models.AntlrContext;
66
import org.antlr.sql.sca.IssuesProvider;
77
import org.sonar.api.batch.fs.InputFile;
8-
import org.sonar.api.batch.rule.Severity;
98
import org.sonar.api.batch.sensor.SensorContext;
10-
import org.sonar.api.batch.sensor.issue.NewExternalIssue;
11-
import org.sonar.api.batch.sensor.issue.NewIssue;
12-
import org.sonar.api.batch.sensor.issue.NewIssueLocation;
13-
import org.sonar.api.batch.sensor.rule.NewAdHocRule;
14-
import org.sonar.api.rule.RuleKey;
15-
import org.sonar.api.rules.RuleType;
169
import org.sonar.api.utils.log.Logger;
1710
import org.sonar.api.utils.log.Loggers;
18-
import org.sonar.plugins.sql.issues.SqlIssue;
11+
import org.sonar.plugins.sql.issues.SqlIssuesList;
12+
import org.sonar.plugins.sql.sensors.BaseSensor;
1913

20-
public class IssuesFiller implements Filler {
14+
public class IssuesFiller extends BaseSensor implements Filler {
2115
private static final Logger LOGGER = Loggers.get(IssuesFiller.class);
2216
private final IssuesProvider provider = new IssuesProvider();
2317

2418
@Override
2519
public void fill(InputFile file, SensorContext context, AntlrContext antlrContext) {
2620

27-
List<SqlIssue> issues = provider.analyze(antlrContext);
28-
29-
synchronized (context) {
30-
for (SqlIssue issue : issues) {
31-
try {
32-
if (issue.isAdhoc) {
33-
NewAdHocRule rule = context.newAdHocRule();
34-
rule.description(issue.getDescription()).engineId(issue.getRepo()).name(issue.getName())
35-
.ruleId(issue.getKey()).severity(Severity.valueOf(issue.getSeverity()))
36-
.type(RuleType.CODE_SMELL).save();
37-
38-
NewExternalIssue iss = context.newExternalIssue();
39-
NewIssueLocation loc = iss.newLocation().on(file).at(file.selectLine(issue.getLine()))
40-
.message(issue.getMessage());
41-
iss.at(loc).engineId(issue.getRepo()).ruleId(issue.getKey()).type(RuleType.CODE_SMELL)
42-
.severity(Severity.valueOf(issue.getSeverity())).save();
43-
continue;
44-
}
45-
NewIssue iss = context.newIssue();
46-
NewIssueLocation loc = iss.newLocation().on(file).at(file.selectLine(issue.getLine()))
47-
.message(issue.getMessage());
48-
iss.at(loc).forRule(RuleKey.of(issue.getRepo(), issue.getKey())).save();
49-
} catch (Exception e) {
50-
LOGGER.warn("Unexpected error adding issue: " + issue.repo + " " + issue.getKey() + " at " + file,
51-
e);
52-
}
53-
}
21+
try {
22+
SqlIssuesList list = provider.analyze(antlrContext);
23+
addIssues(context, list, file);
24+
} catch (IOException e1) {
25+
LOGGER.warn("Unexpected error adding issues", e1);
5426
}
5527

5628
}

src/sonar-sql-plugin/src/main/java/org/sonar/plugins/sql/issues/SqlIssue.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public int hashCode() {
2424
return result;
2525
}
2626

27+
public String getUniqueKey() {
28+
return this.repo + ":" + this.key;
29+
}
30+
2731
@Override
2832
public boolean equals(Object obj) {
2933
if (this == obj)
@@ -79,6 +83,10 @@ public boolean equals(Object obj) {
7983

8084
public String repo;
8185
public String fileName;
86+
public boolean isExternal = true;
87+
public boolean isExternal() {
88+
return isExternal;
89+
}
8290

8391
public String getFileName() {
8492
return fileName;

0 commit comments

Comments
 (0)