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 package gov.nist.secauto.swid.builder;
28
29 import static gov.nist.secauto.swid.builder.util.Util.requireNonEmpty;
30
31 import gov.nist.secauto.swid.builder.resource.EvidenceBuilder;
32 import gov.nist.secauto.swid.builder.resource.PayloadBuilder;
33
34 import java.math.BigInteger;
35 import java.util.LinkedList;
36 import java.util.List;
37 import java.util.Locale;
38 import java.util.Objects;
39
40 public class SWIDBuilder extends AbstractLanguageSpecificBuilder<SWIDBuilder> {
41 private TagType tagType = TagType.PRIMARY;
42 private String name;
43 private String tagId;
44 private BigInteger tagVersion = SWIDConstants.TAG_VERSION_DEFAULT;
45 private String version;
46 private VersionScheme versionScheme;
47 private List<EntityBuilder> entities = new LinkedList<>();
48 private EvidenceBuilder evidence;
49 private List<LinkBuilder> links = new LinkedList<>();
50 private List<MetaBuilder> metas = new LinkedList<>();
51 private PayloadBuilder payload;
52 private String media;
53
54 protected SWIDBuilder() {
55 super();
56 }
57
58 @Override
59 public void reset() {
60 super.reset();
61
62 language(Locale.getDefault().toLanguageTag());
63
64 this.tagType = TagType.PRIMARY;
65 this.name = null;
66 this.tagId = null;
67 this.tagVersion = SWIDConstants.TAG_VERSION_DEFAULT;
68 this.version = null;
69 this.versionScheme = null;
70 this.entities = new LinkedList<>();
71 ;
72 this.evidence = null;
73 this.links = new LinkedList<>();
74 ;
75 this.metas = new LinkedList<>();
76 ;
77 this.payload = null;
78 this.media = null;
79 }
80
81 public static SWIDBuilder create() {
82 return new SWIDBuilder();
83 }
84
85 public String getTagId() {
86 return tagId;
87 }
88
89 public TagType getTagType() {
90 return tagType;
91 }
92
93 public String getName() {
94 return name;
95 }
96
97 public BigInteger getTagVersion() {
98 return tagVersion;
99 }
100
101 public String getVersion() {
102 return (version == null ? SWIDConstants.VERSION_DEFAULT : version);
103 }
104
105 public VersionScheme getVersionScheme() {
106 return (versionScheme == null ? SWIDConstants.VERSION_SCHEME_DEFAULT : versionScheme);
107 }
108
109 public List<EntityBuilder> getEntities() {
110 return entities;
111 }
112
113 public EvidenceBuilder getEvidence() {
114 return evidence;
115 }
116
117 public PayloadBuilder getPayload() {
118 return payload;
119 }
120
121
122
123
124
125
126
127 public EvidenceBuilder newEvidence() {
128 if (evidence == null) {
129 evidence = EvidenceBuilder.create();
130 }
131 return evidence;
132 }
133
134 public List<LinkBuilder> getLinks() {
135 return links;
136 }
137
138 public List<MetaBuilder> getMetas() {
139 return metas;
140 }
141
142
143
144
145
146
147
148 public PayloadBuilder newPayload() {
149 if (payload == null) {
150 payload = PayloadBuilder.create();
151 }
152 return payload;
153 }
154
155 public String getMedia() {
156 return media;
157 }
158
159
160
161
162
163
164
165
166 public SWIDBuilder tagType(TagType type) {
167 Objects.requireNonNull(type, "tagType");
168 this.tagType = type;
169 return this;
170 }
171
172
173
174
175
176
177
178
179 public SWIDBuilder name(String name) {
180 requireNonEmpty(name, "name");
181 this.name = name;
182 return this;
183 }
184
185
186
187
188
189
190
191
192 public SWIDBuilder tagId(String id) {
193 requireNonEmpty(id, "id");
194 this.tagId = id;
195 return this;
196 }
197
198 public SWIDBuilder tagVersion(long version) {
199 return tagVersion(BigInteger.valueOf(version));
200 }
201
202
203
204
205
206
207
208
209 public SWIDBuilder tagVersion(BigInteger version) {
210 Objects.requireNonNull(version, "tagVersion");
211 this.tagVersion = version;
212 return this;
213 }
214
215
216
217
218
219
220
221
222 public SWIDBuilder version(String version) {
223 requireNonEmpty(version, "version");
224 if (SWIDConstants.VERSION_DEFAULT.equals(version)) {
225 this.version = null;
226 } else {
227 this.version = version;
228 }
229 return this;
230 }
231
232
233
234
235
236
237
238
239
240
241
242
243
244 public SWIDBuilder versionScheme(VersionScheme scheme) {
245 Objects.requireNonNull(scheme, "versionScheme");
246 this.versionScheme = scheme;
247 return this;
248 }
249
250
251
252
253
254
255
256
257 public SWIDBuilder media(String media) {
258 Objects.requireNonNull(media, "media");
259 this.media = media;
260 return this;
261 }
262
263
264
265
266
267
268
269
270 public SWIDBuilder addEntity(EntityBuilder entity) {
271 Objects.requireNonNull(entity, "entity");
272 this.entities.add(entity);
273 return this;
274 }
275
276
277
278
279
280
281
282
283 public SWIDBuilder addLink(LinkBuilder link) {
284 Objects.requireNonNull(link, "link");
285 this.links.add(link);
286 return this;
287 }
288
289
290
291
292
293
294
295
296 public SWIDBuilder addMeta(MetaBuilder meta) {
297 Objects.requireNonNull(meta, "meta");
298 this.metas.add(meta);
299 return this;
300 }
301
302
303
304
305
306
307
308
309 public SWIDBuilder payload(PayloadBuilder payload) {
310 Objects.requireNonNull(payload, "payload");
311 this.payload = payload;
312 return this;
313 }
314
315
316
317
318
319
320
321
322 public SWIDBuilder evidence(EvidenceBuilder evidence) {
323 Objects.requireNonNull(evidence, "evidence");
324 this.evidence = evidence;
325 return this;
326 }
327
328 @Override
329 public void validate() throws ValidationException {
330 super.validate();
331 validateNonEmpty("name", name);
332 validateNonEmpty("tagId", tagId);
333 validateNonEmpty("entity", entities);
334 boolean foundTagCreator = false;
335 for (EntityBuilder entity : entities) {
336 entity.validate();
337 if (entity.getRoles().contains(KnownRole.TAG_CREATOR)) {
338 foundTagCreator = true;
339 }
340 }
341 if (!foundTagCreator) {
342 throw new ValidationException(
343 "at least one entity wwith the role '" + KnownRole.TAG_CREATOR.getName() + "' must be provided");
344 }
345
346 if (payload != null && evidence != null) {
347 throw new ValidationException("Only one of evidence or payload must be provided");
348 }
349
350 if (payload != null) {
351 payload.validate();
352 }
353
354 if (evidence != null) {
355 evidence.validate();
356 }
357
358 if (!links.isEmpty()) {
359 for (LinkBuilder link : links) {
360 link.validate();
361 }
362 }
363
364 if (!metas.isEmpty()) {
365 for (MetaBuilder meta : metas) {
366 meta.validate();
367 }
368 }
369 }
370
371 }