Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java @ 5496:23d8f2700b38
Add support for multiple floodplains and add them to the datacage accordingly
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Thu, 28 Mar 2013 12:39:14 +0100 |
parents | a06e443f159a |
children |
line wrap: on
line source
package de.intevation.flys.artifacts.services; import com.vividsolutions.jts.geom.Envelope; import de.intevation.artifactdatabase.XMLService; import de.intevation.artifacts.CallMeta; import de.intevation.artifacts.GlobalContext; import de.intevation.artifacts.common.ArtifactNamespaceContext; import de.intevation.artifacts.common.utils.Config; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; import de.intevation.flys.utils.GeometryUtils; import java.util.HashMap; import java.util.Map; import javax.xml.xpath.XPathConstants; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * This service provides information about the supported rivers by this * application. * * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class MapInfoService extends XMLService { /** XPath that points to the river.*/ public static final String XPATH_RIVER = "/mapinfo/river/text()"; public static final String XPATH_MAPTYPE = "/mapinfo/maptype/text()"; private static final String XPATH_RIVER_PROJECTION = "/artifact-database/*[local-name()=$maptype]/river[@name=$river]/srid/@value"; private static final String XPATH_RIVER_BACKGROUND = "/artifact-database/*[local-name()=$maptype]/river[@name=$river]/background-wms"; private static final String XPATH_RIVER_WMS = "/artifact-database/*[local-name()=$maptype]/river[@name=$river]/river-wms"; /** The logger used in this service.*/ private static Logger logger = Logger.getLogger(MapInfoService.class); /** * The default constructor. */ public MapInfoService() { } protected static String getStringXPath( String query, Map<String, String> variables ) { return (String)XMLUtils.xpath( Config.getConfig(), query, XPathConstants.STRING, null, variables); } protected static Node getNodeXPath( String query, Map<String, String> variables ) { return (Node)XMLUtils.xpath( Config.getConfig(), query, XPathConstants.NODE, null, variables); } @Override public Document processXML( Document data, GlobalContext globalContext, CallMeta callMeta ) { logger.debug("MapInfoService.process"); Document result = XMLUtils.newDocument(); ElementCreator cr = new ElementCreator(result, null, null); Element mapinfo = cr.create("mapinfo"); result.appendChild(mapinfo); String river = extractRiver(data); if (river == null || river.length() == 0) { logger.warn("Cannot generate information: river is empty!"); return result; } String mapType = extractMaptype(data); if (mapType == null || !(mapType.equals("floodmap") || mapType.equals("rivermap"))) { mapType = "floodmap"; } Element root = cr.create("river"); cr.addAttr(root, "name", river); mapinfo.appendChild(root); Envelope env = GeometryUtils.getRiverBoundary(river); if (env != null) { String bounds = GeometryUtils.jtsBoundsToOLBounds(env); if (logger.isDebugEnabled()) { logger.debug("River '" + river + "' bounds: " + bounds); } Element bbox = cr.create("bbox"); cr.addAttr(bbox, "value", bounds); root.appendChild(bbox); } Map<String, String> vars = new HashMap<String, String>(); vars.put("maptype", mapType); vars.put("river", river); String sridStr = getStringXPath(XPATH_RIVER_PROJECTION, vars); if (sridStr != null && sridStr.length() > 0) { Element srid = cr.create("srid"); cr.addAttr(srid, "value", sridStr); root.appendChild(srid); } if (logger.isDebugEnabled()) { logger.debug("processXML: " + XMLUtils.toString(root)); } root.appendChild( createWMSElement("background-wms", XPATH_RIVER_BACKGROUND, vars, cr)); root.appendChild( createWMSElement("river-wms", XPATH_RIVER_WMS, vars, cr)); return result; } protected Element createWMSElement( String elementName, String xpath, Map<String, String> vars, ElementCreator cr) { logger.debug("createWMSElement()"); Element el = cr.create(elementName); Element wms = (Element)getNodeXPath(xpath, vars); if (wms != null) { cr.addAttr(el, "url", wms.getAttribute("url")); cr.addAttr(el, "layers", wms.getAttribute("layers")); logger.debug("createWMSElement: " + XMLUtils.toString(el)); } else { logger.debug("createWMSElement: wms == null"); } return el; } private static String extractRiver(Document data) { return XMLUtils.xpathString( data, XPATH_RIVER, ArtifactNamespaceContext.INSTANCE); } private static String extractMaptype(Document data) { return XMLUtils.xpathString( data, XPATH_MAPTYPE, ArtifactNamespaceContext.INSTANCE); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :