sascha@20: package de.intevation.artifactdatabase;
sascha@20: 
sascha@20: import org.w3c.dom.Document;
sascha@20: import org.w3c.dom.Element;
sascha@20: import org.w3c.dom.Attr;
sascha@20: 
sascha@20: import javax.xml.parsers.DocumentBuilderFactory;
sascha@20: 
sascha@20: import javax.xml.parsers.ParserConfigurationException;
sascha@20: 
sascha@20: import org.apache.log4j.Logger;
sascha@20: 
sascha@23: import javax.xml.xpath.XPathFactory;
sascha@23: import javax.xml.xpath.XPath;
sascha@25: import javax.xml.xpath.XPathExpressionException;
sascha@26: import javax.xml.xpath.XPathConstants;
sascha@23: 
sascha@23: import javax.xml.namespace.NamespaceContext;
sascha@25: import javax.xml.namespace.QName;
sascha@23: 
sascha@20: /**
sascha@20:  *  @author Sascha L. Teichmann
sascha@20:  */
sascha@20: public final class XMLUtils
sascha@20: {
sascha@20:     private static Logger logger = Logger.getLogger(XMLUtils.class);
sascha@20: 
sascha@20:     private XMLUtils() {
sascha@20:     }
sascha@20: 
sascha@20:     public static class ElementCreator
sascha@20:     {
sascha@20:         protected Document document;
sascha@20:         protected String   ns;
sascha@20:         protected String   prefix;
sascha@20: 
sascha@20:         public ElementCreator(Document document, String ns, String prefix) {
sascha@20:             this.document = document;
sascha@20:             this.ns       = ns;
sascha@20:             this.prefix   = prefix;
sascha@20:         }
sascha@20: 
sascha@20:         public Element create(String name) {
sascha@20:             Element element = document.createElementNS(ns, name);
sascha@20:             element.setPrefix(prefix);
sascha@20:             return element;
sascha@20:         }
sascha@20: 
sascha@20:         public void addAttr(Element element, String name, String value) {
sascha@20:             Attr attr = document.createAttributeNS(ns, name);
sascha@20:             attr.setValue(value);
sascha@20:             attr.setPrefix(prefix);
sascha@20:             element.setAttributeNode(attr);
sascha@20:         }
sascha@20:     } // class ElementCreator
sascha@20: 
sascha@20:     public static final Document newDocument() {
sascha@20:         try {
sascha@20:             return DocumentBuilderFactory
sascha@20:                 .newInstance()
sascha@20:                 .newDocumentBuilder()
sascha@20:                 .newDocument();
sascha@20:         }
sascha@20:         catch (ParserConfigurationException pce) {
sascha@20:             logger.error(pce.getLocalizedMessage(), pce);
sascha@20:         }
sascha@20:         return null;
sascha@20:     }
sascha@23: 
sascha@23:     public static final XPath newXPath() {
sascha@23:         return newXPath(null);
sascha@23:     }
sascha@23: 
sascha@23:     public static final XPath newXPath(NamespaceContext namespaceContext) {
sascha@23:         XPathFactory factory = XPathFactory.newInstance();
sascha@23:         XPath        xpath   = factory.newXPath();
sascha@23:         if (namespaceContext != null) {
sascha@23:             xpath.setNamespaceContext(namespaceContext);
sascha@23:         }
sascha@23:         return xpath;
sascha@23:     }
sascha@25: 
sascha@25:     public static final Object xpath(Object root, String query, QName returnTyp) {
sascha@25:         return xpath(root, query, returnTyp, null);
sascha@25:     }
sascha@25: 
sascha@26:     public static final String xpathString(
sascha@26:         Object root, String query, NamespaceContext namespaceContext
sascha@26:     ) {
sascha@26:         return (String)xpath(root, query, XPathConstants.STRING, namespaceContext);
sascha@26:     }
sascha@26: 
sascha@25:     public static final Object xpath(
sascha@25:         Object           root,
sascha@25:         String           query,
sascha@25:         QName            returnType,
sascha@25:         NamespaceContext namespaceContext
sascha@25:     ) {
sascha@25:         if (root == null) {
sascha@25:             return null;
sascha@25:         }
sascha@25: 
sascha@25:         try {
sascha@25:             XPath xpath = newXPath(namespaceContext);
sascha@25:             if (xpath != null) {
sascha@25:                 return xpath.evaluate(query, root, returnType);
sascha@25:             }
sascha@25:         }
sascha@25:         catch (XPathExpressionException xpee) {
sascha@25:             logger.error(xpee.getLocalizedMessage(), xpee);
sascha@25:         }        
sascha@25: 
sascha@25:         return null;
sascha@25:     }
sascha@20: }
sascha@20: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: