Autopsy  3.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
XMLUtil.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2012-2014 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.coreutils;
20 
21 import java.io.File;
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;
48 
56 public class XMLUtil {
57 
64  public static Document createDocument() throws ParserConfigurationException {
65  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
66  DocumentBuilder builder = builderFactory.newDocumentBuilder();
67  return builder.newDocument();
68  }
69 
83  public static <T> Document loadDocument(String docPath, Class<T> clazz, String schemaResourceName) throws IOException, ParserConfigurationException, SAXException {
84  Document doc = loadDocument(docPath);
85  validateDocument(doc, clazz, schemaResourceName);
86  return doc;
87  }
88 
98  public static Document loadDocument(String docPath) throws ParserConfigurationException, SAXException, IOException {
99  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
100  DocumentBuilder builder = builderFactory.newDocumentBuilder();
101  Document doc = builder.parse(new FileInputStream(docPath));
102  return doc;
103  }
104 
114  public static <T> void validateDocument(final Document doc, Class<T> clazz, String schemaResourceName) throws SAXException, IOException {
115  PlatformUtil.extractResourceToUserConfigDir(clazz, schemaResourceName, false);
116  File schemaFile = new File(Paths.get(PlatformUtil.getUserConfigDirectory(), schemaResourceName).toAbsolutePath().toString());
117  SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
118  Schema schema = schemaFactory.newSchema(schemaFile);
119  Validator validator = schema.newValidator();
120  validator.validate(new DOMSource(doc), new DOMResult());
121  }
122 
136  public static void saveDocument(final Document doc, String encoding, String docPath) throws TransformerConfigurationException, FileNotFoundException, UnsupportedEncodingException, TransformerException, IOException {
137  TransformerFactory xf = TransformerFactory.newInstance();
138  xf.setAttribute("indent-number", 1); //NON-NLS
139  Transformer xformer = xf.newTransformer();
140  xformer.setOutputProperty(OutputKeys.METHOD, "xml"); //NON-NLS
141  xformer.setOutputProperty(OutputKeys.INDENT, "yes"); //NON-NLS
142  xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
143  xformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); //NON-NLS
144  xformer.setOutputProperty(OutputKeys.VERSION, "1.0");
145  File file = new File(docPath);
146  try (FileOutputStream stream = new FileOutputStream(file)) {
147  Result out = new StreamResult(new OutputStreamWriter(stream, encoding));
148  xformer.transform(new DOMSource(doc), out);
149  stream.flush();
150  }
151  }
152 
170  // TODO: Deprecate.
171  public static <T> boolean xmlIsValid(DOMSource xmlfile, Class<T> clazz, String schemaFile) {
172  try {
173  PlatformUtil.extractResourceToUserConfigDir(clazz, schemaFile, false);
174  File schemaLoc = new File(PlatformUtil.getUserConfigDirectory() + File.separator + schemaFile);
175  SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
176  try {
177  Schema schema = schm.newSchema(schemaLoc);
178  Validator validator = schema.newValidator();
179  DOMResult result = new DOMResult();
180  validator.validate(xmlfile, result);
181  return true;
182  } catch (SAXException e) {
183  Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to validate XML file.", e); //NON-NLS
184  return false;
185  }
186  } catch (IOException e) {
187  Logger.getLogger(clazz.getName()).log(Level.WARNING, "Unable to load XML file [" + xmlfile.toString() + "] of type [" + schemaFile + "]", e); //NON-NLS
188  return false;
189  }
190  }
191 
208  // TODO: Deprecate.
209  public static <T> boolean xmlIsValid(Document doc, Class<T> clazz, String type) {
210  DOMSource dms = new DOMSource(doc);
211  return xmlIsValid(dms, clazz, type);
212  }
213 
220  // TODO: Deprecate.
221  public static <T> Document loadDoc(Class<T> clazz, String xmlPath) {
222  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
223  Document ret = null;
224  try {
225  DocumentBuilder builder = builderFactory.newDocumentBuilder();
226  ret = builder.parse(new FileInputStream(xmlPath));
227  } catch (ParserConfigurationException e) {
228  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file " + xmlPath + " : can't initialize parser.", e); //NON-NLS
229  } catch (SAXException e) {
230  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file " + xmlPath + " : can't parse XML.", e); //NON-NLS
231  } catch (IOException e) {
232  //error reading file
233  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error loading XML file " + xmlPath + " : can't read file.", e); //NON-NLS
234  }
235  return ret;
236  }
237 
245  // TODO: Deprecate
246  public static <T> Document loadDoc(Class<T> clazz, String xmlPath, String xsdPath) {
247  Document ret = loadDoc(clazz, xmlPath);
248  if (!XMLUtil.xmlIsValid(ret, clazz, xsdPath)) {
249  Logger.getLogger(clazz.getName()).log(Level.WARNING, "Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath); //NON-NLS
250  }
251  return ret;
252  }
253 
262  // TODO: Deprecate.
263  public static <T> boolean saveDoc(Class<T> clazz, String xmlPath, String encoding, final Document doc) {
264  TransformerFactory xf = TransformerFactory.newInstance();
265  xf.setAttribute("indent-number", 1); //NON-NLS
266  boolean success = false;
267  try {
268  Transformer xformer = xf.newTransformer();
269  xformer.setOutputProperty(OutputKeys.METHOD, "xml"); //NON-NLS
270  xformer.setOutputProperty(OutputKeys.INDENT, "yes"); //NON-NLS
271  xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
272  xformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); //NON-NLS
273  xformer.setOutputProperty(OutputKeys.VERSION, "1.0");
274  File file = new File(xmlPath);
275  try (FileOutputStream stream = new FileOutputStream(file)) {
276  Result out = new StreamResult(new OutputStreamWriter(stream, encoding));
277  xformer.transform(new DOMSource(doc), out);
278  stream.flush();
279  }
280  success = true;
281 
282  } catch (UnsupportedEncodingException e) {
283  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Should not happen", e); //NON-NLS
284  } catch (TransformerConfigurationException e) {
285  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error writing XML file", e); //NON-NLS
286  } catch (TransformerException e) {
287  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error writing XML file", e); //NON-NLS
288  } catch (FileNotFoundException e) {
289  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error writing XML file: cannot write to file: " + xmlPath, e); //NON-NLS
290  } catch (IOException e) {
291  Logger.getLogger(clazz.getName()).log(Level.SEVERE, "Error writing XML file: cannot write to file: " + xmlPath, e); //NON-NLS
292  }
293  return success;
294  }
295 
296 }
static< T > Document loadDoc(Class< T > clazz, String xmlPath)
Definition: XMLUtil.java:221
static< T > Document loadDoc(Class< T > clazz, String xmlPath, String xsdPath)
Definition: XMLUtil.java:246
static< T > boolean xmlIsValid(Document doc, Class< T > clazz, String type)
Definition: XMLUtil.java:209
static< T > void validateDocument(final Document doc, Class< T > clazz, String schemaResourceName)
Definition: XMLUtil.java:114
static< T > boolean extractResourceToUserConfigDir(final Class< T > resourceClass, final String resourceFileName, boolean overWrite)
static< T > Document loadDocument(String docPath, Class< T > clazz, String schemaResourceName)
Definition: XMLUtil.java:83
static< T > boolean xmlIsValid(DOMSource xmlfile, Class< T > clazz, String schemaFile)
Definition: XMLUtil.java:171
static Document loadDocument(String docPath)
Definition: XMLUtil.java:98
static void saveDocument(final Document doc, String encoding, String docPath)
Definition: XMLUtil.java:136
static Logger getLogger(String name)
Definition: Logger.java:131
static< T > boolean saveDoc(Class< T > clazz, String xmlPath, String encoding, final Document doc)
Definition: XMLUtil.java:263

Copyright © 2012-2015 Basis Technology. Generated on: Mon Oct 19 2015
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.