teichmann@5835: package org.dive4elements.river.client.server.meta; sascha@286: sascha@286: import org.w3c.dom.Document; sascha@286: import org.w3c.dom.Element; sascha@286: import org.w3c.dom.Node; sascha@286: import org.w3c.dom.NodeList; sascha@813: import org.w3c.dom.Attr; sascha@813: import org.w3c.dom.NamedNodeMap; sascha@813: ingo@1367: import org.apache.log4j.Logger; sascha@286: teichmann@5835: import org.dive4elements.river.client.shared.model.DataCageTree; teichmann@5835: import org.dive4elements.river.client.shared.model.DataCageNode; teichmann@5835: import org.dive4elements.river.client.shared.model.AttrList; sascha@286: sascha@286: import java.util.ArrayList; sascha@286: import java.util.Map; sascha@286: import java.util.HashMap; sascha@286: teichmann@5835: import org.dive4elements.artifacts.common.utils.XMLUtils; sascha@812: felix@3474: /** felix@3474: * Converts document parts (meta-data xml) to datacagenodes/trees, felix@3474: * which are shown in datacage widgets. felix@3474: */ sascha@286: public class Converter sascha@286: { ingo@1367: private static final Logger logger = Logger.getLogger(Converter.class); ingo@1367: ingo@1367: sascha@286: public interface NodeConverter sascha@286: { sascha@286: DataCageNode convert(Element node, Converter converter); sascha@286: sascha@286: } // interface NodeConverter sascha@286: sascha@286: public static class NameConverter implements NodeConverter { sascha@286: public DataCageNode convert(Element node, Converter converter) { sascha@822: //System.err.println("NameConverter called"); sascha@813: DataCageNode out = new DataCageNode( sascha@813: node.getAttribute("name"), sascha@813: toAttrList(node.getAttributes())); sascha@286: converter.convertChildren(out, node); sascha@286: return out; sascha@286: } sascha@286: } // class NameConverter sascha@286: sascha@286: public static class I18NConverter implements NodeConverter { sascha@286: public DataCageNode convert(Element node, Converter converter) { sascha@822: //System.err.println("I18NConverter called"); ingo@892: ingo@892: String name = node.getLocalName(); ingo@892: String desc = node.hasAttribute("description") sascha@822: ? node.getAttribute("description") ingo@892: : "${" + name + "}"; ingo@892: sascha@286: DataCageNode out = ingo@892: new DataCageNode(name, desc, toAttrList(node.getAttributes())); ingo@892: sascha@286: converter.convertChildren(out, node); sascha@286: return out; sascha@286: } sascha@286: } // I18NConverter sascha@286: felix@3475: private static Map converters = new HashMap(); sascha@286: sascha@2905: public static final NodeConverter NAME_CONVERTER = new NameConverter(); sascha@2905: public static final NodeConverter I18N_CONVERTER = new I18NConverter(); sascha@812: felix@3474: static { sascha@812: converters.put("river", NAME_CONVERTER); sascha@812: converters.put("gauge", NAME_CONVERTER); sascha@812: converters.put("historical", NAME_CONVERTER); sascha@812: converters.put("column", NAME_CONVERTER); sascha@286: } sascha@286: felix@3475: felix@3475: /** Trivial constructor. */ felix@3474: public Converter() { felix@3474: } felix@3474: felix@3475: sascha@286: public DataCageTree convert(Document document) { ingo@1367: logger.debug("convert called"); bjoern@4352: bjoern@4352: if (logger.isDebugEnabled()) { bjoern@4352: logger.debug(XMLUtils.toString(document)); bjoern@4352: } sascha@286: sascha@286: ArrayList roots = new ArrayList(); sascha@286: NodeList nodes = document.getChildNodes(); sascha@286: for (int i = 0, N = nodes.getLength(); i < N; ++i) { sascha@286: Node node = nodes.item(i); sascha@286: if (node.getNodeType() == Node.ELEMENT_NODE) { bjoern@4352: Element ele = (Element)node; bjoern@4352: roots.add(convertElement(ele)); sascha@286: } sascha@286: } sascha@286: return roots.isEmpty() sascha@286: ? new DataCageTree() sascha@286: : new DataCageTree(roots.get(0)); sascha@286: } sascha@813: felix@3475: protected void convertChildren(DataCageNode parent, Element sub) { felix@3475: //System.err.println("convertChildren called"); felix@3475: NodeList children = sub.getChildNodes(); felix@3475: for (int i = 0, N = children.getLength(); i < N; ++i) { felix@3475: Node child = children.item(i); felix@3475: if (child.getNodeType() == Node.ELEMENT_NODE) { bjoern@4352: Element childele = (Element)child; bjoern@4352: parent.addChild(convertElement(childele)); felix@3475: bjoern@4352: if (childele.hasAttribute("description")) bjoern@4352: logger.debug("nwd: " + childele.getAttribute("description")); felix@3475: } felix@3475: } // for all children felix@3475: } felix@3475: bjoern@4352: private DataCageNode convertElement(Element element) { bjoern@4352: String name = element.getLocalName(); bjoern@4352: bjoern@4352: logger.debug("search for name: " + name); bjoern@4352: bjoern@4352: NodeConverter converter = converters.get(name); bjoern@4352: if (converter == null) { bjoern@4352: converter = I18N_CONVERTER; bjoern@4352: } bjoern@4352: return converter.convert(element, this); bjoern@4352: bjoern@4352: } bjoern@4352: sascha@3483: felix@3474: /** felix@3474: * Creates key/value pairs from Nodes Attributes. felix@3474: */ sascha@813: public static AttrList toAttrList(NamedNodeMap nodeMap) { sascha@813: if (nodeMap == null) { sascha@813: return null; sascha@813: } sascha@813: int N = nodeMap.getLength(); sascha@813: sascha@813: if (N == 0) { sascha@813: return null; sascha@813: } sascha@813: sascha@813: AttrList result = new AttrList(N); sascha@813: sascha@813: for (int i = 0; i < N; ++i) { sascha@813: Node node = nodeMap.item(i); sascha@813: if (node.getNodeType() == Node.ATTRIBUTE_NODE) { sascha@822: Attr attr = (Attr)node; sascha@813: String key = attr.getName(); sascha@813: String value = attr.getValue(); sascha@813: result.add(key, value); sascha@813: } sascha@813: } sascha@813: sascha@813: return result; sascha@813: } sascha@286: } sascha@286: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :