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.util.ValidationUtil.isEmpty;
20
21 import java.util.Arrays;
22 import java.util.Objects;
23
24 import com.fasterxml.jackson.annotation.JsonInclude;
25 import com.fasterxml.jackson.annotation.JsonProperty;
26 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
27 import org.forgerock.api.ApiValidationException;
28 import org.forgerock.api.enums.ParameterSource;
29 import org.forgerock.util.i18n.LocalizableString;
30
31
32
33
34 @JsonDeserialize(builder = Parameter.Builder.class)
35 @JsonInclude(JsonInclude.Include.NON_EMPTY)
36 public final class Parameter {
37
38 private final String name;
39 private final String type;
40 private final String defaultValue;
41 private final LocalizableString description;
42 private final ParameterSource source;
43 private final Boolean required;
44 private final String[] enumValues;
45 private final String[] enumTitles;
46
47
48
49
50
51
52
53
54 private Parameter(Builder builder) {
55 this.name = builder.name;
56 this.type = builder.type;
57 this.defaultValue = builder.defaultValue;
58 this.description = builder.description;
59 this.source = builder.source;
60 this.required = builder.required;
61 this.enumValues = builder.enumValues;
62 this.enumTitles = builder.enumTitles;
63
64 if (isEmpty(name) || isEmpty(type) || source == null) {
65 throw new ApiValidationException("name, type, and source are required");
66 }
67 if (enumTitles != null) {
68 if (enumValues == null) {
69 throw new ApiValidationException("enum[] required when enum_values[] is defined");
70 }
71 if (enumTitles.length != enumValues.length) {
72 throw new ApiValidationException("enum[] and enum_values[] must be the same length");
73 }
74 }
75 }
76
77
78
79
80
81
82 public String getName() {
83 return name;
84 }
85
86
87
88
89
90
91 public String getType() {
92 return type;
93 }
94
95
96
97
98
99
100 public String getDefaultValue() {
101 return defaultValue;
102 }
103
104
105
106
107
108
109 public LocalizableString getDescription() {
110 return description;
111 }
112
113
114
115
116
117
118 public ParameterSource getSource() {
119 return source;
120 }
121
122
123
124
125
126
127 public Boolean isRequired() {
128 return required;
129 }
130
131
132
133
134
135
136 @JsonProperty("enum")
137 public String[] getEnumValues() {
138 return enumValues;
139 }
140
141
142
143
144
145
146 @JsonProperty("options/enum_titles")
147 public String[] getEnumTitles() {
148 return enumTitles;
149 }
150
151 @Override
152 public boolean equals(Object o) {
153 if (this == o) {
154 return true;
155 }
156 if (o == null || getClass() != o.getClass()) {
157 return false;
158 }
159 Parameter parameter = (Parameter) o;
160 return required == parameter.required
161 && Objects.equals(name, parameter.name)
162 && Objects.equals(type, parameter.type)
163 && Objects.equals(defaultValue, parameter.defaultValue)
164 && Objects.equals(description, parameter.description)
165 && source == parameter.source
166 && Arrays.equals(enumValues, parameter.enumValues)
167 && Arrays.equals(enumTitles, parameter.enumTitles);
168 }
169
170 @Override
171 public int hashCode() {
172 return Objects.hash(name, type, defaultValue, description, source, required, enumValues, enumTitles);
173 }
174
175
176
177
178
179
180 public static Builder parameter() {
181 return new Builder();
182 }
183
184
185
186
187
188
189
190 public static Parameter fromAnnotation(Class<?> type, org.forgerock.api.annotations.Parameter parameter) {
191 return parameter()
192 .description(new LocalizableString(parameter.description(), type))
193 .defaultValue(parameter.defaultValue())
194 .enumValues(parameter.enumValues())
195 .enumTitles(parameter.enumTitles())
196 .required(parameter.required())
197 .name(parameter.name())
198 .source(parameter.source())
199 .type(parameter.type())
200 .build();
201 }
202
203
204
205
206 public static final class Builder {
207
208 private String name;
209 private String type;
210 private String defaultValue;
211 private LocalizableString description;
212 private ParameterSource source;
213 private Boolean required;
214 private String[] enumValues;
215 private String[] enumTitles;
216
217 private Builder() {
218 }
219
220
221
222
223
224
225
226 @JsonProperty("name")
227 public Builder name(String name) {
228 this.name = name;
229 return this;
230 }
231
232
233
234
235
236
237
238 @JsonProperty("enum")
239 public Builder enumValues(String... enumValues) {
240 this.enumValues = enumValues;
241 return this;
242 }
243
244
245
246
247
248
249
250 @JsonProperty("options/enum_titles")
251 public Builder enumTitles(String... enumTitles) {
252 this.enumTitles = enumTitles;
253 return this;
254 }
255
256
257
258
259
260
261
262 @JsonProperty("type")
263 public Builder type(String type) {
264 this.type = type;
265 return this;
266 }
267
268
269
270
271
272
273
274 @JsonProperty("defaultValue")
275 public Builder defaultValue(String defaultValue) {
276 this.defaultValue = defaultValue;
277 return this;
278 }
279
280
281
282
283
284
285
286 public Builder description(LocalizableString description) {
287 this.description = description;
288 return this;
289 }
290
291
292
293
294
295
296
297 @JsonProperty("description")
298 public Builder description(String description) {
299 this.description = new LocalizableString(description);
300 return this;
301 }
302
303
304
305
306
307
308
309 @JsonProperty("source")
310 public Builder source(ParameterSource source) {
311 this.source = source;
312 return this;
313 }
314
315
316
317
318
319
320
321 @JsonProperty("required")
322 public Builder required(Boolean required) {
323 this.required = required;
324 return this;
325 }
326
327
328
329
330
331
332 public Parameter build() {
333 return new Parameter(this);
334 }
335 }
336
337 }