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 :

http://dive4elements.wald.intevation.org