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 }