diff flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java @ 51:a2923d63f530

Introduced a data structure DataList to manage to list of Data objects of a single state. flys-client/trunk@1505 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 17 Mar 2011 16:44:51 +0000
parents b6b89ff1adee
children 1d0be51ab93b
line wrap: on
line diff
--- a/flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java	Thu Mar 17 11:49:03 2011 +0000
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java	Thu Mar 17 16:44:51 2011 +0000
@@ -14,11 +14,11 @@
 import de.intevation.artifacts.common.utils.XMLUtils;
 
 import de.intevation.flys.client.shared.model.ArtifactDescription;
-import de.intevation.flys.client.shared.model.Data;
 import de.intevation.flys.client.shared.model.DataItem;
+import de.intevation.flys.client.shared.model.DataList;
+import de.intevation.flys.client.shared.model.DefaultArtifactDescription;
 import de.intevation.flys.client.shared.model.DefaultData;
 import de.intevation.flys.client.shared.model.DefaultDataItem;
-import de.intevation.flys.client.shared.model.DefaultArtifactDescription;
 
 
 /**
@@ -37,6 +37,8 @@
 
     public static final String XPATH_REACHABLE_STATE = "art:state";
 
+    public static final String XPATH_STATIC_STATE_NODE = "art:state";
+
     public static final String XPATH_STATIC_DATA_NODE = "art:data";
 
     public static final String XPATH_STATIC_ITEM_NODE = "art:item";
@@ -64,8 +66,8 @@
             ArtifactNamespaceContext.INSTANCE);
         System.out.println("Current state name: " + state);
 
-        Data     currentData = extractCurrentData(dynamicNode);
-        Data[]   old         = extractOldData(staticNode);
+        DataList currentData = extractCurrentData(dynamicNode, state);
+        DataList[] old       = extractOldData(staticNode);
         String[] states      = extractReachableStates(reachable);
 
         return new DefaultArtifactDescription(old, currentData, state, states);
@@ -77,24 +79,39 @@
      * current state of the artifact.
      *
      * @param dynamicNode The dynamic node of the DESCRIBE document.
+     * @param state The name of the current state.
      *
      * @return A {@link Data} object that represents the data which might be
      * entered by the user in the current state or null, if no data might be
      * entered.
      */
-    protected static Data extractCurrentData(Node dynamicNode) {
+    protected static DataList extractCurrentData(Node dynamicNode, String state) {
         System.out.println("ArtifactDescriptionFactory - extractCurrentData()");
 
-        Node     data    = ClientProtocolUtils.getSelectNode(dynamicNode);
-        NodeList choices = ClientProtocolUtils.getItemNodes(data);
-        String   label   = ClientProtocolUtils.getLabel(data);
-        String   name    = XMLUtils.xpathString(
-            data, "@art:name", ArtifactNamespaceContext.INSTANCE);
+        NodeList data     = ClientProtocolUtils.getSelectNode(dynamicNode);
+        String uiProvider = extractUIProvider(dynamicNode);
 
-        DataItem[] dataItems = extractCurrentDataItems(choices);
-        String uiProvider    = extractUIProvider(data);
+        if (data == null || data.getLength() == 0) {
+            return null;
+        }
 
-        return new DefaultData(name, label, null, dataItems, uiProvider);
+        int dataNum   = data.getLength();
+        DataList list = new DataList(state, dataNum, uiProvider);
+
+        for (int i = 0; i < dataNum; i++) {
+            Node d = data.item(i);
+
+            NodeList choices  = ClientProtocolUtils.getItemNodes(d);
+            String   label    = ClientProtocolUtils.getLabel(d);
+            String   name     = XMLUtils.xpathString(
+                d, "@art:name", ArtifactNamespaceContext.INSTANCE);
+
+            DataItem[] dataItems = extractCurrentDataItems(choices);
+
+            list.add(new DefaultData(name, label, null, dataItems));
+        }
+
+        return list;
     }
 
 
@@ -136,37 +153,58 @@
      *
      * @param staticNode The static ui node of the DESCRIBE.
      *
-     * @return the Data objects.
+     * @return the DataList objects.
      */
-    protected static Data[] extractOldData(Node staticNode) {
+    protected static DataList[] extractOldData(Node staticNode) {
         System.out.println("ArtifactDescriptionFactory - extractOldData()");
 
-        NodeList dataNodes = (NodeList) XMLUtils.xpath(
+        NodeList stateNodes = (NodeList) XMLUtils.xpath(
             staticNode,
-            XPATH_STATIC_DATA_NODE,
+            XPATH_STATIC_STATE_NODE,
             XPathConstants.NODESET,
             ArtifactNamespaceContext.INSTANCE);
 
-        if (dataNodes == null || dataNodes.getLength() == 0) {
+        if (stateNodes == null || stateNodes.getLength() == 0) {
             System.out.println("No old items found.");
             return null;
         }
 
-        int count = dataNodes.getLength();
-
-        Data[] data = new Data[count];
+        int count       = stateNodes.getLength();
+        DataList[] data = new DataList[count];
 
         for (int i = 0; i < count; i++) {
-            Node tmp = dataNodes.item(i);
+            Node tmp = stateNodes.item(i);
 
             String name = XMLUtils.xpathString(
                 tmp, "@art:name", ArtifactNamespaceContext.INSTANCE);
-            String type = XMLUtils.xpathString(
-                tmp, "@art:type", ArtifactNamespaceContext.INSTANCE);
 
-            DataItem[] items = extractOldDataItems(tmp);
+            NodeList dataNodes = (NodeList) XMLUtils.xpath(
+                tmp,
+                XPATH_STATIC_DATA_NODE,
+                XPathConstants.NODESET,
+                ArtifactNamespaceContext.INSTANCE);
 
-            data[i] = new DefaultData(name, name, type, items, null);
+            if (dataNodes == null || dataNodes.getLength() == 0) {
+                continue;
+            }
+
+            int size      = dataNodes.getLength();
+            DataList list = new DataList(name, size);
+
+            for (int j = 0; j < size; j++) {
+                Node dataNode = dataNodes.item(j);
+
+                String dName = XMLUtils.xpathString(
+                    dataNode, "@art:name", ArtifactNamespaceContext.INSTANCE);
+                String dType = XMLUtils.xpathString(
+                    dataNode, "@art:type", ArtifactNamespaceContext.INSTANCE);
+
+                DataItem[] items = extractOldDataItems(dataNode);
+
+                list.add(new DefaultData(dName, dName, dType, items));
+
+                data[i] = list;
+            }
         }
 
         return data;
@@ -218,9 +256,9 @@
      *
      * @return the UIProvider that is specified in the data node.
      */
-    protected static String extractUIProvider(Node data) {
+    protected static String extractUIProvider(Node ui) {
         return (String) XMLUtils.xpath(
-            data,
+            ui,
             XPATH_UIPROVIDER,
             XPathConstants.STRING,
             ArtifactNamespaceContext.INSTANCE);

http://dive4elements.wald.intevation.org