christian@5022: package de.intevation.flys.mapserver; christian@5022: christian@5022: import com.vividsolutions.jts.geom.Envelope; christian@5379: import com.vividsolutions.jts.geom.MultiLineString; christian@5022: christian@5022: import de.intevation.flys.artifacts.model.LayerInfo; christian@5022: import de.intevation.flys.artifacts.model.RiverFactory; christian@5022: import de.intevation.flys.model.River; christian@5022: import de.intevation.flys.model.RiverAxis; christian@5022: import de.intevation.flys.utils.FLYSUtils; christian@5022: import de.intevation.flys.utils.MapUtils; christian@5022: christian@5022: import java.io.File; christian@5022: import java.io.FileNotFoundException; christian@5022: import java.util.ArrayList; christian@5022: import java.util.List; christian@5022: import java.util.regex.Pattern; christian@5022: christian@5022: import org.apache.log4j.Logger; christian@5022: import org.apache.velocity.Template; christian@5022: christian@5022: public class RiverMapfileGenerator extends MapfileGenerator { christian@5022: christian@5022: public static final String XPATH_RIVERMAP_RIVER_PROJECTION = christian@5022: "/artifact-database/rivermap/river[@name=$name]/srid/@value"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_SHAPEFILE_DIR = christian@5022: "/artifact-database/rivermap/shapefile-path/@value"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_VELOCITY_LOGFILE = christian@5022: "/artifact-database/rivermap/velocity/logfile/@path"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_MAPSERVER_URL = christian@5022: "/artifact-database/rivermap/mapserver/server/@path"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_MAPFILE_PATH = christian@5022: "/artifact-database/rivermap/mapserver/mapfile/@path"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_MAPFILE_TEMPLATE = christian@5022: "/artifact-database/rivermap/mapserver/map-template/@path"; christian@5022: christian@5022: public static final String XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH = christian@5022: "/artifact-database/rivermap/mapserver/templates/@path"; christian@5022: christian@5022: public static final Pattern DB_URL_PATTERN = christian@5022: Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z]+)"); christian@5022: christian@5022: public static final Pattern DB_PSQL_URL_PATTERN = christian@5022: Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z0-9]+)"); christian@5022: christian@5022: private static Logger logger = Logger.getLogger(RiverMapfileGenerator.class); christian@5022: christian@5022: /** christian@5022: * Generate river axis mapfile. christian@5022: */ christian@5022: @Override christian@5022: public void generate() { christian@5022: logger.debug("generate()"); christian@5022: christian@5022: List rivers = RiverFactory.getRivers(); christian@5022: List riverFiles = new ArrayList(); christian@5022: christian@5022: for (River river : rivers) { christian@5022: // We expect that every river has only one RiverAxis. christian@5022: // This is not correct but currently the case here, see christian@5022: // RiverAxis.java. christian@5022: List riverAxis = RiverAxis.getRiverAxis(river.getName()); christian@5022: if (riverAxis == null) { christian@5022: logger.warn("River " + river.getName() + " has no river axis!"); christian@5022: continue; christian@5022: } christian@5379: MultiLineString geom = riverAxis.get(0).getGeom(); christian@5022: Envelope extent = geom.getEnvelopeInternal(); christian@5022: christian@5022: createRiverAxisLayer( christian@5022: river.getName(), christian@5022: river.getId(), christian@5022: Integer.toString(geom.getSRID()), christian@5022: extent.getMinX() + " " + christian@5022: extent.getMinY() + " " + christian@5022: extent.getMaxX() + " " + christian@5022: extent.getMaxY()); christian@5022: christian@5022: riverFiles.add("river-" + river.getName() + ".map"); christian@5022: } christian@5022: writeMapfile(riverFiles); christian@5022: } christian@5022: christian@5022: protected void createRiverAxisLayer(String riverName, int riverID, String srid, String extend) { christian@5022: LayerInfo layerInfo = new LayerInfo(); christian@5022: layerInfo.setName(riverName); christian@5022: layerInfo.setConnection(MapUtils.getConnection()); christian@5022: layerInfo.setConnectionType(MapUtils.getConnectionType()); christian@5022: layerInfo.setSrid(srid); christian@5022: layerInfo.setExtent(extend); christian@5022: layerInfo.setType("line"); christian@5022: layerInfo.setData("geom FROM river_axes"); // FIXME: Use templates for that christian@5022: layerInfo.setFilter("river_id = " + riverID); christian@5022: layerInfo.setTitle(riverName + " RiverAxis"); christian@5022: christian@5022: File layerFile = new File("river-" + riverName + ".map"); christian@5022: Template template = getTemplateByName("riveraxis-layer.vm"); christian@5022: if (template == null) { christian@5022: logger.warn("Template riveraxis-layer.vm not found."); christian@5022: return; christian@5022: } christian@5022: christian@5022: try { christian@5022: writeLayer(layerInfo, layerFile, template); christian@5022: } christian@5022: catch (FileNotFoundException e) { christian@5022: logger.warn(e.getLocalizedMessage(), e); christian@5022: } christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getVelocityLogfile() { christian@5022: return FLYSUtils.getXPathString(XPATH_RIVERMAP_VELOCITY_LOGFILE); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapserverTemplatePath() { christian@5022: return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapserverUrl() { christian@5022: return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPSERVER_URL); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapfilePath() { christian@5022: return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPFILE_PATH); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapfileTemplate() { christian@5022: return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPFILE_TEMPLATE); christian@5022: } christian@5022: }