1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.eluder.coveralls.maven.plugin.parser;
25
26 import org.eluder.coveralls.maven.plugin.ProcessingException;
27 import org.eluder.coveralls.maven.plugin.domain.Source;
28 import org.eluder.coveralls.maven.plugin.source.SourceCallback;
29 import org.eluder.coveralls.maven.plugin.source.SourceLoader;
30
31 import javax.xml.stream.XMLStreamException;
32 import javax.xml.stream.XMLStreamReader;
33 import java.io.File;
34 import java.io.IOException;
35
36 public class CloverParser extends AbstractXmlEventParser {
37
38 private Source source;
39 private String packageName;
40
41 public CloverParser(final File coverageFile, final SourceLoader sourceLoader) {
42 super(coverageFile, sourceLoader);
43 }
44
45 @Override
46 protected void onEvent(final XMLStreamReader xml, final SourceCallback callback) throws XMLStreamException, ProcessingException, IOException {
47 if (isStartElement(xml, "package")) {
48 this.packageName = xml.getAttributeValue(null, "name");
49 } else if (isStartElement(xml, "file") && packageName != null) {
50 String sourceFile = getSourceFile(xml.getAttributeValue(null, "name"));
51 this.source = loadSource(sourceFile);
52 } else if (isStartElement(xml, "line") && this.source != null) {
53
54 String type = xml.getAttributeValue(null, "type");
55 int coverage = 0;
56 if ("method".equals(type) || "stmt".equals(type)) {
57 coverage = (Integer.parseInt(xml.getAttributeValue(null, "count")) == 0) ? 0 : 1;
58 } else if ("cond".equals(type)) {
59 int falseCount = Integer.parseInt(xml.getAttributeValue(null, "falsecount"));
60 int trueCount = Integer.parseInt(xml.getAttributeValue(null, "truecount"));
61 coverage = (trueCount == 0 || falseCount == 0) ? 0 : 1;
62 }
63 int lineNumber = Integer.parseInt(xml.getAttributeValue(null, "num"));
64 this.source.addCoverage(lineNumber, coverage);
65 } else if (isEndElement(xml, "file") && this.source != null) {
66 callback.onSource(this.source);
67 this.source = null;
68 } else if (isEndElement(xml, "package")) {
69 this.packageName = null;
70 }
71 }
72
73 private String getSourceFile(final String fileName) {
74 return this.packageName.replace('.', '/') + "/" + fileName;
75 }
76 }