Skip to content

Commit c634e97

Browse files
alban-auzeillpynicolas
authored andcommitted
SONARPY-238 Drop usage of last squid-bridge component SqaleXmlLoader (SonarSource#114)
1 parent fa06568 commit c634e97

11 files changed

Lines changed: 252 additions & 2317 deletions

File tree

pom.xml

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<sonar.orchestrator.version>3.14.0.887</sonar.orchestrator.version>
9292
<sonarlint-core.version>2.4.1</sonarlint-core.version>
9393
<sslr.version>1.21</sslr.version>
94-
<sslr.squid.bridge.version>2.6.1</sslr.squid.bridge.version>
94+
<sslr.xpath.version>1.20</sslr.xpath.version>
9595
<woodstox.version>4.4.1</woodstox.version>
9696
</properties>
9797

@@ -115,23 +115,9 @@
115115
<version>${sslr.version}</version>
116116
</dependency>
117117
<dependency>
118-
<groupId>org.sonarsource.sslr-squid-bridge</groupId>
119-
<artifactId>sslr-squid-bridge</artifactId>
120-
<version>${sslr.squid.bridge.version}</version>
121-
<exclusions>
122-
<exclusion>
123-
<groupId>org.codehaus.sonar</groupId>
124-
<artifactId>sonar-plugin-api</artifactId>
125-
</exclusion>
126-
<exclusion>
127-
<groupId>org.codehaus.sonar.sslr</groupId>
128-
<artifactId>sslr-core</artifactId>
129-
</exclusion>
130-
<exclusion>
131-
<groupId>org.picocontainer</groupId>
132-
<artifactId>picocontainer</artifactId>
133-
</exclusion>
134-
</exclusions>
118+
<groupId>org.codehaus.sonar.sslr</groupId>
119+
<artifactId>sslr-xpath</artifactId>
120+
<version>${sslr.xpath.version}</version>
135121
</dependency>
136122
<dependency>
137123
<groupId>org.sonarsource.analyzer-commons</groupId>

python-squid/pom.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@
1818
<artifactId>sslr-core</artifactId>
1919
</dependency>
2020
<dependency>
21-
<groupId>org.sonarsource.sslr-squid-bridge</groupId>
22-
<artifactId>sslr-squid-bridge</artifactId>
21+
<groupId>org.codehaus.sonar.sslr</groupId>
22+
<artifactId>sslr-xpath</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.slf4j</groupId>
26+
<artifactId>slf4j-api</artifactId>
2327
</dependency>
2428
<dependency>
2529
<groupId>org.sonarsource.sonarqube</groupId>

python-squid/src/main/java/org/sonar/python/PythonConfiguration.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,18 @@
2020
package org.sonar.python;
2121

2222
import java.nio.charset.Charset;
23-
import org.sonar.squidbridge.api.SquidConfiguration;
2423

25-
public class PythonConfiguration extends SquidConfiguration {
24+
public class PythonConfiguration {
2625

26+
private Charset charset;
27+
private boolean stopSquidOnException = false;
2728
private boolean ignoreHeaderComments;
2829

2930
public PythonConfiguration(Charset charset) {
30-
super(charset);
31+
this.charset = charset;
3132
}
3233

34+
// TODO this method seems to be unused, should we create plugin property to ignore header comments?
3335
public void setIgnoreHeaderComments(boolean ignoreHeaderComments) {
3436
this.ignoreHeaderComments = ignoreHeaderComments;
3537
}
@@ -38,4 +40,16 @@ public boolean getIgnoreHeaderComments() {
3840
return ignoreHeaderComments;
3941
}
4042

43+
public Charset getCharset() {
44+
return charset;
45+
}
46+
47+
public void setStopSquidOnException(boolean stopSquidOnException) {
48+
this.stopSquidOnException = stopSquidOnException;
49+
}
50+
51+
public boolean stopSquidOnException() {
52+
return stopSquidOnException;
53+
}
54+
4155
}

python-squid/src/main/java/org/sonar/python/api/PythonMetric.java

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,12 @@
1919
*/
2020
package org.sonar.python.api;
2121

22-
import org.sonar.squidbridge.measures.CalculatedMetricFormula;
23-
import org.sonar.squidbridge.measures.MetricDef;
24-
25-
public enum PythonMetric implements MetricDef {
22+
public enum PythonMetric {
2623
FILES,
2724
LINES_OF_CODE,
2825
STATEMENTS,
2926
FUNCTIONS,
3027
CLASSES,
3128
COMPLEXITY,
32-
COMMENT_LINES;
33-
34-
@Override
35-
public String getName() {
36-
return name();
37-
}
38-
39-
@Override
40-
public boolean isCalculatedMetric() {
41-
return false;
42-
}
43-
44-
@Override
45-
public boolean aggregateIfThereIsAlreadyAValue() {
46-
return true;
47-
}
48-
49-
@Override
50-
public boolean isThereAggregationFormula() {
51-
return true;
52-
}
53-
54-
@Override
55-
public CalculatedMetricFormula getCalculatedMetricFormula() {
56-
return null;
57-
}
58-
29+
COMMENT_LINES
5930
}

python-squid/src/test/java/org/sonar/python/api/PythonMetricTest.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,6 @@ public class PythonMetricTest {
2828
@Test
2929
public void test() {
3030
assertThat(PythonMetric.values()).hasSize(7);
31-
32-
for (PythonMetric metric : PythonMetric.values()) {
33-
assertThat(metric.getName()).isEqualTo(metric.name());
34-
assertThat(metric.isCalculatedMetric()).isFalse();
35-
assertThat(metric.aggregateIfThereIsAlreadyAValue()).isTrue();
36-
assertThat(metric.isThereAggregationFormula()).isTrue();
37-
assertThat(metric.getCalculatedMetricFormula()).isNull();
38-
}
3931
}
4032

4133
}

sonar-python-plugin/pom.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
<groupId>org.codehaus.woodstox</groupId>
5555
<artifactId>woodstox-core-lgpl</artifactId>
5656
</dependency>
57-
<!-- Used by PylintRuleRepository->org.sonar.squidbridge.rules.SqaleXmlLoader -->
5857
<dependency>
5958
<groupId>org.codehaus.staxmate</groupId>
6059
<artifactId>staxmate</artifactId>
@@ -117,8 +116,8 @@
117116
<configuration>
118117
<rules>
119118
<requireFilesSize>
120-
<minsize>3700000</minsize>
121-
<maxsize>4000000</maxsize>
119+
<minsize>3500000</minsize>
120+
<maxsize>3700000</maxsize>
122121
<files>
123122
<file>${project.build.directory}/${project.build.finalName}.jar</file>
124123
</files>

sonar-python-plugin/src/main/java/org/sonar/plugins/python/pylint/PylintRuleRepository.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@
1919
*/
2020
package org.sonar.plugins.python.pylint;
2121

22-
import com.google.common.base.Charsets;
22+
import java.util.HashMap;
23+
import java.util.Map;
24+
import java.util.Scanner;
2325
import org.sonar.api.server.rule.RulesDefinition;
2426
import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
2527
import org.sonar.plugins.python.Python;
26-
import org.sonar.squidbridge.rules.SqaleXmlLoader;
28+
29+
import static java.nio.charset.StandardCharsets.UTF_8;
2730

2831
public class PylintRuleRepository implements RulesDefinition {
2932

3033
public static final String REPOSITORY_NAME = "Pylint";
3134
public static final String REPOSITORY_KEY = REPOSITORY_NAME;
3235

3336
private static final String RULES_FILE = "/org/sonar/plugins/python/pylint/rules.xml";
34-
private static final String SQALE_FILE = "/com/sonar/sqale/python-model.xml";
37+
private static final String REMEDIATION_FILE = "/org/sonar/plugins/python/pylint/remediation-cost.csv";
38+
3539
private final RulesDefinitionXmlLoader xmlLoader;
3640

3741
public PylintRuleRepository(RulesDefinitionXmlLoader xmlLoader) {
@@ -41,10 +45,34 @@ public PylintRuleRepository(RulesDefinitionXmlLoader xmlLoader) {
4145
@Override
4246
public void define(Context context) {
4347
NewRepository repository = context
44-
.createRepository(REPOSITORY_KEY, Python.KEY)
45-
.setName(REPOSITORY_NAME);
46-
xmlLoader.load(repository, getClass().getResourceAsStream(RULES_FILE), Charsets.UTF_8.name());
47-
SqaleXmlLoader.load(repository, SQALE_FILE);
48+
.createRepository(REPOSITORY_KEY, Python.KEY)
49+
.setName(REPOSITORY_NAME);
50+
xmlLoader.load(repository, getClass().getResourceAsStream(RULES_FILE), UTF_8.name());
51+
defineRemediationFunction(repository);
4852
repository.done();
4953
}
54+
55+
private static void defineRemediationFunction(NewRepository repository) {
56+
Map<String, String> remediationCostMap = loadRemediationCostMap();
57+
for (NewRule rule : repository.rules()) {
58+
String gap = remediationCostMap.get(rule.key());
59+
if (gap == null) {
60+
throw new IllegalStateException("Missing remediation cost for rule " + rule.key());
61+
} else if (!gap.equals("null")) {
62+
rule.setDebtRemediationFunction(rule.debtRemediationFunctions().linear(gap));
63+
}
64+
}
65+
}
66+
67+
private static Map<String, String> loadRemediationCostMap() {
68+
Map<String, String> map = new HashMap<>();
69+
try (Scanner scanner = new Scanner(PylintRuleRepository.class.getResourceAsStream(REMEDIATION_FILE), UTF_8.name())) {
70+
while (scanner.hasNext()) {
71+
String[] cols = scanner.next().split(",");
72+
map.put(cols[0], cols[1]);
73+
}
74+
}
75+
return map;
76+
}
77+
5078
}

0 commit comments

Comments
 (0)