Skip to content

Commit 22cdf3f

Browse files
Fix bugs and code smells
1 parent a4da7f4 commit 22cdf3f

File tree

4 files changed

+76
-80
lines changed

4 files changed

+76
-80
lines changed

src/main/java/fr/cnes/sonar/plugins/icode/languages/ICodeQualityProfiles.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,14 @@
1616
*/
1717
package fr.cnes.sonar.plugins.icode.languages;
1818

19-
import fr.cnes.sonar.plugins.icode.model.Rule;
20-
import fr.cnes.sonar.plugins.icode.model.RulesDefinition;
21-
import fr.cnes.sonar.plugins.icode.model.XmlHandler;
2219
import fr.cnes.sonar.plugins.icode.rules.ICodeRulesDefinition;
2320
import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition;
2421
import org.sonar.api.utils.log.Logger;
2522
import org.sonar.api.utils.log.Loggers;
2623
import org.sonar.api.server.rule.RulesDefinition.NewRule;
2724

28-
import java.util.ArrayList;
2925
import java.util.List;
3026

31-
import java.io.InputStream;
32-
3327
/**
3428
* Built-in quality profile format since SonarQube 9.9
3529
*/
@@ -48,8 +42,8 @@ public final class ICodeQualityProfiles implements BuiltInQualityProfilesDefinit
4842
*/
4943
@Override
5044
public void define(final Context context) {
51-
createBuiltInProfile(context, ICodeRulesDefinition.FORTRAN77_REPOSITORY, Fortran77Language.KEY, ICodeRulesDefinition.f77Rules);
52-
createBuiltInProfile(context, ICodeRulesDefinition.FORTRAN90_REPOSITORY, Fortran90Language.KEY, ICodeRulesDefinition.f90Rules);
45+
createBuiltInProfile(context, ICodeRulesDefinition.FORTRAN77_REPOSITORY, Fortran77Language.KEY, ICodeRulesDefinition.getF77Rules());
46+
createBuiltInProfile(context, ICodeRulesDefinition.FORTRAN90_REPOSITORY, Fortran90Language.KEY, ICodeRulesDefinition.getF90Rules());
5347
}
5448

5549
/**

src/main/java/fr/cnes/sonar/plugins/icode/measures/ICodeMetricsProcessor.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,9 @@ public static void saveMeasure(final SensorContext context, final Map<String, In
7878
if(metricScope.equals(CLASS)) {
7979
// Get i-Code rule id to test if issue must be saved here.
8080
final String metricKey = icodeMeasure.getAnalysisRuleId();
81-
// Take F77 / F90 ncloc into account
81+
// Take F77 / F90 ncloc and number of comment lines into account
8282
if (metricKey.contains("MET.Line")) {
8383
saveSonarQubeNewMeasure(context, files, CoreMetrics.NCLOC, icodeMeasure);
84-
}
85-
// Take F77 / F90 number of comment lines into account
86-
else if (metricKey.contains("MET.Line")) {
8784
saveSonarQubeNewMeasure(context, files, CoreMetrics.COMMENT_LINES, icodeMeasure);
8885
}
8986
}

src/main/java/fr/cnes/sonar/plugins/icode/rules/ICodeRulesDefinition.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import org.sonar.api.rule.RuleKey;
2020
import org.sonar.api.rule.RuleStatus;
21-
import org.sonar.api.rule.Severity;
2221
import org.sonar.api.rules.RuleType;
2322
import org.sonar.api.server.rule.RulesDefinition;
2423

@@ -30,13 +29,10 @@
3029
import fr.cnes.sonar.plugins.icode.settings.ICodePluginProperties;
3130

3231
import java.io.InputStream;
33-
import java.nio.charset.StandardCharsets;
3432
import java.util.ArrayList;
3533
import java.util.List;
3634

37-
import java.io.File;
3835
import javax.xml.parsers.DocumentBuilderFactory;
39-
import javax.xml.parsers.DocumentBuilder;
4036
import org.w3c.dom.Document;
4137
import org.w3c.dom.NodeList;
4238
import org.w3c.dom.Node;
@@ -65,8 +61,8 @@ public class ICodeRulesDefinition implements RulesDefinition {
6561
/** Path to xml file in resources tree (fortran 90 rules). **/
6662
public static final String PATH_TO_F90_RULES_XML = "/rules/icode-f90-rules.xml";
6763

68-
public static List<NewRule> f77Rules;
69-
public static List<NewRule> f90Rules;
64+
private static List<NewRule> f77Rules;
65+
private static List<NewRule> f90Rules;
7066

7167
/**
7268
* Define i-Code rules in SonarQube thanks to xml configuration files.
@@ -103,6 +99,7 @@ protected List<NewRule> createFortranRepository(final Context context, final Str
10399
}
104100

105101
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
102+
dbFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
106103
Document doc = dbFactory.newDocumentBuilder().parse(inputFile);
107104
doc.getDocumentElement().normalize();
108105

@@ -115,15 +112,15 @@ protected List<NewRule> createFortranRepository(final Context context, final Str
115112
Element element = (Element) node;
116113

117114
String key = element.getElementsByTagName("key").item(0).getTextContent();
118-
String name = element.getElementsByTagName("name").item(0).getTextContent();
119-
String internalKey = element.getElementsByTagName("internalKey").item(0).getTextContent();
120-
String description = element.getElementsByTagName("description").item(0).getTextContent();
121-
String severity = element.getElementsByTagName("severity").item(0).getTextContent();
122-
RuleStatus status = RuleStatus.valueOf(element.getElementsByTagName("status").item(0).getTextContent());
123-
RuleType type = RuleType.valueOf(element.getElementsByTagName("type").item(0).getTextContent());
115+
String name = element.getElementsByTagName("name").item(0).getTextContent();
116+
String internalKey = element.getElementsByTagName("internalKey").item(0).getTextContent();
117+
String description = element.getElementsByTagName("description").item(0).getTextContent();
118+
String severity = element.getElementsByTagName("severity").item(0).getTextContent();
119+
RuleStatus status = RuleStatus.valueOf(element.getElementsByTagName("status").item(0).getTextContent());
120+
RuleType type = RuleType.valueOf(element.getElementsByTagName("type").item(0).getTextContent());
124121
String remediationFunctionBaseEffort = element.getElementsByTagName("remediationFunctionBaseEffort").item(0).getTextContent();
125122

126-
RuleKey ruleKey = RuleKey.of(repositoryName, key);
123+
RuleKey ruleKey = RuleKey.of(repositoryName, key);
127124

128125
NewRule rule = repository.createRule(ruleKey.rule())
129126
.setName(name)
@@ -140,7 +137,7 @@ protected List<NewRule> createFortranRepository(final Context context, final Str
140137
}
141138
repository.done();
142139
} catch (Exception e) {
143-
e.printStackTrace();
140+
LOGGER.error("Error while creating rules.", e);
144141
}
145142
return rules;
146143
}
@@ -154,4 +151,12 @@ protected List<NewRule> createFortranRepository(final Context context, final Str
154151
public static String getRepositoryKeyForLanguage(final String language) {
155152
return language + REPO_KEY_SUFFIX;
156153
}
154+
155+
public static List<NewRule> getF77Rules() {
156+
return f77Rules;
157+
}
158+
159+
public static List<NewRule> getF90Rules() {
160+
return f90Rules;
161+
}
157162
}

src/test/java/fr/cnes/sonar/plugins/icode/measures/ICodeMetricsProcessorTest.java

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@
2222
import fr.cnes.sonar.plugins.icode.model.Result;
2323
import org.junit.Assert;
2424
import org.junit.Before;
25-
import org.junit.Test;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.params.ParameterizedTest;
27+
import org.junit.jupiter.params.provider.MethodSource;
28+
import org.junit.jupiter.params.provider.Arguments;
29+
30+
import java.util.stream.Stream;
2631
import org.sonar.api.batch.fs.InputFile;
2732
import org.sonar.api.batch.fs.internal.DefaultFileSystem;
2833
import org.sonar.api.batch.fs.internal.DefaultInputFile;
@@ -77,52 +82,45 @@ public void prepare() throws URISyntaxException {
7782
files.put("clanhb.f90", clanhb_f90);
7883
}
7984

80-
@Test
81-
public void test_is_metric_true() {
82-
Assert.assertTrue(ICodeMetricsProcessor.isMetric("SH.MET.COCO"));
83-
}
84-
85-
@Test
86-
public void test_is_metric_false() {
87-
Assert.assertFalse(ICodeMetricsProcessor.isMetric("COCO"));
85+
private static Stream<Arguments> testData() {
86+
return Stream.of(
87+
Arguments.of(new AnalysisRuleTestData("F77.MET.ComplexitySimplified", "clanhb.f", "3")),
88+
Arguments.of(new AnalysisRuleTestData("F77.MET.Nesting", "clanhb.f", "3")),
89+
Arguments.of(new AnalysisRuleTestData("F77.MET.Line", "clanhb.f", "3"))
90+
);
8891
}
8992

90-
@Test
91-
public void test_save_nominal_measures() {
92-
93-
final String key = clanhb_f.key();
94-
rule.setResult(new Result());
95-
rule.setAnalysisRuleId("F77.MET.Line");
96-
rule.getResult().setFileName("clanhb.f");
97-
rule.getResult().setResultValue("3");
98-
rule.getResult().setResultLine("3");
99-
rule.getResult().setResultTypePlace("class");
100-
rule.getResult().setResultMessage("Small file");
101-
102-
ICodeMetricsProcessor.saveMeasure(context, files, rule);
103-
Assert.assertEquals(1, context.measures(key).size());
104-
}
105-
106-
@Test
107-
public void test_compute_complexity() {
108-
93+
@ParameterizedTest
94+
@MethodSource("testData")
95+
public void test_compute_metrics(AnalysisRuleTestData testData) {
10996
final AnalysisProject project = new AnalysisProject();
11097
final String key = clanhb_f.key();
11198

11299
rule.setResult(new Result());
113-
rule.setAnalysisRuleId("F77.MET.ComplexitySimplified");
114-
rule.getResult().setFileName("clanhb.f");
115-
rule.getResult().setResultValue("3");
116-
rule.getResult().setResultLine("3");
100+
rule.setAnalysisRuleId(testData.getAnalysisRuleId());
101+
rule.getResult().setFileName(testData.getFileName());
102+
rule.getResult().setResultValue(testData.getResultValue());
103+
rule.getResult().setResultLine("3"); // Assuming the result line is always "3"
117104
rule.getResult().setResultTypePlace("method");
118105
rule.getResult().setResultMessage("Small file");
119106

120107
project.setAnalysisRule(new AnalysisRule[]{rule});
121108

122109
ICodeMetricsProcessor.saveExtraMeasures(context, files, project);
110+
123111
Assert.assertEquals(1, context.measures(key).size());
124112
}
125113

114+
@Test
115+
public void test_is_metric_true() {
116+
Assert.assertTrue(ICodeMetricsProcessor.isMetric("SH.MET.COCO"));
117+
}
118+
119+
@Test
120+
public void test_is_metric_false() {
121+
Assert.assertFalse(ICodeMetricsProcessor.isMetric("COCO"));
122+
}
123+
126124
@Test
127125
public void test_save_extra_measure_with_null_location() {
128126
// If we upgrade to Junit5, we may check @ParametrizedTest annotation
@@ -145,42 +143,44 @@ public void test_save_extra_measure_with_null_location() {
145143
}
146144

147145
@Test
148-
public void test_compute_nesting() {
146+
public void test_save_nominal_measures() {
149147

150-
final AnalysisProject project = new AnalysisProject();
151148
final String key = clanhb_f.key();
152-
153149
rule.setResult(new Result());
154-
rule.setAnalysisRuleId("F77.MET.Nesting");
150+
rule.setAnalysisRuleId("F77.MET.Line");
155151
rule.getResult().setFileName("clanhb.f");
156152
rule.getResult().setResultValue("3");
157153
rule.getResult().setResultLine("3");
158-
rule.getResult().setResultTypePlace("method");
154+
rule.getResult().setResultTypePlace("class");
159155
rule.getResult().setResultMessage("Small file");
160156

161-
project.setAnalysisRule(new AnalysisRule[]{rule});
162-
163-
ICodeMetricsProcessor.saveExtraMeasures(context, files, project);
157+
ICodeMetricsProcessor.saveMeasure(context, files, rule);
164158
Assert.assertEquals(1, context.measures(key).size());
165159
}
160+
161+
}
166162

167-
@Test
168-
public void test_compute_functions() {
163+
class AnalysisRuleTestData {
164+
private String analysisRuleId;
165+
private String fileName;
166+
private String resultValue;
169167

170-
final AnalysisProject project = new AnalysisProject();
171-
final String key = clanhb_f.key();
168+
public AnalysisRuleTestData(String analysisRuleId, String fileName, String resultValue) {
169+
this.analysisRuleId = analysisRuleId;
170+
this.fileName = fileName;
171+
this.resultValue = resultValue;
172+
}
172173

173-
rule.setResult(new Result());
174-
rule.setAnalysisRuleId("F77.MET.Line");
175-
rule.getResult().setFileName("clanhb.f");
176-
rule.getResult().setResultValue("3");
177-
rule.getResult().setResultLine("3");
178-
rule.getResult().setResultTypePlace("method");
179-
rule.getResult().setResultMessage("Small file");
174+
public String getAnalysisRuleId() {
175+
return analysisRuleId;
176+
}
180177

181-
project.setAnalysisRule(new AnalysisRule[]{rule});
178+
public String getFileName() {
179+
return fileName;
180+
}
182181

183-
ICodeMetricsProcessor.saveExtraMeasures(context, files, project);
184-
Assert.assertEquals(1, context.measures(key).size());
182+
public String getResultValue() {
183+
return resultValue;
185184
}
185+
186186
}

0 commit comments

Comments
 (0)