Skip to content

Commit f965574

Browse files
committed
[JENKINS-75438] Store parser ID directly in AnalysisResult
Otherwise, we need to read the report with all issues to get this ID. This causes severe performance issues for jobs that have large reports. See https://issues.jenkins.io/browse/JENKINS-75438
1 parent 787fc13 commit f965574

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

plugin/src/main/java/io/jenkins/plugins/analysis/core/model/AnalysisResult.java

+25-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
package io.jenkins.plugins.analysis.core.model; // NOPMD
22

3+
import org.apache.commons.lang3.StringUtils;
4+
import org.eclipse.collections.api.list.ImmutableList;
5+
import org.eclipse.collections.impl.factory.Lists;
6+
import org.eclipse.collections.impl.factory.Maps;
7+
8+
import edu.hm.hafner.analysis.Report;
9+
import edu.hm.hafner.analysis.Severity;
10+
import edu.hm.hafner.echarts.Build;
11+
import edu.hm.hafner.util.VisibleForTesting;
12+
import edu.umd.cs.findbugs.annotations.CheckForNull;
13+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14+
15+
import java.io.Serial;
316
import java.io.Serializable;
417
import java.lang.ref.WeakReference;
518
import java.nio.file.Path;
@@ -14,18 +27,6 @@
1427
import java.util.regex.Matcher;
1528
import java.util.regex.Pattern;
1629

17-
import org.apache.commons.lang3.StringUtils;
18-
import org.eclipse.collections.api.list.ImmutableList;
19-
import org.eclipse.collections.impl.factory.Lists;
20-
import org.eclipse.collections.impl.factory.Maps;
21-
22-
import edu.hm.hafner.analysis.Report;
23-
import edu.hm.hafner.analysis.Severity;
24-
import edu.hm.hafner.echarts.Build;
25-
import edu.hm.hafner.util.VisibleForTesting;
26-
import edu.umd.cs.findbugs.annotations.CheckForNull;
27-
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
28-
2930
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.Whitelisted;
3031
import hudson.model.Run;
3132

@@ -52,13 +53,15 @@
5253
@SuppressFBWarnings(value = "SE, DESERIALIZATION_GADGET", justification = "transient fields are restored using a Jenkins callback (or are checked for null)")
5354
@SuppressWarnings({"PMD.TooManyFields", "PMD.ExcessiveClassLength", "PMD.GodClass", "checkstyle:ClassFanOutComplexity", "checkstyle:ClassDataAbstractionCoupling"})
5455
public class AnalysisResult implements Serializable, StaticAnalysisRun {
56+
@Serial
5557
private static final long serialVersionUID = 1110545450292087475L;
5658

5759
private static final Pattern ISSUES_FILE_NAME = Pattern.compile("issues.xml", Pattern.LITERAL);
5860
private static final int NO_BUILD = -1;
5961
private static final String NO_REFERENCE = StringUtils.EMPTY;
6062

6163
private final String id;
64+
private /* almost final */ String parserId;
6265

6366
private IssuesStatistics totals;
6467

@@ -227,8 +230,10 @@ protected AnalysisResult(final Run<?, ?> owner, final String id, final DeltaRepo
227230
this.owner = owner;
228231

229232
Report allIssues = report.getAllIssues();
233+
230234
new ValidationUtilities().ensureValidId(id);
231235
this.id = id;
236+
this.parserId = allIssues.getParserId();
232237

233238
totals = report.getStatistics();
234239
this.sizePerOrigin = new HashMap<>(sizePerOrigin);
@@ -265,13 +270,17 @@ protected AnalysisResult(final Run<?, ?> owner, final String id, final DeltaRepo
265270
*
266271
* @return this
267272
*/
273+
@Serial
268274
protected Object readResolve() {
269275
if (qualityGateResult == null && qualityGateStatus != null) {
270276
qualityGateResult = new QualityGateResult(qualityGateStatus);
271277
}
272278
if (totals == null) {
273279
totals = new IssuesStatisticsBuilder().build();
274280
}
281+
if (parserId == null) {
282+
parserId = id; // fallback for old data
283+
}
275284
return this;
276285
}
277286

@@ -353,6 +362,10 @@ public String getId() {
353362
return id;
354363
}
355364

365+
String getParserId() {
366+
return parserId;
367+
}
368+
356369
@Override
357370
public Run<?, ?> getOwner() {
358371
return owner;

plugin/src/main/java/io/jenkins/plugins/analysis/core/model/ResultAction.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
@SuppressWarnings("ClassFanOutComplexity")
4444
@SuppressFBWarnings(value = "SE", justification = "transient field owner ist restored using a Jenkins callback")
4545
public class ResultAction implements HealthReportingAction, LastBuildAction, RunAction2, StaplerProxy, Serializable {
46+
@Serial
4647
private static final long serialVersionUID = 6683647181785654908L;
4748

4849
private transient Run<?, ?> owner;
@@ -317,13 +318,17 @@ public StaticAnalysisLabelProvider getLabelProvider() {
317318
}
318319

319320
private String getParserId() {
320-
var originalReport = getResult().getIssues();
321-
if (originalReport.hasParserId()) {
322-
return originalReport.getParserId();
321+
var parserId = getResult().getParserId();
322+
if (isValidId(parserId)) {
323+
return parserId;
323324
}
324325
return id;
325326
}
326327

328+
private boolean isValidId(final String parserId) {
329+
return StringUtils.isNotBlank(parserId) && !"-".equals(parserId);
330+
}
331+
327332
/**
328333
* Returns the detail view for issues for all Stapler requests.
329334
*
@@ -335,7 +340,7 @@ public IssuesDetail getTarget() {
335340
}
336341

337342
/**
338-
* Empty method as workaround for Stapler bug: JavaScript method in target object is not found.
343+
* Empty method as workaround for Stapler bug: JavaScript method in the target object is not found.
339344
*
340345
* @return unused string (since Firefox requires that Ajax calls return something)
341346
*/

0 commit comments

Comments
 (0)