13
13
14
14
import org .apache .commons .lang3 .StringUtils ;
15
15
16
+ import edu .hm .hafner .coverage .ClassNode ;
16
17
import edu .hm .hafner .coverage .Coverage ;
17
18
import edu .hm .hafner .coverage .Coverage .CoverageBuilder ;
18
19
import edu .hm .hafner .coverage .CoverageParser ;
19
20
import edu .hm .hafner .coverage .CyclomaticComplexity ;
20
21
import edu .hm .hafner .coverage .FileNode ;
21
- import edu .hm .hafner .coverage .MethodNode ;
22
22
import edu .hm .hafner .coverage .Metric ;
23
23
import edu .hm .hafner .coverage .ModuleNode ;
24
24
import edu .hm .hafner .coverage .Node ;
@@ -127,7 +127,7 @@ private void readPackage(final XMLEventReader reader, final ModuleNode root,
127
127
var relativePath = PATH_UTIL .getRelativePath (fileName );
128
128
var fileNode = packageNode .findOrCreateFileNode (getFileName (fileName ),
129
129
getTreeStringBuilder ().intern (relativePath ));
130
- readClassOrMethod (reader , fileNode , nextElement , log );
130
+ readClassOrMethod (reader , fileNode , fileNode , nextElement , log );
131
131
}
132
132
}
133
133
else if (event .isEndElement ()) {
@@ -145,13 +145,14 @@ private String getFileName(final String relativePath) {
145
145
}
146
146
147
147
@ SuppressWarnings ({"PMD.CyclomaticComplexity" , "PMD.CognitiveComplexity" })
148
- private Node readClassOrMethod (final XMLEventReader reader , final FileNode fileNode ,
149
- final StartElement parentElement , final FilteredLog log ) throws XMLStreamException {
148
+ private void readClassOrMethod (final XMLEventReader reader ,
149
+ final FileNode fileNode , final Node parentNode ,
150
+ final StartElement element , final FilteredLog log ) throws XMLStreamException {
150
151
var lineCoverage = Coverage .nullObject (Metric .LINE );
151
152
var branchCoverage = Coverage .nullObject (Metric .BRANCH );
152
153
153
- Node node = createNode (fileNode , parentElement );
154
- getOptionalValueOf (parentElement , COMPLEXITY )
154
+ Node node = createNode (parentNode , element , log );
155
+ getOptionalValueOf (element , COMPLEXITY )
155
156
.ifPresent (c -> node .addValue (new CyclomaticComplexity (readComplexity (c ))));
156
157
157
158
while (reader .hasNext ()) {
@@ -175,19 +176,13 @@ private Node readClassOrMethod(final XMLEventReader reader, final FileNode fileN
175
176
}
176
177
lineCoverage = lineCoverage .add (currentLineCoverage );
177
178
178
- if (CLASS .equals (parentElement .getName ())) { // Counters are stored at file level
179
+ if (CLASS .equals (element .getName ())) { // Counters are stored at file level
179
180
int lineNumber = getIntegerValueOf (nextElement , NUMBER );
180
181
fileNode .addCounters (lineNumber , coverage .getCovered (), coverage .getMissed ());
181
182
}
182
183
}
183
184
else if (METHOD .equals (nextElement .getName ())) {
184
- Node methodNode = readClassOrMethod (reader , fileNode , nextElement , log );
185
- if (node .hasChild (methodNode .getName ()) && ignoreErrors ()) {
186
- log .logError ("Skipping duplicate method '%s' for class '%s'" , node .getName (), methodNode .getName ());
187
- }
188
- else {
189
- node .addChild (methodNode );
190
- }
185
+ readClassOrMethod (reader , fileNode , node , nextElement , log ); // recursive call
191
186
}
192
187
}
193
188
else if (event .isEndElement ()) {
@@ -197,7 +192,7 @@ else if (event.isEndElement()) {
197
192
if (branchCoverage .isSet ()) {
198
193
node .addValue (branchCoverage );
199
194
}
200
- return node ;
195
+ return ;
201
196
}
202
197
}
203
198
}
@@ -208,17 +203,29 @@ private Coverage computeLineCoverage(final int coverage) {
208
203
return coverage > 0 ? LINE_COVERED : LINE_MISSED ;
209
204
}
210
205
211
- private Node createNode (final FileNode file , final StartElement parentElement ) {
212
- var name = getValueOf (parentElement , NAME );
206
+ private Node createNode (final Node parentNode , final StartElement element , final FilteredLog log ) {
207
+ var name = getValueOf (element , NAME );
213
208
if (StringUtils .isBlank (name )) { // each node must have a unique name
214
- name = UUID . randomUUID (). toString ();
209
+ name = createId ();
215
210
}
216
- if (CLASS .equals (parentElement .getName ())) {
217
- return file .createClassNode (name ); // connect the class with the file
211
+ if (CLASS .equals (element .getName ())) {
212
+ if (parentNode .hasChild (name ) && ignoreErrors ()) {
213
+ log .logError ("Found a duplicate class '%s' in '%s'" , name , parentNode .getName ());
214
+ name = name + "-" + createId ();
215
+ }
216
+ return ((FileNode )parentNode ).createClassNode (name );
218
217
}
219
- else {
220
- return new MethodNode (name , getValueOf (parentElement , SIGNATURE ));
218
+ var signature = getValueOf (element , SIGNATURE );
219
+ var classNode = (ClassNode ) parentNode ;
220
+ if (classNode .findMethod (name , signature ).isPresent () && ignoreErrors ()) {
221
+ log .logError ("Found a duplicate method '%s' with signature '%s' in '%s'" , name , signature , parentNode .getName ());
222
+ name = name + "-" + createId ();
221
223
}
224
+ return classNode .createMethodNode (name , signature );
225
+ }
226
+
227
+ private String createId () {
228
+ return UUID .randomUUID ().toString ();
222
229
}
223
230
224
231
private int readComplexity (final String c ) {
0 commit comments