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.DateAdapter;
006import dev.metaschema.core.datatype.adapter.StringAdapter;
007import dev.metaschema.core.datatype.markup.MarkupMultiline;
008import dev.metaschema.core.datatype.markup.MarkupMultilineAdapter;
009import dev.metaschema.core.datatype.object.AmbiguousDate;
010import dev.metaschema.core.model.IBoundObject;
011import dev.metaschema.core.model.IMetaschemaData;
012import dev.metaschema.core.model.JsonGroupAsBehavior;
013import dev.metaschema.core.model.constraint.IConstraint;
014import dev.metaschema.core.util.ObjectUtils;
015import dev.metaschema.databind.model.annotations.AllowedValue;
016import dev.metaschema.databind.model.annotations.AllowedValues;
017import dev.metaschema.databind.model.annotations.AssemblyConstraints;
018import dev.metaschema.databind.model.annotations.BoundAssembly;
019import dev.metaschema.databind.model.annotations.BoundField;
020import dev.metaschema.databind.model.annotations.GroupAs;
021import dev.metaschema.databind.model.annotations.IsUnique;
022import dev.metaschema.databind.model.annotations.KeyField;
023import dev.metaschema.databind.model.annotations.MetaschemaAssembly;
024import dev.metaschema.databind.model.annotations.ValueConstraints;
025import edu.umd.cs.findbugs.annotations.NonNull;
026import edu.umd.cs.findbugs.annotations.Nullable;
027import java.util.LinkedList;
028import java.util.List;
029import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
030import org.apache.commons.lang3.builder.ToStringStyle;
031
032/**
033 * Contains the characteristics of the system, such as its name, purpose, and security impact level.
034 */
035@MetaschemaAssembly(
036    formalName = "System Characteristics",
037    description = "Contains the characteristics of the system, such as its name, purpose, and security impact level.",
038    name = "system-characteristics",
039    moduleClass = OscalSspModule.class,
040    valueConstraints = @ValueConstraints(allowedValues = {@AllowedValues(id = "oscal-system-characteristics-prop-name-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = {@AllowedValue(value = "identity-assurance-level", description = "A value of 1, 2, or 3 as defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3)."), @AllowedValue(value = "authenticator-assurance-level", description = "A value of 1, 2, or 3 as defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3)."), @AllowedValue(value = "federation-assurance-level", description = "A value of 1, 2, or 3 as defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3).")}), @AllowedValues(id = "oscal-system-characteristics-prop-sp-800-63-assurance-level-values", level = IConstraint.Level.ERROR, target = "prop[@name=('identity-assurance-level','authenticator-assurance-level','federation-assurance-level')]/@value", values = {@AllowedValue(value = "1", description = "As defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3)."), @AllowedValue(value = "2", description = "As defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3)."), @AllowedValue(value = "3", description = "As defined by [SP 800-63-3](https://doi.org/10.6028/NIST.SP.800-63-3).")}), @AllowedValues(id = "oscal-system-characteristics-prop-name-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name", values = {@AllowedValue(value = "cloud-deployment-model", description = "The associated value is one of: public-cloud, private-cloud, community-cloud, government-only-cloud, hybrid-cloud, or other."), @AllowedValue(value = "cloud-service-model", description = "The associated value is one of: saas, paas, iaas, or other.")}), @AllowedValues(id = "oscal-system-characteristics-prop-cloud-deployment-model-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal') and @name='cloud-deployment-model']/@value", values = {@AllowedValue(value = "public-cloud", description = "The public cloud deployment model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "private-cloud", description = "The private cloud deployment model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "community-cloud", description = "The community cloud deployment model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "hybrid-cloud", description = "The hybrid cloud deployment model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "government-only-cloud", description = "A specific type of community-cloud for use only by government services."), @AllowedValue(value = "other", description = "Any other type of cloud deployment model that is exclusive to the other choices.")}, remarks = "The hybrid cloud deployment model, as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145), can be supported by selecting two or more of the existing deployment models."), @AllowedValues(id = "oscal-system-characteristics-prop-cloud-service-model-values", level = IConstraint.Level.ERROR, target = "prop[has-oscal-namespace('http://csrc.nist.gov/ns/oscal') and @name='cloud-service-model']/@value", values = {@AllowedValue(value = "saas", description = "Software as a service (SaaS) cloud service model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "paas", description = "Platform as a service (PaaS) cloud service model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "iaas", description = "Infrastructure as a service (IaaS) cloud service model as defined by [The NIST Definition of Cloud Computing](https://doi.org/10.6028/NIST.SP.800-145)."), @AllowedValue(value = "other", description = "Any other type of cloud service model that is exclusive to the other choices.")}), @AllowedValues(id = "oscal-system-characteristics-responsible-party-role-id-values", level = IConstraint.Level.ERROR, target = "responsible-party/@role-id", allowOthers = true, values = {@AllowedValue(value = "authorizing-official", description = "The authorizing official for this system."), @AllowedValue(value = "authorizing-official-poc", description = "The authorizing official's designated point of contact (POC) for this system."), @AllowedValue(value = "system-owner", description = "The executive ultimately accountable for the system."), @AllowedValue(value = "system-poc-management", description = "The primary management-level point of contact (POC) for the system."), @AllowedValue(value = "system-poc-technical", description = "The primary technical point of contact (POC) for the system."), @AllowedValue(value = "system-poc-other", description = "Other point of contact (POC) for the system that is not the management or technical POC."), @AllowedValue(value = "information-system-security-officer", description = "The primary role responsible for ensuring the organization operates the system securely."), @AllowedValue(value = "privacy-poc", description = "The point of contact (POC) responsible for identifying privacy information within the system, and ensuring its protection if present.")})}),
041    modelConstraints = @AssemblyConstraints(unique = @IsUnique(id = "oscal-unique-ssp-system-characteristics-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."))
042)
043public class SystemCharacteristics implements IBoundObject {
044  private final IMetaschemaData __metaschemaData;
045
046  /**
047   * 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 with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this system identification property elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#scope">this or other OSCAL instances</a>. When referencing an externally defined <code>system identification</code>, the <code>system identification</code> must be used in the context of the external / imported OSCAL instance (e.g., uri-reference). This string 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 system across revisions of the document.
048   */
049  @BoundField(
050      formalName = "System Identification",
051      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 with [cross-instance](https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance) scope that can be used to reference this system identification property elsewhere in [this or other OSCAL instances](https://pages.nist.gov/OSCAL/concepts/identifier-use/#scope). When referencing an externally defined `system identification`, the `system identification` must be used in the context of the external / imported OSCAL instance (e.g., uri-reference). This string 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 system across revisions of the document.",
052      useName = "system-id",
053      minOccurs = 1,
054      maxOccurs = -1,
055      groupAs = @GroupAs(name = "system-ids", inJson = JsonGroupAsBehavior.LIST)
056  )
057  private List<SystemId> _systemIds;
058
059  /**
060   * The full name of the system.
061   */
062  @BoundField(
063      formalName = "System Name - Full",
064      description = "The full name of the system.",
065      useName = "system-name",
066      minOccurs = 1,
067      typeAdapter = StringAdapter.class
068  )
069  private String _systemName;
070
071  /**
072   * A short name for the system, such as an acronym, that is suitable for display in a data table or summary list.
073   */
074  @BoundField(
075      formalName = "System Name - Short",
076      description = "A short name for the system, such as an acronym, that is suitable for display in a data table or summary list.",
077      useName = "system-name-short",
078      remarks = "Since `system-name-short` is optional, if the `system-name-short` is not provided, the `system-name` can be used as a substitute.",
079      typeAdapter = StringAdapter.class
080  )
081  private String _systemNameShort;
082
083  /**
084   * A summary of the system.
085   */
086  @BoundField(
087      formalName = "System Description",
088      description = "A summary of the system.",
089      useName = "description",
090      minOccurs = 1,
091      typeAdapter = MarkupMultilineAdapter.class
092  )
093  private MarkupMultiline _description;
094
095  /**
096   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
097   */
098  @BoundAssembly(
099      formalName = "Property",
100      description = "An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.",
101      useName = "prop",
102      maxOccurs = -1,
103      groupAs = @GroupAs(name = "props", inJson = JsonGroupAsBehavior.LIST)
104  )
105  private List<Property> _props;
106
107  /**
108   * A reference to a local or remote resource, that has a specific relation to the containing object.
109   */
110  @BoundAssembly(
111      formalName = "Link",
112      description = "A reference to a local or remote resource, that has a specific relation to the containing object.",
113      useName = "link",
114      maxOccurs = -1,
115      groupAs = @GroupAs(name = "links", inJson = JsonGroupAsBehavior.LIST)
116  )
117  private List<Link> _links;
118
119  /**
120   * The date the system received its authorization.
121   */
122  @BoundField(
123      formalName = "System Authorization Date",
124      description = "The date the system received its authorization.",
125      useName = "date-authorized",
126      typeAdapter = DateAdapter.class
127  )
128  private AmbiguousDate _dateAuthorized;
129
130  /**
131   * The overall information system sensitivity categorization, such as defined by <a href="https://doi.org/10.6028/NIST.FIPS.199">FIPS-199</a>.
132   */
133  @BoundField(
134      formalName = "Security Sensitivity Level",
135      description = "The overall information system sensitivity categorization, such as defined by [FIPS-199](https://doi.org/10.6028/NIST.FIPS.199).",
136      useName = "security-sensitivity-level",
137      remarks = "Often, organizations require the security sensitivity level to correspond with the highest confidentiality, integrity, or availability level identified by `security-impact-level`.",
138      typeAdapter = StringAdapter.class
139  )
140  private String _securitySensitivityLevel;
141
142  /**
143   * 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>.
144   */
145  @BoundAssembly(
146      formalName = "System Information",
147      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).",
148      useName = "system-information",
149      minOccurs = 1
150  )
151  private SystemInformation _systemInformation;
152
153  /**
154   * The overall level of expected impact resulting from unauthorized disclosure, modification, or loss of access to information.
155   */
156  @BoundAssembly(
157      formalName = "Security Impact Level",
158      description = "The overall level of expected impact resulting from unauthorized disclosure, modification, or loss of access to information.",
159      useName = "security-impact-level"
160  )
161  private SecurityImpactLevel _securityImpactLevel;
162
163  /**
164   * Describes the operational status of the system.
165   */
166  @BoundAssembly(
167      formalName = "Status",
168      description = "Describes the operational status of the system.",
169      useName = "status",
170      minOccurs = 1
171  )
172  private Status _status;
173
174  /**
175   * A description of this system's authorization boundary, optionally supplemented by diagrams that illustrate the authorization boundary.
176   */
177  @BoundAssembly(
178      formalName = "Authorization Boundary",
179      description = "A description of this system's authorization boundary, optionally supplemented by diagrams that illustrate the authorization boundary.",
180      useName = "authorization-boundary",
181      minOccurs = 1
182  )
183  private AuthorizationBoundary _authorizationBoundary;
184
185  /**
186   * A description of the system's network architecture, optionally supplemented by diagrams that illustrate the network architecture.
187   */
188  @BoundAssembly(
189      formalName = "Network Architecture",
190      description = "A description of the system's network architecture, optionally supplemented by diagrams that illustrate the network architecture.",
191      useName = "network-architecture"
192  )
193  private NetworkArchitecture _networkArchitecture;
194
195  /**
196   * A description of the logical flow of information within the system and across its boundaries, optionally supplemented by diagrams that illustrate these flows.
197   */
198  @BoundAssembly(
199      formalName = "Data Flow",
200      description = "A description of the logical flow of information within the system and across its boundaries, optionally supplemented by diagrams that illustrate these flows.",
201      useName = "data-flow"
202  )
203  private DataFlow _dataFlow;
204
205  /**
206   * 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.
207   */
208  @BoundAssembly(
209      formalName = "Responsible Party",
210      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.",
211      useName = "responsible-party",
212      maxOccurs = -1,
213      groupAs = @GroupAs(name = "responsible-parties", inJson = JsonGroupAsBehavior.LIST)
214  )
215  private List<ResponsibleParty> _responsibleParties;
216
217  /**
218   * Additional commentary about the containing object.
219   */
220  @BoundField(
221      formalName = "Remarks",
222      description = "Additional commentary about the containing object.",
223      useName = "remarks",
224      typeAdapter = MarkupMultilineAdapter.class
225  )
226  private MarkupMultiline _remarks;
227
228  /**
229   * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemCharacteristics} instance with no metadata.
230   */
231  public SystemCharacteristics() {
232    this(null);
233  }
234
235  /**
236   * Constructs a new {@code dev.metaschema.oscal.lib.model.SystemCharacteristics} instance with the specified metadata.
237   *
238   * @param data
239   *           the metaschema data, or {@code null} if none
240   */
241  public SystemCharacteristics(IMetaschemaData data) {
242    this.__metaschemaData = data;
243  }
244
245  @Override
246  public IMetaschemaData getMetaschemaData() {
247    return __metaschemaData;
248  }
249
250  /**
251   * Get the "{@literal System Identification}".
252   *
253   * <p>
254   * 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 with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this system identification property elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#scope">this or other OSCAL instances</a>. When referencing an externally defined <code>system identification</code>, the <code>system identification</code> must be used in the context of the external / imported OSCAL instance (e.g., uri-reference). This string 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 system across revisions of the document.
255   *
256   * @return the system-id value
257   */
258  @NonNull
259  public List<SystemId> getSystemIds() {
260    if (_systemIds == null) {
261      _systemIds = new LinkedList<>();
262    }
263    return ObjectUtils.notNull(_systemIds);
264  }
265
266  /**
267   * Set the "{@literal System Identification}".
268   *
269   * <p>
270   * 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 with <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this system identification property elsewhere in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#scope">this or other OSCAL instances</a>. When referencing an externally defined <code>system identification</code>, the <code>system identification</code> must be used in the context of the external / imported OSCAL instance (e.g., uri-reference). This string 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 system across revisions of the document.
271   *
272   * @param value
273   *           the system-id value to set
274   */
275  public void setSystemIds(@NonNull List<SystemId> value) {
276    _systemIds = value;
277  }
278
279  /**
280   * Add a new {@link SystemId} item to the underlying collection.
281   * @param item the item to add
282   * @return {@code true}
283   */
284  public boolean addSystemId(SystemId item) {
285    SystemId value = ObjectUtils.requireNonNull(item,"item cannot be null");
286    if (_systemIds == null) {
287      _systemIds = new LinkedList<>();
288    }
289    return _systemIds.add(value);
290  }
291
292  /**
293   * Remove the first matching {@link SystemId} item from the underlying collection.
294   * @param item the item to remove
295   * @return {@code true} if the item was removed or {@code false} otherwise
296   */
297  public boolean removeSystemId(SystemId item) {
298    SystemId value = ObjectUtils.requireNonNull(item,"item cannot be null");
299    return _systemIds != null && _systemIds.remove(value);
300  }
301
302  /**
303   * Get the "{@literal System Name - Full}".
304   *
305   * <p>
306   * The full name of the system.
307   *
308   * @return the system-name value
309   */
310  @NonNull
311  public String getSystemName() {
312    return _systemName;
313  }
314
315  /**
316   * Set the "{@literal System Name - Full}".
317   *
318   * <p>
319   * The full name of the system.
320   *
321   * @param value
322   *           the system-name value to set
323   */
324  public void setSystemName(@NonNull String value) {
325    _systemName = value;
326  }
327
328  /**
329   * Get the "{@literal System Name - Short}".
330   *
331   * <p>
332   * A short name for the system, such as an acronym, that is suitable for display in a data table or summary list.
333   *
334   * @return the system-name-short value, or {@code null} if not set
335   */
336  @Nullable
337  public String getSystemNameShort() {
338    return _systemNameShort;
339  }
340
341  /**
342   * Set the "{@literal System Name - Short}".
343   *
344   * <p>
345   * A short name for the system, such as an acronym, that is suitable for display in a data table or summary list.
346   *
347   * @param value
348   *           the system-name-short value to set, or {@code null} to clear
349   */
350  public void setSystemNameShort(@Nullable String value) {
351    _systemNameShort = value;
352  }
353
354  /**
355   * Get the "{@literal System Description}".
356   *
357   * <p>
358   * A summary of the system.
359   *
360   * @return the description value
361   */
362  @NonNull
363  public MarkupMultiline getDescription() {
364    return _description;
365  }
366
367  /**
368   * Set the "{@literal System Description}".
369   *
370   * <p>
371   * A summary of the system.
372   *
373   * @param value
374   *           the description value to set
375   */
376  public void setDescription(@NonNull MarkupMultiline value) {
377    _description = value;
378  }
379
380  /**
381   * Get the "{@literal Property}".
382   *
383   * <p>
384   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
385   *
386   * @return the prop value
387   */
388  @NonNull
389  public List<Property> getProps() {
390    if (_props == null) {
391      _props = new LinkedList<>();
392    }
393    return ObjectUtils.notNull(_props);
394  }
395
396  /**
397   * Set the "{@literal Property}".
398   *
399   * <p>
400   * An attribute, characteristic, or quality of the containing object expressed as a namespace qualified name/value pair.
401   *
402   * @param value
403   *           the prop value to set
404   */
405  public void setProps(@NonNull List<Property> value) {
406    _props = value;
407  }
408
409  /**
410   * Add a new {@link Property} item to the underlying collection.
411   * @param item the item to add
412   * @return {@code true}
413   */
414  public boolean addProp(Property item) {
415    Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
416    if (_props == null) {
417      _props = new LinkedList<>();
418    }
419    return _props.add(value);
420  }
421
422  /**
423   * Remove the first matching {@link Property} item from the underlying collection.
424   * @param item the item to remove
425   * @return {@code true} if the item was removed or {@code false} otherwise
426   */
427  public boolean removeProp(Property item) {
428    Property value = ObjectUtils.requireNonNull(item,"item cannot be null");
429    return _props != null && _props.remove(value);
430  }
431
432  /**
433   * Get the "{@literal Link}".
434   *
435   * <p>
436   * A reference to a local or remote resource, that has a specific relation to the containing object.
437   *
438   * @return the link value
439   */
440  @NonNull
441  public List<Link> getLinks() {
442    if (_links == null) {
443      _links = new LinkedList<>();
444    }
445    return ObjectUtils.notNull(_links);
446  }
447
448  /**
449   * Set the "{@literal Link}".
450   *
451   * <p>
452   * A reference to a local or remote resource, that has a specific relation to the containing object.
453   *
454   * @param value
455   *           the link value to set
456   */
457  public void setLinks(@NonNull List<Link> value) {
458    _links = value;
459  }
460
461  /**
462   * Add a new {@link Link} item to the underlying collection.
463   * @param item the item to add
464   * @return {@code true}
465   */
466  public boolean addLink(Link item) {
467    Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
468    if (_links == null) {
469      _links = new LinkedList<>();
470    }
471    return _links.add(value);
472  }
473
474  /**
475   * Remove the first matching {@link Link} item from the underlying collection.
476   * @param item the item to remove
477   * @return {@code true} if the item was removed or {@code false} otherwise
478   */
479  public boolean removeLink(Link item) {
480    Link value = ObjectUtils.requireNonNull(item,"item cannot be null");
481    return _links != null && _links.remove(value);
482  }
483
484  /**
485   * Get the "{@literal System Authorization Date}".
486   *
487   * <p>
488   * The date the system received its authorization.
489   *
490   * @return the date-authorized value, or {@code null} if not set
491   */
492  @Nullable
493  public AmbiguousDate getDateAuthorized() {
494    return _dateAuthorized;
495  }
496
497  /**
498   * Set the "{@literal System Authorization Date}".
499   *
500   * <p>
501   * The date the system received its authorization.
502   *
503   * @param value
504   *           the date-authorized value to set, or {@code null} to clear
505   */
506  public void setDateAuthorized(@Nullable AmbiguousDate value) {
507    _dateAuthorized = value;
508  }
509
510  /**
511   * Get the "{@literal Security Sensitivity Level}".
512   *
513   * <p>
514   * The overall information system sensitivity categorization, such as defined by <a href="https://doi.org/10.6028/NIST.FIPS.199">FIPS-199</a>.
515   *
516   * @return the security-sensitivity-level value, or {@code null} if not set
517   */
518  @Nullable
519  public String getSecuritySensitivityLevel() {
520    return _securitySensitivityLevel;
521  }
522
523  /**
524   * Set the "{@literal Security Sensitivity Level}".
525   *
526   * <p>
527   * The overall information system sensitivity categorization, such as defined by <a href="https://doi.org/10.6028/NIST.FIPS.199">FIPS-199</a>.
528   *
529   * @param value
530   *           the security-sensitivity-level value to set, or {@code null} to clear
531   */
532  public void setSecuritySensitivityLevel(@Nullable String value) {
533    _securitySensitivityLevel = value;
534  }
535
536  /**
537   * Get the "{@literal System Information}".
538   *
539   * <p>
540   * 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>.
541   *
542   * @return the system-information value
543   */
544  @NonNull
545  public SystemInformation getSystemInformation() {
546    return _systemInformation;
547  }
548
549  /**
550   * Set the "{@literal System Information}".
551   *
552   * <p>
553   * 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>.
554   *
555   * @param value
556   *           the system-information value to set
557   */
558  public void setSystemInformation(@NonNull SystemInformation value) {
559    _systemInformation = value;
560  }
561
562  /**
563   * Get the "{@literal Security Impact Level}".
564   *
565   * <p>
566   * The overall level of expected impact resulting from unauthorized disclosure, modification, or loss of access to information.
567   *
568   * @return the security-impact-level value, or {@code null} if not set
569   */
570  @Nullable
571  public SecurityImpactLevel getSecurityImpactLevel() {
572    return _securityImpactLevel;
573  }
574
575  /**
576   * Set the "{@literal Security Impact Level}".
577   *
578   * <p>
579   * The overall level of expected impact resulting from unauthorized disclosure, modification, or loss of access to information.
580   *
581   * @param value
582   *           the security-impact-level value to set, or {@code null} to clear
583   */
584  public void setSecurityImpactLevel(@Nullable SecurityImpactLevel value) {
585    _securityImpactLevel = value;
586  }
587
588  /**
589   * Get the "{@literal Status}".
590   *
591   * <p>
592   * Describes the operational status of the system.
593   *
594   * @return the status value
595   */
596  @NonNull
597  public Status getStatus() {
598    return _status;
599  }
600
601  /**
602   * Set the "{@literal Status}".
603   *
604   * <p>
605   * Describes the operational status of the system.
606   *
607   * @param value
608   *           the status value to set
609   */
610  public void setStatus(@NonNull Status value) {
611    _status = value;
612  }
613
614  /**
615   * Get the "{@literal Authorization Boundary}".
616   *
617   * <p>
618   * A description of this system's authorization boundary, optionally supplemented by diagrams that illustrate the authorization boundary.
619   *
620   * @return the authorization-boundary value
621   */
622  @NonNull
623  public AuthorizationBoundary getAuthorizationBoundary() {
624    return _authorizationBoundary;
625  }
626
627  /**
628   * Set the "{@literal Authorization Boundary}".
629   *
630   * <p>
631   * A description of this system's authorization boundary, optionally supplemented by diagrams that illustrate the authorization boundary.
632   *
633   * @param value
634   *           the authorization-boundary value to set
635   */
636  public void setAuthorizationBoundary(@NonNull AuthorizationBoundary value) {
637    _authorizationBoundary = value;
638  }
639
640  /**
641   * Get the "{@literal Network Architecture}".
642   *
643   * <p>
644   * A description of the system's network architecture, optionally supplemented by diagrams that illustrate the network architecture.
645   *
646   * @return the network-architecture value, or {@code null} if not set
647   */
648  @Nullable
649  public NetworkArchitecture getNetworkArchitecture() {
650    return _networkArchitecture;
651  }
652
653  /**
654   * Set the "{@literal Network Architecture}".
655   *
656   * <p>
657   * A description of the system's network architecture, optionally supplemented by diagrams that illustrate the network architecture.
658   *
659   * @param value
660   *           the network-architecture value to set, or {@code null} to clear
661   */
662  public void setNetworkArchitecture(@Nullable NetworkArchitecture value) {
663    _networkArchitecture = value;
664  }
665
666  /**
667   * Get the "{@literal Data Flow}".
668   *
669   * <p>
670   * A description of the logical flow of information within the system and across its boundaries, optionally supplemented by diagrams that illustrate these flows.
671   *
672   * @return the data-flow value, or {@code null} if not set
673   */
674  @Nullable
675  public DataFlow getDataFlow() {
676    return _dataFlow;
677  }
678
679  /**
680   * Set the "{@literal Data Flow}".
681   *
682   * <p>
683   * A description of the logical flow of information within the system and across its boundaries, optionally supplemented by diagrams that illustrate these flows.
684   *
685   * @param value
686   *           the data-flow value to set, or {@code null} to clear
687   */
688  public void setDataFlow(@Nullable DataFlow value) {
689    _dataFlow = value;
690  }
691
692  /**
693   * Get the "{@literal Responsible Party}".
694   *
695   * <p>
696   * 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.
697   *
698   * @return the responsible-party value
699   */
700  @NonNull
701  public List<ResponsibleParty> getResponsibleParties() {
702    if (_responsibleParties == null) {
703      _responsibleParties = new LinkedList<>();
704    }
705    return ObjectUtils.notNull(_responsibleParties);
706  }
707
708  /**
709   * Set the "{@literal Responsible Party}".
710   *
711   * <p>
712   * 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.
713   *
714   * @param value
715   *           the responsible-party value to set
716   */
717  public void setResponsibleParties(@NonNull List<ResponsibleParty> value) {
718    _responsibleParties = value;
719  }
720
721  /**
722   * Add a new {@link ResponsibleParty} item to the underlying collection.
723   * @param item the item to add
724   * @return {@code true}
725   */
726  public boolean addResponsibleParty(ResponsibleParty item) {
727    ResponsibleParty value = ObjectUtils.requireNonNull(item,"item cannot be null");
728    if (_responsibleParties == null) {
729      _responsibleParties = new LinkedList<>();
730    }
731    return _responsibleParties.add(value);
732  }
733
734  /**
735   * Remove the first matching {@link ResponsibleParty} item from the underlying collection.
736   * @param item the item to remove
737   * @return {@code true} if the item was removed or {@code false} otherwise
738   */
739  public boolean removeResponsibleParty(ResponsibleParty item) {
740    ResponsibleParty value = ObjectUtils.requireNonNull(item,"item cannot be null");
741    return _responsibleParties != null && _responsibleParties.remove(value);
742  }
743
744  /**
745   * Get the "{@literal Remarks}".
746   *
747   * <p>
748   * Additional commentary about the containing object.
749   *
750   * @return the remarks value, or {@code null} if not set
751   */
752  @Nullable
753  public MarkupMultiline getRemarks() {
754    return _remarks;
755  }
756
757  /**
758   * Set the "{@literal Remarks}".
759   *
760   * <p>
761   * Additional commentary about the containing object.
762   *
763   * @param value
764   *           the remarks value to set, or {@code null} to clear
765   */
766  public void setRemarks(@Nullable MarkupMultiline value) {
767    _remarks = value;
768  }
769
770  @Override
771  public String toString() {
772    return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
773  }
774}