001// Generated from: ../../../../../../../../oscal/src/metaschema/oscal_poam_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.UuidAdapter;
006import dev.metaschema.core.model.IBoundObject;
007import dev.metaschema.core.model.IMetaschemaData;
008import dev.metaschema.core.model.JsonGroupAsBehavior;
009import dev.metaschema.core.model.constraint.IConstraint;
010import dev.metaschema.core.util.ObjectUtils;
011import dev.metaschema.databind.model.annotations.AssemblyConstraints;
012import dev.metaschema.databind.model.annotations.BoundAssembly;
013import dev.metaschema.databind.model.annotations.BoundField;
014import dev.metaschema.databind.model.annotations.BoundFlag;
015import dev.metaschema.databind.model.annotations.GroupAs;
016import dev.metaschema.databind.model.annotations.Index;
017import dev.metaschema.databind.model.annotations.IsUnique;
018import dev.metaschema.databind.model.annotations.KeyField;
019import dev.metaschema.databind.model.annotations.Let;
020import dev.metaschema.databind.model.annotations.MetaschemaAssembly;
021import dev.metaschema.databind.model.annotations.ValueConstraints;
022import edu.umd.cs.findbugs.annotations.NonNull;
023import edu.umd.cs.findbugs.annotations.Nullable;
024import java.util.LinkedList;
025import java.util.List;
026import java.util.UUID;
027import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
028import org.apache.commons.lang3.builder.ToStringStyle;
029
030/**
031 * A plan of action and milestones which identifies initial and residual risks, deviations, and disposition, such as those required by FedRAMP.
032 */
033@MetaschemaAssembly(
034    formalName = "Plan of Action and Milestones (POA&M)",
035    description = "A plan of action and milestones which identifies initial and residual risks, deviations, and disposition, such as those required by FedRAMP.",
036    name = "plan-of-action-and-milestones",
037    moduleClass = OscalPoamModule.class,
038    rootName = "plan-of-action-and-milestones",
039    remarks = "Either an OSCAL-based SSP must be imported, or a unique system-id must be specified. Both may be present.",
040    valueConstraints = @ValueConstraints(lets = @Let(name = "all-imports", target = "recurse-depth('.[import-ap]/doc(resolve-uri(Q{http://csrc.nist.gov/ns/oscal/1.0}resolve-reference(import-ap/@href)))/assessment-plan|.[import-ssp]/doc(resolve-uri(Q{http://csrc.nist.gov/ns/oscal/1.0}resolve-reference(import-ssp/@href)))/system-security-plan|.[import-profile]/resolve-profile(doc(resolve-uri(Q{http://csrc.nist.gov/ns/oscal/1.0}resolve-reference(import-profile/@href))))/catalog')")),
041    modelConstraints = @AssemblyConstraints(index = {@Index(id = "oscal-poam-index-metadata-scoped-role-id", formalName = "In-Scope Role Identifiers", description = "An index of role identifiers that are in-scope for the plan-of-action-and-milestones model. Roles are collected from imported system-securtity-plans, which in turn includes referenced profiles and catalogs. For a given role @id, a locally declared role takes precedence over a role that is imported, the role that was last imported.", level = IConstraint.Level.ERROR, target = "map:merge($all-imports/metadata/role ! map:entry(@id,.))?*", name = "index-imports-metadata-role-id", keyFields = @KeyField(target = "@id")), @Index(id = "oscal-poam-index-metadata-scoped-location-uuid", level = IConstraint.Level.ERROR, target = "map:merge($all-imports/metadata/location ! map:entry(@uuid,.))?*", name = "index-imports-metadata-location-uuid", keyFields = @KeyField(target = "@uuid")), @Index(id = "oscal-poam-index-metadata-scoped-party-uuid", level = IConstraint.Level.ERROR, target = "map:merge($all-imports/metadata/party ! map:entry(@uuid,.))?*", name = "index-imports-metadata-party-uuid", keyFields = @KeyField(target = "@uuid")), @Index(id = "oscal-poam-index-metadata-scoped-party-organization-uuid", level = IConstraint.Level.ERROR, target = "map:merge($all-imports/metadata/party[@type='organization'] ! map:entry(@uuid,.))?*", name = "index-imports-metadata-party-organization-uuid", keyFields = @KeyField(target = "@uuid")), @Index(id = "oscal-poam-index-metadata-scoped-property-uuid", level = IConstraint.Level.ERROR, target = "map:merge($all-imports//prop[@uuid] ! map:entry(@uuid,.))?*", name = "index-imports-metadata-property-uuid", keyFields = @KeyField(target = "@uuid"))}, unique = {@IsUnique(id = "oscal-unique-document-id", formalName = "Unique Document Identifier", description = "Ensure all document identifiers have a unique combination of @scheme and value.", level = IConstraint.Level.ERROR, target = "document-id", keyFields = {@KeyField(target = "@scheme"), @KeyField}), @IsUnique(id = "oscal-unique-property-in-context-location", formalName = "Unique Properties", description = "Ensure all properties are unique for a given location using a unique combination of @ns, @name, @class. @group. and @value.", level = IConstraint.Level.ERROR, target = ".//prop", keyFields = {@KeyField(target = "path(..)"), @KeyField(target = "@name"), @KeyField(target = "@ns"), @KeyField(target = "@class"), @KeyField(target = "@group"), @KeyField(target = "@value")}), @IsUnique(id = "oscal-unique-link-in-context-location", formalName = "Unique Links", description = "Ensure all links are unique for a given location using a unique combination of @href, @rel, and @media-type.", level = IConstraint.Level.ERROR, target = ".//link", keyFields = {@KeyField(target = "path(..)"), @KeyField(target = "@href"), @KeyField(target = "@rel"), @KeyField(target = "@media-type"), @KeyField(target = "@resource-fragment")}), @IsUnique(id = "oscal-unique-responsibility-in-context-location", formalName = "Unique Responsibilities", description = "Ensure all responsible-roles and responsible-parties are unique for a given location using a unique combination of @role-id and the combination of @party-uuid values.", level = IConstraint.Level.ERROR, target = ".//(responsible-party|responsible-role)", keyFields = {@KeyField(target = "path(..)"), @KeyField(target = "@role-id"), @KeyField(target = "@party-uuid")}, remarks = "Since `responsible-party` and `responsible-role` associate multiple `party-uuid` entries with a single `role-id`, each role-id must be referenced only once.")})
042)
043public class PlanOfActionAndMilestones extends AbstractOscalInstance implements IBoundObject {
044  private final IMetaschemaData __metaschemaData;
045
046  /**
047   * 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/#instance">instance</a>scope that can be used to reference this POA&amp;M instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#poam-identifiers">this OSCAL instance</a>. 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.
048   */
049  @BoundFlag(
050      formalName = "POA&M Universally Unique Identifier",
051      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 [instance](https://pages.nist.gov/OSCAL/concepts/identifier-use/#instance)scope that can be used to reference this POA\\&M instance in [this OSCAL instance](https://pages.nist.gov/OSCAL/concepts/identifier-use/#poam-identifiers). 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.",
052      name = "uuid",
053      required = true,
054      typeAdapter = UuidAdapter.class
055  )
056  private UUID _uuid;
057
058  /**
059   * Provides information about the containing document, and defines concepts that are shared across the document.
060   */
061  @BoundAssembly(
062      formalName = "Document Metadata",
063      description = "Provides information about the containing document, and defines concepts that are shared across the document.",
064      useName = "metadata",
065      minOccurs = 1
066  )
067  private Metadata _metadata;
068
069  /**
070   * Used by the assessment plan and POA&amp;M to import information about the system.
071   */
072  @BoundAssembly(
073      formalName = "Import System Security Plan",
074      description = "Used by the assessment plan and POA\\&M to import information about the system.",
075      useName = "import-ssp",
076      remarks = "Used by the POA\\&M to import information about the system."
077  )
078  private ImportSsp _importSsp;
079
080  /**
081   * 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.
082   */
083  @BoundField(
084      formalName = "System Identification",
085      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.",
086      useName = "system-id"
087  )
088  private SystemId _systemId;
089
090  /**
091   * Allows components, and inventory-items to be defined within the POA&amp;M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&amp;M.
092   */
093  @BoundAssembly(
094      formalName = "Local Definitions",
095      description = "Allows components, and inventory-items to be defined within the POA\\&M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA\\&M.",
096      useName = "local-definitions"
097  )
098  private LocalDefinitions _localDefinitions;
099
100  /**
101   * Describes an individual observation.
102   */
103  @BoundAssembly(
104      formalName = "Observation",
105      description = "Describes an individual observation.",
106      useName = "observation",
107      maxOccurs = -1,
108      groupAs = @GroupAs(name = "observations", inJson = JsonGroupAsBehavior.LIST)
109  )
110  private List<Observation> _observations;
111
112  /**
113   * An identified risk.
114   */
115  @BoundAssembly(
116      formalName = "Identified Risk",
117      description = "An identified risk.",
118      useName = "risk",
119      maxOccurs = -1,
120      groupAs = @GroupAs(name = "risks", inJson = JsonGroupAsBehavior.LIST)
121  )
122  private List<Risk> _risks;
123
124  /**
125   * Describes an individual finding.
126   */
127  @BoundAssembly(
128      formalName = "Finding",
129      description = "Describes an individual finding.",
130      useName = "finding",
131      maxOccurs = -1,
132      groupAs = @GroupAs(name = "findings", inJson = JsonGroupAsBehavior.LIST)
133  )
134  private List<Finding> _findings;
135
136  /**
137   * Describes an individual POA&amp;M item.
138   */
139  @BoundAssembly(
140      formalName = "POA&M Item",
141      description = "Describes an individual POA\\&M item.",
142      useName = "poam-item",
143      minOccurs = 1,
144      maxOccurs = -1,
145      groupAs = @GroupAs(name = "poam-items", inJson = JsonGroupAsBehavior.LIST)
146  )
147  private List<PoamItem> _poamItems;
148
149  /**
150   * A collection of resources that may be referenced from within the OSCAL document instance.
151   */
152  @BoundAssembly(
153      formalName = "Back matter",
154      description = "A collection of resources that may be referenced from within the OSCAL document instance.",
155      useName = "back-matter"
156  )
157  private BackMatter _backMatter;
158
159  /**
160   * Constructs a new {@code dev.metaschema.oscal.lib.model.PlanOfActionAndMilestones} instance with no metadata.
161   */
162  public PlanOfActionAndMilestones() {
163    this(null);
164  }
165
166  /**
167   * Constructs a new {@code dev.metaschema.oscal.lib.model.PlanOfActionAndMilestones} instance with the specified metadata.
168   *
169   * @param data
170   *           the metaschema data, or {@code null} if none
171   */
172  public PlanOfActionAndMilestones(IMetaschemaData data) {
173    this.__metaschemaData = data;
174  }
175
176  @Override
177  public IMetaschemaData getMetaschemaData() {
178    return __metaschemaData;
179  }
180
181  /**
182   * Get the "{@literal POA&M Universally Unique Identifier}".
183   *
184   * <p>
185   * 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/#instance">instance</a>scope that can be used to reference this POA&amp;M instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#poam-identifiers">this OSCAL instance</a>. 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.
186   *
187   * @return the uuid value
188   */
189  @NonNull
190  public UUID getUuid() {
191    return _uuid;
192  }
193
194  /**
195   * Set the "{@literal POA&M Universally Unique Identifier}".
196   *
197   * <p>
198   * 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/#instance">instance</a>scope that can be used to reference this POA&amp;M instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#poam-identifiers">this OSCAL instance</a>. 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.
199   *
200   * @param value
201   *           the uuid value to set
202   */
203  public void setUuid(@NonNull UUID value) {
204    _uuid = value;
205  }
206
207  /**
208   * Get the "{@literal Document Metadata}".
209   *
210   * <p>
211   * Provides information about the containing document, and defines concepts that are shared across the document.
212   *
213   * @return the metadata value
214   */
215  @NonNull
216  public Metadata getMetadata() {
217    return _metadata;
218  }
219
220  /**
221   * Set the "{@literal Document Metadata}".
222   *
223   * <p>
224   * Provides information about the containing document, and defines concepts that are shared across the document.
225   *
226   * @param value
227   *           the metadata value to set
228   */
229  public void setMetadata(@NonNull Metadata value) {
230    _metadata = value;
231  }
232
233  /**
234   * Get the "{@literal Import System Security Plan}".
235   *
236   * <p>
237   * Used by the assessment plan and POA&amp;M to import information about the system.
238   *
239   * @return the import-ssp value, or {@code null} if not set
240   */
241  @Nullable
242  public ImportSsp getImportSsp() {
243    return _importSsp;
244  }
245
246  /**
247   * Set the "{@literal Import System Security Plan}".
248   *
249   * <p>
250   * Used by the assessment plan and POA&amp;M to import information about the system.
251   *
252   * @param value
253   *           the import-ssp value to set, or {@code null} to clear
254   */
255  public void setImportSsp(@Nullable ImportSsp value) {
256    _importSsp = value;
257  }
258
259  /**
260   * Get the "{@literal System Identification}".
261   *
262   * <p>
263   * 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.
264   *
265   * @return the system-id value, or {@code null} if not set
266   */
267  @Nullable
268  public SystemId getSystemId() {
269    return _systemId;
270  }
271
272  /**
273   * Set the "{@literal System Identification}".
274   *
275   * <p>
276   * 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.
277   *
278   * @param value
279   *           the system-id value to set, or {@code null} to clear
280   */
281  public void setSystemId(@Nullable SystemId value) {
282    _systemId = value;
283  }
284
285  /**
286   * Get the "{@literal Local Definitions}".
287   *
288   * <p>
289   * Allows components, and inventory-items to be defined within the POA&amp;M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&amp;M.
290   *
291   * @return the local-definitions value, or {@code null} if not set
292   */
293  @Nullable
294  public LocalDefinitions getLocalDefinitions() {
295    return _localDefinitions;
296  }
297
298  /**
299   * Set the "{@literal Local Definitions}".
300   *
301   * <p>
302   * Allows components, and inventory-items to be defined within the POA&amp;M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&amp;M.
303   *
304   * @param value
305   *           the local-definitions value to set, or {@code null} to clear
306   */
307  public void setLocalDefinitions(@Nullable LocalDefinitions value) {
308    _localDefinitions = value;
309  }
310
311  /**
312   * Get the "{@literal Observation}".
313   *
314   * <p>
315   * Describes an individual observation.
316   *
317   * @return the observation value
318   */
319  @NonNull
320  public List<Observation> getObservations() {
321    if (_observations == null) {
322      _observations = new LinkedList<>();
323    }
324    return ObjectUtils.notNull(_observations);
325  }
326
327  /**
328   * Set the "{@literal Observation}".
329   *
330   * <p>
331   * Describes an individual observation.
332   *
333   * @param value
334   *           the observation value to set
335   */
336  public void setObservations(@NonNull List<Observation> value) {
337    _observations = value;
338  }
339
340  /**
341   * Add a new {@link Observation} item to the underlying collection.
342   * @param item the item to add
343   * @return {@code true}
344   */
345  public boolean addObservation(Observation item) {
346    Observation value = ObjectUtils.requireNonNull(item,"item cannot be null");
347    if (_observations == null) {
348      _observations = new LinkedList<>();
349    }
350    return _observations.add(value);
351  }
352
353  /**
354   * Remove the first matching {@link Observation} item from the underlying collection.
355   * @param item the item to remove
356   * @return {@code true} if the item was removed or {@code false} otherwise
357   */
358  public boolean removeObservation(Observation item) {
359    Observation value = ObjectUtils.requireNonNull(item,"item cannot be null");
360    return _observations != null && _observations.remove(value);
361  }
362
363  /**
364   * Get the "{@literal Identified Risk}".
365   *
366   * <p>
367   * An identified risk.
368   *
369   * @return the risk value
370   */
371  @NonNull
372  public List<Risk> getRisks() {
373    if (_risks == null) {
374      _risks = new LinkedList<>();
375    }
376    return ObjectUtils.notNull(_risks);
377  }
378
379  /**
380   * Set the "{@literal Identified Risk}".
381   *
382   * <p>
383   * An identified risk.
384   *
385   * @param value
386   *           the risk value to set
387   */
388  public void setRisks(@NonNull List<Risk> value) {
389    _risks = value;
390  }
391
392  /**
393   * Add a new {@link Risk} item to the underlying collection.
394   * @param item the item to add
395   * @return {@code true}
396   */
397  public boolean addRisk(Risk item) {
398    Risk value = ObjectUtils.requireNonNull(item,"item cannot be null");
399    if (_risks == null) {
400      _risks = new LinkedList<>();
401    }
402    return _risks.add(value);
403  }
404
405  /**
406   * Remove the first matching {@link Risk} item from the underlying collection.
407   * @param item the item to remove
408   * @return {@code true} if the item was removed or {@code false} otherwise
409   */
410  public boolean removeRisk(Risk item) {
411    Risk value = ObjectUtils.requireNonNull(item,"item cannot be null");
412    return _risks != null && _risks.remove(value);
413  }
414
415  /**
416   * Get the "{@literal Finding}".
417   *
418   * <p>
419   * Describes an individual finding.
420   *
421   * @return the finding value
422   */
423  @NonNull
424  public List<Finding> getFindings() {
425    if (_findings == null) {
426      _findings = new LinkedList<>();
427    }
428    return ObjectUtils.notNull(_findings);
429  }
430
431  /**
432   * Set the "{@literal Finding}".
433   *
434   * <p>
435   * Describes an individual finding.
436   *
437   * @param value
438   *           the finding value to set
439   */
440  public void setFindings(@NonNull List<Finding> value) {
441    _findings = value;
442  }
443
444  /**
445   * Add a new {@link Finding} item to the underlying collection.
446   * @param item the item to add
447   * @return {@code true}
448   */
449  public boolean addFinding(Finding item) {
450    Finding value = ObjectUtils.requireNonNull(item,"item cannot be null");
451    if (_findings == null) {
452      _findings = new LinkedList<>();
453    }
454    return _findings.add(value);
455  }
456
457  /**
458   * Remove the first matching {@link Finding} item from the underlying collection.
459   * @param item the item to remove
460   * @return {@code true} if the item was removed or {@code false} otherwise
461   */
462  public boolean removeFinding(Finding item) {
463    Finding value = ObjectUtils.requireNonNull(item,"item cannot be null");
464    return _findings != null && _findings.remove(value);
465  }
466
467  /**
468   * Get the "{@literal POA&M Item}".
469   *
470   * <p>
471   * Describes an individual POA&amp;M item.
472   *
473   * @return the poam-item value
474   */
475  @NonNull
476  public List<PoamItem> getPoamItems() {
477    if (_poamItems == null) {
478      _poamItems = new LinkedList<>();
479    }
480    return ObjectUtils.notNull(_poamItems);
481  }
482
483  /**
484   * Set the "{@literal POA&M Item}".
485   *
486   * <p>
487   * Describes an individual POA&amp;M item.
488   *
489   * @param value
490   *           the poam-item value to set
491   */
492  public void setPoamItems(@NonNull List<PoamItem> value) {
493    _poamItems = value;
494  }
495
496  /**
497   * Add a new {@link PoamItem} item to the underlying collection.
498   * @param item the item to add
499   * @return {@code true}
500   */
501  public boolean addPoamItem(PoamItem item) {
502    PoamItem value = ObjectUtils.requireNonNull(item,"item cannot be null");
503    if (_poamItems == null) {
504      _poamItems = new LinkedList<>();
505    }
506    return _poamItems.add(value);
507  }
508
509  /**
510   * Remove the first matching {@link PoamItem} item from the underlying collection.
511   * @param item the item to remove
512   * @return {@code true} if the item was removed or {@code false} otherwise
513   */
514  public boolean removePoamItem(PoamItem item) {
515    PoamItem value = ObjectUtils.requireNonNull(item,"item cannot be null");
516    return _poamItems != null && _poamItems.remove(value);
517  }
518
519  /**
520   * Get the "{@literal Back matter}".
521   *
522   * <p>
523   * A collection of resources that may be referenced from within the OSCAL document instance.
524   *
525   * @return the back-matter value, or {@code null} if not set
526   */
527  @Nullable
528  public BackMatter getBackMatter() {
529    return _backMatter;
530  }
531
532  /**
533   * Set the "{@literal Back matter}".
534   *
535   * <p>
536   * A collection of resources that may be referenced from within the OSCAL document instance.
537   *
538   * @param value
539   *           the back-matter value to set, or {@code null} to clear
540   */
541  public void setBackMatter(@Nullable BackMatter value) {
542    _backMatter = value;
543  }
544
545  @Override
546  public String toString() {
547    return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
548  }
549}