diff gwt-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java @ 5838:5aa05a7a34b7

Rename modules to more fitting names.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 15:23:37 +0200
parents flys-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java@821a02bbfb4e
children 172338b1407f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java	Thu Apr 25 15:23:37 2013 +0200
@@ -0,0 +1,161 @@
+package org.dive4elements.river.client.server.meta;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Attr;
+import org.w3c.dom.NamedNodeMap;
+
+import org.apache.log4j.Logger;
+
+import org.dive4elements.river.client.shared.model.DataCageTree;
+import org.dive4elements.river.client.shared.model.DataCageNode;
+import org.dive4elements.river.client.shared.model.AttrList;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.dive4elements.artifacts.common.utils.XMLUtils;
+
+/**
+ * Converts document parts (meta-data xml) to datacagenodes/trees,
+ * which are shown in datacage widgets.
+ */
+public class Converter
+{
+    private static final Logger logger = Logger.getLogger(Converter.class);
+
+
+    public interface NodeConverter
+    {
+        DataCageNode convert(Element node, Converter converter);
+
+    } // interface NodeConverter
+
+    public static class NameConverter implements NodeConverter {
+        public DataCageNode convert(Element node, Converter converter) {
+            //System.err.println("NameConverter called");
+            DataCageNode out = new DataCageNode(
+                node.getAttribute("name"),
+                toAttrList(node.getAttributes()));
+            converter.convertChildren(out, node);
+            return out;
+        }
+    } // class NameConverter
+
+    public static class I18NConverter implements NodeConverter {
+        public DataCageNode convert(Element node, Converter converter) {
+            //System.err.println("I18NConverter called");
+
+            String name = node.getLocalName();
+            String desc = node.hasAttribute("description")
+                ? node.getAttribute("description")
+                : "${" + name + "}";
+
+            DataCageNode out =
+                new DataCageNode(name, desc, toAttrList(node.getAttributes()));
+
+            converter.convertChildren(out, node);
+            return out;
+        }
+    } // I18NConverter
+
+    private static Map<String, NodeConverter> converters = new HashMap<String, NodeConverter>();
+
+    public static final NodeConverter NAME_CONVERTER = new NameConverter();
+    public static final NodeConverter I18N_CONVERTER = new I18NConverter();
+
+    static {
+        converters.put("river",      NAME_CONVERTER);
+        converters.put("gauge",      NAME_CONVERTER);
+        converters.put("historical", NAME_CONVERTER);
+        converters.put("column",     NAME_CONVERTER);
+    }
+
+
+    /** Trivial constructor. */
+    public Converter() {
+    }
+
+
+    public DataCageTree convert(Document document) {
+        logger.debug("convert called");
+
+        if (logger.isDebugEnabled()) {
+            logger.debug(XMLUtils.toString(document));
+        }
+
+        ArrayList<DataCageNode> roots = new ArrayList<DataCageNode>();
+        NodeList nodes = document.getChildNodes();
+        for (int i = 0, N = nodes.getLength(); i < N; ++i) {
+            Node node = nodes.item(i);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                Element ele = (Element)node;
+                roots.add(convertElement(ele));
+            }
+        }
+        return roots.isEmpty()
+            ? new DataCageTree()
+            : new DataCageTree(roots.get(0));
+    }
+
+    protected void convertChildren(DataCageNode parent, Element sub) {
+        //System.err.println("convertChildren called");
+        NodeList children = sub.getChildNodes();
+        for (int i = 0, N = children.getLength(); i < N; ++i) {
+            Node child = children.item(i);
+            if (child.getNodeType() == Node.ELEMENT_NODE) {
+                Element childele = (Element)child;
+                parent.addChild(convertElement(childele));
+
+            if (childele.hasAttribute("description"))
+                logger.debug("nwd: " + childele.getAttribute("description"));
+            }
+        } // for all children
+    }
+
+    private DataCageNode convertElement(Element element) {
+        String name = element.getLocalName();
+
+        logger.debug("search for name: " + name);
+
+        NodeConverter converter = converters.get(name);
+        if (converter == null) {
+            converter = I18N_CONVERTER;
+        }
+        return converter.convert(element, this);
+
+    }
+
+
+    /**
+     * Creates key/value pairs from Nodes Attributes.
+     */
+    public static AttrList toAttrList(NamedNodeMap nodeMap) {
+        if (nodeMap == null) {
+            return null;
+        }
+        int N = nodeMap.getLength();
+
+        if (N == 0) {
+            return null;
+        }
+
+        AttrList result = new AttrList(N);
+
+        for (int i = 0; i < N; ++i) {
+            Node node = nodeMap.item(i);
+            if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+                Attr   attr  = (Attr)node;
+                String key   = attr.getName();
+                String value = attr.getValue();
+                result.add(key, value);
+            }
+        }
+
+        return result;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org