1 /*
2 * SPDX-FileCopyrightText: none
3 * SPDX-License-Identifier: CC0-1.0
4 */
5
6 package gov.nist.secauto.oscal.java;
7
8 import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
9 import gov.nist.secauto.metaschema.core.metapath.IMetapathExpression;
10 import gov.nist.secauto.metaschema.core.model.constraint.ConstraintValidationException;
11 import gov.nist.secauto.metaschema.core.metapath.StaticContext;
12 import gov.nist.secauto.metaschema.core.metapath.item.IItem;
13 import gov.nist.secauto.metaschema.core.metapath.item.ISequence;
14 import gov.nist.secauto.metaschema.core.metapath.item.node.IDocumentNodeItem;
15 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
16 import gov.nist.secauto.metaschema.databind.io.IBoundLoader;
17 import gov.nist.secauto.oscal.lib.OscalBindingContext;
18 import gov.nist.secauto.oscal.lib.metapath.function.library.ResolveProfile;
19
20 import org.junit.jupiter.api.Disabled;
21 import org.junit.jupiter.api.Test;
22
23 import java.io.File;
24 import java.io.FileNotFoundException;
25 import java.io.IOException;
26 import java.net.URI;
27 import java.net.URISyntaxException;
28 import java.net.URL;
29 import java.util.concurrent.atomic.AtomicInteger;
30
31 import edu.umd.cs.findbugs.annotations.NonNull;
32
33 class MetaschemaVisitorTest {
34
35 @Disabled
36 @Test
37 void test() throws FileNotFoundException, IOException, URISyntaxException, ConstraintValidationException {
38 OscalBindingContext bindingContext = OscalBindingContext.instance();
39 IBoundLoader loader = bindingContext.newBoundLoader();
40
41 URI baseUri = ObjectUtils.notNull(new File("").getAbsoluteFile().toURI());
42 StaticContext staticContext = OscalBindingContext.OSCAL_STATIC_METAPATH_CONTEXT.buildFrom()
43 .baseUri(baseUri)
44 .build();
45 DynamicContext dynamicContext = new DynamicContext(staticContext);
46 dynamicContext.setDocumentLoader(loader);
47
48 // File file = new
49 // File("target/download/content/NIST_SP-800-53_rev5_LOW-baseline_profile.xml").getCanonicalFile();
50
51 // IDocumentNodeItem nodeItem = loader.loadAsNodeItem(file);
52 IDocumentNodeItem nodeItem = loader.loadAsNodeItem(new URL(
53 "https://raw.githubusercontent.com/usnistgov/oscal-content/master/nist.gov/SP800-53/rev5/xml/NIST_SP-800-53_rev5_HIGH-baseline_profile.xml"));
54
55 // @NonNull
56 // Profile profile = nodeItem.toBoundObject();
57
58 IDocumentNodeItem resolvedProfile = ResolveProfile.resolveProfile(nodeItem, dynamicContext);
59 OscalBindingContext.instance().validate(resolvedProfile, loader, null);
60
61 // OscalBindingContext.instance().newSerializer(Format.XML,
62 // Catalog.class).serialize(resolvedProfile.toBoundObject(), new FileWriter(new
63 // File("resolved-catalog.xml")));
64
65 // evaluatePath(IMetapathExpression.compile("resolve-profile(doc(resolve-uri(/profile/import/@href,
66 // document-uri(/profile))))/(profile, catalog)//control/@id"), nodeItem,
67 // dynamicContext);
68 evaluatePath(IMetapathExpression.compile("//control/@id"), resolvedProfile, dynamicContext);
69 // evaluatePath(IMetapathExpression.compile("doc(resolve-uri(/profile/import/@href,
70 // document-uri(/profile)))/catalog/metadata/last-modified"), nodeItem,
71 // dynamicContext);
72 // evaluatePath(
73 // IMetapathExpression.compile("doc(resolve-uri(/profile/import/@href,
74 // document-uri(/profile)))/catalog/metadata/last-modified -
75 // /catalog/metadata/last-modified"),
76 // nodeItem, dynamicContext);
77 // evaluatePath(IMetapathExpression.compile("doc(resolve-uri(/profile/import/@href,
78 // document-uri(/profile)))/catalog/metadata/last-modified + duration('PT1H')"),
79 // nodeItem,
80 // dynamicContext);
81 // evaluatePath(IMetapathExpression.compile("doc(resolve-uri(/profile/import/@href,
82 // document-uri(/profile)))/catalog/metadata/last-modified,/catalog/metadata/last-modified"),
83 // nodeItem, dynamicContext);
84 // evaluatePath(IMetapathExpression.compile("doc('target/download/content/NIST_SP-800-53_rev5_catalog.xml')"),
85 // nodeItem, dynamicContext);
86 // evaluatePath(Metapath.parseMetapathString("2 eq 1 + 1[/catalog]"),
87 // nodeContext, visitor);
88 // evaluatePath(Metapath.parseMetapathString("/catalog/back-matter/resource[rlink/@href='https://doi.org/10.6028/NIST.SP.800-53r5']"),
89 // nodeItem, dynamicContext);
90 // evaluatePath(IMetapathExpression.compile("/catalog//(@id,@uuid)"), nodeItem,
91 // dynamicContext);
92 // evaluatePath(IMetapathExpression.compile("exists(/catalog//(@id,@uuid))"),
93 // nodeItem,
94 // dynamicContext);
95 // evaluatePath(IMetapathExpression.compile("/catalog//control//prop/@name"),
96 // nodeItem,
97 // dynamicContext);
98 // evaluatePath(Metapath.parseMetapathString("(/catalog//control[@id='ac-1'])"),
99 // nodeItem,
100 // dynamicContext);
101 }
102
103 private static void evaluatePath(@NonNull IMetapathExpression path, @NonNull IItem nodeContext,
104 @NonNull DynamicContext dynamicContext) {
105 // System.out.println("Path: " + path.getPath());
106 // System.out.println("Compiled Path: " + path.toString());
107
108 ISequence<?> result = path.evaluate(nodeContext, dynamicContext);
109 // System.out.println("Result: ");
110 AtomicInteger count = new AtomicInteger();
111 result.stream().forEachOrdered(x -> {
112 count.incrementAndGet();
113 });
114 // System.out.println(String.format(" %d items", count.get()));
115 }
116 }