001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.oscal.tools.cli.core.operations;
007
008import gov.nist.secauto.metaschema.core.model.util.XmlUtil;
009import gov.nist.secauto.metaschema.core.util.ObjectUtils;
010
011import net.sf.saxon.jaxp.SaxonTransformerFactory;
012
013import org.apache.logging.log4j.LogManager;
014import org.apache.logging.log4j.Logger;
015
016import java.io.File;
017import java.io.IOException;
018
019import javax.xml.transform.Source;
020import javax.xml.transform.Transformer;
021import javax.xml.transform.TransformerException;
022import javax.xml.transform.TransformerFactory;
023import javax.xml.transform.stream.StreamResult;
024import javax.xml.transform.stream.StreamSource;
025
026public final class XMLOperations {
027  private static final Logger LOGGER = LogManager.getLogger(XMLOperations.class);
028
029  private XMLOperations() {
030    // disable construction
031  }
032
033  public static void renderCatalogHTML(File input, File result) throws IOException, TransformerException {
034    render(input, result,
035        XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
036            XMLOperations.class.getResource("/xsl/oscal-for-bootstrap-html.xsl"))));
037  }
038
039  public static void renderProfileHTML(File input, File result) throws IOException, TransformerException {
040    SaxonTransformerFactory transfomerFactory = (SaxonTransformerFactory) TransformerFactory.newInstance();
041    // Templates resolver = transfomerFactory.newTemplates();
042    // Templates renderer = transfomerFactory.newTemplates();
043
044    File temp = File.createTempFile("resolved-profile", ".xml");
045
046    try {
047      Transformer transformer = transfomerFactory.newTransformer(
048          XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
049              XMLOperations.class.getResource("/xsl/profile-resolver.xsl"))));
050      transformer.transform(new StreamSource(input), new StreamResult(temp));
051
052      transformer = transfomerFactory.newTransformer(
053          XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
054              XMLOperations.class.getResource("/xsl/oscal-for-bootstrap-html.xsl"))));
055      transformer.transform(new StreamSource(temp), new StreamResult(result));
056    } finally {
057      if (!temp.delete()) {
058        LOGGER.atError().log("failed to delete file: {}", temp);
059      }
060    }
061
062    // TransformerHandler resolverHandler =
063    // transfomerFactory.newTransformerHandler(resolver);
064    // TransformerHandler rendererHandler =
065    // transfomerFactory.newTransformerHandler(renderer);
066    //
067    // resolverHandler.setResult(new SAXResult(rendererHandler));
068    // rendererHandler.setResult(new StreamResult(result));
069    //
070    // Transformer t = transfomerFactory.newTransformer();
071    // File sourceFile = input.getAbsoluteFile();
072    // StreamSource source = new StreamSource();
073    // String sourceSystemId = sourceFile.toURI().toASCIIString();
074    // log.info("Source: "+sourceSystemId);
075    // source.setSystemId(sourceSystemId);
076    // t.setURIResolver(new LoggingURIResolver(t.getURIResolver()));
077    // resolver.setParameter("document-uri", sourceSystemId);
078    // t.transform(source, new SAXResult(resolverHandler));
079  }
080
081  public static void render(File input, File result, Source transform) throws TransformerException {
082    TransformerFactory transfomerFactory = TransformerFactory.newInstance();
083    assert transfomerFactory instanceof SaxonTransformerFactory;
084    Transformer transformer = transfomerFactory.newTransformer(transform);
085    transformer.transform(new StreamSource(input), new StreamResult(result));
086  }
087
088  // private static class LoggingURIResolver implements URIResolver {
089  // private final URIResolver delegate;
090  //
091  //
092  // public LoggingURIResolver(URIResolver delegate) {
093  // super();
094  // this.delegate = delegate;
095  // }
096  //
097  //
098  // @Override
099  // 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}