AbstractTargetedConstraints.java

  1. /*
  2.  * Portions of this software was developed by employees of the National Institute
  3.  * of Standards and Technology (NIST), an agency of the Federal Government and is
  4.  * being made available as a public service. Pursuant to title 17 United States
  5.  * Code Section 105, works of NIST employees are not subject to copyright
  6.  * protection in the United States. This software may be subject to foreign
  7.  * copyright. Permission in the United States and in foreign countries, to the
  8.  * extent that NIST may hold copyright, to use, copy, modify, create derivative
  9.  * works, and distribute this software and its documentation without fee is hereby
  10.  * granted on a non-exclusive basis, provided that this notice and disclaimer
  11.  * of warranty appears in all copies.
  12.  *
  13.  * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
  15.  * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
  16.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
  17.  * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
  18.  * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
  19.  * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
  20.  * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
  21.  * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
  22.  * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
  23.  * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
  24.  * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
  25.  */

  26. package gov.nist.secauto.metaschema.core.model.constraint;

  27. import gov.nist.secauto.metaschema.core.metapath.MetapathExpression;
  28. import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
  29. import gov.nist.secauto.metaschema.core.model.IDefinition;
  30. import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
  31. import gov.nist.secauto.metaschema.core.model.IFlagDefinition;
  32. import gov.nist.secauto.metaschema.core.model.constraint.impl.IFeatureValueConstrained;

  33. import java.util.Locale;

  34. import edu.umd.cs.findbugs.annotations.NonNull;

  35. /**
  36.  * Provides an base implementation for a set of external constraints that target
  37.  * a given definition using a target Metapath expression.
  38.  *
  39.  * @param <T>
  40.  *          the type of the constraint container
  41.  */
  42. public abstract class AbstractTargetedConstraints<T extends IValueConstrained>
  43.     implements ITargetedConstaints, IFeatureValueConstrained {
  44.   @NonNull
  45.   private final MetapathExpression targetExpression;
  46.   @NonNull
  47.   private final T constraints;

  48.   public AbstractTargetedConstraints(
  49.       @NonNull MetapathExpression targetExpression,
  50.       @NonNull T constraints) {
  51.     this.targetExpression = targetExpression;
  52.     this.constraints = constraints;
  53.   }

  54.   @Override
  55.   public MetapathExpression getTargetExpression() {
  56.     return targetExpression;
  57.   }

  58.   @Override
  59.   public T getConstraintSupport() {
  60.     return constraints;
  61.   }

  62.   @SuppressWarnings("null")
  63.   protected void applyTo(@NonNull IDefinition definition) {
  64.     getAllowedValuesConstraints().forEach(constraint -> definition.addConstraint(constraint));
  65.     getMatchesConstraints().forEach(constraint -> definition.addConstraint(constraint));
  66.     getIndexHasKeyConstraints().forEach(constraint -> definition.addConstraint(constraint));
  67.     getExpectConstraints().forEach(constraint -> definition.addConstraint(constraint));
  68.   }

  69.   @Override
  70.   public void target(@NonNull IFlagDefinition definition) {
  71.     throw new IllegalStateException(
  72.         String.format("The targeted definition '%s' from metaschema '%s' is not a %s definition.",
  73.             definition.getEffectiveName(),
  74.             definition.getContainingModule().getQName().toString(),
  75.             definition.getModelType().name().toLowerCase(Locale.ROOT)));
  76.   }

  77.   @Override
  78.   public void target(@NonNull IFieldDefinition definition) {
  79.     throw new IllegalStateException(
  80.         String.format("The targeted definition '%s' from metaschema '%s' is not a %s definition.",
  81.             definition.getEffectiveName(),
  82.             definition.getContainingModule().getQName().toString(),
  83.             definition.getModelType().name().toLowerCase(Locale.ROOT)));
  84.   }

  85.   @Override
  86.   public void target(@NonNull IAssemblyDefinition definition) {
  87.     throw new IllegalStateException(
  88.         String.format("The targeted definition '%s' from metaschema '%s' is not a %s definition.",
  89.             definition.getEffectiveName(),
  90.             definition.getContainingModule().getQName().toString(),
  91.             definition.getModelType().name().toLowerCase(Locale.ROOT)));
  92.   }
  93. }