diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java @ 1091:7230e087ef8b

Prepare directories for WSPLGEN specific data in FloodMap state and remove those directories when State.endOfLife() is called. flys-artifacts/trunk@2594 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 26 Aug 2011 12:42:12 +0000
parents 13784581ab0c
children 9f88cc54570c
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Fri Aug 26 12:40:11 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Fri Aug 26 12:42:12 2011 +0000
@@ -1,16 +1,25 @@
 package de.intevation.flys.artifacts.states;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.List;
 
+import javax.xml.xpath.XPathConstants;
+
 import org.apache.log4j.Logger;
 
+import de.intevation.artifacts.Artifact;
 import de.intevation.artifacts.CallContext;
 
+import de.intevation.artifacts.common.utils.Config;
+import de.intevation.artifacts.common.utils.FileTools;
+
 import de.intevation.artifactdatabase.state.Facet;
 
 import de.intevation.flys.artifacts.FLYSArtifact;
 import de.intevation.flys.artifacts.model.FacetTypes;
 import de.intevation.flys.artifacts.model.WSPLGENFacet;
+import de.intevation.flys.artifacts.model.WSPLGENJob;
 
 
 public class FloodMapState
@@ -21,6 +30,12 @@
     private static Logger logger = Logger.getLogger(FloodMapState.class);
 
 
+    public static final String XPATH_SHAPEFILE_DIR =
+        "/artifact-database/floodmap/shapefile-path/@value";
+
+    public static final String WSPLGEN_PARAMETER_FILE = "wsplgen.par";
+
+
 
     @Override
     public Object computeAdvance(
@@ -30,8 +45,114 @@
         List<Facet>  facets,
         Object       old
     ) {
+        logger.debug("FloodMapState.computeAdvance");
+
+        File artifactDir = getDirectory(artifact);
+
+        if (artifactDir == null) {
+            logger.error("Could not create directory for WSPLGEN results!");
+            return null;
+        }
+
+        WSPLGENJob job = prepareWSPLGENJob(artifact, artifactDir);
+
+        if (job == null) {
+            removeDirectory(artifact);
+
+            logger.error("No WSPLGEN processing has been started!");
+
+            return null;
+        }
+
         facets.add(new WSPLGENFacet(0, FLOODMAP_WSPLGEN, "WSPLGEN"));
 
+        //context.afterCall(CallContext.BACKGROUND);
+
+        return null;
+    }
+
+
+    /**
+     * Returns the shapefile path defined in the configuration.
+     *
+     * @return the shapefile path.
+     */
+    protected String getShapefilePath() {
+        String shapePath = (String) Config.getXPath(
+            XPATH_SHAPEFILE_DIR, XPathConstants.STRING);
+        shapePath = Config.replaceConfigDir(shapePath);
+
+        return shapePath;
+    }
+
+
+    /**
+     * Returns (and creates if not existing) the directory for storing WSPLEN
+     * data for the owner artifact.
+     *
+     * @param artifact The owner Artifact.
+     *
+     * @return the directory for WSPLEN data.
+     */
+    protected File getDirectory(FLYSArtifact artifact) {
+        String shapePath = getShapefilePath();
+
+        File artifactDir = FileTools.getDirectory(
+            shapePath, artifact.identifier());
+
+        return artifactDir;
+    }
+
+
+    /**
+     * Removes the directory and all its content where the required data and the
+     * results of WSPLGEN are stored. Should be called in endOfLife().
+     */
+    protected void removeDirectory(FLYSArtifact artifact) {
+        String shapePath    = getShapefilePath();
+        File   artifactDir = new File(shapePath, artifact.identifier());
+
+        if (artifactDir.exists()) {
+            logger.info("Delete directory: " + artifactDir.getAbsolutePath());
+            boolean success = FileTools.deleteRecursive(artifactDir);
+        }
+        else {
+            logger.debug("There is no directory to remove.");
+        }
+    }
+
+
+    @Override
+    public void endOfLife(Artifact artifact, Object callContext) {
+        logger.info("FloodMapState.endOfLife: " + artifact.identifier());
+
+        FLYSArtifact flys = (FLYSArtifact) artifact;
+        removeDirectory(flys);
+    }
+
+
+
+    protected WSPLGENJob prepareWSPLGENJob(
+        FLYSArtifact artifact,
+        File         artifactDir
+    ) {
+        logger.debug("FloodMapState.prepareWSPLGENJob");
+
+        WSPLGENJob job = new WSPLGENJob();
+        File  paraFile = new File(artifactDir, WSPLGEN_PARAMETER_FILE);
+
+        try {
+            job.toFile(paraFile);
+
+            return job;
+        }
+        catch (IOException ioe) {
+            logger.warn("Cannot write PAR file: " + ioe.getMessage());
+        }
+        catch (IllegalArgumentException iae) {
+            logger.warn("Cannot write PAR file: " + iae.getMessage());
+        }
+
         return null;
     }
 }

http://dive4elements.wald.intevation.org