Skip to content

Commit 703c4c5

Browse files
gaurabdgmuhlba91
authored andcommitted
Issue #331: add template backward compatibility
1 parent 0c35c90 commit 703c4c5

File tree

5 files changed

+109
-5
lines changed

5 files changed

+109
-5
lines changed

config/suppressions.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
<suppress checks="MagicNumber" files=".*[\\/]src[\\/]test[\\/]"/>
3333
<suppress checks="AnonInnerLength" files=".*[\\/]src[\\/]test[\\/]"/>
3434
<suppress checks="ClassDataAbstractionCoupling" files=".*[\\/]src[\\/]test[\\/]"/>
35-
<suppress checks="TrailingComment" files=".*[\\/]CheckstyleMetadata\.java"/>
35+
<suppress checks="TrailingComment" files=".*[\\/]Checkstyle(RulesDefinition|Metadata)\.java"/>
3636
</suppressions>

pom.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@
576576
<exclude>org.sonar.plugins.checkstyle.CheckstyleSeverityUtils</exclude>
577577
<exclude>org.sonar.plugins.checkstyle.CheckstyleConfiguration</exclude>
578578
<exclude>org.sonar.plugins.checkstyle.CheckstyleProfileImporter</exclude>
579+
<exclude>org.sonar.plugins.checkstyle.CheckstyleRulesDefinition</exclude>
579580
<exclude>org.sonar.plugins.checkstyle.metadata.CheckstyleMetadata</exclude>
580581
<exclude>org.sonar.plugins.checkstyle.metadata.CheckUtil</exclude>
581582
</excludes>
@@ -700,6 +701,24 @@
700701
</limit>
701702
</limits>
702703
</rule>
704+
<rule>
705+
<element>CLASS</element>
706+
<includes>
707+
<include>org.sonar.plugins.checkstyle.CheckstyleRulesDefinition</include>
708+
</includes>
709+
<limits>
710+
<limit>
711+
<counter>LINE</counter>
712+
<value>COVEREDRATIO</value>
713+
<minimum>0.90</minimum>
714+
</limit>
715+
<limit>
716+
<counter>BRANCH</counter>
717+
<value>COVEREDRATIO</value>
718+
<minimum>0.5</minimum>
719+
</limit>
720+
</limits>
721+
</rule>
703722
<rule>
704723
<element>CLASS</element>
705724
<includes>
@@ -714,7 +733,7 @@
714733
<limit>
715734
<counter>BRANCH</counter>
716735
<value>COVEREDRATIO</value>
717-
<minimum>0.92</minimum>
736+
<minimum>0.90</minimum>
718737
</limit>
719738
</limits>
720739
</rule>

src/main/java/org/sonar/plugins/checkstyle/CheckstyleRulesDefinition.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@
1919

2020
package org.sonar.plugins.checkstyle;
2121

22+
import java.io.IOException;
23+
import java.io.InputStream;
24+
import java.util.Objects;
25+
import java.util.Properties;
26+
2227
import org.sonar.api.ExtensionPoint;
2328
import org.sonar.api.batch.ScannerSide;
2429
import org.sonar.api.server.rule.RulesDefinition;
30+
import org.sonar.api.server.rule.RulesDefinitionXmlLoader;
2531
import org.sonar.plugins.checkstyle.metadata.CheckstyleMetadata;
32+
import org.sonar.squidbridge.rules.ExternalDescriptionLoader;
33+
import org.sonar.squidbridge.rules.SqaleXmlLoader;
34+
35+
import com.google.common.annotations.VisibleForTesting;
2636

2737
@ExtensionPoint
2838
@ScannerSide
@@ -33,10 +43,65 @@ public void define(Context context) {
3343
final NewRepository repository = context.createRepository(
3444
CheckstyleConstants.REPOSITORY_KEY, "java").setName(
3545
CheckstyleConstants.REPOSITORY_NAME);
46+
try {
47+
extractRulesData(repository, "/org/sonar/plugins/checkstyle/rules.xml",
48+
"/org/sonar/l10n/checkstyle/rules/checkstyle");
49+
}
50+
catch (IOException ex) {
51+
throw new IllegalStateException("Exception during extractRulesData", ex);
52+
}
3653

3754
final CheckstyleMetadata checkstyleMetadata = new CheckstyleMetadata(repository);
3855
checkstyleMetadata.createRulesWithMetadata();
3956

4057
repository.done();
4158
}
59+
60+
@VisibleForTesting
61+
static void extractRulesData(NewRepository repository, String xmlRulesFilePath,
62+
String htmlDescriptionFolder) throws IOException {
63+
final RulesDefinitionXmlLoader ruleLoader = new RulesDefinitionXmlLoader();
64+
try (InputStream resource = CheckstyleRulesDefinition.class
65+
.getResourceAsStream(xmlRulesFilePath)) {
66+
ruleLoader.load(repository, resource, "UTF-8");
67+
}
68+
ExternalDescriptionLoader.loadHtmlDescriptions(repository, // NOSONAR
69+
htmlDescriptionFolder);
70+
try (InputStream resource = CheckstyleRulesDefinition.class
71+
.getResourceAsStream("/org/sonar/l10n/checkstyle.properties")) {
72+
loadNames(repository, resource);
73+
}
74+
SqaleXmlLoader.load(repository, "/com/sonar/sqale/checkstyle-model.xml"); // NOSONAR
75+
}
76+
77+
private static void loadNames(NewRepository repository, InputStream stream) {
78+
// code taken from:
79+
// https://github.com/SonarSource/sslr-squid-bridge/blob/2.5.2/
80+
// src/main/java/org/sonar/squidbridge/rules/PropertyFileLoader.java#L46
81+
final Properties properties = new Properties();
82+
try {
83+
properties.load(stream);
84+
}
85+
catch (IOException ex) {
86+
throw new IllegalArgumentException("Could not read names from properties", ex);
87+
}
88+
89+
if (Objects.nonNull(repository.rules())) {
90+
repository.rules().forEach(rule -> {
91+
final String baseKey = "rule." + repository.key() + "." + rule.key();
92+
final String nameKey = baseKey + ".name";
93+
final String ruleName = properties.getProperty(nameKey);
94+
if (Objects.nonNull(ruleName)) {
95+
rule.setName(ruleName);
96+
}
97+
rule.params().forEach(param -> {
98+
final String paramDescriptionKey = baseKey + ".param." + param.key();
99+
final String paramDescription = properties.getProperty(paramDescriptionKey);
100+
if (Objects.nonNull(paramDescription)) {
101+
param.setDescription(paramDescription);
102+
}
103+
});
104+
});
105+
}
106+
}
42107
}

src/main/java/org/sonar/plugins/checkstyle/metadata/CheckstyleMetadata.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,10 @@ public void createRulesWithMetadata() {
100100
final SonarRulePropertyLoader.AdditionalRuleProperties additionalDetails =
101101
additionalRuleData.get(check.getKey());
102102
final RulesDefinition.NewRule rule =
103-
repository.createRule(moduleDetails.getFullQualifiedName());
103+
repository.createRule(moduleDetails.getFullQualifiedName()
104+
+ "template");
104105
rule.setHtmlDescription(moduleDetails.getDescription())
105-
.setName(getFullCheckName(moduleDetails.getName()))
106+
.setName(getFullCheckName(moduleDetails.getName()) + " Template")
106107
.setInternalKey(getInternalKey(moduleDetails))
107108
.setSeverity("MINOR")
108109
.setStatus(RuleStatus.READY);

src/test/java/org/sonar/plugins/checkstyle/CheckstyleRulesDefinitionTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121

2222
import static org.fest.assertions.Assertions.assertThat;
2323

24+
import java.util.HashMap;
2425
import java.util.List;
26+
import java.util.Map;
27+
import java.util.stream.Collectors;
2528

2629
import org.junit.Rule;
2730
import org.junit.Test;
@@ -61,7 +64,23 @@ public void test() {
6164
assertThat(repository.language()).isEqualTo("java");
6265

6366
final List<RulesDefinition.Rule> rules = repository.rules();
64-
assertThat(rules).hasSize(179);
67+
final Map<String, Integer> ruleCounts = new HashMap<>();
68+
rules.forEach(rule -> {
69+
final String name = rule.key().replace("template", "");
70+
ruleCounts.merge(name, 1, Integer::sum);
71+
});
72+
final List<String> duplicatedRuleWithTemplate = ruleCounts.entrySet().stream()
73+
.filter(entry -> entry.getValue() > 1)
74+
.map(entry -> entry.getKey())
75+
.collect(Collectors.toList());
76+
final List<String> rulesWithDuplicateTemplate = ruleCounts.entrySet().stream()
77+
.filter(entry -> entry.getValue() == 1)
78+
.map(entry -> entry.getKey())
79+
.collect(Collectors.toList());
80+
// such number should not change during checkstyle version upgrade
81+
assertThat(duplicatedRuleWithTemplate).hasSize(174);
82+
// all new Rules should fall in this group
83+
assertThat(rulesWithDuplicateTemplate).hasSize(5);
6584

6685
for (RulesDefinition.Rule rule : rules) {
6786
assertThat(rule.key()).isNotNull();

0 commit comments

Comments
 (0)