diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java @ 1118:7398280b11a0

Write WSP file for WSPLGEN and add its filepath to the WSPLGEN job. flys-artifacts/trunk@2625 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 31 Aug 2011 13:19:29 +0000
parents 563e015f0f22
children faca1825818e
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Wed Aug 31 12:44:07 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Wed Aug 31 13:19:29 2011 +0000
@@ -1,6 +1,8 @@
 package de.intevation.flys.artifacts.states;
 
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.List;
@@ -35,9 +37,13 @@
 import de.intevation.flys.model.RiverAxis;
 
 import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.model.CalculationResult;
 import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.WQKms;
 import de.intevation.flys.artifacts.model.WSPLGENFacet;
 import de.intevation.flys.artifacts.model.WSPLGENJob;
+import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
+import de.intevation.flys.exports.WstWriter;
 import de.intevation.flys.utils.FLYSUtils;
 import de.intevation.flys.utils.GeometryUtils;
 
@@ -57,12 +63,18 @@
     public static final String XPATH_SHAPEFILE_DIR =
         "/artifact-database/floodmap/shapefile-path/@value";
 
+    public static final String WSP_ARTIFACT_UUID = "uesk.wsp.artifact";
+
+    public static final String WINFO_WSP_STATE_ID = "state.winfo.waterlevel";
+
     public static final String WSPLGEN_PARAMETER_FILE = "wsplgen.par";
     public static final String WSPLGEN_BARRIERS_LINES = "barrier_lines.shp";
     public static final String WSPLGEN_BARRIERS_POLY  = "barrier_polygons.shp";
     public static final String WSPLGEN_AXIS           = "axis.shp";
     public static final String WSPLGEN_QPS            = "qps.shp";
     public static final String WSPLGEN_FLOODPLAIN     = "talaue.shp";
+    public static final String WSPLGEN_WSP_FILE       = "waterlevel.txt";
+    public static final String WSPLGEN_OUTPUT_FILE    = "wsplgen.shp";
 
     public static final int WSPLGEN_DEFAULT_OUTPUT = 0;
 
@@ -85,7 +97,7 @@
             return null;
         }
 
-        WSPLGENJob job = prepareWSPLGENJob(artifact, artifactDir);
+        WSPLGENJob job = prepareWSPLGENJob(artifact, artifactDir, context);
 
         if (job == null) {
             if (KEEP_ARTIFACT_DIR.equals("false")) {
@@ -166,7 +178,8 @@
 
     protected WSPLGENJob prepareWSPLGENJob(
         FLYSArtifact artifact,
-        File         artifactDir
+        File         artifactDir,
+        CallContext  context
     ) {
         logger.debug("FloodMapState.prepareWSPLGENJob");
 
@@ -183,11 +196,11 @@
         setPro(artifact, artifactDir, job);
         setDgm(artifact, job);
         setArea(artifact, artifactDir, job);
+        setOutFile(artifact, job);
+        setWsp(artifact, context, artifactDir, job);    // WSP
 
         // TODO
-        // setWsp(artifact, job);    // WSP
         // setWspTag(artifact, job);
-        // setOutFile(artifact, job);
 
         try {
             job.toFile(paraFile);
@@ -475,5 +488,82 @@
             logger.error("Error while writing shapefile: " + ioe.getMessage());
         }
     }
+
+
+    protected void setOutFile(FLYSArtifact artifact, WSPLGENJob job) {
+        job.setOutFile(WSPLGEN_OUTPUT_FILE);
+    }
+
+
+    protected void setWsp(
+        FLYSArtifact artifact,
+        CallContext  context,
+        File         dir,
+        WSPLGENJob   job)
+    {
+        logger.debug("FloodMapState.setWsp");
+
+        String otherArtifact = artifact.getDataAsString(WSP_ARTIFACT_UUID);
+        FLYSArtifact     src = otherArtifact != null
+            ? FLYSUtils.getArtifact(otherArtifact, context)
+            : artifact;
+
+        CalculationResult rawData = (CalculationResult) src.compute(
+            context,
+            null,
+            WINFO_WSP_STATE_ID,
+            ComputeType.ADVANCE,
+            false);
+
+        if (rawData == null) {
+            logger.warn("No WST data found!");
+            return;
+        }
+
+        WQKms[]    data = (WQKms[]) rawData.getData();
+        WstWriter writer = new WstWriter(data.length);
+
+        // TODO REMOVE job.setWspTag(...) This is only used until the user is
+        // able to select the WSP column himself!
+        boolean writeWspTag = true;
+
+        double[] buf = new double[4];
+        for (WQKms wqkms: data) {
+            logger.debug("Add WST column: " + wqkms.getName());
+            writer.addColumn(wqkms.getName());
+
+            if (writeWspTag) {
+                job.setWspTag(wqkms.getName());
+                writeWspTag = false;
+            }
+
+            for (int i = 0, num = wqkms.size(); i < num; i++) {
+                wqkms.get(i, buf);
+                writer.add(buf);
+            }
+        }
+
+        FileOutputStream fout = null;
+
+        try {
+            File wspFile = new File(dir, WSPLGEN_WSP_FILE);
+            fout         = new FileOutputStream(wspFile);
+
+            writer.write(fout);
+
+            job.setWsp(wspFile.getAbsolutePath());
+        }
+        catch (FileNotFoundException fnfe) {
+            logger.warn("Error while writing wsp file: " + fnfe.getMessage());
+        }
+        finally {
+            if (fout != null) {
+                try {
+                    fout.close();
+                }
+                catch (IOException ioe) { /* do nothing */ }
+            }
+        }
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org