-
Notifications
You must be signed in to change notification settings - Fork 39
/
CodeNarcParser.java
134 lines (122 loc) · 4.88 KB
/
CodeNarcParser.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package se.bjurr.violations.lib.parsers;
import static java.nio.charset.StandardCharsets.UTF_8;
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import static se.bjurr.violations.lib.model.SEVERITY.ERROR;
import static se.bjurr.violations.lib.model.SEVERITY.INFO;
import static se.bjurr.violations.lib.model.SEVERITY.WARN;
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
import static se.bjurr.violations.lib.reports.Parser.CODENARC;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getIntegerAttribute;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import se.bjurr.violations.lib.ViolationsLogger;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;
import se.bjurr.violations.lib.util.ViolationParserUtils;
public class CodeNarcParser implements ViolationsParser {
private SEVERITY getSeverity(final Integer from) {
if (from == 1) {
return ERROR;
}
if (from == 2) {
return WARN;
}
return INFO;
}
@Override
public Set<Violation> parseReportOutput(
final String string, final ViolationsLogger violationsLogger) throws Exception {
final Set<Violation> violations = new TreeSet<>();
final Map<String, String> rules = this.getRules(string);
final String sourceDirectory = this.getSourceDirectory(string);
try (InputStream input = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))) {
final XMLStreamReader xmlr = ViolationParserUtils.createXmlReader(input);
String path = null;
String name = null;
while (xmlr.hasNext()) {
final int eventType = xmlr.next();
if (eventType == START_ELEMENT) {
if (xmlr.getLocalName().equalsIgnoreCase("Package")) {
path = getAttribute(xmlr, "path");
}
if (xmlr.getLocalName().equalsIgnoreCase("File")) {
name = getAttribute(xmlr, "name");
}
if (xmlr.getLocalName().equalsIgnoreCase("Violation")) {
final String ruleName = getAttribute(xmlr, "ruleName");
final Integer priority = getIntegerAttribute(xmlr, "priority");
final String lineNumberString = getAttribute(xmlr, "lineNumber");
int lineNumber = 1;
if (!lineNumberString.isEmpty()) {
lineNumber = Integer.parseInt(lineNumberString);
}
String message = rules.get(ruleName);
if (message == null) {
message = ruleName;
}
String fileString;
if (sourceDirectory.isEmpty()) {
fileString = path + "/" + name;
} else {
fileString = sourceDirectory + "/" + path + "/" + name;
}
final Violation violation =
violationBuilder() //
.setParser(CODENARC) //
.setFile(fileString.replace("//", "/")) //
.setMessage(message) //
.setRule(ruleName) //
.setSeverity(this.getSeverity(priority)) //
.setStartLine(lineNumber) //
.build();
violations.add(violation);
}
}
}
}
return violations;
}
private String getSourceDirectory(final String string) throws Exception {
try (InputStream input = new ByteArrayInputStream(string.getBytes(UTF_8))) {
final XMLStreamReader xmlr = ViolationParserUtils.createXmlReader(input);
while (xmlr.hasNext()) {
final int eventType = xmlr.next();
if (eventType == START_ELEMENT) {
if (xmlr.getLocalName().equalsIgnoreCase("SourceDirectory")) {
return xmlr.getElementText().trim();
}
}
}
}
return "";
}
private Map<String, String> getRules(final String string) throws IOException, XMLStreamException {
final Map<String, String> rules = new HashMap<>();
try (InputStream input = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))) {
final XMLStreamReader xmlr = ViolationParserUtils.createXmlReader(input);
String name = null;
while (xmlr.hasNext()) {
final int eventType = xmlr.next();
if (eventType == START_ELEMENT) {
if (xmlr.getLocalName().equalsIgnoreCase("Rule")) {
name = getAttribute(xmlr, "name");
}
if (xmlr.getLocalName().equalsIgnoreCase("Description")) {
final String description = xmlr.getElementText().trim();
rules.put(name, description);
}
}
}
}
return rules;
}
}