diff --git a/src/main/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitor.java b/src/main/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitor.java deleted file mode 100644 index 986ba8db..00000000 --- a/src/main/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitor.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * SPDX-FileCopyrightText: none - * SPDX-License-Identifier: CC0-1.0 - */ - -package dev.metaschema.oscal.lib.model.util; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import dev.metaschema.core.metapath.DynamicContext; -import dev.metaschema.core.metapath.StaticContext; -import dev.metaschema.core.metapath.item.ISequence; -import dev.metaschema.core.metapath.item.node.AbstractRecursionPreventingNodeItemVisitor; -import dev.metaschema.core.metapath.item.node.IAssemblyInstanceGroupedNodeItem; -import dev.metaschema.core.metapath.item.node.IAssemblyNodeItem; -import dev.metaschema.core.metapath.item.node.IDefinitionNodeItem; -import dev.metaschema.core.metapath.item.node.IFieldNodeItem; -import dev.metaschema.core.metapath.item.node.IFlagNodeItem; -import dev.metaschema.core.metapath.item.node.IModuleNodeItem; -import dev.metaschema.core.metapath.item.node.INodeItemFactory; -import dev.metaschema.core.model.IModule; -import dev.metaschema.core.model.constraint.IAllowedValuesConstraint; -import dev.metaschema.core.model.constraint.ILet; -import edu.umd.cs.findbugs.annotations.NonNull; - -public class AllowedValueCollectingNodeItemVisitor - extends AbstractRecursionPreventingNodeItemVisitor { - - private final Map, NodeItemRecord> nodeItemAnalysis = new LinkedHashMap<>(); - - public Collection getAllowedValueLocations() { - return nodeItemAnalysis.values(); - } - - public void visit(@NonNull IModule module) { - DynamicContext context = new DynamicContext( - StaticContext.builder() - .defaultModelNamespace(module.getXmlNamespace()) - .build()); - context.disablePredicateEvaluation(); - - visit(INodeItemFactory.instance().newModuleNodeItem(module), context); - } - - public void visit(@NonNull IModuleNodeItem module, @NonNull DynamicContext context) { - - visitMetaschema(module, context); - } - - private void handleAllowedValuesAtLocation( - @NonNull IDefinitionNodeItem itemLocation, - @NonNull DynamicContext context) { - itemLocation.getDefinition().getAllowedValuesConstraints().stream() - .forEachOrdered(allowedValues -> { - ISequence result = allowedValues.getTarget().evaluate(itemLocation, context); - result.stream().forEachOrdered(target -> { - assert target != null; - handleAllowedValues(allowedValues, itemLocation, (IDefinitionNodeItem) target); - }); - }); - } - - private void handleAllowedValues( - @NonNull IAllowedValuesConstraint allowedValues, - @NonNull IDefinitionNodeItem location, - @NonNull IDefinitionNodeItem target) { - NodeItemRecord itemRecord = nodeItemAnalysis.get(target); - if (itemRecord == null) { - itemRecord = new NodeItemRecord(target); - nodeItemAnalysis.put(target, itemRecord); - } - - AllowedValuesRecord allowedValuesRecord = new AllowedValuesRecord(allowedValues, location, target); - itemRecord.addAllowedValues(allowedValuesRecord); - } - - @Override - public Void visitFlag(IFlagNodeItem item, DynamicContext context) { - assert context != null; - DynamicContext subContext = handleLetStatements(item, context); - handleAllowedValuesAtLocation(item, subContext); - return super.visitFlag(item, subContext); - } - - @Override - public Void visitField(IFieldNodeItem item, DynamicContext context) { - assert context != null; - DynamicContext subContext = handleLetStatements(item, context); - handleAllowedValuesAtLocation(item, subContext); - return super.visitField(item, subContext); - } - - @Override - public Void visitAssembly(IAssemblyNodeItem item, DynamicContext context) { - assert context != null; - DynamicContext subContext = handleLetStatements(item, context); - handleAllowedValuesAtLocation(item, subContext); - return super.visitAssembly(item, subContext); - } - - private DynamicContext handleLetStatements(IDefinitionNodeItem item, DynamicContext context) { - assert context != null; - DynamicContext subContext = context; - for (ILet let : item.getDefinition().getLetExpressions().values()) { - ISequence result = let.getValueExpression().evaluate(item, - subContext).reusable(); - subContext = subContext.bindVariableValue(let.getName(), result); - } - return subContext; - } - - @Override - public Void visitAssembly(IAssemblyInstanceGroupedNodeItem item, DynamicContext context) { - return visitAssembly((IAssemblyNodeItem) item, context); - } - - @Override - protected Void defaultResult() { - return null; - } - - public static final class NodeItemRecord { - @NonNull - private final IDefinitionNodeItem item; - @NonNull - private final List allowedValues = new LinkedList<>(); - - private NodeItemRecord(@NonNull IDefinitionNodeItem item) { - this.item = item; - } - - @NonNull - public IDefinitionNodeItem getItem() { - return item; - } - - @NonNull - public List getAllowedValues() { - return allowedValues; - } - - public void addAllowedValues(@NonNull AllowedValuesRecord record) { - this.allowedValues.add(record); - } - } - - public static final class AllowedValuesRecord { - @NonNull - private final IAllowedValuesConstraint allowedValues; - @NonNull - private final IDefinitionNodeItem location; - @NonNull - private final IDefinitionNodeItem target; - - public AllowedValuesRecord( - @NonNull IAllowedValuesConstraint allowedValues, - @NonNull IDefinitionNodeItem location, - @NonNull IDefinitionNodeItem target) { - this.allowedValues = allowedValues; - this.location = location; - this.target = target; - } - - @NonNull - public IAllowedValuesConstraint getAllowedValues() { - return allowedValues; - } - - @NonNull - public IDefinitionNodeItem getLocation() { - return location; - } - - @NonNull - public IDefinitionNodeItem getTarget() { - return target; - } - } -} diff --git a/src/test/java/dev/metaschema/oscal/lib/model/util/AbstractNodeItemVisitorTest.java b/src/test/java/dev/metaschema/oscal/lib/model/util/AbstractNodeItemVisitorTest.java deleted file mode 100644 index b5fdde3a..00000000 --- a/src/test/java/dev/metaschema/oscal/lib/model/util/AbstractNodeItemVisitorTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SPDX-FileCopyrightText: none - * SPDX-License-Identifier: CC0-1.0 - */ - -package dev.metaschema.oscal.lib.model.util; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.NavigableMap; -import java.util.TreeMap; -import java.util.function.Function; -import java.util.stream.Collectors; - -import dev.metaschema.core.metapath.item.node.IDefinitionNodeItem; -import dev.metaschema.core.model.MetaschemaException; -import dev.metaschema.core.model.constraint.IAllowedValue; -import dev.metaschema.core.model.constraint.IAllowedValuesConstraint; -import dev.metaschema.core.util.ObjectUtils; -import dev.metaschema.databind.model.IBoundModule; -import dev.metaschema.oscal.lib.OscalBindingContext; -import dev.metaschema.oscal.lib.model.OscalCompleteModule; -import dev.metaschema.oscal.lib.model.util.AllowedValueCollectingNodeItemVisitor.AllowedValuesRecord; -import edu.umd.cs.findbugs.annotations.NonNull; - -class AbstractNodeItemVisitorTest { - - @Test - @Disabled - void testAllowedValues() throws MetaschemaException { - IBoundModule module = OscalBindingContext.instance().registerModule(OscalCompleteModule.class); - AllowedValueCollectingNodeItemVisitor walker = new AllowedValueCollectingNodeItemVisitor(); - walker.visit(module); - - System.out.println(); - System.out.println("Allowed Values"); - System.out.println("--------------"); - Map, - List> allowedValuesByTarget - = ObjectUtils.notNull(walker.getAllowedValueLocations().stream() - .flatMap(location -> location.getAllowedValues().stream()) - .collect(Collectors.groupingBy(AllowedValuesRecord::getTarget, - LinkedHashMap::new, - Collectors.mapping(Function.identity(), Collectors.toUnmodifiableList())))); - sortMap(allowedValuesByTarget, ObjectUtils.notNull(Comparator.comparing(IDefinitionNodeItem::getMetapath))) - .entrySet().stream() - .forEachOrdered(entry -> { - IDefinitionNodeItem target = ObjectUtils.requireNonNull(entry.getKey()); - List allowedValuesRecords = entry.getValue(); - - System.out.println("node: " + metapath(target)); - allowedValuesRecords.forEach(record -> { - assert target.equals(record.getTarget()); - - IAllowedValuesConstraint constraint = record.getAllowedValues(); - System.out.println("- allowed-values:"); - System.out.println(" location: " + metapath(record.getLocation())); - System.out.println(" target: " + constraint.getTarget()); - System.out.println(" values: " + values(constraint)); - System.out.println(" allow-other: " + constraint.isAllowedOther()); - // System.out.println(" extensible: " + constraint.getExtensible()); - // System.out.println(" source: " + constraint.getSource()); - }); - }); - } - - private static String metapath(@NonNull IDefinitionNodeItem item) { - return metapath(item.getMetapath()); - } - - private static String metapath(@NonNull String path) { - return path.replace("[1]", ""); - } - - private static String values(@NonNull IAllowedValuesConstraint constraint) { - return constraint.getAllowedValues().values().stream() - .map(IAllowedValue::getValue) - .collect(Collectors.joining(", ")); - } - - @NonNull - private static NavigableMap sortMap(@NonNull Map map, @NonNull Comparator comparator) { - TreeMap retval = new TreeMap<>(comparator); - retval.putAll(map); - return retval; - } - -} diff --git a/src/test/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitorTest.java b/src/test/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitorTest.java deleted file mode 100644 index 62a17c9e..00000000 --- a/src/test/java/dev/metaschema/oscal/lib/model/util/AllowedValueCollectingNodeItemVisitorTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SPDX-FileCopyrightText: none - * SPDX-License-Identifier: CC0-1.0 - */ - -package dev.metaschema.oscal.lib.model.util; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; -import java.util.List; - -import dev.metaschema.core.model.MetaschemaException; -import dev.metaschema.core.model.constraint.IConstraintSet; -import dev.metaschema.core.util.ObjectUtils; -import dev.metaschema.databind.IBindingContext; -import dev.metaschema.databind.model.metaschema.BindingConstraintLoader; -import dev.metaschema.databind.model.metaschema.IBindingMetaschemaModule; -import dev.metaschema.databind.model.metaschema.IBindingModuleLoader; -import dev.metaschema.oscal.lib.model.util.AllowedValueCollectingNodeItemVisitor.NodeItemRecord; - -class AllowedValueCollectingNodeItemVisitorTest { - - @Test - void testAllowedValuesMissingVariableBindings() throws MetaschemaException, IOException { - IBindingContext bindingContext = IBindingContext.builder().build(); - - List constraintSet = new BindingConstraintLoader(bindingContext).load(ObjectUtils.requireNonNull( - Paths.get("src/test/resources/content/issue-112/computer-metaschema-meta-constraints.xml").toUri())); - - Path genDir = Paths.get("target/dynamic-bindings/allowed-values-1"); - Files.createDirectories(genDir); - - IBindingContext bindingContextWithConstraints = IBindingContext.builder() - .constraintSet(constraintSet) - .compilePath(genDir) - .build(); - - IBindingModuleLoader loader = bindingContextWithConstraints.newModuleLoader(); - IBindingMetaschemaModule module = loader.load(ObjectUtils.requireNonNull( - Paths.get("src/test/resources/content/issue-112/computer-example.xml").toUri())); - AllowedValueCollectingNodeItemVisitor walker = new AllowedValueCollectingNodeItemVisitor(); - walker.visit(module); - Collection allowedValuesByTarget = ObjectUtils.notNull(walker.getAllowedValueLocations()); - assertEquals(1, allowedValuesByTarget.size()); - } - - @Test - void testAllowedValuesMissingVariableBindings2() throws MetaschemaException, IOException { - IBindingContext initialBindingContext = IBindingContext.builder().build(); - - List constraintSet = new BindingConstraintLoader(initialBindingContext).load(ObjectUtils - .requireNonNull(Paths.get("src/test/resources/content/issue-112/computer-metaschema-meta-constraints.xml") - .toUri())); - - Path genDir = Paths.get("target/dynamic-bindings/allowed-values-2"); - Files.createDirectories(genDir); - - IBindingContext bindingContext = IBindingContext.builder() - .constraintSet(constraintSet) - .compilePath(genDir) - .build(); - - IBindingModuleLoader loader = bindingContext.newModuleLoader(); - IBindingMetaschemaModule module = loader.load(ObjectUtils.requireNonNull( - Paths.get("src/test/resources/content/issue-112/computer-example.xml").toUri())); - AllowedValueCollectingNodeItemVisitor walker = new AllowedValueCollectingNodeItemVisitor(); - walker.visit(module); - Collection allowedValuesByTarget = ObjectUtils.notNull(walker.getAllowedValueLocations()); - assertEquals(1, allowedValuesByTarget.size()); - } -} diff --git a/src/test/resources/content/issue-112/computer-example.xml b/src/test/resources/content/issue-112/computer-example.xml deleted file mode 100644 index 1264e892..00000000 --- a/src/test/resources/content/issue-112/computer-example.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - Minimak Computer Model - 0.0.5 - computer - http://example.com/ns/computer - http://example.com/ns/computer - - Computer Assembly - A minimal computer model to test let var usage with external constraints. - computer - - - diff --git a/src/test/resources/content/issue-112/computer-metaschema-meta-constraints.xml b/src/test/resources/content/issue-112/computer-metaschema-meta-constraints.xml deleted file mode 100644 index 2fbeaaa5..00000000 --- a/src/test/resources/content/issue-112/computer-metaschema-meta-constraints.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - -