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         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
   62             Thread.currentThread().setContextClassLoader(
XMLUtil.class.getClassLoader());
 
   63             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
 
   64             return builderFactory.newDocumentBuilder();
 
   66             Thread.currentThread().setContextClassLoader(original);
 
   72         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
   74             Thread.currentThread().setContextClassLoader(
XMLUtil.class.getClassLoader());
 
   75             return SchemaFactory.newInstance(schemaLanguage);
 
   77             Thread.currentThread().setContextClassLoader(original);
 
   83         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
   85             Thread.currentThread().setContextClassLoader(
XMLUtil.class.getClassLoader());
 
   86             return TransformerFactory.newInstance();
 
   88             Thread.currentThread().setContextClassLoader(original);
 
   99     public static Document 
createDocument() throws ParserConfigurationException {
 
  117     public static <T> Document 
loadDocument(String docPath, Class<T> clazz, String schemaResourceName) 
throws IOException, ParserConfigurationException, SAXException {
 
  134     public static Document 
loadDocument(String docPath) 
throws ParserConfigurationException, SAXException, IOException {
 
  136         Document doc = builder.parse(
new FileInputStream(docPath));
 
  150     public static <T> 
void validateDocument(
final Document doc, Class<T> clazz, String schemaResourceName) 
throws SAXException, IOException {
 
  153         SchemaFactory schemaFactory = 
getSchemaFactory(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 
  154         Schema schema = schemaFactory.newSchema(schemaFile);
 
  155         Validator validator = schema.newValidator();
 
  156         validator.validate(
new DOMSource(doc), 
new DOMResult());
 
  173     public static void saveDocument(
final Document doc, String encoding, String docPath) 
throws TransformerConfigurationException, FileNotFoundException, UnsupportedEncodingException, TransformerException, IOException {
 
  175         xf.setAttribute(
"indent-number", 1); 
 
  176         Transformer xformer = xf.newTransformer();
 
  177         xformer.setOutputProperty(OutputKeys.METHOD, 
"xml"); 
 
  178         xformer.setOutputProperty(OutputKeys.INDENT, 
"yes"); 
 
  179         xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
 
  180         xformer.setOutputProperty(OutputKeys.STANDALONE, 
"yes"); 
 
  181         xformer.setOutputProperty(OutputKeys.VERSION, 
"1.0");
 
  182         File file = 
new File(docPath);
 
  183         try (FileOutputStream stream = 
new FileOutputStream(file)) {
 
  184             Result out = 
new StreamResult(
new OutputStreamWriter(stream, encoding));
 
  185             xformer.transform(
new DOMSource(doc), out);
 
  208     public static <T> 
boolean xmlIsValid(DOMSource xmlfile, Class<T> clazz, String schemaFile) {
 
  214                 Schema schema = schm.newSchema(schemaLoc);
 
  215                 Validator validator = schema.newValidator();
 
  216                 DOMResult result = 
new DOMResult();
 
  217                 validator.validate(xmlfile, result);
 
  219             } 
catch (SAXException e) {
 
  220                 Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Unable to validate XML file.", e); 
 
  223         } 
catch (IOException e) {
 
  224             Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Unable to load XML file [" + xmlfile.toString() + 
"] of type [" + schemaFile + 
"]", e); 
 
  247     public static <T> 
boolean xmlIsValid(Document doc, Class<T> clazz, String type) {
 
  248         DOMSource dms = 
new DOMSource(doc);
 
  259     public static <T> Document 
loadDoc(Class<T> clazz, String xmlPath) {
 
  263             ret = builder.parse(
new FileInputStream(xmlPath));
 
  264         } 
catch (ParserConfigurationException e) {
 
  265             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't initialize parser.", e); 
 
  266         } 
catch (SAXException e) {
 
  267             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't parse XML.", e); 
 
  268         } 
catch (IOException e) {
 
  270             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error loading XML file " + xmlPath + 
" : can't read file.", e); 
 
  283     public static <T> Document 
loadDoc(Class<T> clazz, String xmlPath, String xsdPath) {
 
  284         Document ret = 
loadDoc(clazz, xmlPath);
 
  286             Logger.
getLogger(clazz.getName()).log(Level.WARNING, 
"Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath); 
 
  300     public static <T> 
boolean saveDoc(Class<T> clazz, String xmlPath, String encoding, 
final Document doc) {
 
  302         xf.setAttribute(
"indent-number", 1); 
 
  303         boolean success = 
false;
 
  305             Transformer xformer = xf.newTransformer();
 
  306             xformer.setOutputProperty(OutputKeys.METHOD, 
"xml"); 
 
  307             xformer.setOutputProperty(OutputKeys.INDENT, 
"yes"); 
 
  308             xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
 
  309             xformer.setOutputProperty(OutputKeys.STANDALONE, 
"yes"); 
 
  310             xformer.setOutputProperty(OutputKeys.VERSION, 
"1.0");
 
  311             File file = 
new File(xmlPath);
 
  312             try (FileOutputStream stream = 
new FileOutputStream(file)) {
 
  313                 Result out = 
new StreamResult(
new OutputStreamWriter(stream, encoding));
 
  314                 xformer.transform(
new DOMSource(doc), out);
 
  319         } 
catch (UnsupportedEncodingException e) {
 
  320             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Should not happen", e); 
 
  321         } 
catch (TransformerConfigurationException e) {
 
  322             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file", e); 
 
  323         } 
catch (TransformerException e) {
 
  324             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file", e); 
 
  325         } 
catch (FileNotFoundException e) {
 
  326             Logger.
getLogger(clazz.getName()).log(Level.SEVERE, 
"Error writing XML file: cannot write to file: " + xmlPath, e); 
 
  327         } 
catch (IOException e) {
 
  328             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)