gernotbelger@9050: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde gernotbelger@9050: * Software engineering by Intevation GmbH gernotbelger@9050: * gernotbelger@9050: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9050: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9050: * documentation coming with Dive4Elements River for details. gernotbelger@9050: */ gernotbelger@9050: gernotbelger@9054: package org.dive4elements.river.artifacts.sinfo.flood_duration; gernotbelger@9050: gernotbelger@9050: import java.util.List; gernotbelger@9050: gernotbelger@9050: import org.dive4elements.artifactdatabase.state.Facet; gernotbelger@9050: import org.dive4elements.artifacts.CallContext; gernotbelger@9050: import org.dive4elements.river.artifacts.ChartArtifact; gernotbelger@9050: import org.dive4elements.river.artifacts.D4EArtifact; mschaefer@9176: import org.dive4elements.river.artifacts.model.Calculation; gernotbelger@9050: import org.dive4elements.river.artifacts.model.CalculationResult; gernotbelger@9145: import org.dive4elements.river.artifacts.model.DataFacet; gernotbelger@9050: import org.dive4elements.river.artifacts.model.EmptyFacet; gernotbelger@9145: import org.dive4elements.river.artifacts.model.FacetTypes; mschaefer@9176: import org.dive4elements.river.artifacts.model.ReportFacet; gernotbelger@9050: import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; mschaefer@9176: import org.dive4elements.river.artifacts.sinfo.common.FloodDurationProcessor; mschaefer@9202: import org.dive4elements.river.artifacts.sinfo.common.FloodHeightProcessor; gernotbelger@9050: import org.dive4elements.river.artifacts.states.DefaultState; gernotbelger@9050: mschaefer@9176: /** mschaefer@9176: * Last state of the S-Info flood duration workflow that calculates and outputs the result mschaefer@9176: */ gernotbelger@9054: public class FloodDurationState extends DefaultState { gernotbelger@9050: gernotbelger@9050: /// ** The log that is used in this state. */ mschaefer@9176: // private static Logger log = Logger.getLogger(FloodDurationState.class); gernotbelger@9050: gernotbelger@9050: private static final long serialVersionUID = 1L; gernotbelger@9050: gernotbelger@9050: /** gernotbelger@9050: * From this state can only be continued trivially. gernotbelger@9050: */ gernotbelger@9050: @Override gernotbelger@9050: protected String getUIProvider() { gernotbelger@9050: return "continue"; gernotbelger@9050: } gernotbelger@9050: gernotbelger@9050: @Override gernotbelger@9050: public Object computeFeed(final D4EArtifact artifact, final String hash, final CallContext context, final List facets, final Object old) { gernotbelger@9050: if (artifact instanceof ChartArtifact) { gernotbelger@9050: facets.add(new EmptyFacet()); gernotbelger@9050: return null; gernotbelger@9050: } gernotbelger@9050: return compute((SINFOArtifact) artifact, context, hash, facets, old); gernotbelger@9050: } gernotbelger@9050: gernotbelger@9050: @Override gernotbelger@9050: public Object computeAdvance(final D4EArtifact artifact, final String hash, final CallContext context, final List facets, final Object old) { gernotbelger@9050: if (artifact instanceof ChartArtifact) { gernotbelger@9050: facets.add(new EmptyFacet()); gernotbelger@9050: return null; gernotbelger@9050: } gernotbelger@9050: return compute((SINFOArtifact) artifact, context, hash, facets, old); gernotbelger@9050: } gernotbelger@9050: gernotbelger@9050: /** gernotbelger@9050: * Compute result or returned object from cache, create facets. gernotbelger@9050: * gernotbelger@9050: * @param old gernotbelger@9050: * Object that was cached. gernotbelger@9050: */ gernotbelger@9050: private Object compute(final SINFOArtifact sinfo, final CallContext context, final String hash, final List facets, final Object old) { gernotbelger@9050: gernotbelger@9050: final CalculationResult res = doCompute(sinfo, context, old); gernotbelger@9050: gernotbelger@9050: if (facets == null) gernotbelger@9050: return res; gernotbelger@9050: gernotbelger@9145: final FloodDurationCalculationResults results = (FloodDurationCalculationResults) res.getData(); gernotbelger@9195: final List resultList = results.getResults(); gernotbelger@9205: int resultIndex = 0; gernotbelger@9205: int themeCount = 0; gernotbelger@9195: for (final FloodDurationCalculationResult result : resultList) { gernotbelger@9145: gernotbelger@9205: facets.add(FloodDurationProcessor.createFloodDurationFacet(context, hash, this.id, result, resultIndex)); gernotbelger@9205: gernotbelger@9205: final int waterlevelCount = result.getWaterlevelCount(); gernotbelger@9205: gernotbelger@9205: facets.add(FloodHeightProcessor.createFloodHeightFacet(context, hash, this.id, result, resultIndex)); gernotbelger@9205: gernotbelger@9205: for (int j = 0; j < waterlevelCount; j++) { gernotbelger@9205: gernotbelger@9205: final String waterlevelLabel = result.getMainValueLabel(j); gernotbelger@9205: // FIXME: use label as label for theme gernotbelger@9205: gernotbelger@9205: facets.add(FloodDurationProcessor.createMainValueDurationFacet(context, hash, this.id, result, themeCount, resultIndex, j)); gernotbelger@9205: facets.add(FloodHeightProcessor.createMainValueHeightFacet(context, hash, this.id, result, themeCount, resultIndex, j)); gernotbelger@9205: gernotbelger@9205: themeCount++; mschaefer@9202: } gernotbelger@9145: mschaefer@9176: facets.add(new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id)); mschaefer@9176: facets.add(new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id)); gernotbelger@9195: gernotbelger@9205: resultIndex++; gernotbelger@9145: } gernotbelger@9145: mschaefer@9176: final Calculation report = res.getReport(); mschaefer@9176: if (report.hasProblems()) mschaefer@9176: facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id)); gernotbelger@9050: gernotbelger@9050: return res; gernotbelger@9050: } gernotbelger@9050: gernotbelger@9050: private CalculationResult doCompute(final SINFOArtifact sinfo, final CallContext context, final Object old) { gernotbelger@9050: if (old instanceof CalculationResult) gernotbelger@9050: return (CalculationResult) old; gernotbelger@9050: gernotbelger@9067: return new FloodDurationCalculation(context).calculate(sinfo); gernotbelger@9050: } gernotbelger@9050: }