-
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathQualityGateResult.java
More file actions
198 lines (167 loc) · 5.88 KB
/
Copy pathQualityGateResult.java
File metadata and controls
198 lines (167 loc) · 5.88 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package io.jenkins.plugins.util;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.Whitelisted;
import hudson.model.Result;
/**
* Result of a quality gate evaluation. Aggregates the individual results of the quality gates into an overall status.
*
* @author Ullrich Hafner
*/
public class QualityGateResult implements Serializable {
@Serial
private static final long serialVersionUID = 1626549055698872334L;
private QualityGateStatus overallStatus;
@SuppressWarnings("PMD.LooseCoupling")
private final ArrayList<QualityGateResultItem> items = new ArrayList<>();
/**
* Creates a new instance of {@link QualityGateResult} that has its overall status set to
* {@link QualityGateStatus#INACTIVE}.
*/
public QualityGateResult() {
this(QualityGateStatus.INACTIVE);
}
/**
* Creates a new instance of {@link QualityGateResult} with the specified overall status.
*
* @param overallStatus
* the overall status of all quality gates
*/
public QualityGateResult(final QualityGateStatus overallStatus) {
this.overallStatus = overallStatus;
}
/**
* Adds another quality gate result to the aggregated result.
*
* @param qualityGate
* the quality gate that has been evaluated
* @param actualStatus
* the status of the quality gate
* @param actualValue
* the value that has been evaluated against the quality gate threshold
*/
public void add(final QualityGate qualityGate, final QualityGateStatus actualStatus, final String actualValue) {
items.add(new QualityGateResultItem(actualStatus, qualityGate, actualValue));
if (actualStatus.isWorseThan(overallStatus)) {
overallStatus = actualStatus;
}
}
@SuppressWarnings("unused") // Called by jelly view
public List<QualityGateResultItem> getResultItems() {
return items;
}
@Whitelisted
public QualityGateStatus getOverallStatus() {
return overallStatus;
}
@Whitelisted
public boolean isSuccessful() {
return overallStatus.isSuccessful();
}
public boolean isInactive() {
return overallStatus == QualityGateStatus.INACTIVE;
}
public Collection<String> getMessages() {
return items.stream().map(this::createMessage).collect(Collectors.toList());
}
private String createMessage(final QualityGateResultItem item) {
return "[%s]: ≪%s≫ - (Actual value: %s, Quality gate: %.2f)".formatted(
item.getQualityGate().getName(),
item.getStatus().getDescription(),
item.getActualValue(),
item.getQualityGate().getThreshold());
}
@Override
public String toString() {
return getOverallStatus().toString();
}
/**
* Represents a single item of the quality gate results.
*/
public static class QualityGateResultItem implements Serializable {
@Serial
private static final long serialVersionUID = -4011767393049355487L;
private final QualityGateStatus status;
private final QualityGate qualityGate;
private final String actualValue;
QualityGateResultItem(final QualityGateStatus status, final QualityGate qualityGate, final String actualValue) {
this.status = status;
this.qualityGate = qualityGate;
this.actualValue = actualValue;
}
public QualityGateStatus getStatus() {
return status;
}
public QualityGate getQualityGate() {
return qualityGate;
}
public String getActualValue() {
return actualValue;
}
}
/**
* Remote API to list the overview of the quality gate evaluation.
*/
@ExportedBean
public static class QualityGateResultApi {
private final QualityGateResult qualityGateResult;
/**
* Creates a new instance of {@link QualityGateResultApi}.
*
* @param qualityGateResult
* the quality gate result to show
*/
public QualityGateResultApi(final QualityGateResult qualityGateResult) {
this.qualityGateResult = qualityGateResult;
}
@Exported(inline = true)
public QualityGateStatus getOverallResult() {
return qualityGateResult.getOverallStatus();
}
@Exported(inline = true)
public Collection<QualityGateItemApi> getResultItems() {
return qualityGateResult.getResultItems()
.stream()
.map(QualityGateItemApi::new)
.collect(Collectors.toList());
}
}
/**
* Remote API to show the content of an individual quality gate item.
*/
@ExportedBean
public static class QualityGateItemApi {
private final QualityGateResultItem item;
/**
* Creates a new instance of {@link QualityGateItemApi}.
*
* @param item
* the quality gate result item to show
*/
public QualityGateItemApi(final QualityGateResultItem item) {
this.item = item;
}
@Exported
public String getQualityGate() {
return item.getQualityGate().getName();
}
@Exported
public double getThreshold() {
return item.getQualityGate().getThreshold();
}
@Exported(inline = true)
public Result getResult() {
return item.getStatus().getResult();
}
@Exported
public String getValue() {
return item.getActualValue();
}
}
}