/*
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.xmlpers.test;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import javanet.staxutils.IndentingXMLStreamWriter;
import li.strolch.utils.exceptions.XmlException;
import li.strolch.utils.helper.XmlHelper;
import li.strolch.xmlpers.test.model.ModelBuilder;
import li.strolch.xmlpers.test.model.MyModel;
import li.strolch.xmlpers.test.model.MyParameter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
*/
@SuppressWarnings("nls")
public class XmlTestMain {
private static final Logger logger = LoggerFactory.getLogger(XmlTestMain.class);
private static MyModel res;
public static void main(String[] args) throws Exception {
res = ModelBuilder.createResource();
logger.info("Writing Res:\n" + res);
writeSax(res);
writeDom(res);
List<MyModel> resoures;
resoures = readDom();
logger.info("Parsed Resources:\n" + resoures);
resoures = readSax();
logger.info("Parsed Resources:\n" + resoures);
}
/**
* @return
*
*/
private static List<MyModel> readDom() throws Exception {
File file = new File("target/res_dom.xml");
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document document = docBuilder.parse(file);
Element rootElement = document.getDocumentElement();
List<MyModel> resources = new ArrayList<>();
NodeList resElements = rootElement.getElementsByTagName("Resource");
for (int i = 0; i < resElements.getLength(); i++) {
Element resElement = (Element) resElements.item(i);
String id = resElement.getAttribute("id");
String name = resElement.getAttribute("name");
String type = resElement.getAttribute("type");
MyModel res = new MyModel();
res.setId(id);
res.setName(name);
res.setType(type);
NodeList paramElements = resElement.getElementsByTagName("Parameter");
parseParameters(res, paramElements);
resources.add(res);
}
logger.info("DOM parsed file " + file.getAbsolutePath());
return resources;
}
private static void parseParameters(MyModel res, NodeList paramElements) {
for (int i = 0; i < paramElements.getLength(); i++) {
Element paramElement = (Element) paramElements.item(i);
String id = paramElement.getAttribute("id");
String name = paramElement.getAttribute("name");
String type = paramElement.getAttribute("type");
String value = paramElement.getAttribute("value");
MyParameter param = new MyParameter();
param.setId(id);
param.setName(name);
param.setType(type);
param.setValue(value);
res.addParameter(param);
}
}
/**
* @return
*
*/
private static List<MyModel> readSax() throws Exception {
final List<MyModel> resources = new ArrayList<>();
final MyModel[] currentRes = new MyModel[1];
DefaultHandler xmlHandler = new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
switch (qName) {
case "Resource":
MyModel res = new MyModel();
res.setId(attributes.getValue("id"));
res.setName(attributes.getValue("name"));
res.setType(attributes.getValue("type"));
currentRes[0] = res;
resources.add(res);
break;
case "Parameter":
MyParameter param = new MyParameter();
param.setId(attributes.getValue("id"));
param.setName(attributes.getValue("name"));
param.setType(attributes.getValue("type"));
param.setValue(attributes.getValue("value"));
currentRes[0].addParameter(param);
break;
case "model":
break;
default:
throw new IllegalArgumentException("The element '" + qName + "' is unhandled!");
}
}
};
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
File file = new File("target/res_sax.xml");
sp.parse(file, xmlHandler);
logger.info("SAX parsed file " + file.getAbsolutePath());
return resources;
}
private static void writeDom(MyModel res) throws Exception {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element resElement = doc.createElement("Resource");
resElement.setAttribute("id", res.getId());
resElement.setAttribute("name", res.getName());
resElement.setAttribute("type", res.getType());
for (String paramId : res.getParameterKeySet()) {
MyParameter param = res.getParameterBy(paramId);
Element paramElement = doc.createElement("Parameter");
paramElement.setAttribute("id", param.getId());
paramElement.setAttribute("name", param.getName());
paramElement.setAttribute("type", param.getType());
paramElement.setAttribute("value", param.getValue());
resElement.appendChild(paramElement);
}
Element rootElement = doc.createElement("model");
rootElement.appendChild(resElement);
doc.appendChild(rootElement);
String lineSep = System.getProperty(XmlHelper.PROP_LINE_SEPARATOR);
try {
String encoding = doc.getInputEncoding();
if (encoding == null || encoding.isEmpty()) {
logger.info("No encoding passed. Using default encoding " + XmlHelper.DEFAULT_ENCODING);
encoding = XmlHelper.DEFAULT_ENCODING;
}
if (!lineSep.equals("\n")) {
logger.info("Overriding line separator to \\n");
System.setProperty(XmlHelper.PROP_LINE_SEPARATOR, "\n");
}
// Set up a transformer
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer transformer = transfac.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
// transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator", "\t");
// Transform to file
File file = new File("target/res_dom.xml");
StreamResult result = new StreamResult(file);
Source xmlSource = new DOMSource(doc);
transformer.transform(xmlSource, result);
logger.info("Wrote DOM to " + file.getAbsolutePath());
} catch (Exception e) {
throw new XmlException("Exception while exporting to file: " + e, e);
} finally {
System.setProperty(XmlHelper.PROP_LINE_SEPARATOR, lineSep);
}
}
private static void writeSax(MyModel res) throws Exception {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
File file = new File("target/res_sax.xml");
try (FileWriter fileWriter = new FileWriter(file)) {
XMLStreamWriter writer = factory.createXMLStreamWriter(fileWriter);
writer = new IndentingXMLStreamWriter(writer);
writer.writeStartDocument("utf-8", "1.0");
writer.writeStartElement("model");
writer.writeStartElement("Resource");
writer.writeAttribute("id", res.getId());
writer.writeAttribute("name", res.getName());
writer.writeAttribute("type", res.getType());
for (String paramId : res.getParameterKeySet()) {
MyParameter param = res.getParameterBy(paramId);
writer.writeEmptyElement("Parameter");
writer.writeAttribute("id", param.getId());
writer.writeAttribute("name", param.getName());
writer.writeAttribute("type", param.getType());
writer.writeAttribute("value", param.getValue());
}
//writer.writeEmptyElement("data");
//writer.writeAttribute("name", "value");
////writer.writeEndElement();
//writer.writeEmptyElement("stuff");
//writer.writeAttribute("attr", "attrVal");
writer.writeEndElement();
writer.writeEndDocument();
writer.flush();
writer.close();
logger.info("Wrote SAX to " + file.getAbsolutePath());
//Transformer transformer = TransformerFactory.newInstance().newTransformer();
//Result outputTarget = new StaxR;
//Source xmlSource;
//transformer.transform(xmlSource, outputTarget);
}
}
}