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&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&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&M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&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&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&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&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&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&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&M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&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&M for circumstances where no OSCAL-based SSP exists, or is not delivered with the POA&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&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&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}