Mercurial > dive4elements > river
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; } }