diff flys-client/src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java @ 1402:15ef3d3081b7

Parse GetFeatureInfo response on our own and display resulting FeatureInfo objects in the GetFeatureInfoWindow. flys-client/trunk@3287 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 18 Nov 2011 11:39:10 +0000
parents 96708d81eaf6
children 442ce7d6bc39
line wrap: on
line diff
--- a/flys-client/src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java	Thu Nov 17 16:24:09 2011 +0000
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java	Fri Nov 18 11:39:10 2011 +0000
@@ -7,15 +7,22 @@
 import java.io.StringWriter;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.ArrayList;
 import java.util.List;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
 import org.apache.log4j.Logger;
 
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
+import de.intevation.artifacts.common.utils.XMLUtils;
 
 import de.intevation.flys.client.shared.exceptions.ServerException;
 import de.intevation.flys.client.shared.model.AttributedTheme;
+import de.intevation.flys.client.shared.model.FeatureInfo;
 import de.intevation.flys.client.shared.model.Theme;
 
 import de.intevation.flys.client.client.services.GFIService;
@@ -53,7 +60,7 @@
      *
      * @return
      */
-    public String query(
+    public List<FeatureInfo> query(
         List<Theme> themes,
         String      format,
         String      bbox,
@@ -68,6 +75,7 @@
 
         String path = createGetFeautureInfoURL(
             themes, format, bbox, projection, height, width, x, y);
+
         logger.debug("URL=" + path);
 
         try {
@@ -78,7 +86,7 @@
 
             InputStream is = conn.getInputStream();
 
-            return getResponseText(is);
+            return parseResponse(is);
 
         }
         catch (IOException ioe) {
@@ -89,51 +97,6 @@
     }
 
 
-    protected String getResponseText(InputStream is)
-    throws ServerException {
-        BufferedReader reader = null;
-        StringWriter   writer = new StringWriter();
-
-        try {
-            reader = new BufferedReader(new InputStreamReader(is));
-
-            String line = null;
-
-            if (reader.ready()) {
-                while ((line = reader.readLine()) != null) {
-                    String test = line.trim();
-                    if (test.startsWith("<") && !test.startsWith("</") 
-                        && test.indexOf("_feature") > 0)
-                    {
-                        writer.append("<gml:featureMember>");
-                    }
-                    writer.append(line);
-
-                    if (test.startsWith("</") && test.indexOf("_feature") > 0) {
-                        writer.append("</gml:featureMember>");
-                    }
-                }
-            }
-        }
-        catch (IOException ioe) {
-            logger.warn(ioe, ioe);
-            throw new ServerException(ERR_PARSING_RESPONSE_FAILED);
-        }
-        finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                }
-                catch (IOException ioe) {
-                    // do nothing here
-                }
-            }
-        }
-
-        return writer.toString();
-    }
-
-
     /**
      * @param map
      * @param themes
@@ -220,5 +183,97 @@
 
         return sb.toString();
     }
+
+
+    protected List<FeatureInfo> parseResponse(InputStream is) {
+        logger.debug("GFIServiceImpl.parseResponse");
+
+        Document response = XMLUtils.parseDocument(is);
+
+        List<FeatureInfo> features = new ArrayList<FeatureInfo>();
+
+        parseFeatureInfos(response, features);
+
+        return features;
+    }
+
+
+    protected void parseFeatureInfos(Node node, List<FeatureInfo> features) {
+        logger.debug("GFIServiceImpl.parseFeatureInfos");
+
+        String name = node.getNodeName();
+
+        if (name.endsWith("_layer")) {
+            features.add(parseFeature(node));
+
+            return;
+        }
+
+        NodeList children = node.getChildNodes();
+
+        if (children != null && children.getLength() > 0) {
+            for (int i = 0, n = children.getLength(); i < n; i++) {
+                parseFeatureInfos(children.item(i), features);
+            }
+        }
+    }
+
+
+    protected FeatureInfo parseFeature(Node node) {
+        logger.debug("GFIServiceImpl.parseFeature");
+
+        String layername = node.getNodeName();
+
+        FeatureInfo f = new FeatureInfo(layername);
+
+        NodeList children = node.getChildNodes();
+        int numChildren   = children != null ? children.getLength() : 0;
+
+        logger.debug("Feature '" + layername + "' has " + numChildren + " nodes.");
+
+        for (int i = 0; i < numChildren; i++) {
+            Node  tmp       = children.item(i);
+            String nodeName = tmp.getNodeName();
+
+            logger.debug("   node name: '" + nodeName + "'");
+
+            if (nodeName.equals("gml:name")) {
+                logger.debug("NAME node has child: " + tmp.getFirstChild().getNodeValue());
+                f.setLayername(tmp.getFirstChild().getNodeValue());
+            }
+            else if (nodeName.endsWith("_feature")) {
+                parseFeatureAttributes(tmp, f);
+            }
+        }
+
+        return f;
+    }
+
+
+    protected void parseFeatureAttributes(Node node, FeatureInfo f) {
+        logger.debug("GFIServiceImpl.parseFeatureAttributes");
+
+        NodeList children = node.getChildNodes();
+        int numChildren   = children != null ? children.getLength() : 0;
+
+        logger.debug("Has " + numChildren + " attributes.");
+
+        for (int i = 0; i < numChildren; i++) {
+            Node   tmp  = children.item(i);
+            String name = tmp.getNodeName();
+
+            logger.debug("  tmp attribute name: '" + name + "'");
+
+            if (name.equals("gml:boundedBy")) {
+                // TODO
+            }
+            else {
+                Node child = tmp.getFirstChild();
+                if (child != null) {
+                    f.addAttr(name, child.getNodeValue());
+                }
+            }
+        }
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org