diff gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java @ 9074:766890addcb2

state To client communication;
author gernotbelger
date Fri, 18 May 2018 17:26:26 +0200
parents 5e38e2924c07
children
line wrap: on
line diff
--- a/gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java	Thu May 17 13:06:12 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java	Fri May 18 17:26:26 2018 +0200
@@ -14,11 +14,6 @@
 
 import javax.xml.xpath.XPathConstants;
 
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 import org.apache.log4j.Logger;
 import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
 import org.dive4elements.artifacts.common.utils.XMLUtils;
@@ -27,16 +22,21 @@
 import org.dive4elements.river.client.shared.model.DefaultData;
 import org.dive4elements.river.client.shared.model.DefaultDataItem;
 import org.dive4elements.river.client.shared.model.DoubleArrayData;
+import org.dive4elements.river.client.shared.model.IntDataItem;
 import org.dive4elements.river.client.shared.model.IntegerArrayData;
 import org.dive4elements.river.client.shared.model.IntegerData;
 import org.dive4elements.river.client.shared.model.IntegerOptionsData;
 import org.dive4elements.river.client.shared.model.IntegerRangeData;
+import org.dive4elements.river.client.shared.model.LongRangeData;
 import org.dive4elements.river.client.shared.model.MultiAttributeData;
 import org.dive4elements.river.client.shared.model.MultiDataItem;
 import org.dive4elements.river.client.shared.model.StringData;
 import org.dive4elements.river.client.shared.model.StringOptionsData;
-import org.dive4elements.river.client.shared.model.LongRangeData;
-import org.dive4elements.river.client.shared.model.IntDataItem;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
@@ -47,18 +47,18 @@
 
     public static final String NS_URI = ArtifactNamespaceContext.NAMESPACE_URI;
 
-
     /**
      * Creates a new Data instance based on the <i>art:type</i> attribute of
      * <i>element</i>.
      *
-     * @param element The Data element.
+     * @param element
+     *            The Data element.
      *
      * @return a Data instance.
      */
-    public static Data createDataFromElement(Element element) {
-        String name  = element.getAttributeNS(NS_URI, "name");
-        String type  = element.getAttributeNS(NS_URI, "type");
+    public static Data createDataFromElement(final Element element) {
+        final String name = element.getAttributeNS(NS_URI, "name");
+        String type = element.getAttributeNS(NS_URI, "type");
         String label = element.getAttributeNS(NS_URI, "label");
 
         label = label != null && label.length() > 0 ? label : name;
@@ -74,279 +74,233 @@
 
             if (type.equals(StringData.TYPE)) {
                 return createStringData(element, name, label);
-            }
-            else if (type.equals(IntegerData.TYPE)) {
+            } else if (type.equals(IntegerData.TYPE)) {
                 return createIntegerData(element, name, label);
-            }
-            else if (type.equals(StringOptionsData.TYPE)) {
+            } else if (type.equals(StringOptionsData.TYPE)) {
                 return createStringOptionsData(element, name, label);
-            }
-            else if (type.equals(IntegerOptionsData.TYPE)) {
+            } else if (type.equals(IntegerOptionsData.TYPE)) {
                 return createIntegerOptionsData(element, name, label);
-            }
-            else if (type.equals(IntegerRangeData.TYPE)) {
+            } else if (type.equals(IntegerRangeData.TYPE)) {
                 return createIntegerRangeData(element, name, label);
-            }
-            else if (type.equals(IntegerArrayData.TYPE)) {
+            } else if (type.equals(IntegerArrayData.TYPE)) {
                 return createIntegerArrayData(element, name, label);
-            }
-            else if (type.equals(DoubleArrayData.TYPE)) {
+            } else if (type.equals(DoubleArrayData.TYPE)) {
                 return createDoubleArrayData(element, name, label);
-            }
-            else if (type.equals(LongRangeData.TYPE)) {
+            } else if (type.equals(LongRangeData.TYPE)) {
                 return createLongRangeData(element, name, label);
-            }
-            else if (type.equals(MultiAttributeData.TYPE)) {
+            } else if (type.equals(MultiAttributeData.TYPE)) {
                 return createMultiAttributeData(element, name, label);
-            }
-            else {
+            } else {
                 return createDefaultData(element, name, label);
             }
         }
-        catch (Exception e) {
+        catch (final Exception e) {
             log.error("Error while data creation for: " + name);
         }
 
         return null;
     }
 
-
-    public static Data createMultiAttributeData(
-        Element element,
-        String name,
-        String label) {
-        return new MultiAttributeData(
-            name,
-            label,
-            extractMultiDataItems(element),
-            extractMeta(element));
+    public static Data createMultiAttributeData(final Element element, final String name, final String label) {
+        return new MultiAttributeData(name, label, extractMultiDataItems(element), extractMeta(element));
     }
 
-
-    private static Map<String, Map<String, String>> extractMeta(
-        Element element
-    ) {
-        NodeList nl = element.getElementsByTagName("meta");
-        int N = nl.getLength();
-        if (N < 1) {
-            log.debug("No meta data found for multi attribute data");
+    private static Map<String, Map<String, String>> extractMeta(final Element element) {
+        final NodeList nl = element.getElementsByTagName("art:meta");
+        final int N = nl.getLength();
+        if (N != 1) {
+            log.debug("No or too much meta data found for multi attribute data");
             return Collections.<String, Map<String, String>>emptyMap();
         }
-        Map<String, Map<String, String>> map =
-            new HashMap<String, Map<String, String>>();
+        final Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
 
-        for (int i = 0; i < N; ++i) {
-            Element e = (Element)nl.item(i);
-            NamedNodeMap attrs = e.getAttributes();
-            Map<String, String> kvs = new HashMap<String, String>();
-            for (int j = 0, A = attrs.getLength(); j < A; ++j) {
-                Attr attr = (Attr)attrs.item(j);
-                kvs.put(attr.getName(), attr.getValue());
+        final Element metaElement = (Element) nl.item(0);
+        final NodeList metaChildren = metaElement.getChildNodes();
+
+        for (int i = 0; i < metaChildren.getLength(); ++i) {
+
+            final Node childNode = metaChildren.item(i);
+            if (childNode instanceof Element) {
+
+                final Element e = (Element) childNode;
+                final NamedNodeMap attrs = e.getAttributes();
+                final Map<String, String> kvs = new HashMap<String, String>();
+                for (int j = 0, A = attrs.getLength(); j < A; ++j) {
+                    final Attr attr = (Attr) attrs.item(j);
+                    kvs.put(attr.getName(), attr.getValue());
+                }
+                map.put(e.getLocalName(), kvs);
             }
-            map.put(e.getTagName(), kvs);
         }
 
         return map;
     }
 
-
-    protected static DataItem[] extractMultiDataItems(Element element) {
-        NodeList itemList = (NodeList) XMLUtils.xpath(
-            element,
-            "art:item",
-            XPathConstants.NODESET,
-            ArtifactNamespaceContext.INSTANCE);
+    protected static DataItem[] extractMultiDataItems(final Element element) {
+        final NodeList itemList = (NodeList) XMLUtils.xpath(element, "art:item", XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE);
 
         if (itemList == null || itemList.getLength() == 0) {
             log.debug("No old data items found.");
             return null;
         }
 
-        int count = itemList.getLength();
-
-        MultiDataItem[] items = new MultiDataItem[count];
-
-         for (int i = 0; i < count; i++) {
-             Element tmp = (Element) itemList.item(i);
+        final int count = itemList.getLength();
 
-             HashMap<String, String> data = new HashMap<String, String>();
-             String label = tmp.getAttributeNS(NS_URI, "label");
-             NamedNodeMap attributes = tmp.getAttributes();
-             for (int j = 0, L = attributes.getLength(); j < L; j++) {
-                 Node n = attributes.item(j);
-                 if (n.getNodeName().equals("label")) {
-                     continue;
-                 }
-                 data.put(n.getNodeName(), n.getNodeValue());
-             }
-             items[i] = new MultiDataItem(label, label, data);
-         }
-         return items;
+        final MultiDataItem[] items = new MultiDataItem[count];
+
+        for (int i = 0; i < count; i++) {
+            final Element tmp = (Element) itemList.item(i);
+
+            final HashMap<String, String> data = new HashMap<String, String>();
+            final String label = tmp.getAttributeNS(NS_URI, "label");
+            final NamedNodeMap attributes = tmp.getAttributes();
+            for (int j = 0, L = attributes.getLength(); j < L; j++) {
+                final Node n = attributes.item(j);
+                if (n.getNodeName().equals("label")) {
+                    continue;
+                }
+                data.put(n.getNodeName(), n.getNodeValue());
+            }
+            items[i] = new MultiDataItem(label, label, data);
+        }
+        return items;
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has no real type
      * set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of DefaultData.
      */
-    protected static Data createDefaultData(
-        Element ele,
-        String name,
-        String label
-    ) {
+    protected static Data createDefaultData(final Element ele, final String name, final String label) {
         log.debug("Create new DefaultData");
         return new DefaultData(name, label, "default", extractDataItems(ele));
     }
 
-
     /**
      * This method creates a new instance of StringData which has a type
      * "string" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of StringData.
      */
-    protected static Data createStringData(
-        Element ele,
-        String name,
-        String label
-    ) {
+    protected static Data createStringData(final Element ele, final String name, final String label) {
         return new StringData(name, label, extractDataItems(ele));
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has a type
      * "integer" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of IntegerData.
      */
-    protected static Data createIntegerData(
-        Element ele,
-        String name,
-        String label
-    ) {
+    protected static Data createIntegerData(final Element ele, final String name, final String label) {
         return new IntegerData(name, label, extractDataItems(ele));
     }
 
-
     /**
      * This method creates a new instance of StringOptionsData which has a type
      * "options" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of StringOptionsData.
      */
-    protected static Data createStringOptionsData(
-        Element ele,
-        String name,
-        String label
-    ) {
+    protected static Data createStringOptionsData(final Element ele, final String name, final String label) {
         return new StringOptionsData(name, label, extractDataItems(ele));
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has a type
      * "intoptions" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of IntegerOptionsData.
      */
-    protected static Data createIntegerOptionsData(
-        Element ele,
-        String name,
-        String label
-    ) {
+    protected static Data createIntegerOptionsData(final Element ele, final String name, final String label) {
         return new IntegerOptionsData(name, label, extractDataItems(ele));
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has a type
      * "intrange" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of IntegerRangeData.
      */
-    protected static Data createIntegerRangeData(
-        Element ele,
-        String name,
-        String label
-    ) {
-        DataItem[] items    = extractDataItems(ele);
-        String     rawValue = items[0].getStringValue();
+    protected static Data createIntegerRangeData(final Element ele, final String name, final String label) {
+        final DataItem[] items = extractDataItems(ele);
+        final String rawValue = items[0].getStringValue();
 
-        String[] minmax = rawValue.split(";");
+        final String[] minmax = rawValue.split(";");
 
-        return new IntegerRangeData(
-            name,
-            label,
-            Integer.valueOf(minmax[0]),
-            Integer.valueOf(minmax[1]));
+        return new IntegerRangeData(name, label, Integer.valueOf(minmax[0]), Integer.valueOf(minmax[1]));
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has a type
      * "integerarray" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of IntegerArrayData.
      */
-    protected static Data createIntegerArrayData(
-        Element ele,
-        String name,
-        String label
-    ) {
-        IntDataItem[] items    = extractIntDataItems(ele);
+    protected static Data createIntegerArrayData(final Element ele, final String name, final String label) {
+        final IntDataItem[] items = extractIntDataItems(ele);
         return new IntegerArrayData(name, label, items);
     }
 
-
     /**
      * This method creates a new instance of DefaultData which has a type
      * "doublearray" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of DoubleArrayData.
      */
-    protected static Data createDoubleArrayData(
-        Element ele,
-        String name,
-        String label
-    ) {
-        DataItem[] items    = extractDataItems(ele);
-        String     rawValue = items[0].getStringValue();
+    protected static Data createDoubleArrayData(final Element ele, final String name, final String label) {
+        final DataItem[] items = extractDataItems(ele);
+        final String rawValue = items[0].getStringValue();
 
-        String[] values  = rawValue.split(";");
-        double[] doubles = new double[values.length];
+        final String[] values = rawValue.split(";");
+        final double[] doubles = new double[values.length];
 
         for (int i = 0; i < values.length; i++) {
             try {
                 doubles[i] = Double.valueOf(values[i]);
             }
-            catch (NumberFormatException nfe) {
+            catch (final NumberFormatException nfe) {
                 log.warn("Error while parsing DoubleArrayData: " + nfe);
             }
         }
@@ -354,37 +308,33 @@
         return new DoubleArrayData(name, label, doubles);
     }
 
-
     /**
      * This method extracts the art:item elements placed under <i>elements</i>.
      *
-     * @param element A data node that contains items.
+     * @param element
+     *            A data node that contains items.
      *
      * @return a list of DataItems.
      */
-    protected static DataItem[] extractDataItems(Element element) {
-        NodeList itemList = (NodeList) XMLUtils.xpath(
-            element,
-            "art:item",
-            XPathConstants.NODESET,
-            ArtifactNamespaceContext.INSTANCE);
+    protected static DataItem[] extractDataItems(final Element element) {
+        final NodeList itemList = (NodeList) XMLUtils.xpath(element, "art:item", XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE);
 
         if (itemList == null || itemList.getLength() == 0) {
             log.debug("No data items found.");
             return null;
         }
 
-        int count = itemList.getLength();
+        final int count = itemList.getLength();
 
-        DataItem[] items = new DataItem[count];
+        final DataItem[] items = new DataItem[count];
 
         log.debug("There are " + count + " data items in element.");
 
         for (int i = 0; i < count; i++) {
-            Element tmp = (Element) itemList.item(i);
+            final Element tmp = (Element) itemList.item(i);
 
-            String value = tmp.getAttributeNS(NS_URI, "value");
-            String label = tmp.getAttributeNS(NS_URI, "label");
+            final String value = tmp.getAttributeNS(NS_URI, "value");
+            final String label = tmp.getAttributeNS(NS_URI, "label");
 
             log.debug("Found data item:");
             log.debug("   label: " + label);
@@ -396,71 +346,61 @@
         return items;
     }
 
-
     /**
      * This method extracts the art:item elements placed under <i>elements</i>.
      *
-     * @param element A data node that contains items.
+     * @param element
+     *            A data node that contains items.
      *
      * @return a list of DataItems.
      */
-    protected static IntDataItem[] extractIntDataItems(Element element) {
-        NodeList itemList = (NodeList) XMLUtils.xpath(
-            element,
-            "art:item",
-            XPathConstants.NODESET,
-            ArtifactNamespaceContext.INSTANCE);
+    protected static IntDataItem[] extractIntDataItems(final Element element) {
+        final NodeList itemList = (NodeList) XMLUtils.xpath(element, "art:item", XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE);
 
         if (itemList == null || itemList.getLength() == 0) {
             log.debug("No old data items found.");
             return null;
         }
 
-        int count = itemList.getLength();
-
-        IntDataItem[] items = new IntDataItem[count];
-
-         for (int i = 0; i < count; i++) {
-             Element tmp = (Element) itemList.item(i);
+        final int count = itemList.getLength();
 
-             String value = tmp.getAttributeNS(NS_URI, "value");
-             String label = tmp.getAttributeNS(NS_URI, "label");
+        final IntDataItem[] items = new IntDataItem[count];
 
-             try {
-                 int data = Integer.parseInt(value);
-                 items[i] = new IntDataItem(label, label, data);
-             }
-             catch(NumberFormatException nfe) {
-                 log.debug(nfe, nfe);
-             }
-         }
-         return items;
+        for (int i = 0; i < count; i++) {
+            final Element tmp = (Element) itemList.item(i);
+
+            final String value = tmp.getAttributeNS(NS_URI, "value");
+            final String label = tmp.getAttributeNS(NS_URI, "label");
+
+            try {
+                final int data = Integer.parseInt(value);
+                items[i] = new IntDataItem(label, label, data);
+            }
+            catch (final NumberFormatException nfe) {
+                log.debug(nfe, nfe);
+            }
+        }
+        return items;
     }
 
     /**
      * This method creates a new instance of LongRangeData which has a type
      * "longrange" set.
      *
-     * @param ele The Data element.
-     * @param name The name of the Data instance.
+     * @param ele
+     *            The Data element.
+     * @param name
+     *            The name of the Data instance.
      *
      * @return an instance of IntegerRangeData.
      */
-    protected static Data createLongRangeData(
-        Element ele,
-        String name,
-        String label
-    ) {
-        DataItem[] items    = extractDataItems(ele);
-        String     rawValue = items[0].getStringValue();
+    protected static Data createLongRangeData(final Element ele, final String name, final String label) {
+        final DataItem[] items = extractDataItems(ele);
+        final String rawValue = items[0].getStringValue();
 
-        String[] minmax = rawValue.split(";");
+        final String[] minmax = rawValue.split(";");
 
-        return new LongRangeData(
-            name,
-            label,
-            Long.valueOf(minmax[0]),
-            Long.valueOf(minmax[1]));
+        return new LongRangeData(name, label, Long.valueOf(minmax[0]), Long.valueOf(minmax[1]));
     }
 
 }

http://dive4elements.wald.intevation.org