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}