diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java @ 5312:2c1045a1e3fe

Added new states and transitions to UESK calculation and adjusted states and UI. TODO: Some refactoring and code cleanup.
author Raimund Renkert <rrenkert@intevation.de>
date Thu, 14 Mar 2013 17:25:00 +0100
parents cf7e0d9022fa
children a1cb9a734cc5
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Thu Mar 14 17:21:00 2013 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Thu Mar 14 17:25:00 2013 +0100
@@ -43,8 +43,11 @@
 import de.intevation.flys.artifacts.model.CalculationMessage;
 import de.intevation.flys.artifacts.model.CalculationResult;
 import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.LayerInfo;
 import de.intevation.flys.artifacts.model.WQKms;
-
+import de.intevation.flys.artifacts.model.map.HWS;
+import de.intevation.flys.artifacts.model.map.HWSContainer;
+import de.intevation.flys.artifacts.model.map.HWSFactory;
 import de.intevation.flys.artifacts.model.map.WMSLayerFacet;
 import de.intevation.flys.artifacts.model.map.WSPLGENCalculation;
 import de.intevation.flys.artifacts.model.map.WSPLGENJob;
@@ -68,6 +71,26 @@
 import de.intevation.flys.wsplgen.JobObserver;
 import de.intevation.flys.wsplgen.Scheduler;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.naming.Context;
+
+import org.apache.log4j.Logger;
+import org.apache.velocity.Template;
+import org.geotools.feature.FeatureCollection;
+import org.geotools.feature.FeatureCollections;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.hibernate.HibernateException;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+
 public class FloodMapState
 extends      DefaultState
 implements   FacetTypes
@@ -102,6 +125,13 @@
 
     public static final int WSPLGEN_DEFAULT_OUTPUT = 0;
 
+    private static final String HWS_LINES_SHAPE = "hws-lines.shp";
+
+    private static final String I18N_HWS_POINTS = "floodmap.hws.points";
+    private static final String I18N_HWS_LINES = "floodmap.hws.lines";
+    private static final String HWS_LINES = "hws-lines";
+    private static final String HWS_POINT_SHAPE = "hws-points.shp";
+    private static final String HWS_POINTS = "hws-points";
 
     /**
      * @param orig
@@ -305,6 +335,7 @@
         WSPLGENCalculation calculation
     ) {
         logger.debug("FloodMapState.prepareWSPLGENJob");
+        String scenario = artifact.getDataAsString("scenario");
 
         WSPLGENJob job = new WSPLGENJob(
             artifact,
@@ -320,15 +351,20 @@
         setDelta(artifact, job);
         setGel(artifact, job);
         setDist(artifact, job);
-        setLine(artifact, facetCreator, artifactDir, job);
-        setUserShape(artifact, facetCreator, artifactDir, job);
         setAxis(artifact, artifactDir, job);
         setPro(artifact, artifactDir, job);
         setDgm(artifact, job, context);
         setArea(artifact, artifactDir, job);
         setOutFile(artifact, job);
         setWsp(artifact, context, artifactDir, job);    // WSP
-
+        if (scenario.equals("scenario.current")) {
+            setOfficialHWS(artifact, facetCreator, artifactDir, job);
+        }
+        else if (scenario.equals("scenario.scenario")) {
+            setAdditionalHWS(artifact, facetCreator, artifactDir, job);
+            setLine(artifact, facetCreator, artifactDir, job);
+            setUserShape(artifact, facetCreator, artifactDir, job);
+        }
         // TODO
         // setWspTag(artifact, job);
 
@@ -348,6 +384,106 @@
     }
 
 
+    private void setAdditionalHWS(
+        FLYSArtifact artifact,
+        FacetCreator facetCreator,
+        File dir,
+        WSPLGENJob job) {
+        File line = new File(dir, HWS_LINES_SHAPE);
+        boolean lines = line.exists();
+        logger.debug("shp file exists: " + lines);
+        if (lines) {
+            job.addLin(dir + "/" + HWS_LINES_SHAPE);
+            facetCreator.createShapeFacet(I18N_HWS_LINES,
+                MapfileGenerator.MS_LAYER_PREFIX + HWS_LINES,
+                FLOODMAP_LINES, 2);
+        }
+        File point = new File(dir, HWS_POINT_SHAPE);
+        boolean points = point.exists();
+        logger.debug("shp file exists: " + points);
+        if (points) {
+            facetCreator.createShapeFacet(I18N_HWS_POINTS,
+                MapfileGenerator.MS_LAYER_PREFIX + HWS_POINTS,
+                FLOODMAP_FIXPOINTS, 3);
+        }
+    }
+
+
+    private void setOfficialHWS(
+        FLYSArtifact artifact,
+        FacetCreator facetCreator,
+        File artifactDir,
+        WSPLGENJob job) {
+        String river = artifact.getDataAsString("river");
+
+        HWSContainer hwsLines = HWSFactory.getHWSLines(river);
+        List<HWS> selectedLines = hwsLines.getOfficialHWS();
+
+        FeatureCollection collectionLines = FeatureCollections.newCollection();
+        SimpleFeatureType lineType = null;
+        for (HWS h : selectedLines) {
+            lineType = h.getFeatureType();
+            collectionLines.add(h.getFeature());
+        }
+        boolean successLines = false;
+        if (lineType != null && collectionLines.size() > 0) {
+            File shapeLines = new File(artifactDir, HWS_LINES_SHAPE);
+            successLines = GeometryUtils.writeShapefile(
+                shapeLines, lineType, collectionLines);
+        }
+       if (successLines) {
+            createMapfile(
+                artifact,
+                artifactDir,
+                MapfileGenerator.MS_LAYER_PREFIX + "hws-lines",
+                HWS_LINES_SHAPE,
+                "LINE",
+                "31467",
+                "hws");
+            job.addLin(artifactDir + "/" + HWS_LINES_SHAPE);
+            facetCreator.createShapeFacet(I18N_HWS_LINES,
+                MapfileGenerator.MS_LAYER_PREFIX + HWS_LINES,
+                FLOODMAP_HWS,2);
+        }
+    }
+
+
+    private void createMapfile(
+        FLYSArtifact artifact,
+        File artifactDir,
+        String name,
+        String hwsShapefile,
+        String type,
+        String srid,
+        String group
+    ) {
+        LayerInfo info = new LayerInfo();
+        info.setName(name + artifact.identifier());
+        info.setType(type);
+        info.setDirectory(artifact.identifier());
+        info.setTitle(name);
+        info.setData(hwsShapefile);
+        info.setSrid(srid);
+        info.setGroupTitle(group);
+        MapfileGenerator generator = new ArtifactMapfileGenerator();
+        Template tpl = generator.getTemplateByName(MapfileGenerator.SHP_LAYER_TEMPLATE);
+        try {
+            File layer = new File(artifactDir.getCanonicalPath() + "/" + name);
+            generator.writeLayer(info, layer, tpl);
+            List<String> layers = new ArrayList<String>();
+            layers.add(layer.getAbsolutePath());
+            generator.generate();
+        }
+        catch(FileNotFoundException fnfe) {
+            logger.warn("Could not find mapfile for hws layer");
+        }
+        catch (Exception ioe) {
+            logger.warn("Could not create mapfile for hws layer");
+            logger.warn(Arrays.toString(ioe.getStackTrace()));
+        }
+    }
+
+
     protected void setOut(FLYSArtifact artifact, WSPLGENJob job) {
         job.setOut(WSPLGEN_DEFAULT_OUTPUT);
     }
@@ -464,6 +600,14 @@
             logger.debug(
                 "Successfully created barrier line shapefile. " +
                 "Write shapefile path into WSPLGEN job.");
+            createMapfile(
+                artifact,
+                dir,
+                MapfileGenerator.MS_LAYER_PREFIX + "barriers-lines",
+                WSPLGEN_BARRIERS_LINES,
+                "LINE",
+                srid,
+                "barriers");
 
             if (scenario.equals(WSPLGENJob.GEL_NOSPERRE)) {
                 logger.debug("WSPLGEN will not use barrier features.");
@@ -478,10 +622,19 @@
             GeometryUtils.buildFeatureType("polygons", srs, Polygon.class, obj),
             fcs[1]);
 
+
         if (p) {
             logger.debug(
                 "Successfully created barrier polygon shapefile. " +
                 "Write shapefile path into WSPLGEN job.");
+            createMapfile(
+                artifact,
+                dir,
+                MapfileGenerator.MS_LAYER_PREFIX + "barriers-poly",
+                shapePolys.getAbsolutePath(),
+                "POLYGON",
+                srid,
+                "barriers");
 
             if (scenario.equals(WSPLGENJob.GEL_NOSPERRE)) {
                 logger.debug("WSPLGEN will not use barrier features.");
@@ -503,22 +656,15 @@
         File         dir,
         WSPLGENJob   job
     ) {
-        File archive = new File(dir, WSPLGEN_USER_ZIP);
+        File archive = new File(dir, WSPLGEN_USER_SHAPE);
         boolean exists = archive.exists();
-        logger.debug("Zip file exists: " + exists);
+        logger.debug("shp file exists: " + exists);
         if (exists) {
-            try {
-                File tmpDir = new File(dir, "usr_tmp");
-                FileTools.extractArchive(archive, tmpDir);
-                moveFiles(tmpDir, dir);
-            }
-            catch (IOException ioe) {
-                logger.warn("Zip archive " + dir + "/" + WSPLGEN_USER_ZIP + " could not be extracted.");
-                return;
-            }
-
             job.addLin(dir + "/" + WSPLGEN_USER_SHAPE);
-            facetCreator.createUserShapeFacet();
+            facetCreator.createShapeFacet(FacetCreator.I18N_USERSHAPE,
+                MapfileGenerator.MS_LAYER_PREFIX + "user-rgd",
+                FLOODMAP_USERSHAPE,
+                4);
         }
     }
 
@@ -883,41 +1029,6 @@
     }
 
 
-    protected void moveFiles(File source, final File target)
-    throws IOException
-    {
-        if (!source.exists()) {
-            return;
-        }
-        if (!target.exists()) {
-            target.mkdir();
-        }
-        FileTools.walkTree(source, new FileTools.FileVisitor() {
-            @Override
-            public boolean visit(File file) {
-                if (!file.isDirectory()) {
-                    String name = file.getName();
-                    String suffix = "";
-                    int pos = name.lastIndexOf('.');
-                    if (pos > 0 && pos < name.length() - 1) {
-                        suffix = name.substring(pos + 1);
-                    }
-                    else {
-                        return true;
-                    }
-                    try {
-                        FileTools.copyFile(file, new File(target, WSPLGEN_USER_FILENAME + "." + suffix));
-                    }
-                    catch (IOException ioe) {
-                        logger.warn ("Error while copying file " + file.getName());
-                        return true;
-                    }
-                }
-                return true;
-            }
-        });
 
-        FileTools.deleteRecursive(source);
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org