ingo@927: package de.intevation.flys.artifacts.states; ingo@927: ingo@1091: import java.io.File; ingo@1091: import java.io.IOException; ingo@935: import java.util.List; ingo@935: ingo@1091: import javax.xml.xpath.XPathConstants; ingo@1091: ingo@927: import org.apache.log4j.Logger; ingo@927: ingo@1091: import de.intevation.artifacts.Artifact; ingo@935: import de.intevation.artifacts.CallContext; ingo@935: ingo@1091: import de.intevation.artifacts.common.utils.Config; ingo@1091: import de.intevation.artifacts.common.utils.FileTools; ingo@1091: ingo@935: import de.intevation.artifactdatabase.state.Facet; ingo@935: ingo@935: import de.intevation.flys.artifacts.FLYSArtifact; ingo@927: import de.intevation.flys.artifacts.model.FacetTypes; ingo@935: import de.intevation.flys.artifacts.model.WSPLGENFacet; ingo@1091: import de.intevation.flys.artifacts.model.WSPLGENJob; ingo@927: ingo@927: ingo@927: public class FloodMapState ingo@927: extends DefaultState ingo@927: implements FacetTypes ingo@927: { ingo@927: /** The logger that is used in this state.*/ ingo@927: private static Logger logger = Logger.getLogger(FloodMapState.class); ingo@927: ingo@935: ingo@1091: public static final String XPATH_SHAPEFILE_DIR = ingo@1091: "/artifact-database/floodmap/shapefile-path/@value"; ingo@1091: ingo@1091: public static final String WSPLGEN_PARAMETER_FILE = "wsplgen.par"; ingo@1091: ingo@1091: ingo@1053: ingo@1053: @Override ingo@935: public Object computeAdvance( ingo@935: FLYSArtifact artifact, ingo@935: String hash, ingo@935: CallContext context, ingo@935: List facets, ingo@935: Object old ingo@935: ) { ingo@1091: logger.debug("FloodMapState.computeAdvance"); ingo@1091: ingo@1091: File artifactDir = getDirectory(artifact); ingo@1091: ingo@1091: if (artifactDir == null) { ingo@1091: logger.error("Could not create directory for WSPLGEN results!"); ingo@1091: return null; ingo@1091: } ingo@1091: ingo@1091: WSPLGENJob job = prepareWSPLGENJob(artifact, artifactDir); ingo@1091: ingo@1091: if (job == null) { ingo@1091: removeDirectory(artifact); ingo@1091: ingo@1091: logger.error("No WSPLGEN processing has been started!"); ingo@1091: ingo@1091: return null; ingo@1091: } ingo@1091: ingo@935: facets.add(new WSPLGENFacet(0, FLOODMAP_WSPLGEN, "WSPLGEN")); ingo@935: ingo@1091: //context.afterCall(CallContext.BACKGROUND); ingo@1091: ingo@1091: return null; ingo@1091: } ingo@1091: ingo@1091: ingo@1091: /** ingo@1091: * Returns the shapefile path defined in the configuration. ingo@1091: * ingo@1091: * @return the shapefile path. ingo@1091: */ ingo@1091: protected String getShapefilePath() { ingo@1091: String shapePath = (String) Config.getXPath( ingo@1091: XPATH_SHAPEFILE_DIR, XPathConstants.STRING); ingo@1091: shapePath = Config.replaceConfigDir(shapePath); ingo@1091: ingo@1091: return shapePath; ingo@1091: } ingo@1091: ingo@1091: ingo@1091: /** ingo@1091: * Returns (and creates if not existing) the directory for storing WSPLEN ingo@1091: * data for the owner artifact. ingo@1091: * ingo@1091: * @param artifact The owner Artifact. ingo@1091: * ingo@1091: * @return the directory for WSPLEN data. ingo@1091: */ ingo@1091: protected File getDirectory(FLYSArtifact artifact) { ingo@1091: String shapePath = getShapefilePath(); ingo@1091: ingo@1091: File artifactDir = FileTools.getDirectory( ingo@1091: shapePath, artifact.identifier()); ingo@1091: ingo@1091: return artifactDir; ingo@1091: } ingo@1091: ingo@1091: ingo@1091: /** ingo@1091: * Removes the directory and all its content where the required data and the ingo@1091: * results of WSPLGEN are stored. Should be called in endOfLife(). ingo@1091: */ ingo@1091: protected void removeDirectory(FLYSArtifact artifact) { ingo@1091: String shapePath = getShapefilePath(); ingo@1091: File artifactDir = new File(shapePath, artifact.identifier()); ingo@1091: ingo@1091: if (artifactDir.exists()) { ingo@1091: logger.info("Delete directory: " + artifactDir.getAbsolutePath()); ingo@1091: boolean success = FileTools.deleteRecursive(artifactDir); ingo@1091: } ingo@1091: else { ingo@1091: logger.debug("There is no directory to remove."); ingo@1091: } ingo@1091: } ingo@1091: ingo@1091: ingo@1091: @Override ingo@1091: public void endOfLife(Artifact artifact, Object callContext) { ingo@1091: logger.info("FloodMapState.endOfLife: " + artifact.identifier()); ingo@1091: ingo@1091: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@1091: removeDirectory(flys); ingo@1091: } ingo@1091: ingo@1091: ingo@1091: ingo@1091: protected WSPLGENJob prepareWSPLGENJob( ingo@1091: FLYSArtifact artifact, ingo@1091: File artifactDir ingo@1091: ) { ingo@1091: logger.debug("FloodMapState.prepareWSPLGENJob"); ingo@1091: ingo@1091: WSPLGENJob job = new WSPLGENJob(); ingo@1091: File paraFile = new File(artifactDir, WSPLGEN_PARAMETER_FILE); ingo@1091: ingo@1091: try { ingo@1091: job.toFile(paraFile); ingo@1091: ingo@1091: return job; ingo@1091: } ingo@1091: catch (IOException ioe) { ingo@1091: logger.warn("Cannot write PAR file: " + ioe.getMessage()); ingo@1091: } ingo@1091: catch (IllegalArgumentException iae) { ingo@1091: logger.warn("Cannot write PAR file: " + iae.getMessage()); ingo@1091: } ingo@1091: ingo@935: return null; ingo@935: } ingo@927: } ingo@927: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :