001// Generated from: ../../../../../../../../oscal/src/metaschema/oscal_ssp_metaschema.xml
002// Do not edit - changes will be lost when regenerated.
003package dev.metaschema.oscal.lib.model;
004
005import dev.metaschema.core.datatype.adapter.StringAdapter;
006import dev.metaschema.core.datatype.adapter.UriAdapter;
007import dev.metaschema.core.datatype.adapter.UriReferenceAdapter;
008import dev.metaschema.core.datatype.adapter.UuidAdapter;
009import dev.metaschema.core.datatype.markup.MarkupLine;
010import dev.metaschema.core.datatype.markup.MarkupLineAdapter;
011import dev.metaschema.core.datatype.markup.MarkupMultiline;
012import dev.metaschema.core.datatype.markup.MarkupMultilineAdapter;
013import dev.metaschema.core.model.IBoundObject;
014import dev.metaschema.core.model.IMetaschemaData;
015import dev.metaschema.core.model.JsonGroupAsBehavior;
016import dev.metaschema.core.model.constraint.IConstraint;
017import dev.metaschema.core.util.ObjectUtils;
018import dev.metaschema.databind.model.annotations.AllowedValue;
019import dev.metaschema.databind.model.annotations.AllowedValues;
020import dev.metaschema.databind.model.annotations.BoundAssembly;
021import dev.metaschema.databind.model.annotations.BoundField;
022import dev.metaschema.databind.model.annotations.BoundFlag;
023import dev.metaschema.databind.model.annotations.Expect;
024import dev.metaschema.databind.model.annotations.GroupAs;
025import dev.metaschema.databind.model.annotations.IndexHasKey;
026import dev.metaschema.databind.model.annotations.KeyField;
027import dev.metaschema.databind.model.annotations.Matches;
028import dev.metaschema.databind.model.annotations.MetaschemaAssembly;
029import dev.metaschema.databind.model.annotations.ValueConstraints;
030import edu.umd.cs.findbugs.annotations.NonNull;
031import edu.umd.cs.findbugs.annotations.Nullable;
032import java.net.URI;
033import java.util.LinkedList;
034import java.util.List;
035import java.util.UUID;
036import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
037import org.apache.commons.lang3.builder.ToStringStyle;
038
039/**
040 * Contains details about all information types that are stored, processed, or transmitted by the system, such as privacy information, and those defined in <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">NIST SP 800-60</a>.
041 */
042@MetaschemaAssembly(
043    formalName = "System Information",
044    description = "Contains details about all information types that are stored, processed, or transmitted by the system, such as privacy information, and those defined in [NIST SP 800-60](https://doi.org/10.6028/NIST.SP.800-60v2r1).",
045    name = "system-information",
046    moduleClass = OscalSspModule.class,
047    valueConstraints = @ValueConstraints(allowedValues = {@AllowedValues(id = "oscal-system-information-prop-name-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = @AllowedValue(value = "privacy-designation", description = "Is this a privacy sensitive system? yes or no")), @AllowedValues(id = "oscal-system-information-prop-privacy-designation-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal') and @name='privacy-designation']/@value", values = {@AllowedValue(value = "yes", description = "The system is privacy sensitive."), @AllowedValue(value = "no", description = "The system is not privacy sensitive.")}), @AllowedValues(id = "oscal-system-information-link-rel-values", level = IConstraint.Level.ERROR, target = "link/@rel", allowOthers = true, values = @AllowedValue(value = "privacy-impact-assessment", description = "A link to the privacy impact assessment.")), @AllowedValues(id = "oscal-fips-199-impact-levels", level = IConstraint.Level.ERROR, target = "information-type/(confidentiality-impact|integrity-impact|availability-impact)/(base|selected)", allowOthers = true, values = {@AllowedValue(value = "fips-199-low", description = "A 'low' sensitivity level as defined in [FIPS-199](https://doi.org/10.6028/NIST.FIPS.199)."), @AllowedValue(value = "fips-199-moderate", description = "A 'moderate' sensitivity level as defined in [FIPS-199](https://doi.org/10.6028/NIST.FIPS.199)."), @AllowedValue(value = "fips-199-high", description = "A 'high' sensitivity level as defined in [FIPS-199](https://doi.org/10.6028/NIST.FIPS.199).")}, remarks = "FIPS-199 taxonomy is provided here as a starting point. We will provide other taxonomies based on community requests.")}, indexHasKey = @IndexHasKey(id = "oscal-system-information-index-back-matter-resource-pia-link-rel", level = IConstraint.Level.ERROR, target = "link[@rel='privacy-impact-assessment' and starts-with(@href,'#')]", indexName = "index-back-matter-resource", keyFields = @KeyField(target = "@href", pattern = "#(.*)")), matches = {@Matches(id = "oscal-system-information-pia-datatype-uri-reference", level = IConstraint.Level.ERROR, target = "link[@rel='privacy-impact-assessment']/@href[starts-with(.,'#')]", typeAdapter = UriReferenceAdapter.class), @Matches(id = "oscal-system-information-pia-datatype-uri", level = IConstraint.Level.ERROR, target = "link[@rel='privacy-impact-assessment']/@href[not(starts-with(.,'#'))]", typeAdapter = UriAdapter.class)})
048)
049public class SystemInformation implements IBoundObject {
050  private final IMetaschemaData __metaschemaData;
051
052  /**
053   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
054   */
055  @BoundAssembly(
056      formalName = "Property",
057      description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
058      useName = "prop",
059      maxOccurs = -1,
060      groupAs = @GroupAs(name = "props", inJson = JsonGroupAsBehavior.LIST)
061  )
062  private List<Property> _props;
063
064  /**
065   * A reference to a local or remote resource, that has a specific relation to the containing object.
066   */
067  @BoundAssembly(
068      formalName = "Link",
069      description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
070      useName = "link",
071      maxOccurs = -1,
072      groupAs = @GroupAs(name = "links", inJson = JsonGroupAsBehavior.LIST)
073  )
074  private List<Link> _links;
075
076  /**
077   * Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">NIST SP 800-60</a>.
078   */
079  @BoundAssembly(
080      formalName = "Information Type",
081      description = "Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in [NIST SP 800-60](https://doi.org/10.6028/NIST.SP.800-60v2r1).",
082      useName = "information-type",
083      minOccurs = 1,
084      maxOccurs = -1,
085      groupAs = @GroupAs(name = "information-types", inJson = JsonGroupAsBehavior.LIST)
086  )
087  private List<InformationType> _informationTypes;
088
089  /**
090   * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation} instance with no metadata.
091   */
092  public SystemInformation() {
093    this(null);
094  }
095
096  /**
097   * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation} instance with the specified metadata.
098   *
099   * @param data
100   *           the metaschema data, or {@code null} if none
101   */
102  public SystemInformation(IMetaschemaData data) {
103    this.__metaschemaData = data;
104  }
105
106  @Override
107  public IMetaschemaData getMetaschemaData() {
108    return __metaschemaData;
109  }
110
111  /**
112   * Get the "{@literal Property}".
113   *
114   * <p>
115   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
116   *
117   * @return the prop value
118   */
119  @NonNull
120  public List<Property> getProps() {
121    if (_props == null) {
122      _props = new LinkedList<>();
123    }
124    return ObjectUtils.notNull(_props);
125  }
126
127  /**
128   * Set the "{@literal Property}".
129   *
130   * <p>
131   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
132   *
133   * @param value
134   *           the prop value to set
135   */
136  public void setProps(@NonNull List<Property> value) {
137    _props = value;
138  }
139
140  /**
141   * Add a new {@link Property} item to the underlying collection.
142   * @param item the item to add
143   * @return {@code true}
144   */
145  public boolean addProp(Property item) {
146    Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
147    if (_props == null) {
148      _props = new LinkedList<>();
149    }
150    return _props.add(value);
151  }
152
153  /**
154   * Remove the first matching {@link Property} item from the underlying collection.
155   * @param item the item to remove
156   * @return {@code true} if the item was removed or {@code false} otherwise
157   */
158  public boolean removeProp(Property item) {
159    Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
160    return _props != null && _props.remove(value);
161  }
162
163  /**
164   * Get the "{@literal Link}".
165   *
166   * <p>
167   * A reference to a local or remote resource, that has a specific relation to the containing object.
168   *
169   * @return the link value
170   */
171  @NonNull
172  public List<Link> getLinks() {
173    if (_links == null) {
174      _links = new LinkedList<>();
175    }
176    return ObjectUtils.notNull(_links);
177  }
178
179  /**
180   * Set the "{@literal Link}".
181   *
182   * <p>
183   * A reference to a local or remote resource, that has a specific relation to the containing object.
184   *
185   * @param value
186   *           the link value to set
187   */
188  public void setLinks(@NonNull List<Link> value) {
189    _links = value;
190  }
191
192  /**
193   * Add a new {@link Link} item to the underlying collection.
194   * @param item the item to add
195   * @return {@code true}
196   */
197  public boolean addLink(Link item) {
198    Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
199    if (_links == null) {
200      _links = new LinkedList<>();
201    }
202    return _links.add(value);
203  }
204
205  /**
206   * Remove the first matching {@link Link} item from the underlying collection.
207   * @param item the item to remove
208   * @return {@code true} if the item was removed or {@code false} otherwise
209   */
210  public boolean removeLink(Link item) {
211    Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
212    return _links != null && _links.remove(value);
213  }
214
215  /**
216   * Get the "{@literal Information Type}".
217   *
218   * <p>
219   * Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">NIST SP 800-60</a>.
220   *
221   * @return the information-type value
222   */
223  @NonNull
224  public List<InformationType> getInformationTypes() {
225    if (_informationTypes == null) {
226      _informationTypes = new LinkedList<>();
227    }
228    return ObjectUtils.notNull(_informationTypes);
229  }
230
231  /**
232   * Set the "{@literal Information Type}".
233   *
234   * <p>
235   * Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">NIST SP 800-60</a>.
236   *
237   * @param value
238   *           the information-type value to set
239   */
240  public void setInformationTypes(@NonNull List<InformationType> value) {
241    _informationTypes = value;
242  }
243
244  /**
245   * Add a new {@link InformationType} item to the underlying collection.
246   * @param item the item to add
247   * @return {@code true}
248   */
249  public boolean addInformationType(InformationType item) {
250    InformationType value = ObjectUtils.requireNonNull(item,"item cannot be null");
251    if (_informationTypes == null) {
252      _informationTypes = new LinkedList<>();
253    }
254    return _informationTypes.add(value);
255  }
256
257  /**
258   * Remove the first matching {@link InformationType} item from the underlying collection.
259   * @param item the item to remove
260   * @return {@code true} if the item was removed or {@code false} otherwise
261   */
262  public boolean removeInformationType(InformationType item) {
263    InformationType value = ObjectUtils.requireNonNull(item,"item cannot be null");
264    return _informationTypes != null && _informationTypes.remove(value);
265  }
266
267  @Override
268  public String toString() {
269    return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
270  }
271
272  /**
273   * Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">NIST SP 800-60</a>.
274   */
275  @MetaschemaAssembly(
276      formalName = "Information Type",
277      description = "Contains details about one information type that is stored, processed, or transmitted by the system, such as privacy information, and those defined in [NIST SP 800-60](https://doi.org/10.6028/NIST.SP.800-60v2r1).",
278      name = "information-type",
279      moduleClass = OscalSspModule.class,
280      valueConstraints = @ValueConstraints(expect = @Expect(id = "oscal-information-type-uuid", level = IConstraint.Level.WARNING, test = "@uuid", message = "It is a best practice to provide a UUID."))
281  )
282  public static class InformationType implements IBoundObject {
283    private final IMetaschemaData __metaschemaData;
284
285    /**
286     * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this information type elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>information type</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
287     */
288    @BoundFlag(
289        formalName = "Information Type Universally Unique Identifier",
290        description = "A [machine-oriented](https://pages.nist.gov/OSCAL/concepts/identifier-use/#machine-oriented), [globally unique](https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique) identifier with [cross-instance](https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance) scope that can be used to reference this information type elsewhere in [this or other OSCAL instances](https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers). The locally defined *UUID* of the `information type` can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned [per-subject](https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency), which means it should be consistently used to identify the same subject across revisions of the document.",
291        name = "uuid",
292        typeAdapter = UuidAdapter.class
293    )
294    private UUID _uuid;
295
296    /**
297     * A human readable name for the information type. This title should be meaningful within the context of the system.
298     */
299    @BoundField(
300        formalName = "title field",
301        description = "A human readable name for the information type. This title should be meaningful within the context of the system.",
302        useName = "title",
303        minOccurs = 1,
304        typeAdapter = MarkupLineAdapter.class
305    )
306    private MarkupLine _title;
307
308    /**
309     * A summary of how this information type is used within the system.
310     */
311    @BoundField(
312        formalName = "Information Type Description",
313        description = "A summary of how this information type is used within the system.",
314        useName = "description",
315        minOccurs = 1,
316        typeAdapter = MarkupMultilineAdapter.class
317    )
318    private MarkupMultiline _description;
319
320    /**
321     * A set of information type identifiers qualified by the given identification <code>system</code> used, such as NIST SP 800-60.
322     */
323    @BoundAssembly(
324        formalName = "Information Type Categorization",
325        description = "A set of information type identifiers qualified by the given identification `system` used, such as NIST SP 800-60.",
326        useName = "categorization",
327        maxOccurs = -1,
328        groupAs = @GroupAs(name = "categorizations", inJson = JsonGroupAsBehavior.LIST)
329    )
330    private List<Categorization> _categorizations;
331
332    /**
333     * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
334     */
335    @BoundAssembly(
336        formalName = "Property",
337        description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
338        useName = "prop",
339        maxOccurs = -1,
340        groupAs = @GroupAs(name = "props", inJson = JsonGroupAsBehavior.LIST)
341    )
342    private List<Property> _props;
343
344    /**
345     * A reference to a local or remote resource, that has a specific relation to the containing object.
346     */
347    @BoundAssembly(
348        formalName = "Link",
349        description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
350        useName = "link",
351        maxOccurs = -1,
352        groupAs = @GroupAs(name = "links", inJson = JsonGroupAsBehavior.LIST)
353    )
354    private List<Link> _links;
355
356    /**
357     * The expected level of impact resulting from the unauthorized disclosure of the described information.
358     */
359    @BoundAssembly(
360        formalName = "Confidentiality Impact Level",
361        description = "The expected level of impact resulting from the unauthorized disclosure of the described information.",
362        useName = "confidentiality-impact"
363    )
364    private Impact _confidentialityImpact;
365
366    /**
367     * The expected level of impact resulting from the unauthorized modification of the described information.
368     */
369    @BoundAssembly(
370        formalName = "Integrity Impact Level",
371        description = "The expected level of impact resulting from the unauthorized modification of the described information.",
372        useName = "integrity-impact"
373    )
374    private Impact _integrityImpact;
375
376    /**
377     * The expected level of impact resulting from the disruption of access to or use of the described information or the information system.
378     */
379    @BoundAssembly(
380        formalName = "Availability Impact Level",
381        description = "The expected level of impact resulting from the disruption of access to or use of the described information or the information system.",
382        useName = "availability-impact"
383    )
384    private Impact _availabilityImpact;
385
386    /**
387     * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation.InformationType} instance with no metadata.
388     */
389    public InformationType() {
390      this(null);
391    }
392
393    /**
394     * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation.InformationType} instance with the specified metadata.
395     *
396     * @param data
397     *           the metaschema data, or {@code null} if none
398     */
399    public InformationType(IMetaschemaData data) {
400      this.__metaschemaData = data;
401    }
402
403    @Override
404    public IMetaschemaData getMetaschemaData() {
405      return __metaschemaData;
406    }
407
408    /**
409     * Get the "{@literal Information Type Universally Unique Identifier}".
410     *
411     * <p>
412     * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this information type elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>information type</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
413     *
414     * @return the uuid value, or {@code null} if not set
415     */
416    @Nullable
417    public UUID getUuid() {
418      return _uuid;
419    }
420
421    /**
422     * Set the "{@literal Information Type Universally Unique Identifier}".
423     *
424     * <p>
425     * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this information type elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>information type</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
426     *
427     * @param value
428     *           the uuid value to set, or {@code null} to clear
429     */
430    public void setUuid(@Nullable UUID value) {
431      _uuid = value;
432    }
433
434    /**
435     * Get the "{@literal title field}".
436     *
437     * <p>
438     * A human readable name for the information type. This title should be meaningful within the context of the system.
439     *
440     * @return the title value
441     */
442    @NonNull
443    public MarkupLine getTitle() {
444      return _title;
445    }
446
447    /**
448     * Set the "{@literal title field}".
449     *
450     * <p>
451     * A human readable name for the information type. This title should be meaningful within the context of the system.
452     *
453     * @param value
454     *           the title value to set
455     */
456    public void setTitle(@NonNull MarkupLine value) {
457      _title = value;
458    }
459
460    /**
461     * Get the "{@literal Information Type Description}".
462     *
463     * <p>
464     * A summary of how this information type is used within the system.
465     *
466     * @return the description value
467     */
468    @NonNull
469    public MarkupMultiline getDescription() {
470      return _description;
471    }
472
473    /**
474     * Set the "{@literal Information Type Description}".
475     *
476     * <p>
477     * A summary of how this information type is used within the system.
478     *
479     * @param value
480     *           the description value to set
481     */
482    public void setDescription(@NonNull MarkupMultiline value) {
483      _description = value;
484    }
485
486    /**
487     * Get the "{@literal Information Type Categorization}".
488     *
489     * <p>
490     * A set of information type identifiers qualified by the given identification <code>system</code> used, such as NIST SP 800-60.
491     *
492     * @return the categorization value
493     */
494    @NonNull
495    public List<Categorization> getCategorizations() {
496      if (_categorizations == null) {
497        _categorizations = new LinkedList<>();
498      }
499      return ObjectUtils.notNull(_categorizations);
500    }
501
502    /**
503     * Set the "{@literal Information Type Categorization}".
504     *
505     * <p>
506     * A set of information type identifiers qualified by the given identification <code>system</code> used, such as NIST SP 800-60.
507     *
508     * @param value
509     *           the categorization value to set
510     */
511    public void setCategorizations(@NonNull List<Categorization> value) {
512      _categorizations = value;
513    }
514
515    /**
516     * Add a new {@link Categorization} item to the underlying collection.
517     * @param item the item to add
518     * @return {@code true}
519     */
520    public boolean addCategorization(Categorization item) {
521      Categorization value = ObjectUtils.requireNonNull(item,"item cannot be null");
522      if (_categorizations == null) {
523        _categorizations = new LinkedList<>();
524      }
525      return _categorizations.add(value);
526    }
527
528    /**
529     * Remove the first matching {@link Categorization} item from the underlying collection.
530     * @param item the item to remove
531     * @return {@code true} if the item was removed or {@code false} otherwise
532     */
533    public boolean removeCategorization(Categorization item) {
534      Categorization value = ObjectUtils.requireNonNull(item,"item cannot be null");
535      return _categorizations != null && _categorizations.remove(value);
536    }
537
538    /**
539     * Get the "{@literal Property}".
540     *
541     * <p>
542     * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
543     *
544     * @return the prop value
545     */
546    @NonNull
547    public List<Property> getProps() {
548      if (_props == null) {
549        _props = new LinkedList<>();
550      }
551      return ObjectUtils.notNull(_props);
552    }
553
554    /**
555     * Set the "{@literal Property}".
556     *
557     * <p>
558     * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
559     *
560     * @param value
561     *           the prop value to set
562     */
563    public void setProps(@NonNull List<Property> value) {
564      _props = value;
565    }
566
567    /**
568     * Add a new {@link Property} item to the underlying collection.
569     * @param item the item to add
570     * @return {@code true}
571     */
572    public boolean addProp(Property item) {
573      Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
574      if (_props == null) {
575        _props = new LinkedList<>();
576      }
577      return _props.add(value);
578    }
579
580    /**
581     * Remove the first matching {@link Property} item from the underlying collection.
582     * @param item the item to remove
583     * @return {@code true} if the item was removed or {@code false} otherwise
584     */
585    public boolean removeProp(Property item) {
586      Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
587      return _props != null && _props.remove(value);
588    }
589
590    /**
591     * Get the "{@literal Link}".
592     *
593     * <p>
594     * A reference to a local or remote resource, that has a specific relation to the containing object.
595     *
596     * @return the link value
597     */
598    @NonNull
599    public List<Link> getLinks() {
600      if (_links == null) {
601        _links = new LinkedList<>();
602      }
603      return ObjectUtils.notNull(_links);
604    }
605
606    /**
607     * Set the "{@literal Link}".
608     *
609     * <p>
610     * A reference to a local or remote resource, that has a specific relation to the containing object.
611     *
612     * @param value
613     *           the link value to set
614     */
615    public void setLinks(@NonNull List<Link> value) {
616      _links = value;
617    }
618
619    /**
620     * Add a new {@link Link} item to the underlying collection.
621     * @param item the item to add
622     * @return {@code true}
623     */
624    public boolean addLink(Link item) {
625      Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
626      if (_links == null) {
627        _links = new LinkedList<>();
628      }
629      return _links.add(value);
630    }
631
632    /**
633     * Remove the first matching {@link Link} item from the underlying collection.
634     * @param item the item to remove
635     * @return {@code true} if the item was removed or {@code false} otherwise
636     */
637    public boolean removeLink(Link item) {
638      Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
639      return _links != null && _links.remove(value);
640    }
641
642    /**
643     * Get the "{@literal Confidentiality Impact Level}".
644     *
645     * <p>
646     * The expected level of impact resulting from the unauthorized disclosure of the described information.
647     *
648     * @return the confidentiality-impact value, or {@code null} if not set
649     */
650    @Nullable
651    public Impact getConfidentialityImpact() {
652      return _confidentialityImpact;
653    }
654
655    /**
656     * Set the "{@literal Confidentiality Impact Level}".
657     *
658     * <p>
659     * The expected level of impact resulting from the unauthorized disclosure of the described information.
660     *
661     * @param value
662     *           the confidentiality-impact value to set, or {@code null} to clear
663     */
664    public void setConfidentialityImpact(@Nullable Impact value) {
665      _confidentialityImpact = value;
666    }
667
668    /**
669     * Get the "{@literal Integrity Impact Level}".
670     *
671     * <p>
672     * The expected level of impact resulting from the unauthorized modification of the described information.
673     *
674     * @return the integrity-impact value, or {@code null} if not set
675     */
676    @Nullable
677    public Impact getIntegrityImpact() {
678      return _integrityImpact;
679    }
680
681    /**
682     * Set the "{@literal Integrity Impact Level}".
683     *
684     * <p>
685     * The expected level of impact resulting from the unauthorized modification of the described information.
686     *
687     * @param value
688     *           the integrity-impact value to set, or {@code null} to clear
689     */
690    public void setIntegrityImpact(@Nullable Impact value) {
691      _integrityImpact = value;
692    }
693
694    /**
695     * Get the "{@literal Availability Impact Level}".
696     *
697     * <p>
698     * The expected level of impact resulting from the disruption of access to or use of the described information or the information system.
699     *
700     * @return the availability-impact value, or {@code null} if not set
701     */
702    @Nullable
703    public Impact getAvailabilityImpact() {
704      return _availabilityImpact;
705    }
706
707    /**
708     * Set the "{@literal Availability Impact Level}".
709     *
710     * <p>
711     * The expected level of impact resulting from the disruption of access to or use of the described information or the information system.
712     *
713     * @param value
714     *           the availability-impact value to set, or {@code null} to clear
715     */
716    public void setAvailabilityImpact(@Nullable Impact value) {
717      _availabilityImpact = value;
718    }
719
720    @Override
721    public String toString() {
722      return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
723    }
724
725    /**
726     * A set of information type identifiers qualified by the given identification <code>system</code> used, such as NIST SP 800-60.
727     */
728    @MetaschemaAssembly(
729        formalName = "Information Type Categorization",
730        description = "A set of information type identifiers qualified by the given identification `system` used, such as NIST SP 800-60.",
731        name = "categorization",
732        moduleClass = OscalSspModule.class
733    )
734    public static class Categorization implements IBoundObject {
735      private final IMetaschemaData __metaschemaData;
736
737      /**
738       * Specifies the information type identification system used.
739       */
740      @BoundFlag(
741          formalName = "Information Type Identification System",
742          description = "Specifies the information type identification system used.",
743          name = "system",
744          required = true,
745          typeAdapter = UriAdapter.class,
746          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).",
747          valueConstraints = @ValueConstraints(allowedValues = @AllowedValues(id = "oscal-information-type-categorization-system-values", level = IConstraint.Level.ERROR, allowOthers = true, values = @AllowedValue(value = "http://doi.org/10.6028/NIST.SP.800-60v2r1", description = "Based on the section identifiers in NIST [Special Publication 800-60 Volume II Revision 1](https://doi.org/10.6028/NIST.SP.800-60v2r1).")))
748      )
749      private URI _system;
750
751      /**
752       * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#human-oriented">human-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier qualified by the given identification <code>system</code> used, such as NIST SP 800-60. This identifier has <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope and can be used to reference this system elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. This id should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
753       */
754      @BoundField(
755          formalName = "Information Type Systematized Identifier",
756          description = "A [human-oriented](https://pages.nist.gov/OSCAL/concepts/identifier-use/#human-oriented), [globally unique](https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique) identifier qualified by the given identification `system` used, such as NIST SP 800-60. This identifier has [cross-instance](https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance) scope and can be used to reference this system elsewhere in [this or other OSCAL instances](https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers). This id should be assigned [per-subject](https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency), which means it should be consistently used to identify the same subject across revisions of the document.",
757          useName = "information-type-id",
758          maxOccurs = -1,
759          groupAs = @GroupAs(name = "information-type-ids", inJson = JsonGroupAsBehavior.LIST),
760          typeAdapter = StringAdapter.class
761      )
762      private List<String> _informationTypeIds;
763
764      /**
765       * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation.InformationType.Categorization} instance with no metadata.
766       */
767      public Categorization() {
768        this(null);
769      }
770
771      /**
772       * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemInformation.InformationType.Categorization} instance with the specified metadata.
773       *
774       * @param data
775       *           the metaschema data, or {@code null} if none
776       */
777      public Categorization(IMetaschemaData data) {
778        this.__metaschemaData = data;
779      }
780
781      @Override
782      public IMetaschemaData getMetaschemaData() {
783        return __metaschemaData;
784      }
785
786      /**
787       * Get the "{@literal Information Type Identification System}".
788       *
789       * <p>
790       * Specifies the information type identification system used.
791       *
792       * @return the system value
793       */
794      @NonNull
795      public URI getSystem() {
796        return _system;
797      }
798
799      /**
800       * Set the "{@literal Information Type Identification System}".
801       *
802       * <p>
803       * Specifies the information type identification system used.
804       *
805       * @param value
806       *           the system value to set
807       */
808      public void setSystem(@NonNull URI value) {
809        _system = value;
810      }
811
812      /**
813       * Get the "{@literal Information Type Systematized Identifier}".
814       *
815       * <p>
816       * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#human-oriented">human-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier qualified by the given identification <code>system</code> used, such as NIST SP 800-60. This identifier has <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope and can be used to reference this system elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. This id should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
817       *
818       * @return the information-type-id value
819       */
820      @NonNull
821      public List<String> getInformationTypeIds() {
822        if (_informationTypeIds == null) {
823          _informationTypeIds = new LinkedList<>();
824        }
825        return ObjectUtils.notNull(_informationTypeIds);
826      }
827
828      /**
829       * Set the "{@literal Information Type Systematized Identifier}".
830       *
831       * <p>
832       * A <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#human-oriented">human-oriented</a>, <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#globally-unique">globally unique</a> identifier qualified by the given identification <code>system</code> used, such as NIST SP 800-60. This identifier has <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope and can be used to reference this system elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ssp-identifiers">this or other OSCAL instances</a>. This id should be assigned <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.
833       *
834       * @param value
835       *           the information-type-id value to set
836       */
837      public void setInformationTypeIds(@NonNull List<String> value) {
838        _informationTypeIds = value;
839      }
840
841      /**
842       * Add a new {@link String} item to the underlying collection.
843       * @param item the item to add
844       * @return {@code true}
845       */
846      public boolean addInformationTypeId(String item) {
847        String value = ObjectUtils.requireNonNull(item,"item cannot be null");
848        if (_informationTypeIds == null) {
849          _informationTypeIds = new LinkedList<>();
850        }
851        return _informationTypeIds.add(value);
852      }
853
854      /**
855       * Remove the first matching {@link String} item from the underlying collection.
856       * @param item the item to remove
857       * @return {@code true} if the item was removed or {@code false} otherwise
858       */
859      public boolean removeInformationTypeId(String item) {
860        String value = ObjectUtils.requireNonNull(item,"item cannot be null");
861        return _informationTypeIds != null && _informationTypeIds.remove(value);
862      }
863
864      @Override
865      public String toString() {
866        return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
867      }
868    }
869  }
870}