Skip to content

Commit 427f261

Browse files
Merge pull request #48 from lequal/dev
Merge dev to master
2 parents 2e9c49a + 5a8e1fd commit 427f261

File tree

16 files changed

+343
-306
lines changed

16 files changed

+343
-306
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ sudo: false
44
install: true
55

66
jdk:
7-
- oraclejdk8
7+
- openjdk8
8+
- openjdk11
89

910
cache:
1011
directories:

pom.xml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<groupId>fr.cnes.sonarqube.plugins</groupId>
66
<artifactId>sonaricode</artifactId>
77
<packaging>sonar-plugin</packaging>
8-
<version>1.1.0</version>
8+
<version>1.2.0</version>
99
<name>Sonar i-Code CNES plugin</name>
1010

1111
<description>i-Code CNES plugin for SonarQube</description>
@@ -43,6 +43,12 @@
4343
<url>https://github.com/begarco</url>
4444
<id>begarco</id>
4545
</developer>
46+
<developer>
47+
<name>Louis Martin</name>
48+
<organization>CNES</organization>
49+
<url>https://github.com/louisjdmartin</url>
50+
<id>louisjdmartin</id>
51+
</developer>
4652
<developer>
4753
<name>Omar Waldmann</name>
4854
<organization>CNES</organization>
@@ -91,17 +97,22 @@
9197
<dependency>
9298
<groupId>org.mockito</groupId>
9399
<artifactId>mockito-core</artifactId>
94-
<version>2.9.0</version>
100+
<version>3.0.0</version>
95101
<scope>test</scope>
96102
</dependency>
103+
<dependency>
104+
<groupId>com.thoughtworks.xstream</groupId>
105+
<artifactId>xstream</artifactId>
106+
<version>1.4.11.1</version>
107+
</dependency>
97108
</dependencies>
98109

99110
<build>
100111
<plugins>
101112
<plugin>
102113
<groupId>org.jacoco</groupId>
103114
<artifactId>jacoco-maven-plugin</artifactId>
104-
<version>0.7.6.201602180812</version>
115+
<version>0.8.4</version>
105116
<executions>
106117
<execution>
107118
<id>prepare-agent</id>

src/main/java/fr/cnes/sonar/plugins/icode/check/ICodeSensor.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@
4141
import org.sonar.api.utils.log.Logger;
4242
import org.sonar.api.utils.log.Loggers;
4343

44-
import javax.xml.bind.JAXBException;
4544
import java.io.File;
45+
import java.io.FileInputStream;
46+
import java.io.FileNotFoundException;
4647
import java.io.IOException;
4748
import java.nio.file.Paths;
4849
import java.util.ArrayList;
@@ -113,27 +114,27 @@ public void execute(SensorContext sensorContext) {
113114
for(final String reportPath : reportFiles) {
114115
try {
115116
// Unmarshall the xml.
116-
final File file = new File(reportPath);
117+
final FileInputStream file = new FileInputStream(reportPath);
117118
final AnalysisProject analysisProject = (AnalysisProject) XmlHandler.unmarshal(file, AnalysisProject.class);
118119
// Retrieve file in a SonarQube format.
119120
final Map<String, InputFile> scannedFiles = getScannedFiles(fileSystem, analysisProject);
120121

121122
// Handles issues.
122123
for (final AnalysisRule rule : analysisProject.getAnalysisRules()) {
123-
if(isRuleActive(activeRules, rule.analysisRuleId)) { // manage active rules
124+
if(isRuleActive(activeRules, rule.getAnalysisRuleId())) { // manage active rules
124125
saveIssue(sensorContext, scannedFiles, rule);
125-
} else if (ICodeMetricsProcessor.isMetric(rule.analysisRuleId)) { // manage trivial measures
126+
} else if (ICodeMetricsProcessor.isMetric(rule.getAnalysisRuleId())) { // manage trivial measures
126127
ICodeMetricsProcessor.saveMeasure(sensorContext, scannedFiles, rule);
127128
} else { // log ignored data
128129
LOGGER.info(String.format(
129130
"An issue for rule '%s' was detected by i-Code but this rule is deactivated in current analysis.",
130-
rule.analysisRuleId));
131+
rule.getAnalysisRuleId()));
131132
}
132133
}
133134

134135
ICodeMetricsProcessor.saveExtraMeasures(sensorContext, scannedFiles, analysisProject);
135136

136-
} catch (JAXBException e) {
137+
} catch (FileNotFoundException e) {
137138
LOGGER.error(e.getMessage(), e);
138139
sensorContext.newAnalysisError().message(e.getMessage()).save();
139140
}
@@ -192,32 +193,32 @@ protected int runICode(final String command) throws IOException, InterruptedExce
192193
static void saveIssue(final SensorContext context, final Map<String, InputFile> files, final AnalysisRule issue) {
193194

194195
// Retrieve the file containing the issue.
195-
final InputFile inputFile = files.getOrDefault(issue.result.fileName, null);
196+
final InputFile inputFile = files.getOrDefault(issue.getResult().getFileName(), null);
196197

197198
if(inputFile!=null) {
198199
// Retrieve the ruleKey if it exists.
199-
final RuleKey ruleKey = RuleKey.of(ICodeRulesDefinition.getRepositoryKeyForLanguage(inputFile.language()), issue.analysisRuleId);
200+
final RuleKey ruleKey = RuleKey.of(ICodeRulesDefinition.getRepositoryKeyForLanguage(inputFile.language()), issue.getAnalysisRuleId());
200201

201202
// Create a new issue for SonarQube, but it must be saved using NewIssue.save().
202203
final NewIssue newIssue = context.newIssue();
203204
// Create a new location for this issue.
204205
final NewIssueLocation newIssueLocation = newIssue.newLocation();
205206

206207
// Calculate the line number of the issue (must be between 1 and max, otherwise 1).
207-
int issueLine = Integer.parseInt(issue.result.resultLine);
208+
int issueLine = Integer.parseInt(issue.getResult().getResultLine());
208209
issueLine = issueLine > 0 && issueLine <= inputFile.lines() ? issueLine : 1;
209210

210211
// Set trivial issue's attributes from AnalysisRule fields.
211212
newIssueLocation.on(inputFile);
212213
newIssueLocation.at(inputFile.selectLine(issueLine));
213-
newIssueLocation.message(issue.result.resultMessage);
214+
newIssueLocation.message(issue.getResult().getResultMessage());
214215
newIssue.forRule(ruleKey);
215216
newIssue.at(newIssueLocation);
216217
newIssue.save();
217218
} else {
218219
LOGGER.error(String.format(
219220
"Issue '%s' on file '%s' has not been saved because source file was not found.",
220-
issue.analysisRuleId, issue.result.fileName
221+
issue.getAnalysisRuleId(), issue.getResult().getFileName()
221222
));
222223
}
223224

@@ -238,14 +239,14 @@ protected Map<String, InputFile> getScannedFiles(final FileSystem fileSystem, fi
238239
// Looks for each file in file system, print an error if not found.
239240
for(final AnalysisFile file : files) {
240241
// Checks if the file system contains a file with corresponding path (relative or absolute).
241-
FilePredicate predicate = fileSystem.predicates().hasPath(file.fileName);
242+
FilePredicate predicate = fileSystem.predicates().hasPath(file.getFileName());
242243
InputFile inputFile = fileSystem.inputFile(predicate);
243244
if(inputFile!=null) {
244-
result.put(file.fileName, inputFile);
245+
result.put(file.getFileName(), inputFile);
245246
} else {
246247
LOGGER.error(String.format(
247248
"The source file '%s' was not found.",
248-
file.fileName
249+
file.getFileName()
249250
));
250251
}
251252
}

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.sonar.api.utils.log.Logger;
2525
import org.sonar.api.utils.log.Loggers;
2626

27-
import javax.xml.bind.JAXBException;
2827
import java.io.InputStream;
2928

3029
/**
@@ -64,16 +63,12 @@ private void createBuiltInProfile(final Context context, final String language,
6463
final NewBuiltInQualityProfile defaultProfile =
6564
context.createBuiltInQualityProfile(I_CODE_RULES_PROFILE_NAME, language);
6665

67-
try {
68-
// Retrieve all defined rules.
69-
final InputStream stream = getClass().getResourceAsStream(path);
70-
final RulesDefinition rules = (RulesDefinition) XmlHandler.unmarshal(stream, RulesDefinition.class);
71-
// Activate all i-Code CNES rules.
72-
for(final Rule rule : rules.getRules()) {
73-
defaultProfile.activateRule(ICodeRulesDefinition.getRepositoryKeyForLanguage(language), rule.key);
74-
}
75-
} catch (JAXBException e) {
76-
LOGGER.warn(e.getLocalizedMessage(), e);
66+
// Retrieve all defined rules.
67+
final InputStream stream = getClass().getResourceAsStream(path);
68+
final RulesDefinition rules = (RulesDefinition) XmlHandler.unmarshal(stream, RulesDefinition.class);
69+
// Activate all i-Code CNES rules.
70+
for(final Rule rule : rules.getRules()) {
71+
defaultProfile.activateRule(ICodeRulesDefinition.getRepositoryKeyForLanguage(language), rule.getKey());
7772
}
7873
// Save the default profile.
7974
defaultProfile.setDefault(true);

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ public static void saveMeasure(final SensorContext context, final Map<String, In
7373
// Create a new measure from the scan context.
7474
final NewMeasure<Integer> newMeasure = context.newMeasure();
7575
// i-Code rule id.
76-
final String metricKey = rule.analysisRuleId;
76+
final String metricKey = rule.getAnalysisRuleId();
7777
// Determine if a measure is relative to a file or a method.
78-
final String metricScope = rule.result.resultTypePlace;
78+
final String metricScope = rule.getResult().getResultTypePlace();
7979
// Component concerned by the measure.
80-
final String metricComponent = rule.result.fileName;
80+
final String metricComponent = rule.getResult().getFileName();
8181
// Component concerned by the measure.
82-
final String measureValue = rule.result.resultValue;
82+
final String measureValue = rule.getResult().getResultValue();
8383

8484
// Is true if the metric must be interpreted by the plugin.
8585
boolean isCalculated = false;
@@ -142,8 +142,8 @@ public static void saveExtraMeasures(final SensorContext context, final Map<Stri
142142

143143
// Collect all measures on methods into specific list
144144
for(final AnalysisRule rule : project.getAnalysisRules()) {
145-
final String type = rule.result.resultTypePlace;
146-
final String id = rule.analysisRuleId;
145+
final String type = rule.getResult().getResultTypePlace();
146+
final String id = rule.getAnalysisRuleId();
147147
if(id.contains(COMMON_METRICS_KEY_PART) && type.equals("method")) {
148148
final List<AnalysisRule> sub = measures.getOrDefault(id, new ArrayList<>());
149149
sub.add(rule);
@@ -182,7 +182,7 @@ private static void computeFunctions(final SensorContext context, final Map<Stri
182182

183183
// Compute number of functions by file.
184184
for(final AnalysisRule measure : rawMeasures) {
185-
final String file = measure.result.fileName;
185+
final String file = measure.getResult().getFileName();
186186
Integer sum = functions.getOrDefault(file, 0) + 1;
187187
functions.put(file, sum);
188188
}
@@ -213,8 +213,8 @@ private static void computeComplexity(final SensorContext context, final Map<Str
213213

214214
// Compute complexity sum value by file.
215215
for(final AnalysisRule measure : rawMeasures) {
216-
final String file = measure.result.fileName;
217-
final Integer value = Double.valueOf((measure.result.resultValue)).intValue();
216+
final String file = measure.getResult().getFileName();
217+
final Integer value = Double.valueOf((measure.getResult().getResultValue())).intValue();
218218
Integer sum = complexity.getOrDefault(file, 0);
219219
sum += value;
220220
complexity.put(file, sum);
@@ -246,8 +246,8 @@ private static void computeNesting(final SensorContext context, final Map<String
246246

247247
// compute max nesting value by file
248248
for(final AnalysisRule measure : rawMeasures) {
249-
final String file = measure.result.fileName;
250-
final Integer value = Double.valueOf((measure.result.resultValue)).intValue();
249+
final String file = measure.getResult().getFileName();
250+
final Integer value = Double.valueOf((measure.getResult().getResultValue())).intValue();
251251
Integer max = nesting.getOrDefault(file, 0);
252252
max = Math.max(max,value);
253253
nesting.put(file, max);

src/main/java/fr/cnes/sonar/plugins/icode/model/AnalysisFile.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package fr.cnes.sonar.plugins.icode.model;
1818

19-
import javax.xml.bind.annotation.XmlAttribute;
2019

2120
/**
2221
* Class used to unmarshal i-Code xml file.
@@ -26,8 +25,22 @@
2625
* @author lequal
2726
*/
2827
public class AnalysisFile {
29-
@XmlAttribute
30-
public String language;
31-
@XmlAttribute
32-
public String fileName;
28+
private String language;
29+
private String fileName;
30+
31+
public String getLanguage() {
32+
return language;
33+
}
34+
35+
public void setLanguage(String language) {
36+
this.language = language;
37+
}
38+
39+
public String getFileName() {
40+
return fileName;
41+
}
42+
43+
public void setFileName(String fileName) {
44+
this.fileName = fileName;
45+
}
3346
}

src/main/java/fr/cnes/sonar/plugins/icode/model/AnalysisInformations.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package fr.cnes.sonar.plugins.icode.model;
1818

19-
import javax.xml.bind.annotation.XmlAttribute;
2019

2120
/**
2221
* Class used to unmarshal i-Code xml file.
@@ -26,10 +25,13 @@
2625
* @author lequal
2726
*/
2827
public class AnalysisInformations {
29-
@XmlAttribute
30-
public String analysisConfigurationId;
31-
@XmlAttribute
32-
public String analysisDate;
33-
@XmlAttribute
34-
public String author;
28+
private String author;
29+
30+
public String getAuthor() {
31+
return author;
32+
}
33+
34+
public void setAuthor(String author) {
35+
this.author = author;
36+
}
3537
}

src/main/java/fr/cnes/sonar/plugins/icode/model/AnalysisProject.java

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
*/
1717
package fr.cnes.sonar.plugins.icode.model;
1818

19-
import javax.xml.bind.annotation.XmlAttribute;
20-
import javax.xml.bind.annotation.XmlElement;
21-
import javax.xml.bind.annotation.XmlRootElement;
2219
import java.util.ArrayList;
2320
import java.util.Arrays;
2421
import java.util.List;
@@ -30,18 +27,10 @@
3027
*
3128
* @author lequal
3229
*/
33-
@XmlRootElement
3430
public class AnalysisProject {
35-
@XmlAttribute
36-
public String analysisProjectName;
37-
@XmlAttribute
38-
public String analysisProjectVersion;
39-
@XmlElement
40-
public AnalysisInformations analysisInformations;
41-
@XmlElement
42-
public AnalysisFile[] analysisFile;
43-
@XmlElement
44-
public AnalysisRule[] analysisRule;
31+
private AnalysisInformations analysisInformations;
32+
private AnalysisFile[] analysisFile;
33+
private AnalysisRule[] analysisRule;
4534

4635
/**
4736
* Getter for accessing analysis rules (issues).
@@ -50,8 +39,8 @@ public class AnalysisProject {
5039
public List<AnalysisRule> getAnalysisRules() {
5140
// Retrieve issues (called rules)
5241
List<AnalysisRule> rules;
53-
if(analysisRule!=null) {
54-
rules = Arrays.asList(analysisRule);
42+
if(getAnalysisRule() !=null) {
43+
rules = Arrays.asList(getAnalysisRule());
5544
} else {
5645
rules = new ArrayList<>();
5746
}
@@ -65,11 +54,36 @@ public List<AnalysisRule> getAnalysisRules() {
6554
public List<AnalysisFile> getAnalysisFiles() {
6655
// Retrieve files
6756
List<AnalysisFile> files;
68-
if(analysisFile!=null) {
69-
files = Arrays.asList(analysisFile);
57+
if(getAnalysisFile() !=null) {
58+
files = Arrays.asList(getAnalysisFile());
7059
} else {
7160
files = new ArrayList<>();
7261
}
7362
return files;
7463
}
64+
65+
66+
public AnalysisInformations getAnalysisInformations() {
67+
return analysisInformations;
68+
}
69+
70+
public void setAnalysisInformations(AnalysisInformations analysisInformations) {
71+
this.analysisInformations = analysisInformations;
72+
}
73+
74+
public AnalysisFile[] getAnalysisFile() {
75+
return analysisFile;
76+
}
77+
78+
public void setAnalysisFile(AnalysisFile[] analysisFile) {
79+
this.analysisFile = analysisFile;
80+
}
81+
82+
public AnalysisRule[] getAnalysisRule() {
83+
return analysisRule;
84+
}
85+
86+
public void setAnalysisRule(AnalysisRule[] analysisRule) {
87+
this.analysisRule = analysisRule;
88+
}
7589
}

0 commit comments

Comments
 (0)