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;
65 public static Document
createDocument() throws ParserConfigurationException {
66 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
67 DocumentBuilder builder = builderFactory.newDocumentBuilder();
68 return builder.newDocument();
85 public static <T> Document
loadDocument(String docPath, Class<T> clazz, String schemaResourceName)
throws IOException, ParserConfigurationException, SAXException {
102 public static Document
loadDocument(String docPath)
throws ParserConfigurationException, SAXException, IOException {
103 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
104 DocumentBuilder builder = builderFactory.newDocumentBuilder();
105 Document doc = builder.parse(
new FileInputStream(docPath));
119 public static <T>
void validateDocument(
final Document doc, Class<T> clazz, String schemaResourceName)
throws SAXException, IOException {
122 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
123 Schema schema = schemaFactory.newSchema(schemaFile);
124 Validator validator = schema.newValidator();
125 validator.validate(
new DOMSource(doc),
new DOMResult());
142 public static void saveDocument(
final Document doc, String encoding, String docPath)
throws TransformerConfigurationException, FileNotFoundException, UnsupportedEncodingException, TransformerException, IOException {
143 TransformerFactory xf = TransformerFactory.newInstance();
144 xf.setAttribute(
"indent-number", 1);
145 Transformer xformer = xf.newTransformer();
146 xformer.setOutputProperty(OutputKeys.METHOD,
"xml");
147 xformer.setOutputProperty(OutputKeys.INDENT,
"yes");
148 xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
149 xformer.setOutputProperty(OutputKeys.STANDALONE,
"yes");
150 xformer.setOutputProperty(OutputKeys.VERSION,
"1.0");
151 File file =
new File(docPath);
152 try (FileOutputStream stream =
new FileOutputStream(file)) {
153 Result out =
new StreamResult(
new OutputStreamWriter(stream, encoding));
154 xformer.transform(
new DOMSource(doc), out);
177 public static <T>
boolean xmlIsValid(DOMSource xmlfile, Class<T> clazz, String schemaFile) {
181 SchemaFactory schm = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
183 Schema schema = schm.newSchema(schemaLoc);
184 Validator validator = schema.newValidator();
185 DOMResult result =
new DOMResult();
186 validator.validate(xmlfile, result);
188 }
catch (SAXException e) {
189 Logger.
getLogger(clazz.getName()).log(Level.WARNING,
"Unable to validate XML file.", e);
192 }
catch (IOException e) {
193 Logger.
getLogger(clazz.getName()).log(Level.WARNING,
"Unable to load XML file [" + xmlfile.toString() +
"] of type [" + schemaFile +
"]", e);
216 public static <T>
boolean xmlIsValid(Document doc, Class<T> clazz, String type) {
217 DOMSource dms =
new DOMSource(doc);
228 public static <T> Document
loadDoc(Class<T> clazz, String xmlPath) {
229 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
232 DocumentBuilder builder = builderFactory.newDocumentBuilder();
233 ret = builder.parse(
new FileInputStream(xmlPath));
234 }
catch (ParserConfigurationException e) {
235 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error loading XML file " + xmlPath +
" : can't initialize parser.", e);
236 }
catch (SAXException e) {
237 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error loading XML file " + xmlPath +
" : can't parse XML.", e);
238 }
catch (IOException e) {
240 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error loading XML file " + xmlPath +
" : can't read file.", e);
253 public static <T> Document
loadDoc(Class<T> clazz, String xmlPath, String xsdPath) {
254 Document ret =
loadDoc(clazz, xmlPath);
256 Logger.
getLogger(clazz.getName()).log(Level.WARNING,
"Error loading XML file: could not validate against [{0}], results may not be accurate", xsdPath);
270 public static <T>
boolean saveDoc(Class<T> clazz, String xmlPath, String encoding,
final Document doc) {
271 TransformerFactory xf = TransformerFactory.newInstance();
272 xf.setAttribute(
"indent-number", 1);
273 boolean success =
false;
275 Transformer xformer = xf.newTransformer();
276 xformer.setOutputProperty(OutputKeys.METHOD,
"xml");
277 xformer.setOutputProperty(OutputKeys.INDENT,
"yes");
278 xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
279 xformer.setOutputProperty(OutputKeys.STANDALONE,
"yes");
280 xformer.setOutputProperty(OutputKeys.VERSION,
"1.0");
281 File file =
new File(xmlPath);
282 try (FileOutputStream stream =
new FileOutputStream(file)) {
283 Result out =
new StreamResult(
new OutputStreamWriter(stream, encoding));
284 xformer.transform(
new DOMSource(doc), out);
289 }
catch (UnsupportedEncodingException e) {
290 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Should not happen", e);
291 }
catch (TransformerConfigurationException e) {
292 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error writing XML file", e);
293 }
catch (TransformerException e) {
294 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error writing XML file", e);
295 }
catch (FileNotFoundException e) {
296 Logger.
getLogger(clazz.getName()).log(Level.SEVERE,
"Error writing XML file: cannot write to file: " + xmlPath, e);
297 }
catch (IOException e) {
298 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< T > Document loadDoc(Class< T > clazz, String xmlPath, String xsdPath)
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< T > boolean saveDoc(Class< T > clazz, String xmlPath, String encoding, final Document doc)