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 package org.eluder.coveralls.maven.plugin.parser;
26
27 import java.io.File;
28 import java.io.IOException;
29
30 import javax.xml.stream.XMLStreamException;
31 import javax.xml.stream.XMLStreamReader;
32
33 import org.eluder.coveralls.maven.plugin.ProcessingException;
34 import org.eluder.coveralls.maven.plugin.domain.Source;
35 import org.eluder.coveralls.maven.plugin.source.SourceCallback;
36 import org.eluder.coveralls.maven.plugin.source.SourceLoader;
37
38
39
40
41 public class CloverParser extends AbstractXmlEventParser {
42
43
44 private Source source;
45
46
47 private String packageName;
48
49
50
51
52
53
54
55
56
57 public CloverParser(final File coverageFile, final SourceLoader sourceLoader) {
58 super(coverageFile, sourceLoader);
59 }
60
61 @Override
62 protected void onEvent(final XMLStreamReader xml, final SourceCallback callback)
63 throws XMLStreamException, ProcessingException, IOException {
64 if (this.isStartElement(xml, "package")) {
65 this.packageName = xml.getAttributeValue(null, "name");
66 } else if (this.isStartElement(xml, "file") && this.packageName != null) {
67 final var sourceFile = this.getSourceFile(xml.getAttributeValue(null, "name"));
68 this.source = this.loadSource(sourceFile);
69 } else if (this.isStartElement(xml, "line") && this.source != null) {
70
71 final var type = xml.getAttributeValue(null, "type");
72 var coverage = 0;
73 if ("method".equals(type) || "stmt".equals(type)) {
74 coverage = Integer.parseInt(xml.getAttributeValue(null, "count")) == 0 ? 0 : 1;
75 } else if ("cond".equals(type)) {
76 final var falseCount = Integer.parseInt(xml.getAttributeValue(null, "falsecount"));
77 final var trueCount = Integer.parseInt(xml.getAttributeValue(null, "truecount"));
78 coverage = trueCount == 0 || falseCount == 0 ? 0 : 1;
79 }
80 final var lineNumber = Integer.parseInt(xml.getAttributeValue(null, "num"));
81 this.source.addCoverage(lineNumber, coverage);
82 } else if (this.isEndElement(xml, "file") && this.source != null) {
83 callback.onSource(this.source);
84 this.source = null;
85 } else if (this.isEndElement(xml, "package")) {
86 this.packageName = null;
87 }
88 }
89
90
91
92
93
94
95
96
97
98 private String getSourceFile(final String fileName) {
99 return this.packageName.replace('.', '/') + "/" + fileName;
100 }
101 }