19 package org.sleuthkit.autopsy.coreutils;
 
   22 import java.io.FileInputStream;
 
   23 import java.io.FileNotFoundException;
 
   24 import java.io.FileOutputStream;
 
   25 import java.io.IOException;
 
   26 import java.io.OutputStreamWriter;
 
   27 import java.io.UnsupportedEncodingException;
 
   28 import java.nio.file.Paths;
 
   29 import java.util.logging.Level;
 
   30 import javax.xml.XMLConstants;
 
   31 import javax.xml.parsers.DocumentBuilder;
 
   32 import javax.xml.parsers.DocumentBuilderFactory;
 
   33 import javax.xml.parsers.ParserConfigurationException;
 
   34 import javax.xml.transform.OutputKeys;
 
   35 import javax.xml.transform.Result;
 
   36 import javax.xml.transform.Transformer;
 
   37 import javax.xml.transform.TransformerConfigurationException;
 
   38 import javax.xml.transform.TransformerException;
 
   39 import javax.xml.transform.TransformerFactory;
 
   40 import javax.xml.transform.dom.DOMResult;
 
   41 import javax.xml.transform.dom.DOMSource;
 
   42 import javax.xml.transform.stream.StreamResult;
 
   43 import javax.xml.validation.Schema;
 
   44 import javax.xml.validation.SchemaFactory;
 
   45 import javax.xml.validation.Validator;
 
   46 import org.w3c.dom.Document;
 
   47 import org.xml.sax.SAXException;
 
   60         System.setProperty(
"javax.xml.transform.TransformerFactory",
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
 
   65         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
   67             Thread.currentThread().setContextClassLoader(
XMLUtil.class.getClassLoader());
 
   68             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
 
   69             return builderFactory.newDocumentBuilder();
 
   71             Thread.currentThread().setContextClassLoader(original);
 
   76         return SchemaFactory.newInstance(schemaLanguage);
 
   81         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
   83             Thread.currentThread().setContextClassLoader(
XMLUtil.class.getClassLoader());
 
   84             return TransformerFactory.newInstance();
 
   86             Thread.currentThread().setContextClassLoader(original);
 
   97     public static Document 
createDocument() throws ParserConfigurationException {
 
  115     public static <T> Document 
loadDocument(String docPath, Class<T> clazz, String schemaResourceName) 
throws IOException, ParserConfigurationException, SAXException {
 
  132     public static Document 
loadDocument(String docPath) 
throws ParserConfigurationException, SAXException, IOException {
 
  134         Document doc = builder.parse(
new FileInputStream(docPath));
 
  148     public static <T> 
void validateDocument(
final Document doc, Class<T> clazz, String schemaResourceName) 
throws SAXException, IOException {
 
  151         SchemaFactory schemaFactory = 
getSchemaFactory(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 
  152         Schema schema = schemaFactory.newSchema(schemaFile);
 
  153         Validator validator = schema.newValidator();
 
  154         validator.validate(
new DOMSource(doc), 
new DOMResult());
 
  171     public static void saveDocument(
final Document doc, String encoding, String docPath) 
throws TransformerConfigurationException, FileNotFoundException, UnsupportedEncodingException, TransformerException, IOException {
 
  173         xf.setAttribute(
"indent-number", 1); 
 
  174         Transformer xformer = xf.newTransformer();
 
  175         xformer.setOutputProperty(OutputKeys.METHOD, 
"xml"); 
 
  176         xformer.setOutputProperty(OutputKeys.INDENT, 
"yes"); 
 
  177         xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
 
  178         xformer.setOutputProperty(OutputKeys.STANDALONE, 
"yes"); 
 
  179         xformer.setOutputProperty(OutputKeys.VERSION, 
"1.0");
 
  180         File file = 
new File(docPath);
 
  181         try (FileOutputStream stream = 
new FileOutputStream(file)) {
 
  182             Result out = 
new StreamResult(
new OutputStreamWriter(stream, encoding));
 
  183             xformer.transform(
new DOMSource(doc), out);
 
  206     public static <T> 
boolean xmlIsValid(DOMSource xmlfile, Class<T> clazz, String schemaFile) {
 
  212                 Schema schema = schm.newSchema(schemaLoc);
 
  213                 Validator validator = schema.newValidator();
 
  214                 DOMResult result = 
new DOMResult();
 
  215                 validator.validate(xmlfile, result);
 
  217             } 
catch (SAXException e) {
 
  218                 Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Unable to validate XML file.", e); 
 
  221         } 
catch (IOException e) {
 
  222             Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Unable to load XML file [" + xmlfile.toString() + 
"] of type [" + schemaFile + 
"]", e); 
 
  245     public static <T> 
boolean xmlIsValid(Document doc, Class<T> clazz, String type) {
 
  246         DOMSource dms = 
new DOMSource(doc);
 
  257     public static <T> Document 
loadDoc(Class<T> clazz, String xmlPath) {
 
  261             ret = builder.parse(
new FileInputStream(xmlPath));
 
  262         } 
catch (ParserConfigurationException e) {
 
  263             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't initialize parser.", e); 
 
  264         } 
catch (SAXException e) {
 
  265             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't parse XML.", e); 
 
  266         } 
catch (IOException e) {
 
  268             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't read file.", e); 
 
  281     public static <T> Document 
loadDoc(Class<T> clazz, String xmlPath, String xsdPath) {
 
  282         Document ret = 
loadDoc(clazz, xmlPath);
 
  284             Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath); 
 
  298     public static <T> 
boolean saveDoc(Class<T> clazz, String xmlPath, String encoding, 
final Document doc) {
 
  300         xf.setAttribute(
"indent-number", 1); 
 
  301         boolean success = 
false;
 
  303             Transformer xformer = xf.newTransformer();
 
  304             xformer.setOutputProperty(OutputKeys.METHOD, 
"xml"); 
 
  305             xformer.setOutputProperty(OutputKeys.INDENT, 
"yes"); 
 
  306             xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
 
  307             xformer.setOutputProperty(OutputKeys.STANDALONE, 
"yes"); 
 
  308             xformer.setOutputProperty(OutputKeys.VERSION, 
"1.0");
 
  309             File file = 
new File(xmlPath);
 
  310             try (FileOutputStream stream = 
new FileOutputStream(file)) {
 
  311                 Result out = 
new StreamResult(
new OutputStreamWriter(stream, encoding));
 
  312                 xformer.transform(
new DOMSource(doc), out);
 
  317         } 
catch (UnsupportedEncodingException e) {
 
  318             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Should not happen", e); 
 
  319         } 
catch (TransformerConfigurationException e) {
 
  320             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file", e); 
 
  321         } 
catch (TransformerException e) {
 
  322             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file", e); 
 
  323         } 
catch (FileNotFoundException e) {
 
  324             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file: cannot write to file: " + xmlPath, e); 
 
  325         } 
catch (IOException e) {
 
  326             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file: cannot write to file: " + xmlPath, e); 
 
static< T > Document loadDoc(Class< T > clazz, String xmlPath)
static Document createDocument()
static TransformerFactory getTransformerFactory()
static< T > Document loadDoc(Class< T > clazz, String xmlPath, String xsdPath)
static SchemaFactory getSchemaFactory(String schemaLanguage)
static< T > boolean xmlIsValid(Document doc, Class< T > clazz, String type)
static< T > void validateDocument(final Document doc, Class< T > clazz, String schemaResourceName)
static< T > Document loadDocument(String docPath, Class< T > clazz, String schemaResourceName)
static< T > boolean xmlIsValid(DOMSource xmlfile, Class< T > clazz, String schemaFile)
static Document loadDocument(String docPath)
static void saveDocument(final Document doc, String encoding, String docPath)
synchronized static Logger getLogger(String name)
static DocumentBuilder getDocumentBuilder()
static< T > boolean saveDoc(Class< T > clazz, String xmlPath, String encoding, final Document doc)