1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.oscal.tools.cli.core.operations;
7   
8   import gov.nist.secauto.metaschema.core.model.util.XmlUtil;
9   import gov.nist.secauto.metaschema.core.util.ObjectUtils;
10  
11  import net.sf.saxon.jaxp.SaxonTransformerFactory;
12  
13  import org.apache.logging.log4j.LogManager;
14  import org.apache.logging.log4j.Logger;
15  
16  import java.io.File;
17  import java.io.IOException;
18  
19  import javax.xml.transform.Source;
20  import javax.xml.transform.Transformer;
21  import javax.xml.transform.TransformerException;
22  import javax.xml.transform.TransformerFactory;
23  import javax.xml.transform.stream.StreamResult;
24  import javax.xml.transform.stream.StreamSource;
25  
26  public final class XMLOperations {
27    private static final Logger LOGGER = LogManager.getLogger(XMLOperations.class);
28  
29    private XMLOperations() {
30      // disable construction
31    }
32  
33    public static void renderCatalogHTML(File input, File result) throws IOException, TransformerException {
34      render(input, result,
35          XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
36              XMLOperations.class.getResource("/xsl/oscal-for-bootstrap-html.xsl"))));
37    }
38  
39    public static void renderProfileHTML(File input, File result) throws IOException, TransformerException {
40      SaxonTransformerFactory transfomerFactory = (SaxonTransformerFactory) TransformerFactory.newInstance();
41      // Templates resolver = transfomerFactory.newTemplates();
42      // Templates renderer = transfomerFactory.newTemplates();
43  
44      File temp = File.createTempFile("resolved-profile", ".xml");
45  
46      try {
47        Transformer transformer = transfomerFactory.newTransformer(
48            XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
49                XMLOperations.class.getResource("/xsl/profile-resolver.xsl"))));
50        transformer.transform(new StreamSource(input), new StreamResult(temp));
51  
52        transformer = transfomerFactory.newTransformer(
53            XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
54                XMLOperations.class.getResource("/xsl/oscal-for-bootstrap-html.xsl"))));
55        transformer.transform(new StreamSource(temp), new StreamResult(result));
56      } finally {
57        if (!temp.delete()) {
58          LOGGER.atError().log("failed to delete file: {}", temp);
59        }
60      }
61  
62      // TransformerHandler resolverHandler =
63      // transfomerFactory.newTransformerHandler(resolver);
64      // TransformerHandler rendererHandler =
65      // transfomerFactory.newTransformerHandler(renderer);
66      //
67      // resolverHandler.setResult(new SAXResult(rendererHandler));
68      // rendererHandler.setResult(new StreamResult(result));
69      //
70      // Transformer t = transfomerFactory.newTransformer();
71      // File sourceFile = input.getAbsoluteFile();
72      // StreamSource source = new StreamSource();
73      // String sourceSystemId = sourceFile.toURI().toASCIIString();
74      // log.info("Source: "+sourceSystemId);
75      // source.setSystemId(sourceSystemId);
76      // t.setURIResolver(new LoggingURIResolver(t.getURIResolver()));
77      // resolver.setParameter("document-uri", sourceSystemId);
78      // t.transform(source, new SAXResult(resolverHandler));
79    }
80  
81    public static void render(File input, File result, Source transform) throws TransformerException {
82      TransformerFactory transfomerFactory = TransformerFactory.newInstance();
83      assert transfomerFactory instanceof SaxonTransformerFactory;
84      Transformer transformer = transfomerFactory.newTransformer(transform);
85      transformer.transform(new StreamSource(input), new StreamResult(result));
86    }
87  
88    // private static class LoggingURIResolver implements URIResolver {
89    // private final URIResolver delegate;
90    //
91    //
92    // public LoggingURIResolver(URIResolver delegate) {
93    // super();
94    // this.delegate = delegate;
95    // }
96    //
97    //
98    // @Override
99    // public Source resolve(String href, String base) throws TransformerException {
100   // log.info("Resolve: base='{}', href='{}'", base, href);
101   // return delegate.resolve(href, base);
102   // }
103   //
104   // }
105 }