blob: 0b3ee9eb2fabd0796fc698fff20fefef35778cb1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.oodt.commons.xml;
//JDK imports
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.OutputKeys;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author mattmann
* @author bfoster
* @version $Revision$
*
*
* <p>
* A Utility class containing methods to write and transform XML objects.
* </p>
*/
public class XMLUtils {
/* our log stream */
private final static Logger LOG = Logger
.getLogger(XMLUtils.class.getName());
/**
* <p>
* This method writes a DOM document to a file
* </p>.
*
* @param doc
* The DOM document to write.
* @param filename
* The filename to write the DOM document to.
*/
public static void writeXmlFile(Document doc, String filename) {
// Prepare the output file
Result result = new StreamResult(filename);
transform(doc, result);
}
public static void writeXmlToStream(Document doc, OutputStream stream) {
Result result = new StreamResult(stream);
transform(doc, result);
}
private static void transform(Document doc, Result result) {
try {
// Prepare the DOM document for writing
Source source = new DOMSource(doc);
// Write the DOM document to the file
Transformer xformer = TransformerFactory.newInstance()
.newTransformer();
xformer.setOutputProperty(OutputKeys.INDENT, "yes");
xformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List readMany(Element root, String elt) {
return readMany(root, elt, "UTF-8");
}
public static List readMany(Element root, String elt, String encoding) {
NodeList valueNodes = root.getElementsByTagName(elt);
List values = new Vector();
for (int i = 0; i < valueNodes.getLength(); i++) {
Element valElem = (Element) valueNodes.item(i);
String value = null;
try {
value = URLDecoder.decode(
DOMUtil.getSimpleElementText(valElem), encoding);
values.add(value);
} catch (Exception e) {
e.printStackTrace();
LOG.log(Level.WARNING, "Error decoding tag: [" + elt
+ "]: val: [" + DOMUtil.getSimpleElementText(valElem)
+ "] from metadata. Message: " + e.getMessage());
}
}
return values;
}
public static String read(Element root, String elt) {
return read(root, elt, "UTF-8");
}
public static String read(Element root, String elt, String encoding) {
String value = null;
try {
value = URLDecoder.decode(DOMUtil.getSimpleElementText(root, elt),
encoding);
} catch (Exception e) {
LOG.log(Level.WARNING, "Error decoding " + elt + "from metadata. "
+ "Message: " + e.getMessage());
}
return value;
}
public static Element getFirstElement(String name, Element root) {
NodeList list = root.getElementsByTagName(name);
if (list != null) {
return (Element) list.item(0);
} else
return null;
}
public static String getSimpleElementText(Element node, boolean trim) {
if (node.getChildNodes().item(0) instanceof Text) {
String elemTxt = null;
if (trim) {
elemTxt = node.getChildNodes().item(0).getNodeValue().trim();
} else {
elemTxt = node.getChildNodes().item(0).getNodeValue();
}
return elemTxt;
} else
return null;
}
public static String getSimpleElementText(Element node) {
return getSimpleElementText(node, false);
}
public static String getElementText(String elemName, Element root,
boolean trim) {
Element elem = getFirstElement(elemName, root);
if (elem != null) {
return getSimpleElementText(elem, trim);
} else
return null;
}
public static String getElementText(String elemName, Element root) {
return getElementText(elemName, root, false);
}
public static Document getDocumentRoot(InputStream is) {
// open up the XML file
DocumentBuilderFactory factory = null;
DocumentBuilder parser = null;
Document document = null;
InputSource inputSource = null;
inputSource = new InputSource(is);
try {
factory = DocumentBuilderFactory.newInstance();
parser = factory.newDocumentBuilder();
document = parser.parse(inputSource);
} catch (Exception e) {
LOG.log(Level.WARNING, "Unable to parse xml stream"
+ ": Reason is [" + e + "]");
return null;
}
return document;
}
public static Element addNode(Document doc, Node parent, String name) {
Element child = doc.createElement(name);
parent.appendChild(child);
return child;
}
public static void addNode(Document doc, Node parent, String name,
String text) {
Element child = doc.createElement(name);
child.appendChild(doc.createTextNode(text));
parent.appendChild(child);
}
public static void addNode(Document doc, Node parent, String ns,
String name, String text, Map NS_MAP) {
Element child = doc.createElementNS((String) NS_MAP.get(ns), ns + ":"
+ name);
child.appendChild(doc.createTextNode(text));
parent.appendChild(child);
}
public static void addAttribute(Document doc, Element node, String name,
String value) {
Attr attribute = doc.createAttribute(name);
attribute.setValue(value);
node.getAttributes().setNamedItem(attribute);
}
}