view 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 source
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
extends      DefaultState
implements   FacetTypes
{
    /** The logger that is used in this state.*/
    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(
        FLYSArtifact artifact,
        String       hash,
        CallContext  context,
        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;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org