Mercurial > dive4elements > river
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 :