Skip to content

Commit d458821

Browse files
author
totocaca
committed
Add multi report
1 parent fc5c9c5 commit d458821

File tree

4 files changed

+152
-17
lines changed

4 files changed

+152
-17
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.jenkins.plugins.reporter.steps;
2+
3+
import hudson.Extension;
4+
import hudson.model.AbstractDescribableImpl;
5+
import hudson.model.AbstractProject;
6+
import hudson.model.Descriptor;
7+
import hudson.model.Item;
8+
import hudson.util.FormValidation;
9+
import hudson.util.ListBoxModel;
10+
import io.jenkins.plugins.reporter.model.DisplayType;
11+
import io.jenkins.plugins.reporter.model.Provider;
12+
import io.jenkins.plugins.util.JenkinsFacade;
13+
import org.apache.commons.lang3.StringUtils;
14+
import org.kohsuke.stapler.AncestorInPath;
15+
import org.kohsuke.stapler.DataBoundConstructor;
16+
import org.kohsuke.stapler.DataBoundSetter;
17+
import org.kohsuke.stapler.QueryParameter;
18+
import org.kohsuke.stapler.verb.POST;
19+
20+
/**
21+
* Configuration for a single report in a FreeStyle project.
22+
*/
23+
public class ReportConfiguration extends AbstractDescribableImpl<ReportConfiguration> {
24+
25+
private String name;
26+
private Provider provider;
27+
private String displayType = "dual";
28+
29+
@DataBoundConstructor
30+
public ReportConfiguration() {
31+
// empty constructor required for Stapler
32+
}
33+
34+
public String getName() {
35+
return name;
36+
}
37+
38+
@DataBoundSetter
39+
public void setName(String name) {
40+
this.name = name;
41+
}
42+
43+
public Provider getProvider() {
44+
return provider;
45+
}
46+
47+
@DataBoundSetter
48+
public void setProvider(Provider provider) {
49+
this.provider = provider;
50+
}
51+
52+
public String getDisplayType() {
53+
return displayType;
54+
}
55+
56+
@DataBoundSetter
57+
public void setDisplayType(String displayType) {
58+
this.displayType = displayType;
59+
}
60+
61+
@Extension
62+
public static class DescriptorImpl extends Descriptor<ReportConfiguration> {
63+
private static final JenkinsFacade JENKINS = new JenkinsFacade();
64+
65+
@Override
66+
public String getDisplayName() {
67+
return "Report Configuration";
68+
}
69+
70+
@POST
71+
public FormValidation doCheckName(@QueryParameter("name") String name) {
72+
if (StringUtils.isEmpty(name)) {
73+
return FormValidation.error("Field 'name' is required.");
74+
}
75+
return FormValidation.ok();
76+
}
77+
78+
@POST
79+
public ListBoxModel doFillDisplayTypeItems(@AncestorInPath final AbstractProject<?, ?> project) {
80+
if (JENKINS.hasPermission(Item.CONFIGURE, project)) {
81+
ListBoxModel r = new ListBoxModel();
82+
for (DisplayType dt : DisplayType.values()) {
83+
r.add(dt.name().toLowerCase());
84+
}
85+
return r;
86+
}
87+
return new ListBoxModel();
88+
}
89+
}
90+
}

src/main/java/io/jenkins/plugins/reporter/steps/ReportRecorder.java

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@
2929
import org.kohsuke.stapler.verb.POST;
3030

3131
import java.io.IOException;
32+
import java.util.ArrayList;
3233
import java.util.Arrays;
34+
import java.util.List;
3335
import java.util.Locale;
3436

3537
public class ReportRecorder extends Recorder {
3638

37-
private String name;
38-
39-
private Provider provider;
40-
41-
private String displayType;
39+
private List<ReportConfiguration> reports = new ArrayList<>();
4240

4341
/**
4442
* Creates a new instance of {@link ReportRecorder}.
@@ -49,6 +47,15 @@ public ReportRecorder() {
4947

5048
// empty constructor required for Stapler
5149
}
50+
51+
@DataBoundSetter
52+
public void setReports(List<ReportConfiguration> reports) {
53+
this.reports = reports;
54+
}
55+
56+
public List<ReportConfiguration> getReports() {
57+
return reports;
58+
}
5259

5360
/**
5461
* Called after de-serialization to retain backward compatibility or to populate new elements (that would be
@@ -57,9 +64,25 @@ public ReportRecorder() {
5764
* @return this
5865
*/
5966
protected Object readResolve() {
67+
// Backward compatibility: if old single report fields are set, convert to list
68+
if (reports == null) {
69+
reports = new ArrayList<>();
70+
}
71+
if (name != null && provider != null && reports.isEmpty()) {
72+
ReportConfiguration config = new ReportConfiguration();
73+
config.setName(name);
74+
config.setProvider(provider);
75+
config.setDisplayType(displayType != null ? displayType : "dual");
76+
reports.add(config);
77+
}
6078
return this;
6179
}
6280

81+
// Keep these for backward compatibility
82+
private String name;
83+
private Provider provider;
84+
private String displayType;
85+
6386
@DataBoundSetter
6487
public void setName(String name) {
6588
this.name = name;
@@ -124,17 +147,31 @@ ReportResult perform(final Run<?, ?> run, final FilePath workspace, final TaskLi
124147

125148
private ReportResult record(final Run<?, ?> run, final FilePath workspace, final TaskListener listener)
126149
throws IOException, InterruptedException {
127-
128-
Report report = scan(run, workspace, listener, provider);
129-
report.setName(getName());
130-
131-
DisplayType dt = Arrays.stream(DisplayType.values())
132-
.filter(e -> e.name().toLowerCase(Locale.ROOT).equals(getDisplayType()))
133-
.findFirst().orElse(DisplayType.ABSOLUTE);
134150

135-
report.setDisplayType(dt);
151+
// Ensure backward compatibility is handled
152+
readResolve();
153+
154+
ReportResult lastResult = null;
155+
156+
// Process all configured reports
157+
for (ReportConfiguration config : reports) {
158+
if (config.getProvider() == null) {
159+
continue;
160+
}
161+
162+
Report report = scan(run, workspace, listener, config.getProvider());
163+
report.setName(config.getName());
164+
165+
DisplayType dt = Arrays.stream(DisplayType.values())
166+
.filter(e -> e.name().toLowerCase(Locale.ROOT).equals(config.getDisplayType()))
167+
.findFirst().orElse(DisplayType.ABSOLUTE);
168+
169+
report.setDisplayType(dt);
170+
171+
lastResult = publishReport(run, listener, config.getProvider().getSymbolName(), report);
172+
}
136173

137-
return publishReport(run, listener, provider.getSymbolName(), report);
174+
return lastResult;
138175
}
139176

140177
ReportResult publishReport(final Run<?, ?> run, final TaskListener listener,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?jelly escape-by-default='true'?>
2+
<j:jelly xmlns:j="jelly:core" xmlns:report="/report">
3+
4+
<report:step/>
5+
6+
</j:jelly>
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?jelly escape-by-default='true'?>
2-
<j:jelly xmlns:j="jelly:core" xmlns:report="/report">
2+
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form">
33

4-
<report:step/>
4+
<f:entry>
5+
<f:repeatableProperty field="reports" add="Add Report" header="Report Configuration"/>
6+
</f:entry>
57

6-
</j:jelly>
8+
</j:jelly>

0 commit comments

Comments
 (0)