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 a rule that requires that the target contents of the
022 * assembly, represented by the containing {@link MetaschemaAssembly}
023 * annotation, reference items in a name index defined by the {@link Index}
024 * constraint.
025 */
026
027@Documented
028@Retention(RUNTIME)
029@Target(ANNOTATION_TYPE)
030public @interface IndexHasKey {
031  /**
032   * An optional identifier for the constraint, which must be unique to only this
033   * constraint.
034   *
035   * @return the identifier if provided or an empty string otherwise
036   */
037  @SuppressWarnings("PMD.ShortMethodName")
038  @NonNull
039  String id() default "";
040
041  /**
042   * An optional formal name for the constraint.
043   *
044   * @return the formal name if provided or an empty string otherwise
045   */
046  @NonNull
047  String formalName() default "";
048
049  /**
050   * An optional description of the constraint.
051   *
052   * @return the description if provided or an empty string otherwise
053   */
054  @NonNull
055  String description() default "";
056
057  /**
058   * The significance of a violation of this constraint.
059   *
060   * @return the level
061   */
062  @NonNull
063  Level level() default IConstraint.Level.ERROR;
064
065  /**
066   * An optional metapath that points to the target flag or field value that the
067   * constraint applies to. If omitted the target will be ".", which means the
068   * target is the value of the {@link BoundFlag}, {@link BoundField} or
069   * {@link BoundFieldValue} annotation the constraint appears on. In the prior
070   * case, this annotation may only appear on a {@link BoundField} if the field
071   * has no flags, which results in a {@link BoundField} annotation on a field
072   * instance with a scalar, data type value.
073   *
074   * @return the target metapath
075   */
076  @NonNull
077  String target() default ".";
078
079  /**
080   * An optional set of properties associated with these allowed values.
081   *
082   * @return the properties or an empty array with no properties
083   */
084  Property[] properties() default {};
085
086  /**
087   * A reference to a named index.
088   *
089   * @return the index name
090   */
091  @NonNull
092  String indexName();
093
094  /**
095   * A list of one or more keys to use in looking up an entry in a given index.
096   *
097   * @return one or more keys
098   */
099  @NonNull
100  KeyField[] keyFields();
101
102  /**
103   * The message to emit when the constraint is violated.
104   *
105   * @return the message or an empty string otherwise
106   */
107  @NonNull
108  String message() default "";
109
110  /**
111   * Any remarks about the constraint, encoded as an escaped Markdown string.
112   *
113   * @return an encoded markdown string or an empty string if no remarks are
114   *         provided
115   */
116  @NonNull
117  String remarks() default "";
118}