forked from jenkinsci/analysis-model
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJSLintXmlSaxParser.java
100 lines (84 loc) · 3.08 KB
/
JSLintXmlSaxParser.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
package edu.hm.hafner.analysis.parser;
import org.apache.commons.lang3.StringUtils;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import edu.hm.hafner.analysis.IssueBuilder;
import edu.hm.hafner.analysis.Report;
import edu.hm.hafner.analysis.Severity;
/**
* Handles parsing.
*/
public class JSLintXmlSaxParser extends DefaultHandler {
private static final String ISSUE = "issue";
private static final String ERROR = "error";
private final Report report;
private String fileName = StringUtils.EMPTY;
/** Categories. */
static final String CATEGORY_PARSING = "Parsing";
static final String CATEGORY_UNDEFINED_VARIABLE = "Undefined Variable";
static final String CATEGORY_FORMATTING = "Formatting";
/**
* Creates a new instance of {@link JSLintXmlSaxParser}.
*
* @param report
* the issues
*/
public JSLintXmlSaxParser(final Report report) {
super();
this.report = report;
}
@Override
public void startElement(final String namespaceURI,
final String localName, final String key, final Attributes atts) {
if (isLintDerivate(key)) {
return; // Start element, good to skip
}
if ("file".equals(key)) {
fileName = atts.getValue("name");
return;
}
if (ISSUE.equals(key) || ERROR.equals(key)) {
createWarning(atts);
}
}
private void createWarning(final Attributes attributes) {
String category = StringUtils.EMPTY;
Severity priority = Severity.WARNING_NORMAL;
String message = extractFrom(attributes, "reason", "message");
if (message.startsWith("Expected")) {
priority = Severity.WARNING_HIGH;
category = CATEGORY_PARSING;
}
else if (message.endsWith(" is not defined.")) {
priority = Severity.WARNING_HIGH;
category = CATEGORY_UNDEFINED_VARIABLE;
}
else if (message.contains("Mixed spaces and tabs")) {
priority = Severity.WARNING_LOW;
category = CATEGORY_FORMATTING;
}
else if (message.contains("Unnecessary semicolon")) {
category = CATEGORY_FORMATTING;
}
else if (message.contains("is better written in dot notation")) {
category = CATEGORY_FORMATTING;
}
IssueBuilder builder = new IssueBuilder().setFileName(fileName)
.setLineStart(attributes.getValue("line"))
.setColumnStart(extractFrom(attributes, "column", "char"))
.setCategory(category)
.setMessage(message)
.setSeverity(priority);
report.add(builder.build());
}
private String extractFrom(final Attributes atts, final String first, final String second) {
String value = atts.getValue(first);
if (StringUtils.isEmpty(value)) {
value = atts.getValue(second);
}
return value;
}
private boolean isLintDerivate(final String key) {
return key != null && key.contains("lint");
}
}