changeset 4656:442fbb290fa8

Introduce river mapfile generation (WARNING: Changes in config xml files required!). On startup the RiverMapfileGeneratorStarter is called by the server app. The starter invokes a call to RiverMapfileGenerator.generate() which reads all available rivers from the database and generates layers for each river (in theory...uncompleted) in a river.map file. The old MapfileGenerator which generates layers that have artifact dependencies is now in ArtifactMapfileGenerator.
author Christian Lins <christian.lins@intevation.de>
date Tue, 11 Dec 2012 15:24:24 +0100
parents cd44d28d0fbc
children 65eadfe33466
files flys-artifacts/doc/conf/conf.xml flys-artifacts/doc/conf/floodmap.xml flys-artifacts/doc/conf/rivermap.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/map/RiverMapfileGeneratorStarter.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java flys-artifacts/src/main/java/de/intevation/flys/utils/ArtefactMapfileGenerator.java flys-artifacts/src/main/java/de/intevation/flys/utils/FLYSUtils.java flys-artifacts/src/main/java/de/intevation/flys/utils/MapfileGenerator.java flys-artifacts/src/main/java/de/intevation/flys/utils/Pair.java flys-artifacts/src/main/java/de/intevation/flys/utils/RiverMapfileGenerator.java
diffstat 14 files changed, 216 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/doc/conf/conf.xml	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/doc/conf/conf.xml	Tue Dec 11 15:24:24 2012 +0100
@@ -6,6 +6,7 @@
     <!ENTITY seddb-db    SYSTEM "seddb-db.xml">
     <!ENTITY rest-server SYSTEM "rest-server.xml">
     <!ENTITY floodmap    SYSTEM "floodmap.xml">
+    <!ENTITY rivermap	 SYSTEM "rivermap.xml">
 ]>
 <artifact-database>
     <export-secret>YOUR_SECRET</export-secret>
@@ -224,7 +225,7 @@
     <lifetime-listeners>
         <listener>de.intevation.flys.artifacts.datacage.Datacage</listener>
         <listener>de.intevation.flys.wsplgen.SchedulerSetup</listener>
-        <listener>de.intevation.flys.map.RiverMapGeneratorStarter</listener>
+        <listener>de.intevation.flys.artifacts.map.RiverMapfileGeneratorStarter</listener>
     </lifetime-listeners>
 
     <backend-listeners>
@@ -371,6 +372,7 @@
     </metadata>
 
     &floodmap;
+    &rivermap;
 
     &rest-server;
 
--- a/flys-artifacts/doc/conf/floodmap.xml	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/doc/conf/floodmap.xml	Tue Dec 11 15:24:24 2012 +0100
@@ -9,7 +9,7 @@
     </mapserver>
 
     <velocity>
-        <logfile path="${artifacts.config.dir}/../velocity_log.log"/>
+        <logfile path="${artifacts.config.dir}/../velocity.log"/>
     </velocity>
 
     <river name="Saar">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/doc/conf/rivermap.xml	Tue Dec 11 15:24:24 2012 +0100
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--// configuration fragment for static river WMS //-->
+<rivermap>
+    <mapserver>
+        <server path="http://flys-devel.intevation.de/cgi-bin/"/>
+        <mapfile path="${artifacts.config.dir}/../rivers.map"/>
+        <templates path="${artifacts.config.dir}/mapserver/"/>
+        <map-template path="mapfile.vm"/>
+    </mapserver>
+
+    <velocity>
+        <logfile path="${artifacts.config.dir}/../rivermap_velocity.log"/>
+    </velocity>
+</rivermap>
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Tue Dec 11 15:24:24 2012 +0100
@@ -344,7 +344,7 @@
         public void endOfLife(Artifact owner, Object context) {
             logger.info("Destroy WMSDBState: " + getID());
 
-            String p = FLYSUtils.getXPathString(FLYSUtils.XPATH_SHAPEFILE_DIR);
+            String p = FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
             File dir = new File(p, owner.identifier());
 
             if (dir != null && dir.exists()) {
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java	Tue Dec 11 15:24:24 2012 +0100
@@ -1,5 +1,22 @@
 package de.intevation.flys.artifacts.context;
 
+import de.intevation.artifactdatabase.state.State;
+import de.intevation.artifactdatabase.state.StateEngine;
+import de.intevation.artifactdatabase.transition.Transition;
+import de.intevation.artifactdatabase.transition.TransitionEngine;
+import de.intevation.artifacts.ArtifactContextFactory;
+import de.intevation.artifacts.GlobalContext;
+import de.intevation.artifacts.common.utils.Config;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.flys.artifacts.model.Module;
+import de.intevation.flys.artifacts.model.ZoomScale;
+import de.intevation.flys.artifacts.states.StateFactory;
+import de.intevation.flys.artifacts.transitions.TransitionFactory;
+import de.intevation.flys.themes.Theme;
+import de.intevation.flys.themes.ThemeFactory;
+import de.intevation.flys.themes.ThemeGroup;
+import de.intevation.flys.themes.ThemeMapping;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -9,32 +26,11 @@
 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;
 import org.w3c.dom.NodeList;
 
-import de.intevation.artifacts.ArtifactContextFactory;
-import de.intevation.artifacts.GlobalContext;
-
-import de.intevation.artifacts.common.utils.XMLUtils;
-import de.intevation.artifacts.common.utils.Config;
-
-import de.intevation.artifactdatabase.state.State;
-import de.intevation.artifactdatabase.state.StateEngine;
-import de.intevation.artifactdatabase.transition.Transition;
-import de.intevation.artifactdatabase.transition.TransitionEngine;
-
-import de.intevation.flys.artifacts.model.Module;
-import de.intevation.flys.artifacts.model.ZoomScale;
-import de.intevation.flys.artifacts.states.StateFactory;
-import de.intevation.flys.artifacts.transitions.TransitionFactory;
-import de.intevation.flys.themes.Theme;
-import de.intevation.flys.themes.ThemeGroup;
-import de.intevation.flys.themes.ThemeFactory;
-import de.intevation.flys.themes.ThemeMapping;
-
 
 /**
  * The ArtifactContextFactory is used to initialize basic components and put
@@ -94,6 +90,7 @@
      * @param config The artifact server configuration.
      * @return a FLYSArtifactContext.
      */
+    @Override
     public GlobalContext createArtifactContext(Document config) {
         FLYSContext context = new FLYSContext(config);
 
@@ -102,7 +99,7 @@
         configureOutGenerators(config, context);
         configureThemes(config, context);
         configureThemesMappings(config, context);
-        configureRiverWMS(config, context);
+        configureFloodmapWMS(config, context);
         configureModules(config, context);
         configureZoomScales(config, context);
 
@@ -110,7 +107,7 @@
     }
 
 
-    private void configureZoomScales(Document config, FLYSContext context) {
+    protected void configureZoomScales(Document config, FLYSContext context) {
         NodeList list = (NodeList)XMLUtils.xpath(
             config,
             XPATH_ZOOM_SCALES,
@@ -278,7 +275,7 @@
      * @param context the FLYSContext.
      */
     protected void configureOutGenerators(Document config, FLYSContext context){
-        Map<String, Class> generators = new HashMap<String, Class>();
+        Map<String, Class<?>> generators = new HashMap<String, Class<?>>();
 
         NodeList outGenerators = (NodeList) XMLUtils.xpath(
             config,
@@ -451,7 +448,13 @@
     }
 
 
-    protected void configureRiverWMS(Document cfg, FLYSContext context) {
+    /**
+     * Reads configured floodmap river WMSs from floodmap.xml and
+     * loads them into the given FLYSContext.
+     * @param cfg
+     * @param context
+     */
+    protected void configureFloodmapWMS(Document cfg, FLYSContext context) {
         Map<String, String> riverWMS = new HashMap<String, String>();
 
         NodeList rivers = (NodeList) XMLUtils.xpath(
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/map/RiverMapfileGeneratorStarter.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/map/RiverMapfileGeneratorStarter.java	Tue Dec 11 15:24:24 2012 +0100
@@ -10,6 +10,7 @@
 /**
  * LifetimeListener that creates a Mapfile containing river axis layers.
  * The listener is called when the server has completed its startup.
+ *
  * @author <a href="mailto:christian.lins@intevation.de">Christian Lins</a>
  */
 public class RiverMapfileGeneratorStarter implements LifetimeListener {
@@ -18,15 +19,18 @@
 
     @Override
     public void setup(Document document) {
-
+        // Nothing to setup here
     }
 
+    /**
+     * Calls RiverMapfileGenerator.generate().
+     */
     @Override
     public void systemUp(GlobalContext globalContext) {
         logger.debug("systemUp()");
 
         RiverMapfileGenerator fmfg = new RiverMapfileGenerator();
-
+        fmfg.generate();
     }
 
     @Override
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java	Tue Dec 11 15:24:24 2012 +0100
@@ -1,26 +1,22 @@
 package de.intevation.flys.artifacts.services;
 
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.GlobalContext;
+import de.intevation.artifacts.common.ArtifactNamespaceContext;
+import de.intevation.artifacts.common.utils.FileTools;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
+import de.intevation.flys.utils.FLYSUtils;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
+import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
-
-import org.apache.commons.codec.binary.Base64;
-
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import de.intevation.artifacts.common.ArtifactNamespaceContext;
-import de.intevation.artifacts.common.utils.XMLUtils;
-import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.artifacts.CallMeta;
-import de.intevation.artifacts.GlobalContext;
-
-import de.intevation.flys.utils.FLYSUtils;
-
 /**
  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
  */
@@ -54,7 +50,7 @@
         if (fileData != null) {
             try {
                 String shapePath = FLYSUtils.getXPathString(
-                    FLYSUtils.XPATH_SHAPEFILE_DIR);
+                    FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
 
                 File artifactDir = FileTools.getDirectory(shapePath, uuid);
                 FileOutputStream fos =
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Tue Dec 11 15:24:24 2012 +0100
@@ -227,7 +227,7 @@
      */
     protected File getDirectory(FLYSArtifact artifact) {
         String shapePath = FLYSUtils.getXPathString(
-            FLYSUtils.XPATH_SHAPEFILE_DIR);
+            FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
 
         File artifactDir = FileTools.getDirectory(
             shapePath, artifact.identifier());
@@ -242,13 +242,16 @@
      */
     protected void removeDirectory(FLYSArtifact artifact) {
         String shapePath = FLYSUtils.getXPathString(
-            FLYSUtils.XPATH_SHAPEFILE_DIR);
+            FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
 
         File artifactDir = new File(shapePath, artifact.identifier());
 
         if (artifactDir.exists()) {
             logger.info("Delete directory: " + artifactDir.getAbsolutePath());
-            boolean success = FileTools.deleteRecursive(artifactDir);
+            if (!FileTools.deleteRecursive(artifactDir)) {
+                logger.warn("Could not delete directory: "
+                        + artifactDir.getAbsolutePath());
+            }
         }
         else {
             logger.debug("There is no directory to remove.");
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java	Tue Dec 11 15:24:24 2012 +0100
@@ -1,25 +1,21 @@
 package de.intevation.flys.artifacts.states;
 
+import de.intevation.artifactdatabase.ProtocolUtils;
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.common.utils.FileTools;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
+import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.resources.Resources;
+import de.intevation.flys.utils.FLYSUtils;
+
 import java.io.File;
 
 import org.apache.log4j.Logger;
-
 import org.w3c.dom.Element;
 
-import de.intevation.artifacts.Artifact;
-import de.intevation.artifacts.CallContext;
-import de.intevation.artifacts.CallMeta;
-
-import de.intevation.artifacts.common.utils.XMLUtils;
-import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
-import de.intevation.artifacts.common.utils.FileTools;
-
-import de.intevation.artifactdatabase.ProtocolUtils;
-
-import de.intevation.flys.artifacts.FLYSArtifact;
-import de.intevation.flys.artifacts.resources.Resources;
-import de.intevation.flys.utils.FLYSUtils;
-
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
@@ -105,6 +101,7 @@
     }
 
 
+    @Override
     protected Element createItem(XMLUtils.ElementCreator cr, Object obj) {
         Element item  = ProtocolUtils.createArtNode(cr, "item", null, null);
         Element label = ProtocolUtils.createArtNode(cr, "label", null, null);
@@ -137,9 +134,10 @@
      * Removes the directory and all its content where the required data and the
      * results of WSPLGEN are stored. Should be called in endOfLife().
      */
+    // FIXME: I've seen this code somewhere else...
     protected void removeDirectory(FLYSArtifact artifact) {
         String shapePath = FLYSUtils.getXPathString(
-            FLYSUtils.XPATH_SHAPEFILE_DIR);
+            FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
 
         File artifactDir = new File(shapePath, artifact.identifier());
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/ArtefactMapfileGenerator.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/ArtefactMapfileGenerator.java	Tue Dec 11 15:24:24 2012 +0100
@@ -23,6 +23,21 @@
 
     private static Logger logger = Logger.getLogger(ArtefactMapfileGenerator.class);
 
+    @Override
+    protected String getVelocityLogfile() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_VELOCITY_LOGFILE);
+    }
+
+    @Override
+    protected String getMapserverTemplatePath() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_TEMPLATE_PATH);
+    }
+
+    @Override
+    protected String getMapserverUrl() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_URL);
+    }
+
     /**
      * Method which starts searching for meta information file and mapfile
      * generation.
@@ -74,7 +89,7 @@
 
         try {
             File dir = new File(getShapefileBaseDir(), flys.identifier());
-            writeLayer(layerinfo, dir, name, template);
+            writeLayer(layerinfo, new File(dir, name), template);
         }
         catch (FileNotFoundException fnfe) {
             logger.error(fnfe, fnfe);
@@ -140,7 +155,7 @@
         }
 
         try {
-            writeLayer(lineInfo, dir, nameLines, tpl);
+            writeLayer(lineInfo, new File(dir, nameLines), tpl);
         }
         catch (FileNotFoundException fnfe) {
             logger.error(fnfe, fnfe);
@@ -185,7 +200,7 @@
             }
 
             try {
-                writeLayer(polygonInfo, dir, namePolygons, tpl);
+                writeLayer(polygonInfo, new File(dir, namePolygons), tpl);
             }
             catch (FileNotFoundException fnfe) {
                 logger.error(fnfe, fnfe);
@@ -250,7 +265,7 @@
             }
 
             try {
-                writeLayer(info, dir, nameUser, tpl);
+                writeLayer(info, new File(dir, nameUser), tpl);
             }
             catch (FileNotFoundException fnfe) {
                 logger.error(fnfe, fnfe);
@@ -301,7 +316,7 @@
 
             try {
                 File dir = new File(getShapefileBaseDir(), flys.identifier());
-                writeLayer(layerinfo, dir, name, template);
+                writeLayer(layerinfo, new File(dir, name), template);
             }
             catch (FileNotFoundException fnfe) {
                 logger.error(fnfe, fnfe);
@@ -309,4 +324,14 @@
             }
         }
 
+        @Override
+        protected String getMapfilePath() {
+            return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_PATH);
+        }
+
+        @Override
+        protected String getMapfileTemplate() {
+            return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_TEMPLATE);
+        }
+
 }
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/FLYSUtils.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/FLYSUtils.java	Tue Dec 11 15:24:24 2012 +0100
@@ -70,27 +70,48 @@
     public static final Pattern NUMBERS_PATTERN =
         Pattern.compile("\\D*(\\d++.\\d*)\\D*");
 
-    public static final String XPATH_RIVER_PROJECTION =
+    public static final String XPATH_FLOODMAP_RIVER_PROJECTION =
         "/artifact-database/floodmap/river[@name=$name]/srid/@value";
 
-    public static final String XPATH_SHAPEFILE_DIR =
+    public static final String XPATH_FLOODMAP_SHAPEFILE_DIR =
         "/artifact-database/floodmap/shapefile-path/@value";
 
-    public static final String XPATH_VELOCITY_LOGFILE =
+    public static final String XPATH_FLOODMAP_VELOCITY_LOGFILE =
         "/artifact-database/floodmap/velocity/logfile/@path";
 
-    public static final String XPATH_MAPSERVER_URL =
+    public static final String XPATH_FLOODMAP_MAPSERVER_URL =
         "/artifact-database/floodmap/mapserver/server/@path";
 
-    public static final String XPATH_MAPFILE_PATH =
+    public static final String XPATH_FLOODMAP_MAPFILE_PATH =
         "/artifact-database/floodmap/mapserver/mapfile/@path";
 
-    public static final String XPATH_MAPFILE_TEMPLATE =
+    public static final String XPATH_FLOODMAP_MAPFILE_TEMPLATE =
         "/artifact-database/floodmap/mapserver/map-template/@path";
 
-    public static final String XPATH_MAPSERVER_TEMPLATE_PATH =
+    public static final String XPATH_FLOODMAP_MAPSERVER_TEMPLATE_PATH =
         "/artifact-database/floodmap/mapserver/templates/@path";
 
+    public static final String XPATH_RIVERMAP_RIVER_PROJECTION =
+        "/artifact-database/rivermap/river[@name=$name]/srid/@value";
+
+    public static final String XPATH_RIVERMAP_SHAPEFILE_DIR =
+        "/artifact-database/rivermap/shapefile-path/@value";
+
+    public static final String XPATH_RIVERMAP_VELOCITY_LOGFILE =
+        "/artifact-database/rivermap/velocity/logfile/@path";
+
+    public static final String XPATH_RIVERMAP_MAPSERVER_URL =
+        "/artifact-database/rivermap/mapserver/server/@path";
+
+    public static final String XPATH_RIVERMAP_MAPFILE_PATH =
+        "/artifact-database/rivermap/mapserver/mapfile/@path";
+
+    public static final String XPATH_RIVERMAP_MAPFILE_TEMPLATE =
+        "/artifact-database/rivermap/mapserver/map-template/@path";
+
+    public static final String XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH =
+        "/artifact-database/rivermap/mapserver/templates/@path";
+
 
     private FLYSUtils() {
     }
@@ -348,6 +369,7 @@
                 locations.add(Double.parseDouble(l));
             }
             catch (NumberFormatException nfe) {
+                logger.debug(nfe.getLocalizedMessage(), nfe);
             }
         }
 
@@ -452,7 +474,7 @@
 
         return (String) XMLUtils.xpath(
             cfg,
-            XPATH_RIVER_PROJECTION,
+            XPATH_FLOODMAP_RIVER_PROJECTION,
             XPathConstants.STRING,
             null,
             variables);
@@ -694,7 +716,7 @@
      * @return the URL of the user wms.
      */
     public static String getUserWMSUrl(String artifactId) {
-        String url = getXPathString(XPATH_MAPSERVER_URL);
+        String url = getXPathString(XPATH_FLOODMAP_MAPSERVER_URL);
         url = url.endsWith("/") ? url + "user-wms" : url + "/" + "user-wms";
 
         return url;
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/MapfileGenerator.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/MapfileGenerator.java	Tue Dec 11 15:24:24 2012 +0100
@@ -17,6 +17,7 @@
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.runtime.RuntimeConstants;
 
 /**
  * This class iterates over a bunch of directories, searches for meta
@@ -67,7 +68,7 @@
     }
 
 
-    protected abstract void generate() throws Exception;
+    public abstract void generate() throws Exception;
 
 
     /**
@@ -104,8 +105,8 @@
             "UTF-8");
 
         engine.setProperty(
-            VelocityEngine.RUNTIME_LOG,
-            FLYSUtils.getXPathString(FLYSUtils.XPATH_VELOCITY_LOGFILE));
+            RuntimeConstants.RUNTIME_LOG,
+            getVelocityLogfile());
 
         engine.setProperty(
             "resource.loader",
@@ -113,18 +114,23 @@
 
         engine.setProperty(
             "file.resource.loader.path",
-            FLYSUtils.getXPathString(FLYSUtils.XPATH_MAPSERVER_TEMPLATE_PATH));
+            getMapserverTemplatePath());
 
         engine.init();
     }
 
+    protected abstract String getVelocityLogfile();
+
+    protected abstract String getMapserverTemplatePath();
+
+    protected abstract String getMapserverUrl();
 
     protected VelocityContext getVelocityContext() {
         VelocityContext context = new VelocityContext();
 
         try {
             context.put("MAPSERVERURL",
-                FLYSUtils.getXPathString(FLYSUtils.XPATH_MAPSERVER_URL));
+                getMapserverUrl());
             context.put("SHAPEFILEPATH",
                 getShapefileBaseDir().getCanonicalPath());
             context.put("CONFIGDIR",
@@ -177,15 +183,19 @@
      * @return the mapfile template.
      * @throws Exception if an error occured while reading the configuration.
      */
-    protected Template getMapfileTemplate()
+    protected Template getMapfileTemplateObj()
     throws Exception
     {
         String mapfileName = FLYSUtils.getXPathString(
-            FLYSUtils.XPATH_MAPFILE_TEMPLATE);
+            FLYSUtils.XPATH_FLOODMAP_MAPFILE_TEMPLATE);
 
         return getTemplateByName(mapfileName);
     }
 
+    protected abstract String getMapfilePath();
+
+    protected abstract String getMapfileTemplate();
+
 
     /**
      * Returns the base directory storing the shapefiles.
@@ -200,7 +210,7 @@
     {
         if (shapefileDirectory == null) {
             String path = FLYSUtils.getXPathString(
-                FLYSUtils.XPATH_SHAPEFILE_DIR);
+                FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR);
 
             if (path != null) {
                 shapefileDirectory = new File(path);
@@ -270,27 +280,24 @@
      * section.
      */
     protected void writeLayer(
-        LayerInfo layerinfo,
-        File      dir,
-        String    filename,
+        LayerInfo layerInfo,
+        File      layerFile,
         Template  tpl
     )
     throws    FileNotFoundException
     {
         if (logger.isDebugEnabled()) {
             logger.debug("Write layer for:");
-            logger.debug("   directory: " + dir.getName());
-            logger.debug("   name:      " + filename);
+            logger.debug("   directory/file: " + layerFile.getName());
         }
 
-        File   layer  = new File(dir, filename);
         Writer writer = null;
 
         try {
-            writer = new FileWriter(layer);
+            writer = new FileWriter(layerFile);
 
             VelocityContext context = getVelocityContext();
-            context.put("LAYER", layerinfo);
+            context.put("LAYER", layerInfo);
 
             tpl.merge(context, writer);
         }
@@ -324,8 +331,7 @@
     protected void writeMapfile(List<String> layers) {
         String tmpMapName = "mapfile" + new Date().getTime();
 
-        File mapfile = new File(
-            FLYSUtils.getXPathString(FLYSUtils.XPATH_MAPFILE_PATH));
+        File mapfile = new File(getMapfilePath());
 
         File   tmp     = null;
         Writer writer  = null;
@@ -339,7 +345,7 @@
             VelocityContext context = getVelocityContext();
             context.put("LAYERS", layers);
 
-            Template mapTemplate = getMapfileTemplate();
+            Template mapTemplate = getMapfileTemplateObj();
             if (mapTemplate == null) {
                 logger.warn("No mapfile template found.");
                 return;
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/Pair.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/Pair.java	Tue Dec 11 15:24:24 2012 +0100
@@ -21,6 +21,7 @@
     private A a;
     private B b;
 
+    @SuppressWarnings("unused")
     private Pair() {
     }
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/RiverMapfileGenerator.java	Tue Dec 11 09:44:04 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/RiverMapfileGenerator.java	Tue Dec 11 15:24:24 2012 +0100
@@ -4,15 +4,22 @@
 import de.intevation.flys.artifacts.model.RiverFactory;
 import de.intevation.flys.model.River;
 
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.util.List;
 
+import org.apache.log4j.Logger;
+import org.apache.velocity.Template;
+
 public class RiverMapfileGenerator extends MapfileGenerator {
 
+    private static Logger logger = Logger.getLogger(RiverMapfileGenerator.class);
+
     /**
      * Generate river axis mapfile.
      */
     @Override
-    protected void generate() {
+    public void generate() {
         List<River> rivers = RiverFactory.getRivers();
 
         for (River river : rivers) {
@@ -29,6 +36,44 @@
         layerInfo.setName(riverName);
         layerInfo.setSrid(srid);
         layerInfo.setExtent(extend);
+
+        File layerFile = new File(getMapfilePath());
+        Template template = getTemplateByName(DB_LAYER_TEMPLATE);
+        if (template == null) {
+            logger.warn("Template '" + DB_LAYER_TEMPLATE + "' found.");
+            return;
+        }
+
+        try {
+            writeLayer(layerInfo, layerFile, template);
+        }
+        catch (FileNotFoundException e) {
+            logger.warn(e.getLocalizedMessage(), e);
+        }
     }
 
+    @Override
+    protected String getVelocityLogfile() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_RIVERMAP_VELOCITY_LOGFILE);
+    }
+
+    @Override
+    protected String getMapserverTemplatePath() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH);
+    }
+
+    @Override
+    protected String getMapserverUrl() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_RIVERMAP_MAPSERVER_URL);
+    }
+
+    @Override
+    protected String getMapfilePath() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_RIVERMAP_MAPFILE_PATH);
+    }
+
+    @Override
+    protected String getMapfileTemplate() {
+        return FLYSUtils.getXPathString(FLYSUtils.XPATH_RIVERMAP_MAPFILE_TEMPLATE);
+    }
 }

http://dive4elements.wald.intevation.org