ingo@1058: package de.intevation.flys.artifacts.services;
ingo@1058: 
ingo@1058: import org.apache.log4j.Logger;
ingo@1058: 
ingo@1058: import org.w3c.dom.Document;
ingo@1058: import org.w3c.dom.Element;
ingo@1058: 
ingo@1058: import com.vividsolutions.jts.geom.Geometry;
ingo@1058: 
ingo@1058: import de.intevation.artifacts.CallMeta;
ingo@1058: import de.intevation.artifacts.GlobalContext;
ingo@1058: 
ingo@1058: import de.intevation.artifacts.common.ArtifactNamespaceContext;
ingo@1058: import de.intevation.artifacts.common.utils.Config;
ingo@1058: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@1058: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
ingo@1058: 
ingo@1058: import de.intevation.artifactdatabase.DefaultService;
ingo@1058: 
ingo@1058: import de.intevation.flys.model.River;
ingo@1058: 
ingo@1058: import de.intevation.flys.model.RiverAxis;
ingo@1058: import de.intevation.flys.utils.GeometryUtils;
ingo@1058: 
ingo@1058: /**
ingo@1058:  * This service provides information about the supported rivers by this
ingo@1058:  * application.
ingo@1058:  *
ingo@1058:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@1058:  */
ingo@1058: public class MapInfoService extends DefaultService {
ingo@1058: 
ingo@1058:     /** XPath that points to the river.*/
ingo@1058:     public static final String XPATH_RIVER = "/mapinfo/river/text()";
ingo@1058: 
ingo@1058:     public static final String XPATH_RIVER_PROJECTION =
ingo@1058:         "/artifact-database/floodmap/river[@name='%RIVER%']/srid/@value";
ingo@1058: 
ingo@1058:     public static final String XPATH_RIVER_BACKGROUND =
ingo@1058:         "/artifact-database/floodmap/river[@name='%RIVER%']/background-wms";
ingo@1058: 
ingo@1058:     public static final String XPATH_RIVER_WMS =
ingo@1058:         "/artifact-database/floodmap/river[@name='%RIVER%']/river-wms/@url";
ingo@1058: 
ingo@1058: 
ingo@1058:     /** The logger used in this service.*/
ingo@1058:     private static Logger logger = Logger.getLogger(MapInfoService.class);
ingo@1058: 
ingo@1058: 
ingo@1058:     /**
ingo@1058:      * The default constructor.
ingo@1058:      */
ingo@1058:     public MapInfoService() {
ingo@1058:     }
ingo@1058: 
ingo@1058: 
ingo@1058:     public Document process(
ingo@1058:         Document      data,
ingo@1058:         GlobalContext globalContext,
ingo@1058:         CallMeta      callMeta
ingo@1058:     ) {
ingo@1058:         logger.debug("MapInfoService.process");
ingo@1058: 
ingo@1058:         Document result   = XMLUtils.newDocument();
ingo@1058:         ElementCreator cr = new ElementCreator(result, null, null);
ingo@1058: 
ingo@1058:         Element mapinfo = cr.create("mapinfo");
ingo@1058:         result.appendChild(mapinfo);
ingo@1058: 
ingo@1058:         String river = extractRiver(data);
ingo@1058:         if (river == null || river.length() == 0) {
ingo@1058:             logger.warn("Cannot generate information: river is empty!");
ingo@1058:             return result;
ingo@1058:         }
ingo@1058: 
ingo@1058:         Element root = cr.create("river");
ingo@1058:         cr.addAttr(root, "name", river);
ingo@1058:         mapinfo.appendChild(root);
ingo@1058: 
ingo@1058:         RiverAxis axis = RiverAxis.getRiverAxis(river);
ingo@1058:         if (axis != null) {
ingo@1058:             Geometry geom   = axis.getGeom().getBoundary();
ingo@1058:             String   bounds = GeometryUtils.jtsBoundsToOLBounds(geom);
ingo@1058: 
ingo@1058:             logger.debug("River '" + river + "' bounds: " + bounds);
ingo@1058:             Element bbox = cr.create("bbox");
ingo@1058:             cr.addAttr(bbox, "value", bounds);
ingo@1058:             root.appendChild(bbox);
ingo@1058:         }
ingo@1058: 
ingo@1058:         String xpathS  = XPATH_RIVER_PROJECTION.replace("%RIVER%", river);
ingo@1058:         String sridStr = Config.getStringXPath(xpathS);
ingo@1058:         if (sridStr != null && sridStr.length() > 0) {
ingo@1058:             Element srid = cr.create("srid");
ingo@1058:             cr.addAttr(srid, "value", sridStr);
ingo@1058:             root.appendChild(srid);
ingo@1058:         }
ingo@1058: 
ingo@1058:         String xpathB = XPATH_RIVER_BACKGROUND.replace("%RIVER%", river);
ingo@1058:         Element back  = (Element) Config.getNodeXPath(xpathB);
ingo@1058:         if (back != null) {
ingo@1058:             Element background = cr.create("background-wms");
ingo@1058:             cr.addAttr(background, "url", back.getAttribute("url"));
ingo@1058:             cr.addAttr(background, "layers", back.getAttribute("layers"));
ingo@1058:             root.appendChild(background);
ingo@1058:         }
ingo@1058: 
ingo@1058:         String xpathWMS = XPATH_RIVER_WMS.replace("%RIVER%", river);
ingo@1058:         String wmsStr   = Config.getStringXPath(xpathWMS);
ingo@1058:         if (wmsStr != null && wmsStr.length() > 0) {
ingo@1058:             Element wms = cr.create("river-wms");
ingo@1058:             cr.addAttr(wms, "url", wmsStr);
ingo@1058:             root.appendChild(wms);
ingo@1058:         }
ingo@1058: 
ingo@1058:         return result;
ingo@1058:     }
ingo@1058: 
ingo@1058: 
ingo@1058:     protected String extractRiver(Document data) {
ingo@1058:         return XMLUtils.xpathString(
ingo@1058:             data, XPATH_RIVER, ArtifactNamespaceContext.INSTANCE);
ingo@1058:     }
ingo@1058: }
ingo@1058: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :