Skip to content

Commit 31e8729

Browse files
authored
Merge pull request #2179 from guwirth/other-repository
Make the loading of other rules more robust.
2 parents 4f75be3 + 8c74791 commit 31e8729

File tree

2 files changed

+69
-12
lines changed

2 files changed

+69
-12
lines changed

cxx-sensors/src/main/java/org/sonar/cxx/sensors/other/CxxOtherRepository.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,23 @@ public CxxOtherRepository(Configuration config, RulesDefinitionXmlLoader xmlRule
5454
public void define(Context context) {
5555
var repository = context.createRepository(KEY, "cxx")
5656
.setName(NAME);
57+
var validate = context.createRepository("Validate", "cxx")
58+
.setName("validate");
5759

5860
xmlRuleLoader.load(repository, getClass().getResourceAsStream("/external-rule.xml"), StandardCharsets.UTF_8.name());
5961
for (var ruleDefs : this.config.getStringArray(CxxOtherSensor.RULES_KEY)) {
6062
if (ruleDefs != null && !ruleDefs.trim().isEmpty()) {
6163
try {
64+
// read rules first into dummy repository to check if there are errors
65+
xmlRuleLoader.load(validate, new StringReader(ruleDefs));
66+
// in case of no errors read again into real repository
6267
xmlRuleLoader.load(repository, new StringReader(ruleDefs));
6368
} catch (IllegalStateException e) {
64-
LOG.error("Cannot load Rules Definions '{}'", e.getMessage());
69+
// In case of an error, ignore the whole XML block. The loading happens during the server start,
70+
// errors are critical and can cause that the server cannot be started anymore.
71+
var xml = ruleDefs.substring(0, Math.min(ruleDefs.length(), 120))
72+
.replaceAll("\\R", "").replaceAll(">[ ]+<", "><");
73+
LOG.error("Cannot load rule definions for 'sonar.cxx.other.rules', '{}', XML '{}...'", e.getMessage(), xml);
6574
}
6675
}
6776
}

cxx-sensors/src/test/java/org/sonar/cxx/sensors/other/CxxOtherRepositoryTest.java

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,33 @@ public class CxxOtherRepositoryTest {
4646

4747
private final String profile2 = "<?xml version=\"1.0\" encoding=\"ASCII\"?>\n"
4848
+ "<rules>\n"
49-
+ " <rule key=\"key\">\n"
50-
+ " <name><![CDATA[name]]></name>\n"
51-
+ " <configKey><![CDATA[configKey]]></configKey>\n"
52-
+ " <category name=\"category\" />\n"
53-
+ " <description><![CDATA[description]]></description>\n"
49+
+ " <rule key=\"key1\">\n"
50+
+ " <name><![CDATA[name1]]></name>\n"
51+
+ " <configKey><![CDATA[configKey1]]></configKey>\n"
52+
+ " <category name=\"category1\" />\n"
53+
+ " <description><![CDATA[description1]]></description>\n"
54+
+ " </rule>\n"
55+
+ " <rule key=\"key2\">\n"
56+
+ " <name><![CDATA[name2]]></name>\n"
57+
+ " <configKey><![CDATA[configKey2]]></configKey>\n"
58+
+ " <category name=\"category2\" />\n"
59+
+ " <description><![CDATA[description2]]></description>\n"
60+
+ " </rule>\n"
61+
+ "</rules>";
62+
63+
private final String profile3 = "<?xml version=\"1.0\" encoding=\"ASCII\"?>\n"
64+
+ "<rules>\n"
65+
+ " <rule key=\"key1\">\n"
66+
+ " <name><![CDATA[name1]]></name>\n"
67+
+ " <configKey><![CDATA[configKey1]]></configKey>\n"
68+
+ " <category name=\"category1\" />\n"
69+
+ " <description><![CDATA[description1]]></description>\n"
70+
+ " </rule>\n"
71+
+ " <rule key=\"key3\">\n"
72+
+ " <name><![CDATA[name3]]></name>\n"
73+
+ " <configKey><![CDATA[configKey3]]></configKey>\n"
74+
+ " <category name=\"category3\" />\n"
75+
+ " <description><![CDATA[description3]]></description>\n"
5476
+ " </rule>\n"
5577
+ "</rules>";
5678

@@ -99,15 +121,41 @@ public void verifyRuleValuesTest() {
99121
def.define(context);
100122

101123
RulesDefinition.Repository repo = context.repository(CxxOtherRepository.KEY);
102-
var rule = repo.rule("key");
124+
var rule = repo.rule("key1");
103125
assertThat(rule).isNotNull();
104126

105-
// from rule.xml
106-
assertThat(rule.key()).isEqualTo("key");
107-
assertThat(rule.name()).isEqualTo("name");
108-
assertThat(rule.internalKey()).isEqualTo("configKey");
109-
assertThat(rule.htmlDescription()).isEqualTo("description");
127+
assertThat(rule.key()).isEqualTo("key1");
128+
assertThat(rule.name()).isEqualTo("name1");
129+
assertThat(rule.internalKey()).isEqualTo("configKey1");
130+
assertThat(rule.htmlDescription()).isEqualTo("description1");
131+
}
132+
133+
@Test
134+
public void verifyRulesWithSameKey() {
135+
settings.setProperty(CxxOtherSensor.RULES_KEY, profile2 + "," + profile3);
136+
var def = new CxxOtherRepository(settings.asConfig(), new RulesDefinitionXmlLoader());
137+
138+
var context = new RulesDefinition.Context();
139+
def.define(context);
140+
141+
RulesDefinition.Repository repo = context.repository(CxxOtherRepository.KEY);
142+
assertThat(repo.rules()).hasSize(3);
143+
144+
var rule = repo.rule("key1");
145+
assertThat(rule).isNotNull();
146+
147+
assertThat(rule.key()).isEqualTo("key1");
148+
assertThat(rule.name()).isEqualTo("name1");
149+
assertThat(rule.internalKey()).isEqualTo("configKey1");
150+
assertThat(rule.htmlDescription()).isEqualTo("description1");
151+
152+
rule = repo.rule("key2");
153+
assertThat(rule).isNotNull();
110154

155+
assertThat(rule.key()).isEqualTo("key2");
156+
assertThat(rule.name()).isEqualTo("name2");
157+
assertThat(rule.internalKey()).isEqualTo("configKey2");
158+
assertThat(rule.htmlDescription()).isEqualTo("description2");
111159
}
112160

113161
}

0 commit comments

Comments
 (0)