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}