/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.configuration.editors.xml;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
/**
* @author Dart
*
*/
public class XMLUtils {
public static DocumentBuilder getDOMBuilder() throws ParserConfigurationException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
return builder;
}
public static Transformer getTransformer() throws TransformerConfigurationException {
TransformerFactory tf = TransformerFactory.newInstance();
return tf.newTransformer();
}
public static Document createDocument() throws ParserConfigurationException {
return XMLUtils.getDOMBuilder().newDocument();
}
public static Element firstChildElement(Node node) {
for (Node tempNode = node.getFirstChild(); tempNode != null; tempNode = tempNode.getNextSibling()) {
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) tempNode;
}
}
return null;
}
public static Element nextSiblingElement(Node node) {
for (Node tempNode = node.getNextSibling(); tempNode != null; tempNode = tempNode.getNextSibling()) {
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) tempNode;
}
}
return null;
}
public static Element lastChildElement(Node node) {
for (Node tempNode = node.getLastChild(); tempNode != null; tempNode = tempNode.getPreviousSibling()) {
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) tempNode;
}
}
return null;
}
public static Element previousSiblingElement(Node node) {
for (Node tempNode = node.getPreviousSibling(); tempNode != null; tempNode = tempNode.getPreviousSibling()) {
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) tempNode;
}
}
return null;
}
public static List<Element> getAllChildElements(Node node) {
List<Element> v = new ArrayList<Element>();
Node child = XMLUtils.firstChildElement(node);
while (child != null) {
v.add((Element) child);
child = XMLUtils.nextSiblingElement(child);
}
return v;
}
public static List<Element> getChildElementsByNS(Node node, String uri, String localName) {
List<Element> childElements = XMLUtils.getAllChildElements(node);
List<Element> v = new ArrayList<Element>();
for (int i = 0; i < childElements.size(); i++) {
Element child = (Element) childElements.get(i);
String ln = child.getLocalName();
String u = child.getNamespaceURI();
if (uri == null) {
if (ln.equals(localName)) {
v.add(child);
}
} else {
if (ln.equals(localName) && u.equals(uri)) {
v.add(child);
}
}
}
return v;
}
public static String getLocalName(String nodeName) {
int index = nodeName.lastIndexOf(58);
if (index == -1) {
return nodeName;
} else {
return nodeName.substring(index + 1, nodeName.length());
}
}
public static String getPrefix(String nodeName) {
int index = nodeName.lastIndexOf(58);
if (index == -1) {
return null;
} else {
return nodeName.substring(0, index);
}
}
public static void outDOMNode(Node node, Writer writer) throws TransformerConfigurationException,
TransformerException {
Transformer transformer = XMLUtils.getTransformer();
Source source = new DOMSource(node);
Result result = new StreamResult(writer);
transformer.transform(source, result);
}
public static void outDOMNode(Node node, OutputStream os) throws TransformerConfigurationException,
TransformerException {
Document document = null;
if (node instanceof Document) {
document = (Document) node;
} else {
document = node.getOwnerDocument();
}
Object ls = null;
if (document != null) {
ls = document.getImplementation().getFeature("LS", "3.0"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (ls != null && ls instanceof DOMImplementationLS) {
LSSerializer lss = ((DOMImplementationLS) ls).createLSSerializer();
DOMConfiguration domConfiguration = lss.getDomConfig();
if (domConfiguration.canSetParameter("format-pretty-print", Boolean.TRUE)) { //$NON-NLS-1$
lss.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); //$NON-NLS-1$
}
LSOutput lsoutput = ((DOMImplementationLS) ls).createLSOutput();
lsoutput.setByteStream(os);
lss.write(node, lsoutput);
} else {
Transformer transformer = XMLUtils.getTransformer();
Source source = new DOMSource(node);
Result result = new StreamResult(os);
transformer.transform(source, result);
}
}
}