001// Generated from: ../../../../../../../../oscal/src/metaschema/oscal_assessment-results_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.datatype.markup.MarkupMultiline;
007import dev.metaschema.core.datatype.markup.MarkupMultilineAdapter;
008import dev.metaschema.core.model.IBoundObject;
009import dev.metaschema.core.model.IMetaschemaData;
010import dev.metaschema.core.model.JsonGroupAsBehavior;
011import dev.metaschema.core.model.constraint.IConstraint;
012import dev.metaschema.core.util.ObjectUtils;
013import dev.metaschema.databind.model.annotations.AssemblyConstraints;
014import dev.metaschema.databind.model.annotations.BoundAssembly;
015import dev.metaschema.databind.model.annotations.BoundField;
016import dev.metaschema.databind.model.annotations.BoundFlag;
017import dev.metaschema.databind.model.annotations.GroupAs;
018import dev.metaschema.databind.model.annotations.Index;
019import dev.metaschema.databind.model.annotations.IsUnique;
020import dev.metaschema.databind.model.annotations.KeyField;
021import dev.metaschema.databind.model.annotations.Let;
022import dev.metaschema.databind.model.annotations.MetaschemaAssembly;
023import dev.metaschema.databind.model.annotations.ValueConstraints;
024import edu.umd.cs.findbugs.annotations.NonNull;
025import edu.umd.cs.findbugs.annotations.Nullable;
026import java.util.LinkedList;
027import java.util.List;
028import java.util.UUID;
029import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
030import org.apache.commons.lang3.builder.ToStringStyle;
031
032/**
033 * Security assessment results, such as those provided by a FedRAMP assessor in the FedRAMP Security Assessment Report.
034 */
035@MetaschemaAssembly(
036    formalName = "Security Assessment Results (SAR)",
037    description = "Security assessment results, such as those provided by a FedRAMP assessor in the FedRAMP Security Assessment Report.",
038    name = "assessment-results",
039    moduleClass = OscalArModule.class,
040    rootName = "assessment-results",
041    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')")),
042    modelConstraints = @AssemblyConstraints(index = {@Index(id = "oscal-ar-index-metadata-scoped-role-id", formalName = "In-Scope Role Identifiers", description = "An index of role identifiers that are in-scope for the assessment-result model. Roles are collected from imported assessment-plans, which in turn includes referenced 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-ar-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-ar-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-ar-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-ar-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.")})
043)
044public class AssessmentResults extends AbstractOscalInstance implements IBoundObject {
045  private final IMetaschemaData __metaschemaData;
046
047  /**
048   * 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 assessment results instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ar-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>assessment result</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.
049   */
050  @BoundFlag(
051      formalName = "Assessment Results Universally Unique Identifier",
052      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 assessment results instance in [this or other OSCAL instances](https://pages.nist.gov/OSCAL/concepts/identifier-use/#ar-identifiers). The locally defined *UUID* of the `assessment result` 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.",
053      name = "uuid",
054      required = true,
055      typeAdapter = UuidAdapter.class
056  )
057  private UUID _uuid;
058
059  /**
060   * Provides information about the containing document, and defines concepts that are shared across the document.
061   */
062  @BoundAssembly(
063      formalName = "Document Metadata",
064      description = "Provides information about the containing document, and defines concepts that are shared across the document.",
065      useName = "metadata",
066      minOccurs = 1
067  )
068  private Metadata _metadata;
069
070  /**
071   * Used by assessment-results to import information about the original plan for assessing the system.
072   */
073  @BoundAssembly(
074      formalName = "Import Assessment Plan",
075      description = "Used by assessment-results to import information about the original plan for assessing the system.",
076      useName = "import-ap",
077      remarks = "Used by the SAR to import information about the original plan for assessing the system.",
078      minOccurs = 1
079  )
080  private ImportAp _importAp;
081
082  /**
083   * Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.
084   */
085  @BoundAssembly(
086      formalName = "Local Definitions",
087      description = "Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.",
088      useName = "local-definitions"
089  )
090  private LocalDefinitions _localDefinitions;
091
092  /**
093   * Used by the assessment results and POA&amp;M. In the assessment results, this identifies all of the assessment observations and findings, initial and residual risks, deviations, and disposition. In the POA&amp;M, this identifies initial and residual risks, deviations, and disposition.
094   */
095  @BoundAssembly(
096      formalName = "Assessment Result",
097      description = "Used by the assessment results and POA\\&M. In the assessment results, this identifies all of the assessment observations and findings, initial and residual risks, deviations, and disposition. In the POA\\&M, this identifies initial and residual risks, deviations, and disposition.",
098      useName = "result",
099      minOccurs = 1,
100      maxOccurs = -1,
101      groupAs = @GroupAs(name = "results", inJson = JsonGroupAsBehavior.LIST)
102  )
103  private List<Result> _results;
104
105  /**
106   * A collection of resources that may be referenced from within the OSCAL document instance.
107   */
108  @BoundAssembly(
109      formalName = "Back matter",
110      description = "A collection of resources that may be referenced from within the OSCAL document instance.",
111      useName = "back-matter"
112  )
113  private BackMatter _backMatter;
114
115  /**
116   * Constructs a new {@code dev.metaschema.oscal.lib.model.AssessmentResults} instance with no metadata.
117   */
118  public AssessmentResults() {
119    this(null);
120  }
121
122  /**
123   * Constructs a new {@code dev.metaschema.oscal.lib.model.AssessmentResults} instance with the specified metadata.
124   *
125   * @param data
126   *           the metaschema data, or {@code null} if none
127   */
128  public AssessmentResults(IMetaschemaData data) {
129    this.__metaschemaData = data;
130  }
131
132  @Override
133  public IMetaschemaData getMetaschemaData() {
134    return __metaschemaData;
135  }
136
137  /**
138   * Get the "{@literal Assessment Results Universally Unique Identifier}".
139   *
140   * <p>
141   * 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 assessment results instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ar-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>assessment result</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.
142   *
143   * @return the uuid value
144   */
145  @NonNull
146  public UUID getUuid() {
147    return _uuid;
148  }
149
150  /**
151   * Set the "{@literal Assessment Results Universally Unique Identifier}".
152   *
153   * <p>
154   * 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 assessment results instance in <a href="https://pages.nist.gov/OSCAL/concepts/identifier-use/#ar-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>assessment result</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.
155   *
156   * @param value
157   *           the uuid value to set
158   */
159  public void setUuid(@NonNull UUID value) {
160    _uuid = value;
161  }
162
163  /**
164   * Get the "{@literal Document Metadata}".
165   *
166   * <p>
167   * Provides information about the containing document, and defines concepts that are shared across the document.
168   *
169   * @return the metadata value
170   */
171  @NonNull
172  public Metadata getMetadata() {
173    return _metadata;
174  }
175
176  /**
177   * Set the "{@literal Document Metadata}".
178   *
179   * <p>
180   * Provides information about the containing document, and defines concepts that are shared across the document.
181   *
182   * @param value
183   *           the metadata value to set
184   */
185  public void setMetadata(@NonNull Metadata value) {
186    _metadata = value;
187  }
188
189  /**
190   * Get the "{@literal Import Assessment Plan}".
191   *
192   * <p>
193   * Used by assessment-results to import information about the original plan for assessing the system.
194   *
195   * @return the import-ap value
196   */
197  @NonNull
198  public ImportAp getImportAp() {
199    return _importAp;
200  }
201
202  /**
203   * Set the "{@literal Import Assessment Plan}".
204   *
205   * <p>
206   * Used by assessment-results to import information about the original plan for assessing the system.
207   *
208   * @param value
209   *           the import-ap value to set
210   */
211  public void setImportAp(@NonNull ImportAp value) {
212    _importAp = value;
213  }
214
215  /**
216   * Get the "{@literal Local Definitions}".
217   *
218   * <p>
219   * Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.
220   *
221   * @return the local-definitions value, or {@code null} if not set
222   */
223  @Nullable
224  public LocalDefinitions getLocalDefinitions() {
225    return _localDefinitions;
226  }
227
228  /**
229   * Set the "{@literal Local Definitions}".
230   *
231   * <p>
232   * Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.
233   *
234   * @param value
235   *           the local-definitions value to set, or {@code null} to clear
236   */
237  public void setLocalDefinitions(@Nullable LocalDefinitions value) {
238    _localDefinitions = value;
239  }
240
241  /**
242   * Get the "{@literal Assessment Result}".
243   *
244   * <p>
245   * Used by the assessment results and POA&amp;M. In the assessment results, this identifies all of the assessment observations and findings, initial and residual risks, deviations, and disposition. In the POA&amp;M, this identifies initial and residual risks, deviations, and disposition.
246   *
247   * @return the result value
248   */
249  @NonNull
250  public List<Result> getResults() {
251    if (_results == null) {
252      _results = new LinkedList<>();
253    }
254    return ObjectUtils.notNull(_results);
255  }
256
257  /**
258   * Set the "{@literal Assessment Result}".
259   *
260   * <p>
261   * Used by the assessment results and POA&amp;M. In the assessment results, this identifies all of the assessment observations and findings, initial and residual risks, deviations, and disposition. In the POA&amp;M, this identifies initial and residual risks, deviations, and disposition.
262   *
263   * @param value
264   *           the result value to set
265   */
266  public void setResults(@NonNull List<Result> value) {
267    _results = value;
268  }
269
270  /**
271   * Add a new {@link Result} item to the underlying collection.
272   * @param item the item to add
273   * @return {@code true}
274   */
275  public boolean addResult(Result item) {
276    Result value = ObjectUtils.requireNonNull(item,"item cannot be null");
277    if (_results == null) {
278      _results = new LinkedList<>();
279    }
280    return _results.add(value);
281  }
282
283  /**
284   * Remove the first matching {@link Result} item from the underlying collection.
285   * @param item the item to remove
286   * @return {@code true} if the item was removed or {@code false} otherwise
287   */
288  public boolean removeResult(Result item) {
289    Result value = ObjectUtils.requireNonNull(item,"item cannot be null");
290    return _results != null && _results.remove(value);
291  }
292
293  /**
294   * Get the "{@literal Back matter}".
295   *
296   * <p>
297   * A collection of resources that may be referenced from within the OSCAL document instance.
298   *
299   * @return the back-matter value, or {@code null} if not set
300   */
301  @Nullable
302  public BackMatter getBackMatter() {
303    return _backMatter;
304  }
305
306  /**
307   * Set the "{@literal Back matter}".
308   *
309   * <p>
310   * A collection of resources that may be referenced from within the OSCAL document instance.
311   *
312   * @param value
313   *           the back-matter value to set, or {@code null} to clear
314   */
315  public void setBackMatter(@Nullable BackMatter value) {
316    _backMatter = value;
317  }
318
319  @Override
320  public String toString() {
321    return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
322  }
323
324  /**
325   * Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.
326   */
327  @MetaschemaAssembly(
328      formalName = "Local Definitions",
329      description = "Used to define data objects that are used in the assessment plan, that do not appear in the referenced SSP.",
330      name = "local-definitions",
331      moduleClass = OscalArModule.class
332  )
333  public static class LocalDefinitions implements IBoundObject {
334    private final IMetaschemaData __metaschemaData;
335
336    /**
337     * A local definition of a control objective for this assessment. Uses catalog syntax for control objective and assessment actions.
338     */
339    @BoundAssembly(
340        formalName = "Assessment-Specific Control Objective",
341        description = "A local definition of a control objective for this assessment. Uses catalog syntax for control objective and assessment actions.",
342        useName = "objectives-and-methods",
343        maxOccurs = -1,
344        groupAs = @GroupAs(name = "objectives-and-methods", inJson = JsonGroupAsBehavior.LIST)
345    )
346    private List<LocalObjective> _objectivesAndMethods;
347
348    /**
349     * Identifies an assessment or related process that can be performed. In the assessment plan, this is an intended activity which may be associated with an assessment task. In the assessment results, this an activity that was actually performed as part of an assessment.
350     */
351    @BoundAssembly(
352        formalName = "Activity",
353        description = "Identifies an assessment or related process that can be performed. In the assessment plan, this is an intended activity which may be associated with an assessment task. In the assessment results, this an activity that was actually performed as part of an assessment.",
354        useName = "activity",
355        maxOccurs = -1,
356        groupAs = @GroupAs(name = "activities", inJson = JsonGroupAsBehavior.LIST)
357    )
358    private List<Activity> _activities;
359
360    /**
361     * Additional commentary about the containing object.
362     */
363    @BoundField(
364        formalName = "Remarks",
365        description = "Additional commentary about the containing object.",
366        useName = "remarks",
367        typeAdapter = MarkupMultilineAdapter.class
368    )
369    private MarkupMultiline _remarks;
370
371    /**
372     * Constructs a new {@code dev.metaschema.oscal.lib.model.AssessmentResults.LocalDefinitions} instance with no metadata.
373     */
374    public LocalDefinitions() {
375      this(null);
376    }
377
378    /**
379     * Constructs a new {@code dev.metaschema.oscal.lib.model.AssessmentResults.LocalDefinitions} instance with the specified metadata.
380     *
381     * @param data
382     *           the metaschema data, or {@code null} if none
383     */
384    public LocalDefinitions(IMetaschemaData data) {
385      this.__metaschemaData = data;
386    }
387
388    @Override
389    public IMetaschemaData getMetaschemaData() {
390      return __metaschemaData;
391    }
392
393    /**
394     * Get the "{@literal Assessment-Specific Control Objective}".
395     *
396     * <p>
397     * A local definition of a control objective for this assessment. Uses catalog syntax for control objective and assessment actions.
398     *
399     * @return the objectives-and-methods value
400     */
401    @NonNull
402    public List<LocalObjective> getObjectivesAndMethods() {
403      if (_objectivesAndMethods == null) {
404        _objectivesAndMethods = new LinkedList<>();
405      }
406      return ObjectUtils.notNull(_objectivesAndMethods);
407    }
408
409    /**
410     * Set the "{@literal Assessment-Specific Control Objective}".
411     *
412     * <p>
413     * A local definition of a control objective for this assessment. Uses catalog syntax for control objective and assessment actions.
414     *
415     * @param value
416     *           the objectives-and-methods value to set
417     */
418    public void setObjectivesAndMethods(@NonNull List<LocalObjective> value) {
419      _objectivesAndMethods = value;
420    }
421
422    /**
423     * Add a new {@link LocalObjective} item to the underlying collection.
424     * @param item the item to add
425     * @return {@code true}
426     */
427    public boolean addObjectivesAndMethods(LocalObjective item) {
428      LocalObjective value = ObjectUtils.requireNonNull(item,"item cannot be null");
429      if (_objectivesAndMethods == null) {
430        _objectivesAndMethods = new LinkedList<>();
431      }
432      return _objectivesAndMethods.add(value);
433    }
434
435    /**
436     * Remove the first matching {@link LocalObjective} item from the underlying collection.
437     * @param item the item to remove
438     * @return {@code true} if the item was removed or {@code false} otherwise
439     */
440    public boolean removeObjectivesAndMethods(LocalObjective item) {
441      LocalObjective value = ObjectUtils.requireNonNull(item,"item cannot be null");
442      return _objectivesAndMethods != null && _objectivesAndMethods.remove(value);
443    }
444
445    /**
446     * Get the "{@literal Activity}".
447     *
448     * <p>
449     * Identifies an assessment or related process that can be performed. In the assessment plan, this is an intended activity which may be associated with an assessment task. In the assessment results, this an activity that was actually performed as part of an assessment.
450     *
451     * @return the activity value
452     */
453    @NonNull
454    public List<Activity> getActivities() {
455      if (_activities == null) {
456        _activities = new LinkedList<>();
457      }
458      return ObjectUtils.notNull(_activities);
459    }
460
461    /**
462     * Set the "{@literal Activity}".
463     *
464     * <p>
465     * Identifies an assessment or related process that can be performed. In the assessment plan, this is an intended activity which may be associated with an assessment task. In the assessment results, this an activity that was actually performed as part of an assessment.
466     *
467     * @param value
468     *           the activity value to set
469     */
470    public void setActivities(@NonNull List<Activity> value) {
471      _activities = value;
472    }
473
474    /**
475     * Add a new {@link Activity} item to the underlying collection.
476     * @param item the item to add
477     * @return {@code true}
478     */
479    public boolean addActivity(Activity item) {
480      Activity value = ObjectUtils.requireNonNull(item,"item cannot be null");
481      if (_activities == null) {
482        _activities = new LinkedList<>();
483      }
484      return _activities.add(value);
485    }
486
487    /**
488     * Remove the first matching {@link Activity} item from the underlying collection.
489     * @param item the item to remove
490     * @return {@code true} if the item was removed or {@code false} otherwise
491     */
492    public boolean removeActivity(Activity item) {
493      Activity value = ObjectUtils.requireNonNull(item,"item cannot be null");
494      return _activities != null && _activities.remove(value);
495    }
496
497    /**
498     * Get the "{@literal Remarks}".
499     *
500     * <p>
501     * Additional commentary about the containing object.
502     *
503     * @return the remarks value, or {@code null} if not set
504     */
505    @Nullable
506    public MarkupMultiline getRemarks() {
507      return _remarks;
508    }
509
510    /**
511     * Set the "{@literal Remarks}".
512     *
513     * <p>
514     * Additional commentary about the containing object.
515     *
516     * @param value
517     *           the remarks value to set, or {@code null} to clear
518     */
519    public void setRemarks(@Nullable MarkupMultiline value) {
520      _remarks = value;
521    }
522
523    @Override
524    public String toString() {
525      return ObjectUtils.notNull(new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString());
526    }
527  }
528}