1 package gov.nist.secauto.oscal.lib.model;
2
3 import gov.nist.secauto.metaschema.binding.model.annotations.AllowedValue;
4 import gov.nist.secauto.metaschema.binding.model.annotations.AllowedValues;
5 import gov.nist.secauto.metaschema.binding.model.annotations.AssemblyConstraints;
6 import gov.nist.secauto.metaschema.binding.model.annotations.BoundAssembly;
7 import gov.nist.secauto.metaschema.binding.model.annotations.BoundField;
8 import gov.nist.secauto.metaschema.binding.model.annotations.BoundFieldValue;
9 import gov.nist.secauto.metaschema.binding.model.annotations.BoundFlag;
10 import gov.nist.secauto.metaschema.binding.model.annotations.GroupAs;
11 import gov.nist.secauto.metaschema.binding.model.annotations.HasCardinality;
12 import gov.nist.secauto.metaschema.binding.model.annotations.Index;
13 import gov.nist.secauto.metaschema.binding.model.annotations.IndexHasKey;
14 import gov.nist.secauto.metaschema.binding.model.annotations.IsUnique;
15 import gov.nist.secauto.metaschema.binding.model.annotations.KeyField;
16 import gov.nist.secauto.metaschema.binding.model.annotations.MetaschemaAssembly;
17 import gov.nist.secauto.metaschema.binding.model.annotations.MetaschemaField;
18 import gov.nist.secauto.metaschema.binding.model.annotations.MetaschemaFieldValue;
19 import gov.nist.secauto.metaschema.binding.model.annotations.ValueConstraints;
20 import gov.nist.secauto.metaschema.model.common.JsonGroupAsBehavior;
21 import gov.nist.secauto.metaschema.model.common.XmlGroupAsBehavior;
22 import gov.nist.secauto.metaschema.model.common.constraint.IConstraint;
23 import gov.nist.secauto.metaschema.model.common.datatype.adapter.DateTimeWithTZAdapter;
24 import gov.nist.secauto.metaschema.model.common.datatype.adapter.EmailAddressAdapter;
25 import gov.nist.secauto.metaschema.model.common.datatype.adapter.StringAdapter;
26 import gov.nist.secauto.metaschema.model.common.datatype.adapter.TokenAdapter;
27 import gov.nist.secauto.metaschema.model.common.datatype.adapter.UriAdapter;
28 import gov.nist.secauto.metaschema.model.common.datatype.adapter.UuidAdapter;
29 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupLine;
30 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupLineAdapter;
31 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupMultiline;
32 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupMultilineAdapter;
33 import gov.nist.secauto.metaschema.model.common.util.ObjectUtils;
34 import gov.nist.secauto.oscal.lib.model.metadata.AbstractMetadata;
35 import java.lang.Override;
36 import java.lang.String;
37 import java.net.URI;
38 import java.time.ZonedDateTime;
39 import java.util.LinkedList;
40 import java.util.List;
41 import java.util.UUID;
42 import org.apache.commons.lang3.builder.MultilineRecursiveToStringStyle;
43 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
44
45
46
47
48 @MetaschemaAssembly(
49 formalName = "Document Metadata",
50 description = "Provides information about the containing document, and defines concepts that are shared across the document.",
51 name = "metadata",
52 metaschema = OscalMetadataMetaschema.class,
53 remarks = "All OSCAL documents use the same metadata structure, that provides a consistent way of expressing OSCAL document metadata across all OSCAL models. The metadata section also includes declarations of individual objects (i.e., roles, location, parties) that may be referenced within and across linked OSCAL documents.\n"
54 + "\n"
55 + "The metadata in an OSCAL document has few required fields, representing only the bare minimum data needed to differentiate one instance from another. Tools and users creating OSCAL documents may choose to use any of the optional fields, as well as extension mechanisms (e.g., properties, links) to go beyond this minimum to suit their use cases.\n"
56 + "\n"
57 + "A publisher of OSCAL content can use the `published`, `last-modified`, and `version` fields to establish information about an individual in a sequence of successive revisions of a given OSCAL-based publication. The metadata for a previous revision can be represented as a `revision` within this object. Links may also be provided using the `predecessor-version` and `successor-version` link relations to provide for direct access to the related resource. These relations can be provided as a link child of this object or as `link` within a given `revision`.\n"
58 + "\n"
59 + "A `responsible-party` entry in this context refers to roles and parties that have responsibility relative to the production, review, publication, and use of the containing document."
60 )
61 @ValueConstraints(
62 allowedValues = {
63 @AllowedValues(id = "allowed-metadata-responsibe-party-role-ids", level = IConstraint.Level.ERROR, target = "responsible-party/@role-id", allowOthers = true, values = {@AllowedValue(value = "creator", description = "Indicates the person or organization that created this content."), @AllowedValue(value = "prepared-by", description = "Indicates the person or organization that prepared this content."), @AllowedValue(value = "prepared-for", description = "Indicates the person or organization for which this content was created."), @AllowedValue(value = "content-approver", description = "Indicates the person or organization responsible for all content represented in the \"document\"."), @AllowedValue(value = "contact", description = "Indicates the person or organization to contact for questions or support related to this content.")}),
64 @AllowedValues(level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = @AllowedValue(value = "keywords", description = "The value identifies a comma-seperated listing of keywords associated with this content. These keywords may be used as search terms for indexing and other applications.")),
65 @AllowedValues(level = IConstraint.Level.ERROR, target = "link/@rel", allowOthers = true, values = {@AllowedValue(value = "canonical", description = "The link identifies the authoritative location for this resource. Defined by [RFC 6596](https://tools.ietf.org/html/rfc6596)."), @AllowedValue(value = "alternate", description = "The link identifies an alternative location or format for this resource. Defined by [the HTML Living Standard](https://html.spec.whatwg.org/multipage/links.html#linkTypes)"), @AllowedValue(value = "latest-version", description = "This link identifies a resource containing the latest version in the version history. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829)."), @AllowedValue(value = "predecessor-version", description = "This link identifies a resource containing the predecessor version in the version history. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829)."), @AllowedValue(value = "successor-version", description = "This link identifies a resource containing the predecessor version in the version history. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829).")})
66 }
67 )
68 @AssemblyConstraints(
69 index = {
70 @Index(id = "index-metadata-roles", level = IConstraint.Level.ERROR, target = "role", name = "index-metadata-role-ids", keyFields = @KeyField(target = "@id")),
71 @Index(id = "index-metadata-property-uuid", level = IConstraint.Level.ERROR, target = ".//prop", name = "index-metadata-property-uuid", keyFields = @KeyField(target = "@uuid")),
72 @Index(id = "index-metadata-role-id", level = IConstraint.Level.ERROR, target = "role", name = "index-metadata-role-id", keyFields = @KeyField(target = "@id")),
73 @Index(id = "index-metadata-location-uuid", level = IConstraint.Level.ERROR, target = "location", name = "index-metadata-location-uuid", keyFields = @KeyField(target = "@uuid")),
74 @Index(id = "index-metadata-party-uuid", level = IConstraint.Level.ERROR, target = "party", name = "index-metadata-party-uuid", keyFields = @KeyField(target = "@uuid")),
75 @Index(id = "index-metadata-party-organizations-uuid", level = IConstraint.Level.ERROR, target = "party[@type='organization']", name = "index-metadata-party-organizations-uuid", keyFields = @KeyField(target = "@uuid"))
76 },
77 isUnique = {
78 @IsUnique(id = "unique-metadata-doc-id", level = IConstraint.Level.ERROR, target = "document-id", keyFields = {@KeyField(target = "@scheme"), @KeyField}),
79 @IsUnique(id = "unique-metadata-property", level = IConstraint.Level.ERROR, target = "prop", keyFields = {@KeyField(target = "@name"), @KeyField(target = "@ns"), @KeyField(target = "@class"), @KeyField(target = "@group"), @KeyField(target = "@value")}),
80 @IsUnique(id = "unique-metadata-link", level = IConstraint.Level.ERROR, target = "link", keyFields = {@KeyField(target = "@href"), @KeyField(target = "@rel"), @KeyField(target = "@media-type")}),
81 @IsUnique(id = "unique-metadata-responsible-party", level = IConstraint.Level.ERROR, target = "responsible-party", keyFields = @KeyField(target = "@role-id"), remarks = "Since `responsible-party` associates multiple `party-uuid` entries with a single `role-id`, each role-id must be referenced only once."),
82 @IsUnique(level = IConstraint.Level.ERROR, target = "document-id", keyFields = {@KeyField(target = "@scheme"), @KeyField}, remarks = "The combination of `scheme` and the field value must be unique.")
83 }
84 )
85 public class Metadata extends AbstractMetadata {
86
87
88
89 @BoundField(
90 formalName = "Document Title",
91 description = "A name given to the document, which may be used by a tool for display and navigation.",
92 useName = "title",
93 minOccurs = 1
94 )
95 @BoundFieldValue(
96 typeAdapter = MarkupLineAdapter.class
97 )
98 private MarkupLine _title;
99
100 @BoundField(
101 formalName = "Publication Timestamp",
102 description = "The date and time the document was last made available.",
103 useName = "published"
104 )
105 @BoundFieldValue(
106 typeAdapter = DateTimeWithTZAdapter.class
107 )
108 private ZonedDateTime _published;
109
110 @BoundField(
111 formalName = "Last Modified Timestamp",
112 description = "The date and time the document was last stored for later retrieval.",
113 useName = "last-modified",
114 minOccurs = 1
115 )
116 @BoundFieldValue(
117 typeAdapter = DateTimeWithTZAdapter.class
118 )
119 private ZonedDateTime _lastModified;
120
121 @BoundField(
122 formalName = "Document Version",
123 description = "Used to distinguish a specific revision of an OSCAL document from other previous and future versions.",
124 useName = "version",
125 minOccurs = 1
126 )
127 private String _version;
128
129 @BoundField(
130 formalName = "OSCAL Version",
131 description = "The OSCAL model version the document was authored against and will conform to as valid.",
132 useName = "oscal-version",
133 minOccurs = 1
134 )
135 private String _oscalVersion;
136
137
138
139
140 @BoundAssembly(
141 formalName = "Revision History Entry",
142 description = "An entry in a sequential list of revisions to the containing document, expected to be in reverse chronological order (i.e. latest first).",
143 useName = "revision",
144 maxOccurs = -1,
145 remarks = "While `published`, `last-modified`, and `oscal-version` are not required, values for these entries should be provided if the information is known. A `link` with a `rel` of \"source\" should be provided if the information is known."
146 )
147 @GroupAs(
148 name = "revisions",
149 inJson = JsonGroupAsBehavior.LIST,
150 inXml = XmlGroupAsBehavior.GROUPED
151 )
152 private List<Revision> _revisions;
153
154 @BoundField(
155 formalName = "Document Identifier",
156 description = "A document identifier qualified by an identifier `scheme`.",
157 useName = "document-id",
158 maxOccurs = -1
159 )
160 @GroupAs(
161 name = "document-ids",
162 inJson = JsonGroupAsBehavior.LIST
163 )
164 private List<DocumentId> _documentIds;
165
166 @BoundAssembly(
167 formalName = "Property",
168 description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
169 useName = "prop",
170 maxOccurs = -1
171 )
172 @GroupAs(
173 name = "props",
174 inJson = JsonGroupAsBehavior.LIST
175 )
176 private List<Property> _props;
177
178 @BoundAssembly(
179 formalName = "Link",
180 description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
181 useName = "link",
182 maxOccurs = -1
183 )
184 @GroupAs(
185 name = "links",
186 inJson = JsonGroupAsBehavior.LIST
187 )
188 private List<Link> _links;
189
190
191
192
193 @BoundAssembly(
194 formalName = "Role",
195 description = "Defines a function, which might be assigned to a party in a specific situation.",
196 useName = "role",
197 maxOccurs = -1,
198 remarks = "Permissible values to be determined closer to the application (e.g. by a receiving authority).\n"
199 + "\n"
200 + "OSCAL has defined a set of standardized roles for consistent use in OSCAL documents. This allows tools consuming OSCAL content to infer specific semantics when these roles are used. These roles are documented in the specific contexts of their use (e.g., responsible-party, responsible-role). When using such a role, it is necessary to define these roles in this list, which will then allow such a role to be referenced."
201 )
202 @GroupAs(
203 name = "roles",
204 inJson = JsonGroupAsBehavior.LIST
205 )
206 private List<Role> _roles;
207
208
209
210
211 @BoundAssembly(
212 formalName = "Location",
213 description = "A physical point of presence, which may be associated with people, organizations, or other concepts within the current or linked OSCAL document.",
214 useName = "location",
215 maxOccurs = -1,
216 remarks = "An address might be sensitive in nature. In such cases a title, mailing address, email-address, and/or phone number may be used instead."
217 )
218 @GroupAs(
219 name = "locations",
220 inJson = JsonGroupAsBehavior.LIST
221 )
222 private List<Location> _locations;
223
224
225
226
227 @BoundAssembly(
228 formalName = "Party",
229 description = "An organization or person, which may be associated with roles or other concepts within the current or linked OSCAL document.",
230 useName = "party",
231 maxOccurs = -1,
232 remarks = "A party can be optionally associated with either an address or a location. While providing a meaningful location for a party is desired, there are some cases where it might not be possible to provide an exact location or even any location."
233 )
234 @GroupAs(
235 name = "parties",
236 inJson = JsonGroupAsBehavior.LIST
237 )
238 private List<Party> _parties;
239
240 @BoundAssembly(
241 formalName = "Responsible Party",
242 description = "A reference to a set of persons and/or organizations that have responsibility for performing the referenced role in the context of the containing object.",
243 useName = "responsible-party",
244 maxOccurs = -1
245 )
246 @GroupAs(
247 name = "responsible-parties",
248 inJson = JsonGroupAsBehavior.LIST
249 )
250 private List<ResponsibleParty> _responsibleParties;
251
252 @BoundAssembly(
253 formalName = "Action",
254 description = "An action applied by a role within a given party to the content.",
255 useName = "action",
256 maxOccurs = -1
257 )
258 @GroupAs(
259 name = "actions",
260 inJson = JsonGroupAsBehavior.LIST
261 )
262 private List<Action> _actions;
263
264 @BoundField(
265 formalName = "Remarks",
266 description = "Additional commentary about the containing object.",
267 useName = "remarks"
268 )
269 @BoundFieldValue(
270 typeAdapter = MarkupMultilineAdapter.class
271 )
272 private MarkupMultiline _remarks;
273
274 public Metadata() {
275 }
276
277 public MarkupLine getTitle() {
278 return _title;
279 }
280
281 public void setTitle(MarkupLine value) {
282 _title = value;
283 }
284
285 public ZonedDateTime getPublished() {
286 return _published;
287 }
288
289 public void setPublished(ZonedDateTime value) {
290 _published = value;
291 }
292
293 public ZonedDateTime getLastModified() {
294 return _lastModified;
295 }
296
297 public void setLastModified(ZonedDateTime value) {
298 _lastModified = value;
299 }
300
301 public String getVersion() {
302 return _version;
303 }
304
305 public void setVersion(String value) {
306 _version = value;
307 }
308
309 public String getOscalVersion() {
310 return _oscalVersion;
311 }
312
313 public void setOscalVersion(String value) {
314 _oscalVersion = value;
315 }
316
317 public List<Revision> getRevisions() {
318 return _revisions;
319 }
320
321 public void setRevisions(List<Revision> value) {
322 _revisions = value;
323 }
324
325
326
327
328
329
330 public boolean addRevision(Revision item) {
331 Revision value = ObjectUtils.requireNonNull(item,"item cannot be null");
332 if (_revisions == null) {
333 _revisions = new LinkedList<>();
334 }
335 return _revisions.add(value);
336 }
337
338
339
340
341
342
343 public boolean removeRevision(Revision item) {
344 Revision value = ObjectUtils.requireNonNull(item,"item cannot be null");
345 return _revisions == null ? false : _revisions.remove(value);
346 }
347
348 public List<DocumentId> getDocumentIds() {
349 return _documentIds;
350 }
351
352 public void setDocumentIds(List<DocumentId> value) {
353 _documentIds = value;
354 }
355
356
357
358
359
360
361 public boolean addDocumentId(DocumentId item) {
362 DocumentId value = ObjectUtils.requireNonNull(item,"item cannot be null");
363 if (_documentIds == null) {
364 _documentIds = new LinkedList<>();
365 }
366 return _documentIds.add(value);
367 }
368
369
370
371
372
373
374 public boolean removeDocumentId(DocumentId item) {
375 DocumentId value = ObjectUtils.requireNonNull(item,"item cannot be null");
376 return _documentIds == null ? false : _documentIds.remove(value);
377 }
378
379 public List<Property> getProps() {
380 return _props;
381 }
382
383 public void setProps(List<Property> value) {
384 _props = value;
385 }
386
387
388
389
390
391
392 public boolean addProp(Property item) {
393 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
394 if (_props == null) {
395 _props = new LinkedList<>();
396 }
397 return _props.add(value);
398 }
399
400
401
402
403
404
405 public boolean removeProp(Property item) {
406 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
407 return _props == null ? false : _props.remove(value);
408 }
409
410 public List<Link> getLinks() {
411 return _links;
412 }
413
414 public void setLinks(List<Link> value) {
415 _links = value;
416 }
417
418
419
420
421
422
423 public boolean addLink(Link item) {
424 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
425 if (_links == null) {
426 _links = new LinkedList<>();
427 }
428 return _links.add(value);
429 }
430
431
432
433
434
435
436 public boolean removeLink(Link item) {
437 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
438 return _links == null ? false : _links.remove(value);
439 }
440
441 public List<Role> getRoles() {
442 return _roles;
443 }
444
445 public void setRoles(List<Role> value) {
446 _roles = value;
447 }
448
449
450
451
452
453
454 public boolean addRole(Role item) {
455 Role value = ObjectUtils.requireNonNull(item,"item cannot be null");
456 if (_roles == null) {
457 _roles = new LinkedList<>();
458 }
459 return _roles.add(value);
460 }
461
462
463
464
465
466
467 public boolean removeRole(Role item) {
468 Role value = ObjectUtils.requireNonNull(item,"item cannot be null");
469 return _roles == null ? false : _roles.remove(value);
470 }
471
472 public List<Location> getLocations() {
473 return _locations;
474 }
475
476 public void setLocations(List<Location> value) {
477 _locations = value;
478 }
479
480
481
482
483
484
485 public boolean addLocation(Location item) {
486 Location value = ObjectUtils.requireNonNull(item,"item cannot be null");
487 if (_locations == null) {
488 _locations = new LinkedList<>();
489 }
490 return _locations.add(value);
491 }
492
493
494
495
496
497
498 public boolean removeLocation(Location item) {
499 Location value = ObjectUtils.requireNonNull(item,"item cannot be null");
500 return _locations == null ? false : _locations.remove(value);
501 }
502
503 public List<Party> getParties() {
504 return _parties;
505 }
506
507 public void setParties(List<Party> value) {
508 _parties = value;
509 }
510
511
512
513
514
515
516 public boolean addParty(Party item) {
517 Party value = ObjectUtils.requireNonNull(item,"item cannot be null");
518 if (_parties == null) {
519 _parties = new LinkedList<>();
520 }
521 return _parties.add(value);
522 }
523
524
525
526
527
528
529 public boolean removeParty(Party item) {
530 Party value = ObjectUtils.requireNonNull(item,"item cannot be null");
531 return _parties == null ? false : _parties.remove(value);
532 }
533
534 public List<ResponsibleParty> getResponsibleParties() {
535 return _responsibleParties;
536 }
537
538 public void setResponsibleParties(List<ResponsibleParty> value) {
539 _responsibleParties = value;
540 }
541
542
543
544
545
546
547 public boolean addResponsibleParty(ResponsibleParty item) {
548 ResponsibleParty value = ObjectUtils.requireNonNull(item,"item cannot be null");
549 if (_responsibleParties == null) {
550 _responsibleParties = new LinkedList<>();
551 }
552 return _responsibleParties.add(value);
553 }
554
555
556
557
558
559
560 public boolean removeResponsibleParty(ResponsibleParty item) {
561 ResponsibleParty value = ObjectUtils.requireNonNull(item,"item cannot be null");
562 return _responsibleParties == null ? false : _responsibleParties.remove(value);
563 }
564
565 public List<Action> getActions() {
566 return _actions;
567 }
568
569 public void setActions(List<Action> value) {
570 _actions = value;
571 }
572
573
574
575
576
577
578 public boolean addAction(Action item) {
579 Action value = ObjectUtils.requireNonNull(item,"item cannot be null");
580 if (_actions == null) {
581 _actions = new LinkedList<>();
582 }
583 return _actions.add(value);
584 }
585
586
587
588
589
590
591 public boolean removeAction(Action item) {
592 Action value = ObjectUtils.requireNonNull(item,"item cannot be null");
593 return _actions == null ? false : _actions.remove(value);
594 }
595
596 public MarkupMultiline getRemarks() {
597 return _remarks;
598 }
599
600 public void setRemarks(MarkupMultiline value) {
601 _remarks = value;
602 }
603
604 @Override
605 public String toString() {
606 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
607 }
608
609
610
611
612 @MetaschemaAssembly(
613 formalName = "Revision History Entry",
614 description = "An entry in a sequential list of revisions to the containing document, expected to be in reverse chronological order (i.e. latest first).",
615 name = "revision",
616 metaschema = OscalMetadataMetaschema.class,
617 remarks = "While `published`, `last-modified`, and `oscal-version` are not required, values for these entries should be provided if the information is known. A `link` with a `rel` of \"source\" should be provided if the information is known."
618 )
619 @ValueConstraints(
620 allowedValues = @AllowedValues(level = IConstraint.Level.ERROR, target = "link/@rel", allowOthers = true, values = {@AllowedValue(value = "canonical", description = "The link identifies the authoritative location for this resource. Defined by [RFC 6596](https://tools.ietf.org/html/rfc6596)."), @AllowedValue(value = "alternate", description = "The link identifies an alternative location or format for this resource. Defined by [the HTML Living Standard](https://html.spec.whatwg.org/multipage/links.html#linkTypes)"), @AllowedValue(value = "predecessor-version", description = "This link identifies a resource containing the predecessor version in the version history. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829)."), @AllowedValue(value = "successor-version", description = "This link identifies a resource containing the predecessor version in the version history. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829)."), @AllowedValue(value = "version-history", description = "This link identifies a resource containing the version history of this document. Defined by [RFC 5829](https://tools.ietf.org/html/rfc5829).")})
621 )
622 public static class Revision {
623
624
625
626 @BoundField(
627 formalName = "Document Title",
628 description = "A name given to the document revision, which may be used by a tool for display and navigation.",
629 useName = "title"
630 )
631 @BoundFieldValue(
632 typeAdapter = MarkupLineAdapter.class
633 )
634 private MarkupLine _title;
635
636 @BoundField(
637 formalName = "Publication Timestamp",
638 description = "The date and time the document was last made available.",
639 useName = "published"
640 )
641 @BoundFieldValue(
642 typeAdapter = DateTimeWithTZAdapter.class
643 )
644 private ZonedDateTime _published;
645
646 @BoundField(
647 formalName = "Last Modified Timestamp",
648 description = "The date and time the document was last stored for later retrieval.",
649 useName = "last-modified"
650 )
651 @BoundFieldValue(
652 typeAdapter = DateTimeWithTZAdapter.class
653 )
654 private ZonedDateTime _lastModified;
655
656 @BoundField(
657 formalName = "Document Version",
658 description = "Used to distinguish a specific revision of an OSCAL document from other previous and future versions.",
659 useName = "version",
660 minOccurs = 1
661 )
662 private String _version;
663
664 @BoundField(
665 formalName = "OSCAL Version",
666 description = "The OSCAL model version the document was authored against and will conform to as valid.",
667 useName = "oscal-version"
668 )
669 private String _oscalVersion;
670
671 @BoundAssembly(
672 formalName = "Property",
673 description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
674 useName = "prop",
675 maxOccurs = -1
676 )
677 @GroupAs(
678 name = "props",
679 inJson = JsonGroupAsBehavior.LIST
680 )
681 private List<Property> _props;
682
683 @BoundAssembly(
684 formalName = "Link",
685 description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
686 useName = "link",
687 maxOccurs = -1
688 )
689 @GroupAs(
690 name = "links",
691 inJson = JsonGroupAsBehavior.LIST
692 )
693 private List<Link> _links;
694
695 @BoundField(
696 formalName = "Remarks",
697 description = "Additional commentary about the containing object.",
698 useName = "remarks"
699 )
700 @BoundFieldValue(
701 typeAdapter = MarkupMultilineAdapter.class
702 )
703 private MarkupMultiline _remarks;
704
705 public Revision() {
706 }
707
708 public MarkupLine getTitle() {
709 return _title;
710 }
711
712 public void setTitle(MarkupLine value) {
713 _title = value;
714 }
715
716 public ZonedDateTime getPublished() {
717 return _published;
718 }
719
720 public void setPublished(ZonedDateTime value) {
721 _published = value;
722 }
723
724 public ZonedDateTime getLastModified() {
725 return _lastModified;
726 }
727
728 public void setLastModified(ZonedDateTime value) {
729 _lastModified = value;
730 }
731
732 public String getVersion() {
733 return _version;
734 }
735
736 public void setVersion(String value) {
737 _version = value;
738 }
739
740 public String getOscalVersion() {
741 return _oscalVersion;
742 }
743
744 public void setOscalVersion(String value) {
745 _oscalVersion = value;
746 }
747
748 public List<Property> getProps() {
749 return _props;
750 }
751
752 public void setProps(List<Property> value) {
753 _props = value;
754 }
755
756
757
758
759
760
761 public boolean addProp(Property item) {
762 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
763 if (_props == null) {
764 _props = new LinkedList<>();
765 }
766 return _props.add(value);
767 }
768
769
770
771
772
773
774 public boolean removeProp(Property item) {
775 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
776 return _props == null ? false : _props.remove(value);
777 }
778
779 public List<Link> getLinks() {
780 return _links;
781 }
782
783 public void setLinks(List<Link> value) {
784 _links = value;
785 }
786
787
788
789
790
791
792 public boolean addLink(Link item) {
793 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
794 if (_links == null) {
795 _links = new LinkedList<>();
796 }
797 return _links.add(value);
798 }
799
800
801
802
803
804
805 public boolean removeLink(Link item) {
806 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
807 return _links == null ? false : _links.remove(value);
808 }
809
810 public MarkupMultiline getRemarks() {
811 return _remarks;
812 }
813
814 public void setRemarks(MarkupMultiline value) {
815 _remarks = value;
816 }
817
818 @Override
819 public String toString() {
820 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
821 }
822 }
823
824
825
826
827 @MetaschemaAssembly(
828 formalName = "Party",
829 description = "An organization or person, which may be associated with roles or other concepts within the current or linked OSCAL document.",
830 name = "party",
831 metaschema = OscalMetadataMetaschema.class,
832 remarks = "A party can be optionally associated with either an address or a location. While providing a meaningful location for a party is desired, there are some cases where it might not be possible to provide an exact location or even any location."
833 )
834 @ValueConstraints(
835 allowedValues = @AllowedValues(level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = {@AllowedValue(value = "mail-stop", description = "A mail stop associated with the party."), @AllowedValue(value = "office", description = "The name or number of the party's office."), @AllowedValue(value = "job-title", description = "The formal job title of a person.")})
836 )
837 public static class Party {
838 @BoundFlag(
839 formalName = "Party Universally Unique Identifier",
840 description = "A unique identifier for the party.",
841 useName = "uuid",
842 required = true,
843 typeAdapter = UuidAdapter.class
844 )
845 private UUID _uuid;
846
847 @BoundFlag(
848 formalName = "Party Type",
849 description = "A category describing the kind of party the object describes.",
850 useName = "type",
851 required = true,
852 typeAdapter = StringAdapter.class
853 )
854 @ValueConstraints(
855 allowedValues = @AllowedValues(level = IConstraint.Level.ERROR, values = {@AllowedValue(value = "person", description = "A human being regarded as an individual."), @AllowedValue(value = "organization", description = "An organized group of one or more `person` individuals with a specific purpose.")})
856 )
857 private String _type;
858
859
860
861
862 @BoundField(
863 formalName = "Party Name",
864 description = "The full name of the party. This is typically the legal name associated with the party.",
865 useName = "name"
866 )
867 private String _name;
868
869
870
871
872 @BoundField(
873 formalName = "Party Short Name",
874 description = "A short common name, abbreviation, or acronym for the party.",
875 useName = "short-name"
876 )
877 private String _shortName;
878
879
880
881
882 @BoundField(
883 formalName = "Party External Identifier",
884 description = "An identifier for a person or organization using a designated scheme. e.g. an Open Researcher and Contributor ID (ORCID).",
885 useName = "external-id",
886 maxOccurs = -1
887 )
888 @GroupAs(
889 name = "external-ids",
890 inJson = JsonGroupAsBehavior.LIST
891 )
892 private List<ExternalId> _externalIds;
893
894 @BoundAssembly(
895 formalName = "Property",
896 description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
897 useName = "prop",
898 maxOccurs = -1
899 )
900 @GroupAs(
901 name = "props",
902 inJson = JsonGroupAsBehavior.LIST
903 )
904 private List<Property> _props;
905
906 @BoundAssembly(
907 formalName = "Link",
908 description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
909 useName = "link",
910 maxOccurs = -1
911 )
912 @GroupAs(
913 name = "links",
914 inJson = JsonGroupAsBehavior.LIST
915 )
916 private List<Link> _links;
917
918 @BoundField(
919 formalName = "Email Address",
920 description = "An email address as defined by [RFC 5322 Section 3.4.1](https://tools.ietf.org/html/rfc5322#section-3.4.1).",
921 useName = "email-address",
922 maxOccurs = -1,
923 remarks = "This is a contact email associated with the party."
924 )
925 @BoundFieldValue(
926 typeAdapter = EmailAddressAdapter.class
927 )
928 @GroupAs(
929 name = "email-addresses",
930 inJson = JsonGroupAsBehavior.LIST
931 )
932 private List<String> _emailAddresses;
933
934 @BoundField(
935 formalName = "Telephone Number",
936 description = "A telephone service number as defined by [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164-201011-I/en).",
937 useName = "telephone-number",
938 maxOccurs = -1,
939 remarks = "A phone number used to contact the party."
940 )
941 @GroupAs(
942 name = "telephone-numbers",
943 inJson = JsonGroupAsBehavior.LIST
944 )
945 private List<TelephoneNumber> _telephoneNumbers;
946
947 @BoundAssembly(
948 formalName = "Address",
949 description = "A postal address for the location.",
950 useName = "address",
951 maxOccurs = -1
952 )
953 @GroupAs(
954 name = "addresses",
955 inJson = JsonGroupAsBehavior.LIST
956 )
957 private List<Address> _addresses;
958
959 @BoundField(
960 formalName = "Location Universally Unique Identifier Reference",
961 description = "Reference to a location by UUID.",
962 useName = "location-uuid",
963 maxOccurs = -1
964 )
965 @BoundFieldValue(
966 typeAdapter = UuidAdapter.class
967 )
968 @ValueConstraints(
969 indexHasKey = @IndexHasKey(level = IConstraint.Level.ERROR, indexName = "index-metadata-location-uuid", keyFields = @KeyField)
970 )
971 @GroupAs(
972 name = "location-uuids",
973 inJson = JsonGroupAsBehavior.LIST
974 )
975 private List<UUID> _locationUuids;
976
977
978
979
980 @BoundField(
981 formalName = "Organizational Affiliation",
982 description = "A reference to another `party` by UUID, typically an organization, that this subject is associated with.",
983 useName = "member-of-organization",
984 maxOccurs = -1,
985 remarks = "Since the reference target of an organizational affiliation must be another `party` (whether further qualified as person or organization) as inidcated by its `uuid`. As a [machine-oriented](https://pages.nist.gov/OSCAL/concepts/identifier-use/#machine-oriented) identifier with uniqueness across document and trans-document scope, this `uuid` value is sufficient to reference the data item locally or globally across related documents, e.g., in an imported OSCAL instance.\n"
986 + "\n"
987 + "Parties of both the `person` or `organization` type can be associated with an organization using the `member-of-organization`."
988 )
989 @BoundFieldValue(
990 typeAdapter = UuidAdapter.class
991 )
992 @ValueConstraints(
993 indexHasKey = @IndexHasKey(level = IConstraint.Level.ERROR, indexName = "index-metadata-party-organizations-uuid", keyFields = @KeyField)
994 )
995 @GroupAs(
996 name = "member-of-organizations",
997 inJson = JsonGroupAsBehavior.LIST
998 )
999 private List<UUID> _memberOfOrganizations;
1000
1001 @BoundField(
1002 formalName = "Remarks",
1003 description = "Additional commentary about the containing object.",
1004 useName = "remarks"
1005 )
1006 @BoundFieldValue(
1007 typeAdapter = MarkupMultilineAdapter.class
1008 )
1009 private MarkupMultiline _remarks;
1010
1011 public Party() {
1012 }
1013
1014 public UUID getUuid() {
1015 return _uuid;
1016 }
1017
1018 public void setUuid(UUID value) {
1019 _uuid = value;
1020 }
1021
1022 public String getType() {
1023 return _type;
1024 }
1025
1026 public void setType(String value) {
1027 _type = value;
1028 }
1029
1030 public String getName() {
1031 return _name;
1032 }
1033
1034 public void setName(String value) {
1035 _name = value;
1036 }
1037
1038 public String getShortName() {
1039 return _shortName;
1040 }
1041
1042 public void setShortName(String value) {
1043 _shortName = value;
1044 }
1045
1046 public List<ExternalId> getExternalIds() {
1047 return _externalIds;
1048 }
1049
1050 public void setExternalIds(List<ExternalId> value) {
1051 _externalIds = value;
1052 }
1053
1054
1055
1056
1057
1058
1059 public boolean addExternalId(ExternalId item) {
1060 ExternalId value = ObjectUtils.requireNonNull(item,"item cannot be null");
1061 if (_externalIds == null) {
1062 _externalIds = new LinkedList<>();
1063 }
1064 return _externalIds.add(value);
1065 }
1066
1067
1068
1069
1070
1071
1072 public boolean removeExternalId(ExternalId item) {
1073 ExternalId value = ObjectUtils.requireNonNull(item,"item cannot be null");
1074 return _externalIds == null ? false : _externalIds.remove(value);
1075 }
1076
1077 public List<Property> getProps() {
1078 return _props;
1079 }
1080
1081 public void setProps(List<Property> value) {
1082 _props = value;
1083 }
1084
1085
1086
1087
1088
1089
1090 public boolean addProp(Property item) {
1091 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1092 if (_props == null) {
1093 _props = new LinkedList<>();
1094 }
1095 return _props.add(value);
1096 }
1097
1098
1099
1100
1101
1102
1103 public boolean removeProp(Property item) {
1104 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1105 return _props == null ? false : _props.remove(value);
1106 }
1107
1108 public List<Link> getLinks() {
1109 return _links;
1110 }
1111
1112 public void setLinks(List<Link> value) {
1113 _links = value;
1114 }
1115
1116
1117
1118
1119
1120
1121 public boolean addLink(Link item) {
1122 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1123 if (_links == null) {
1124 _links = new LinkedList<>();
1125 }
1126 return _links.add(value);
1127 }
1128
1129
1130
1131
1132
1133
1134 public boolean removeLink(Link item) {
1135 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1136 return _links == null ? false : _links.remove(value);
1137 }
1138
1139 public List<String> getEmailAddresses() {
1140 return _emailAddresses;
1141 }
1142
1143 public void setEmailAddresses(List<String> value) {
1144 _emailAddresses = value;
1145 }
1146
1147
1148
1149
1150
1151
1152 public boolean addEmailAddress(String item) {
1153 String value = ObjectUtils.requireNonNull(item,"item cannot be null");
1154 if (_emailAddresses == null) {
1155 _emailAddresses = new LinkedList<>();
1156 }
1157 return _emailAddresses.add(value);
1158 }
1159
1160
1161
1162
1163
1164
1165 public boolean removeEmailAddress(String item) {
1166 String value = ObjectUtils.requireNonNull(item,"item cannot be null");
1167 return _emailAddresses == null ? false : _emailAddresses.remove(value);
1168 }
1169
1170 public List<TelephoneNumber> getTelephoneNumbers() {
1171 return _telephoneNumbers;
1172 }
1173
1174 public void setTelephoneNumbers(List<TelephoneNumber> value) {
1175 _telephoneNumbers = value;
1176 }
1177
1178
1179
1180
1181
1182
1183 public boolean addTelephoneNumber(TelephoneNumber item) {
1184 TelephoneNumber value = ObjectUtils.requireNonNull(item,"item cannot be null");
1185 if (_telephoneNumbers == null) {
1186 _telephoneNumbers = new LinkedList<>();
1187 }
1188 return _telephoneNumbers.add(value);
1189 }
1190
1191
1192
1193
1194
1195
1196 public boolean removeTelephoneNumber(TelephoneNumber item) {
1197 TelephoneNumber value = ObjectUtils.requireNonNull(item,"item cannot be null");
1198 return _telephoneNumbers == null ? false : _telephoneNumbers.remove(value);
1199 }
1200
1201 public List<Address> getAddresses() {
1202 return _addresses;
1203 }
1204
1205 public void setAddresses(List<Address> value) {
1206 _addresses = value;
1207 }
1208
1209
1210
1211
1212
1213
1214 public boolean addAddress(Address item) {
1215 Address value = ObjectUtils.requireNonNull(item,"item cannot be null");
1216 if (_addresses == null) {
1217 _addresses = new LinkedList<>();
1218 }
1219 return _addresses.add(value);
1220 }
1221
1222
1223
1224
1225
1226
1227 public boolean removeAddress(Address item) {
1228 Address value = ObjectUtils.requireNonNull(item,"item cannot be null");
1229 return _addresses == null ? false : _addresses.remove(value);
1230 }
1231
1232 public List<UUID> getLocationUuids() {
1233 return _locationUuids;
1234 }
1235
1236 public void setLocationUuids(List<UUID> value) {
1237 _locationUuids = value;
1238 }
1239
1240
1241
1242
1243
1244
1245 public boolean addLocationUuid(UUID item) {
1246 UUID value = ObjectUtils.requireNonNull(item,"item cannot be null");
1247 if (_locationUuids == null) {
1248 _locationUuids = new LinkedList<>();
1249 }
1250 return _locationUuids.add(value);
1251 }
1252
1253
1254
1255
1256
1257
1258 public boolean removeLocationUuid(UUID item) {
1259 UUID value = ObjectUtils.requireNonNull(item,"item cannot be null");
1260 return _locationUuids == null ? false : _locationUuids.remove(value);
1261 }
1262
1263 public List<UUID> getMemberOfOrganizations() {
1264 return _memberOfOrganizations;
1265 }
1266
1267 public void setMemberOfOrganizations(List<UUID> value) {
1268 _memberOfOrganizations = value;
1269 }
1270
1271
1272
1273
1274
1275
1276 public boolean addMemberOfOrganization(UUID item) {
1277 UUID value = ObjectUtils.requireNonNull(item,"item cannot be null");
1278 if (_memberOfOrganizations == null) {
1279 _memberOfOrganizations = new LinkedList<>();
1280 }
1281 return _memberOfOrganizations.add(value);
1282 }
1283
1284
1285
1286
1287
1288
1289 public boolean removeMemberOfOrganization(UUID item) {
1290 UUID value = ObjectUtils.requireNonNull(item,"item cannot be null");
1291 return _memberOfOrganizations == null ? false : _memberOfOrganizations.remove(value);
1292 }
1293
1294 public MarkupMultiline getRemarks() {
1295 return _remarks;
1296 }
1297
1298 public void setRemarks(MarkupMultiline value) {
1299 _remarks = value;
1300 }
1301
1302 @Override
1303 public String toString() {
1304 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
1305 }
1306
1307
1308
1309
1310 @MetaschemaField(
1311 formalName = "Party External Identifier",
1312 description = "An identifier for a person or organization using a designated scheme. e.g. an Open Researcher and Contributor ID (ORCID).",
1313 name = "external-id",
1314 metaschema = OscalMetadataMetaschema.class,
1315 isCollapsible = false
1316 )
1317 public static class ExternalId {
1318 @MetaschemaFieldValue(
1319 valueKeyName = "id"
1320 )
1321 private String _value;
1322
1323 @BoundFlag(
1324 formalName = "External Identifier Schema",
1325 description = "Indicates the type of external identifier.",
1326 useName = "scheme",
1327 required = true,
1328 typeAdapter = UriAdapter.class,
1329 remarks = "This value must be an [absolute URI](https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri) that serves as a [naming system identifier](https://pages.nist.gov/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier)."
1330 )
1331 @ValueConstraints(
1332 allowedValues = @AllowedValues(level = IConstraint.Level.ERROR, allowOthers = true, values = @AllowedValue(value = "http://orcid.org/", description = "The identifier is Open Researcher and Contributor ID (ORCID)."))
1333 )
1334 private URI _scheme;
1335
1336 public ExternalId() {
1337 }
1338
1339 public String getValue() {
1340 return _value;
1341 }
1342
1343 public void setValue(String value) {
1344 _value = value;
1345 }
1346
1347 public URI getScheme() {
1348 return _scheme;
1349 }
1350
1351 public void setScheme(URI value) {
1352 _scheme = value;
1353 }
1354
1355 @Override
1356 public String toString() {
1357 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
1358 }
1359 }
1360 }
1361
1362
1363
1364
1365 @MetaschemaAssembly(
1366 formalName = "Role",
1367 description = "Defines a function, which might be assigned to a party in a specific situation.",
1368 name = "role",
1369 metaschema = OscalMetadataMetaschema.class,
1370 remarks = "Permissible values to be determined closer to the application (e.g. by a receiving authority).\n"
1371 + "\n"
1372 + "OSCAL has defined a set of standardized roles for consistent use in OSCAL documents. This allows tools consuming OSCAL content to infer specific semantics when these roles are used. These roles are documented in the specific contexts of their use (e.g., responsible-party, responsible-role). When using such a role, it is necessary to define these roles in this list, which will then allow such a role to be referenced."
1373 )
1374 public static class Role {
1375 @BoundFlag(
1376 formalName = "Role Identifier",
1377 description = "A unique identifier for the role.",
1378 useName = "id",
1379 required = true,
1380 typeAdapter = TokenAdapter.class
1381 )
1382 private String _id;
1383
1384
1385
1386
1387 @BoundField(
1388 formalName = "Role Title",
1389 description = "A name given to the role, which may be used by a tool for display and navigation.",
1390 useName = "title",
1391 minOccurs = 1
1392 )
1393 @BoundFieldValue(
1394 typeAdapter = MarkupLineAdapter.class
1395 )
1396 private MarkupLine _title;
1397
1398
1399
1400
1401 @BoundField(
1402 formalName = "Role Short Name",
1403 description = "A short common name, abbreviation, or acronym for the role.",
1404 useName = "short-name"
1405 )
1406 private String _shortName;
1407
1408
1409
1410
1411 @BoundField(
1412 formalName = "Role Description",
1413 description = "A summary of the role's purpose and associated responsibilities.",
1414 useName = "description"
1415 )
1416 @BoundFieldValue(
1417 typeAdapter = MarkupMultilineAdapter.class
1418 )
1419 private MarkupMultiline _description;
1420
1421 @BoundAssembly(
1422 formalName = "Property",
1423 description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
1424 useName = "prop",
1425 maxOccurs = -1
1426 )
1427 @GroupAs(
1428 name = "props",
1429 inJson = JsonGroupAsBehavior.LIST
1430 )
1431 private List<Property> _props;
1432
1433 @BoundAssembly(
1434 formalName = "Link",
1435 description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
1436 useName = "link",
1437 maxOccurs = -1
1438 )
1439 @GroupAs(
1440 name = "links",
1441 inJson = JsonGroupAsBehavior.LIST
1442 )
1443 private List<Link> _links;
1444
1445 @BoundField(
1446 formalName = "Remarks",
1447 description = "Additional commentary about the containing object.",
1448 useName = "remarks"
1449 )
1450 @BoundFieldValue(
1451 typeAdapter = MarkupMultilineAdapter.class
1452 )
1453 private MarkupMultiline _remarks;
1454
1455 public Role() {
1456 }
1457
1458 public String getId() {
1459 return _id;
1460 }
1461
1462 public void setId(String value) {
1463 _id = value;
1464 }
1465
1466 public MarkupLine getTitle() {
1467 return _title;
1468 }
1469
1470 public void setTitle(MarkupLine value) {
1471 _title = value;
1472 }
1473
1474 public String getShortName() {
1475 return _shortName;
1476 }
1477
1478 public void setShortName(String value) {
1479 _shortName = value;
1480 }
1481
1482 public MarkupMultiline getDescription() {
1483 return _description;
1484 }
1485
1486 public void setDescription(MarkupMultiline value) {
1487 _description = value;
1488 }
1489
1490 public List<Property> getProps() {
1491 return _props;
1492 }
1493
1494 public void setProps(List<Property> value) {
1495 _props = value;
1496 }
1497
1498
1499
1500
1501
1502
1503 public boolean addProp(Property item) {
1504 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1505 if (_props == null) {
1506 _props = new LinkedList<>();
1507 }
1508 return _props.add(value);
1509 }
1510
1511
1512
1513
1514
1515
1516 public boolean removeProp(Property item) {
1517 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1518 return _props == null ? false : _props.remove(value);
1519 }
1520
1521 public List<Link> getLinks() {
1522 return _links;
1523 }
1524
1525 public void setLinks(List<Link> value) {
1526 _links = value;
1527 }
1528
1529
1530
1531
1532
1533
1534 public boolean addLink(Link item) {
1535 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1536 if (_links == null) {
1537 _links = new LinkedList<>();
1538 }
1539 return _links.add(value);
1540 }
1541
1542
1543
1544
1545
1546
1547 public boolean removeLink(Link item) {
1548 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1549 return _links == null ? false : _links.remove(value);
1550 }
1551
1552 public MarkupMultiline getRemarks() {
1553 return _remarks;
1554 }
1555
1556 public void setRemarks(MarkupMultiline value) {
1557 _remarks = value;
1558 }
1559
1560 @Override
1561 public String toString() {
1562 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
1563 }
1564 }
1565
1566
1567
1568
1569 @MetaschemaAssembly(
1570 formalName = "Location",
1571 description = "A physical point of presence, which may be associated with people, organizations, or other concepts within the current or linked OSCAL document.",
1572 name = "location",
1573 metaschema = OscalMetadataMetaschema.class,
1574 remarks = "An address might be sensitive in nature. In such cases a title, mailing address, email-address, and/or phone number may be used instead."
1575 )
1576 @ValueConstraints(
1577 allowedValues = {
1578 @AllowedValues(level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = @AllowedValue(value = "type", description = "Characterizes the kind of location.")),
1579 @AllowedValues(level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal') and @name='type']/@value", values = @AllowedValue(value = "data-center", description = "A location that contains computing assets. A `class` can be used to indicate the sub-type of data-center as *primary* or *alternate*.")),
1580 @AllowedValues(level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal') and @name='type' and @value='data-center']/@class", values = {@AllowedValue(value = "primary", description = "The location is a data-center used for normal operations."), @AllowedValue(value = "alternate", description = "The location is a data-center used for fail-over or backup operations.")})
1581 }
1582 )
1583 @AssemblyConstraints(
1584 hasCardinality = {
1585 @HasCardinality(level = IConstraint.Level.WARNING, target = "address", minOccurs = 1),
1586 @HasCardinality(level = IConstraint.Level.ERROR, target = "title|address|email-address|telephone-number", minOccurs = 1)
1587 }
1588 )
1589 public static class Location {
1590 @BoundFlag(
1591 formalName = "Location Universally Unique Identifier",
1592 description = "A unique ID for the location, for reference.",
1593 useName = "uuid",
1594 required = true,
1595 typeAdapter = UuidAdapter.class
1596 )
1597 private UUID _uuid;
1598
1599
1600
1601
1602 @BoundField(
1603 formalName = "Location Title",
1604 description = "A name given to the location, which may be used by a tool for display and navigation.",
1605 useName = "title"
1606 )
1607 @BoundFieldValue(
1608 typeAdapter = MarkupLineAdapter.class
1609 )
1610 private MarkupLine _title;
1611
1612 @BoundAssembly(
1613 formalName = "Address",
1614 description = "A postal address for the location.",
1615 useName = "address",
1616 remarks = "The physical address of the location, which will provided for physical locations. Virtual locations can omit this data item."
1617 )
1618 private Address _address;
1619
1620 @BoundField(
1621 formalName = "Email Address",
1622 description = "An email address as defined by [RFC 5322 Section 3.4.1](https://tools.ietf.org/html/rfc5322#section-3.4.1).",
1623 useName = "email-address",
1624 maxOccurs = -1,
1625 remarks = "A contact email associated with the location."
1626 )
1627 @BoundFieldValue(
1628 typeAdapter = EmailAddressAdapter.class
1629 )
1630 @GroupAs(
1631 name = "email-addresses",
1632 inJson = JsonGroupAsBehavior.LIST
1633 )
1634 private List<String> _emailAddresses;
1635
1636 @BoundField(
1637 formalName = "Telephone Number",
1638 description = "A telephone service number as defined by [ITU-T E.164](https://www.itu.int/rec/T-REC-E.164-201011-I/en).",
1639 useName = "telephone-number",
1640 maxOccurs = -1,
1641 remarks = "A phone number used to contact the location."
1642 )
1643 @GroupAs(
1644 name = "telephone-numbers",
1645 inJson = JsonGroupAsBehavior.LIST
1646 )
1647 private List<TelephoneNumber> _telephoneNumbers;
1648
1649
1650
1651
1652 @BoundField(
1653 formalName = "Location URL",
1654 description = "The uniform resource locator (URL) for a web site or other resource associated with the location.",
1655 useName = "url",
1656 maxOccurs = -1,
1657 remarks = "This data field is deprecated in favor of using a link with an appropriate relationship."
1658 )
1659 @BoundFieldValue(
1660 typeAdapter = UriAdapter.class
1661 )
1662 @GroupAs(
1663 name = "urls",
1664 inJson = JsonGroupAsBehavior.LIST
1665 )
1666 private List<URI> _urls;
1667
1668 @BoundAssembly(
1669 formalName = "Property",
1670 description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
1671 useName = "prop",
1672 maxOccurs = -1
1673 )
1674 @GroupAs(
1675 name = "props",
1676 inJson = JsonGroupAsBehavior.LIST
1677 )
1678 private List<Property> _props;
1679
1680 @BoundAssembly(
1681 formalName = "Link",
1682 description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
1683 useName = "link",
1684 maxOccurs = -1
1685 )
1686 @GroupAs(
1687 name = "links",
1688 inJson = JsonGroupAsBehavior.LIST
1689 )
1690 private List<Link> _links;
1691
1692 @BoundField(
1693 formalName = "Remarks",
1694 description = "Additional commentary about the containing object.",
1695 useName = "remarks"
1696 )
1697 @BoundFieldValue(
1698 typeAdapter = MarkupMultilineAdapter.class
1699 )
1700 private MarkupMultiline _remarks;
1701
1702 public Location() {
1703 }
1704
1705 public UUID getUuid() {
1706 return _uuid;
1707 }
1708
1709 public void setUuid(UUID value) {
1710 _uuid = value;
1711 }
1712
1713 public MarkupLine getTitle() {
1714 return _title;
1715 }
1716
1717 public void setTitle(MarkupLine value) {
1718 _title = value;
1719 }
1720
1721 public Address getAddress() {
1722 return _address;
1723 }
1724
1725 public void setAddress(Address value) {
1726 _address = value;
1727 }
1728
1729 public List<String> getEmailAddresses() {
1730 return _emailAddresses;
1731 }
1732
1733 public void setEmailAddresses(List<String> value) {
1734 _emailAddresses = value;
1735 }
1736
1737
1738
1739
1740
1741
1742 public boolean addEmailAddress(String item) {
1743 String value = ObjectUtils.requireNonNull(item,"item cannot be null");
1744 if (_emailAddresses == null) {
1745 _emailAddresses = new LinkedList<>();
1746 }
1747 return _emailAddresses.add(value);
1748 }
1749
1750
1751
1752
1753
1754
1755 public boolean removeEmailAddress(String item) {
1756 String value = ObjectUtils.requireNonNull(item,"item cannot be null");
1757 return _emailAddresses == null ? false : _emailAddresses.remove(value);
1758 }
1759
1760 public List<TelephoneNumber> getTelephoneNumbers() {
1761 return _telephoneNumbers;
1762 }
1763
1764 public void setTelephoneNumbers(List<TelephoneNumber> value) {
1765 _telephoneNumbers = value;
1766 }
1767
1768
1769
1770
1771
1772
1773 public boolean addTelephoneNumber(TelephoneNumber item) {
1774 TelephoneNumber value = ObjectUtils.requireNonNull(item,"item cannot be null");
1775 if (_telephoneNumbers == null) {
1776 _telephoneNumbers = new LinkedList<>();
1777 }
1778 return _telephoneNumbers.add(value);
1779 }
1780
1781
1782
1783
1784
1785
1786 public boolean removeTelephoneNumber(TelephoneNumber item) {
1787 TelephoneNumber value = ObjectUtils.requireNonNull(item,"item cannot be null");
1788 return _telephoneNumbers == null ? false : _telephoneNumbers.remove(value);
1789 }
1790
1791 public List<URI> getUrls() {
1792 return _urls;
1793 }
1794
1795 public void setUrls(List<URI> value) {
1796 _urls = value;
1797 }
1798
1799
1800
1801
1802
1803
1804 public boolean addUrl(URI item) {
1805 URI value = ObjectUtils.requireNonNull(item,"item cannot be null");
1806 if (_urls == null) {
1807 _urls = new LinkedList<>();
1808 }
1809 return _urls.add(value);
1810 }
1811
1812
1813
1814
1815
1816
1817 public boolean removeUrl(URI item) {
1818 URI value = ObjectUtils.requireNonNull(item,"item cannot be null");
1819 return _urls == null ? false : _urls.remove(value);
1820 }
1821
1822 public List<Property> getProps() {
1823 return _props;
1824 }
1825
1826 public void setProps(List<Property> value) {
1827 _props = value;
1828 }
1829
1830
1831
1832
1833
1834
1835 public boolean addProp(Property item) {
1836 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1837 if (_props == null) {
1838 _props = new LinkedList<>();
1839 }
1840 return _props.add(value);
1841 }
1842
1843
1844
1845
1846
1847
1848 public boolean removeProp(Property item) {
1849 Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
1850 return _props == null ? false : _props.remove(value);
1851 }
1852
1853 public List<Link> getLinks() {
1854 return _links;
1855 }
1856
1857 public void setLinks(List<Link> value) {
1858 _links = value;
1859 }
1860
1861
1862
1863
1864
1865
1866 public boolean addLink(Link item) {
1867 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1868 if (_links == null) {
1869 _links = new LinkedList<>();
1870 }
1871 return _links.add(value);
1872 }
1873
1874
1875
1876
1877
1878
1879 public boolean removeLink(Link item) {
1880 Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
1881 return _links == null ? false : _links.remove(value);
1882 }
1883
1884 public MarkupMultiline getRemarks() {
1885 return _remarks;
1886 }
1887
1888 public void setRemarks(MarkupMultiline value) {
1889 _remarks = value;
1890 }
1891
1892 @Override
1893 public String toString() {
1894 return new ReflectionToStringBuilder(this, MultilineRecursiveToStringStyle.MULTI_LINE_STYLE).toString();
1895 }
1896 }
1897 }