001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.metaschema.databind.model.annotations;
007
008import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
009import static java.lang.annotation.RetentionPolicy.RUNTIME;
010
011import gov.nist.secauto.metaschema.core.model.constraint.IConstraint;
012import gov.nist.secauto.metaschema.core.model.constraint.IConstraint.Level;
013
014import java.lang.annotation.Documented;
015import java.lang.annotation.Retention;
016import java.lang.annotation.Target;
017
018import edu.umd.cs.findbugs.annotations.NonNull;
019
020/**
021 * This annotation defines cardinality condition(s) to be met in the context of
022 * the containing annotation.
023 */
024@Documented
025@Retention(RUNTIME)
026@Target(ANNOTATION_TYPE)
027public @interface HasCardinality {
028  /**
029   * An optional identifier for the constraint, which must be unique to only this
030   * constraint.
031   *
032   * @return the identifier if provided or an empty string otherwise
033   */
034  @SuppressWarnings("PMD.ShortMethodName")
035  @NonNull
036  String id() default "";
037
038  /**
039   * An optional formal name for the constraint.
040   *
041   * @return the formal name if provided or an empty string otherwise
042   */
043  @NonNull
044  String formalName() default "";
045
046  /**
047   * An optional description of the constraint.
048   *
049   * @return the description if provided or an empty string otherwise
050   */
051  @NonNull
052  String description() default "";
053
054  /**
055   * The significance of a violation of this constraint.
056   *
057   * @return the level
058   */
059  @NonNull
060  Level level() default IConstraint.Level.ERROR;
061
062  /**
063   * An optional metapath that points to the target flag or field value that the
064   * constraint applies to. If omitted the target will be ".", which means the
065   * target is the value of the {@link BoundFlag}, {@link BoundField} or
066   * {@link BoundFieldValue} annotation the constraint appears on. In the prior
067   * case, this annotation may only appear on a {@link BoundField} if the field
068   * has no flags, which results in a {@link BoundField} annotation on a field
069   * instance with a scalar, data type value.
070   *
071   * @return the target metapath
072   */
073  @NonNull
074  String target() default ".";
075
076  /**
077   * An optional set of properties associated with these allowed values.
078   *
079   * @return the properties or an empty array with no properties
080   */
081  Property[] properties() default {};
082
083  /**
084   * The minimum occurrence of the target. This value cannot be less than or equal
085   * to the corresponding value defined on the target. The value must be greater
086   * than {@code 0}.
087   *
088   * @return a non-negative integer or {@code -1} if not defined
089   */
090  int minOccurs() default -1;
091
092  /**
093   * The maximum occurrence of the target. This value must be greater than or
094   * equal to the {@link #minOccurs()} if both are provided. This value must be
095   * less than the corresponding value defined on the target.
096   *
097   * @return a non-negative integer or {@code -1} if not defined
098   */
099  int maxOccurs() default -1;
100
101  /**
102   * The message to emit when the constraint is violated.
103   *
104   * @return the message or an empty string otherwise
105   */
106  @NonNull
107  String message() default "";
108
109  /**
110   * Any remarks about the constraint, encoded as an escaped Markdown string.
111   *
112   * @return an encoded markdown string or an empty string if no remarks are
113   *         provided
114   */
115  @NonNull
116  String remarks() default "";
117}