Skip to content

Commit 6e6eae0

Browse files
committed
Better parsing of result files to avoid errors + UT
1 parent f8d13b0 commit 6e6eae0

File tree

8 files changed

+2739
-18
lines changed

8 files changed

+2739
-18
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package fr.cnes.sonar.plugins.icode.converter;
2+
3+
import com.thoughtworks.xstream.converters.ConverterLookup;
4+
import com.thoughtworks.xstream.converters.UnmarshallingContext;
5+
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
6+
import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
7+
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
8+
import com.thoughtworks.xstream.mapper.Mapper;
9+
import fr.cnes.sonar.plugins.icode.model.AnalysisRule;
10+
import fr.cnes.sonar.plugins.icode.model.Result;
11+
12+
public class AnalysisConverter extends ToAttributedValueConverter {
13+
14+
public AnalysisConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup) {
15+
super(type, mapper, reflectionProvider, lookup);
16+
}
17+
18+
public AnalysisConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup, String valueFieldName) {
19+
super(type, mapper, reflectionProvider, lookup, valueFieldName);
20+
}
21+
22+
public AnalysisConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup, String valueFieldName, Class valueDefinedIn) {
23+
super(type, mapper, reflectionProvider, lookup, valueFieldName, valueDefinedIn);
24+
}
25+
26+
@Override
27+
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext unmarshallingContext) {
28+
Object r = super.unmarshal(reader, unmarshallingContext);
29+
if (r.getClass() == AnalysisRule.class) {
30+
Result result = new Result();
31+
reader.moveDown();
32+
result.setFileName(reader.getAttribute("fileName"));
33+
result.setResultLine(reader.getAttribute("resultLine"));
34+
result.setResultTypePlace(reader.getAttribute("resultTypePlace"));
35+
result.setResultValue(reader.getAttribute("resultValue"));
36+
if(reader.hasMoreChildren()) {
37+
reader.moveDown();
38+
result.setResultMessage(reader.getValue());
39+
reader.moveUp();
40+
}
41+
reader.moveUp();
42+
((AnalysisRule) r).setResult(result);
43+
}
44+
else r = super.unmarshal(reader, unmarshallingContext);
45+
46+
return r;
47+
}
48+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@
1717
package fr.cnes.sonar.plugins.icode.model;
1818

1919

20+
import com.thoughtworks.xstream.annotations.XStreamConverter;
21+
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
22+
2023
/**
2124
* Class used to unmarshal i-Code xml file.
2225
*
2326
* It contains an analyzed file.
2427
*
2528
* @author lequal
2629
*/
30+
@XStreamConverter(value = ToAttributedValueConverter.class)
2731
public class AnalysisFile {
2832
private String language;
2933
private String fileName;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@
1717
package fr.cnes.sonar.plugins.icode.model;
1818

1919

20+
import com.thoughtworks.xstream.annotations.XStreamConverter;
21+
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
22+
2023
/**
2124
* Class used to unmarshal i-Code xml file.
2225
*
2326
* It contains meta data about the i-Code analysis.
2427
*
2528
* @author lequal
2629
*/
30+
@XStreamConverter(ToAttributedValueConverter.class)
2731
public class AnalysisInformations {
2832
private String author;
2933

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

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

19+
import com.thoughtworks.xstream.annotations.XStreamAlias;
20+
import com.thoughtworks.xstream.annotations.XStreamConverter;
21+
import com.thoughtworks.xstream.annotations.XStreamImplicit;
22+
import com.thoughtworks.xstream.annotations.XStreamInclude;
23+
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
24+
1925
import java.util.ArrayList;
2026
import java.util.Arrays;
2127
import java.util.List;
@@ -27,10 +33,14 @@
2733
*
2834
* @author lequal
2935
*/
36+
@XStreamAlias("analysisProject")
37+
@XStreamInclude({AnalysisFile.class, AnalysisRule.class, AnalysisInformations.class})
3038
public class AnalysisProject {
3139
private AnalysisInformations analysisInformations;
32-
private AnalysisFile[] analysisFile;
33-
private AnalysisRule[] analysisRule;
40+
@XStreamImplicit(itemFieldName = "analysisFile")
41+
private List<AnalysisFile> analysisFile;
42+
@XStreamImplicit(itemFieldName = "analysisRule")
43+
private List<AnalysisRule> analysisRule;
3444

3545
/**
3646
* Getter for accessing analysis rules (issues).
@@ -39,8 +49,8 @@ public class AnalysisProject {
3949
public List<AnalysisRule> getAnalysisRules() {
4050
// Retrieve issues (called rules)
4151
List<AnalysisRule> rules;
42-
if(getAnalysisRule() !=null) {
43-
rules = Arrays.asList(getAnalysisRule());
52+
if(analysisRule !=null) {
53+
rules = this.analysisRule;
4454
} else {
4555
rules = new ArrayList<>();
4656
}
@@ -54,8 +64,8 @@ public List<AnalysisRule> getAnalysisRules() {
5464
public List<AnalysisFile> getAnalysisFiles() {
5565
// Retrieve files
5666
List<AnalysisFile> files;
57-
if(getAnalysisFile() !=null) {
58-
files = Arrays.asList(getAnalysisFile());
67+
if(analysisFile !=null) {
68+
files = this.analysisFile;
5969
} else {
6070
files = new ArrayList<>();
6171
}
@@ -71,19 +81,11 @@ public void setAnalysisInformations(AnalysisInformations analysisInformations) {
7181
this.analysisInformations = analysisInformations;
7282
}
7383

74-
public AnalysisFile[] getAnalysisFile() {
75-
return analysisFile;
76-
}
77-
7884
public void setAnalysisFile(AnalysisFile[] analysisFile) {
79-
this.analysisFile = analysisFile;
80-
}
81-
82-
public AnalysisRule[] getAnalysisRule() {
83-
return analysisRule;
85+
this.analysisFile = Arrays.asList(analysisFile);
8486
}
8587

8688
public void setAnalysisRule(AnalysisRule[] analysisRule) {
87-
this.analysisRule = analysisRule;
89+
this.analysisRule = Arrays.asList(analysisRule);
8890
}
8991
}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,24 @@
1717
package fr.cnes.sonar.plugins.icode.model;
1818

1919

20+
import com.thoughtworks.xstream.annotations.XStreamConverter;
21+
import com.thoughtworks.xstream.annotations.XStreamInclude;
22+
import fr.cnes.sonar.plugins.icode.converter.AnalysisConverter;
23+
2024
/**
2125
* Class used to unmarshal i-Code xml file.
2226
*
2327
* It contains an issue and a violated rule.
2428
*
2529
* @author lequal
2630
*/
31+
@XStreamInclude(Result.class)
32+
@XStreamConverter(value = AnalysisConverter.class, strings = {"result"})
2733
public class AnalysisRule {
2834

35+
private String analysisRuleId;
36+
private Result result;
37+
2938
public String getAnalysisRuleId() {
3039
return analysisRuleId;
3140
}
@@ -34,7 +43,6 @@ public Result getResult() {
3443
return result;
3544
}
3645

37-
private String analysisRuleId;
3846

3947
public void setAnalysisRuleId(String analysisRuleId) {
4048
this.analysisRuleId = analysisRuleId;
@@ -44,6 +52,7 @@ public void setResult(Result result) {
4452
this.result = result;
4553
}
4654

47-
private Result result;
4855

4956
}
57+
58+

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

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

19+
import com.thoughtworks.xstream.annotations.XStreamConverter;
20+
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;
21+
1922
/**
2023
* Class used to unmarshal i-Code xml file.
2124
*
2225
* It contains an issue or a metric.
2326
*
2427
* @author lequal
2528
*/
29+
@XStreamConverter(value = ToAttributedValueConverter.class)
2630
public class Result {
2731

2832
private String fileName;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package fr.cnes.sonar.plugins.icode;
2+
3+
import fr.cnes.sonar.plugins.icode.model.AnalysisProject;
4+
import fr.cnes.sonar.plugins.icode.model.XmlHandler;
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
8+
import java.io.InputStream;
9+
10+
public class ParseResultTest {
11+
@Test
12+
public void parseIcodeOutputTest() {
13+
InputStream icodeOutput = getClass().getResourceAsStream("/result.res");
14+
AnalysisProject analysisProject = (AnalysisProject) XmlHandler.unmarshal(icodeOutput, AnalysisProject.class);
15+
16+
17+
Assert.assertNotNull(analysisProject);
18+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0));
19+
20+
// Try to get Analysis informations
21+
Assert.assertNotNull(analysisProject.getAnalysisInformations().getAuthor());
22+
23+
// Try to get files informations
24+
Assert.assertEquals(7, analysisProject.getAnalysisFiles().size());
25+
Assert.assertNotNull(analysisProject.getAnalysisFiles().get(0).getFileName());
26+
Assert.assertNotNull(analysisProject.getAnalysisFiles().get(0).getLanguage());
27+
28+
// Try to get rules analyzed
29+
Assert.assertEquals(574, analysisProject.getAnalysisRules().size());
30+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getResult());
31+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getAnalysisRuleId());
32+
33+
// Try to get results
34+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getResult().getResultTypePlace());
35+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(58).getResult().getResultMessage());
36+
Assert.assertNull(analysisProject.getAnalysisRules().get(0).getResult().getResultMessage());
37+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getResult().getFileName());
38+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getResult().getResultValue());
39+
Assert.assertNotNull(analysisProject.getAnalysisRules().get(0).getResult().getResultLine());
40+
}
41+
}

0 commit comments

Comments
 (0)