1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.api.models;
18
19 import static org.forgerock.api.models.ApiError.apiError;
20 import static org.forgerock.api.models.Reference.reference;
21 import static org.forgerock.api.util.ValidationUtil.isEmpty;
22
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Objects;
27
28 import com.fasterxml.jackson.annotation.JsonInclude;
29 import com.fasterxml.jackson.annotation.JsonProperty;
30 import org.forgerock.api.enums.Stability;
31 import org.forgerock.util.i18n.LocalizableString;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36
37
38 @JsonInclude(JsonInclude.Include.NON_NULL)
39 public abstract class Operation {
40
41 private static final Logger logger = LoggerFactory.getLogger(Operation.class);
42
43 private final LocalizableString description;
44 private final String[] supportedLocales;
45 @JsonProperty("errors")
46 private final ApiError[] apiErrors;
47 private final Parameter[] parameters;
48 private final Stability stability;
49
50
51
52
53
54
55 protected Operation(Builder builder) {
56 this.description = builder.description;
57 this.supportedLocales = builder.supportedLocales;
58 this.stability = builder.stability;
59
60 final List<ApiError> apiErrors = builder.apiErrors;
61 this.apiErrors = apiErrors.toArray(new ApiError[apiErrors.size()]);
62
63 final List<Parameter> parameters = builder.parameters;
64 this.parameters = parameters.toArray(new Parameter[parameters.size()]);
65 }
66
67
68
69
70
71
72 public LocalizableString getDescription() {
73 return description;
74 }
75
76
77
78
79
80
81 public String[] getSupportedLocales() {
82 return supportedLocales;
83 }
84
85
86
87
88
89
90 public ApiError[] getApiErrors() {
91 return apiErrors.length == 0 ? null : apiErrors;
92 }
93
94
95
96
97
98
99 public Parameter[] getParameters() {
100 return parameters.length == 0 ? null : parameters;
101 }
102
103
104
105
106
107
108 public Stability getStability() {
109 return stability;
110 }
111
112 @Override
113 public boolean equals(Object o) {
114 if (this == o) {
115 return true;
116 }
117 if (o == null || getClass() != o.getClass()) {
118 return false;
119 }
120 Operation operation = (Operation) o;
121 return Objects.equals(description, operation.description)
122 && Arrays.equals(supportedLocales, operation.supportedLocales)
123 && Arrays.equals(apiErrors, operation.apiErrors)
124 && Arrays.equals(parameters, operation.parameters)
125 && stability == operation.stability;
126 }
127
128 @Override
129 public int hashCode() {
130 return Objects.hash(description, supportedLocales, apiErrors, parameters, stability);
131 }
132
133
134
135
136
137
138
139 protected abstract void allocateToResource(Resource.Builder resourceBuilder);
140
141
142
143
144 public abstract static class Builder<T extends Builder<T>> {
145
146 private LocalizableString description;
147 private String[] supportedLocales;
148 private final List<ApiError> apiErrors;
149 private final List<Parameter> parameters;
150 private Stability stability;
151
152
153
154
155 protected Builder() {
156 apiErrors = new ArrayList<>();
157 parameters = new ArrayList<>();
158 }
159
160
161
162
163
164
165 protected abstract T self();
166
167
168
169
170
171
172
173 public T description(LocalizableString description) {
174 this.description = description;
175 return self();
176 }
177
178
179
180
181
182
183
184 @JsonProperty("description")
185 public T description(String description) {
186 this.description = new LocalizableString(description);
187 return self();
188 }
189
190
191
192
193
194
195
196 @JsonProperty("supportedLocales")
197 public T supportedLocales(String... supportedlocales) {
198 this.supportedLocales = supportedlocales;
199 return self();
200 }
201
202
203
204
205
206
207
208 @JsonProperty("errors")
209 public T errors(List<ApiError> apiErrors) {
210 this.apiErrors.addAll(apiErrors);
211 return self();
212 }
213
214
215
216
217
218
219
220 public T error(ApiError apiError) {
221 this.apiErrors.add(apiError);
222 return self();
223 }
224
225
226
227
228
229
230
231 @JsonProperty("parameters")
232 public T parameters(List<Parameter> parameters) {
233 this.parameters.addAll(parameters);
234 return self();
235 }
236
237
238
239
240
241
242
243 public T parameter(Parameter parameter) {
244 this.parameters.add(parameter);
245 return self();
246 }
247
248
249
250
251
252
253
254 @JsonProperty("stability")
255 public T stability(Stability stability) {
256 this.stability = stability;
257 return self();
258 }
259
260
261
262
263
264
265
266
267 public T detailsFromAnnotation(org.forgerock.api.annotations.Operation operation,
268 ApiDescription descriptor, Class<?> relativeType) {
269 for (String ref : operation.errorRefs()) {
270 if (isEmpty(ref)) {
271 logger.debug("Empty errorRefs array-element ignored on: " + relativeType.getCanonicalName());
272 } else {
273 error(apiError().reference(reference().value(ref).build()).build());
274 }
275 }
276 for (org.forgerock.api.annotations.ApiError apiApiError : operation.errors()) {
277 error(ApiError.fromAnnotation(apiApiError, descriptor, relativeType));
278 }
279 for (org.forgerock.api.annotations.Parameter parameter : operation.parameters()) {
280 parameter(Parameter.fromAnnotation(relativeType, parameter));
281 }
282 return description(new LocalizableString(operation.description(), relativeType))
283 .supportedLocales(operation.locales())
284 .stability(operation.stability());
285 }
286 }
287
288 }