FindingCollectingConstraintValidationHandler.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.DynamicContext;
  28. import gov.nist.secauto.metaschema.core.metapath.ISequence;
  29. import gov.nist.secauto.metaschema.core.metapath.MetapathException;
  30. import gov.nist.secauto.metaschema.core.metapath.format.IPathFormatter;
  31. import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
  32. import gov.nist.secauto.metaschema.core.model.constraint.IConstraint.Level;
  33. import gov.nist.secauto.metaschema.core.model.validation.IValidationResult;
  34. import gov.nist.secauto.metaschema.core.util.CollectionUtil;

  35. import java.util.LinkedList;
  36. import java.util.List;
  37. import java.util.Objects;

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

  39. public class FindingCollectingConstraintValidationHandler
  40.     extends AbstractConstraintValidationHandler
  41.     implements IValidationResult {
  42.   @NonNull
  43.   private final List<ConstraintValidationFinding> findings = new LinkedList<>();
  44.   @NonNull
  45.   private IPathFormatter pathFormatter = IPathFormatter.METAPATH_PATH_FORMATER;
  46.   @NonNull
  47.   private Level highestLevel = IConstraint.Level.INFORMATIONAL;

  48.   @Override
  49.   @NonNull
  50.   public IPathFormatter getPathFormatter() {
  51.     return pathFormatter;
  52.   }

  53.   public void setPathFormatter(@NonNull IPathFormatter pathFormatter) {
  54.     this.pathFormatter = Objects.requireNonNull(pathFormatter, "pathFormatter");
  55.   }

  56.   @Override
  57.   @NonNull
  58.   public List<ConstraintValidationFinding> getFindings() {
  59.     return CollectionUtil.unmodifiableList(findings);
  60.   }

  61.   @Override
  62.   @NonNull
  63.   public Level getHighestSeverity() {
  64.     return highestLevel;
  65.   }

  66.   protected void addFinding(@NonNull ConstraintValidationFinding finding) {
  67.     findings.add(finding);

  68.     Level severity = finding.getSeverity();
  69.     if (severity.ordinal() > highestLevel.ordinal()) {
  70.       highestLevel = severity;
  71.     }
  72.   }

  73.   @Override
  74.   public void handleCardinalityMinimumViolation(
  75.       @NonNull ICardinalityConstraint constraint,
  76.       @NonNull INodeItem node,
  77.       @NonNull ISequence<? extends INodeItem> targets) {
  78.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  79.         .targets(targets.asList())
  80.         .message(newCardinalityMinimumViolationMessage(constraint, node, targets))
  81.         .build());
  82.   }

  83.   @Override
  84.   public void handleCardinalityMaximumViolation(
  85.       @NonNull ICardinalityConstraint constraint,
  86.       @NonNull INodeItem node,
  87.       @NonNull ISequence<? extends INodeItem> targets) {
  88.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  89.         .targets(targets.asList())
  90.         .message(newCardinalityMaximumViolationMessage(constraint, node, targets))
  91.         .build());
  92.   }

  93.   @Override
  94.   public void handleIndexDuplicateKeyViolation(
  95.       @NonNull IIndexConstraint constraint,
  96.       @NonNull INodeItem node,
  97.       @NonNull INodeItem oldItem,
  98.       @NonNull INodeItem target) {
  99.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  100.         .target(target)
  101.         .message(newIndexDuplicateKeyViolationMessage(constraint, node, oldItem, target))
  102.         .build());
  103.   }

  104.   @Override
  105.   public void handleUniqueKeyViolation(
  106.       @NonNull IUniqueConstraint constraint,
  107.       @NonNull INodeItem node,
  108.       @NonNull INodeItem oldItem,
  109.       @NonNull INodeItem target) {
  110.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  111.         .target(target)
  112.         .message(newUniqueKeyViolationMessage(constraint, node, oldItem, target))
  113.         .build());
  114.   }

  115.   @SuppressWarnings("null")
  116.   @Override
  117.   public void handleKeyMatchError(
  118.       @NonNull IKeyConstraint constraint,
  119.       @NonNull INodeItem node,
  120.       @NonNull INodeItem target,
  121.       @NonNull MetapathException cause) {
  122.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  123.         .target(target)
  124.         .message(cause.getLocalizedMessage())
  125.         .cause(cause)
  126.         .build());
  127.   }

  128.   @Override
  129.   public void handleMatchPatternViolation(
  130.       @NonNull IMatchesConstraint constraint,
  131.       @NonNull INodeItem node,
  132.       @NonNull INodeItem target,
  133.       @NonNull String value) {
  134.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  135.         .target(target)
  136.         .message(newMatchPatternViolationMessage(constraint, node, target, value))
  137.         .build());
  138.   }

  139.   @Override
  140.   public void handleMatchDatatypeViolation(
  141.       @NonNull IMatchesConstraint constraint,
  142.       @NonNull INodeItem node,
  143.       @NonNull INodeItem target,
  144.       @NonNull String value,
  145.       @NonNull IllegalArgumentException cause) {
  146.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  147.         .target(target)
  148.         .message(newMatchDatatypeViolationMessage(constraint, node, target, value))
  149.         .cause(cause)
  150.         .build());
  151.   }

  152.   @Override
  153.   public void handleExpectViolation(
  154.       @NonNull IExpectConstraint constraint,
  155.       @NonNull INodeItem node,
  156.       @NonNull INodeItem target,
  157.       @NonNull DynamicContext dynamicContext) {
  158.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  159.         .target(target)
  160.         .message(newExpectViolationMessage(constraint, node, target, dynamicContext))
  161.         .build());
  162.   }

  163.   @Override
  164.   public void handleAllowedValuesViolation(@NonNull List<IAllowedValuesConstraint> failedConstraints,
  165.       @NonNull INodeItem target) {
  166.     addFinding(ConstraintValidationFinding.builder(failedConstraints, target)
  167.         .target(target)
  168.         .message(newAllowedValuesViolationMessage(failedConstraints, target))
  169.         .build());
  170.   }

  171.   @Override
  172.   public void handleIndexDuplicateViolation(IIndexConstraint constraint, INodeItem node) {
  173.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  174.         .message(newIndexDuplicateViolationMessage(constraint, node))
  175.         .severity(Level.CRITICAL)
  176.         .build());
  177.   }

  178.   @Override
  179.   public void handleIndexMiss(IIndexHasKeyConstraint constraint, INodeItem node, INodeItem target, List<String> key) {
  180.     addFinding(ConstraintValidationFinding.builder(constraint, node)
  181.         .message(newIndexMissMessage(constraint, node, target, key))
  182.         .build());
  183.   }

  184. }