mschaefer@9259: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9259: * Software engineering by mschaefer@9259: * Björnsen Beratende Ingenieure GmbH mschaefer@9259: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt 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; mschaefer@9252: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@9050: import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; mschaefer@9229: import org.dive4elements.river.artifacts.sinfo.flood_duration.RiversideRadioChoice.RiversideChoiceKey; 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: mschaefer@9229: final FloodDurationAccess access = new FloodDurationAccess(sinfo); mschaefer@9229: if ((access.getRiverside() == RiversideChoiceKey.LEFT) || (access.getRiverside() == RiversideChoiceKey.BOTH)) mschaefer@9229: facets.add(FloodDurationProcessor.createFloodDurationFacet(context, hash, this.id, result, 0, resultIndex)); mschaefer@9229: if ((access.getRiverside() == RiversideChoiceKey.RIGHT) || (access.getRiverside() == RiversideChoiceKey.BOTH)) mschaefer@9229: facets.add(FloodDurationProcessor.createFloodDurationFacet(context, hash, this.id, result, 1, resultIndex)); gernotbelger@9205: gernotbelger@9205: final int waterlevelCount = result.getWaterlevelCount(); gernotbelger@9205: mschaefer@9229: if ((access.getRiverside() == RiversideChoiceKey.LEFT) || (access.getRiverside() == RiversideChoiceKey.BOTH)) mschaefer@9229: facets.add(FloodHeightProcessor.createFloodHeightFacet(context, hash, this.id, result, 0, resultIndex)); mschaefer@9229: if ((access.getRiverside() == RiversideChoiceKey.RIGHT) || (access.getRiverside() == RiversideChoiceKey.BOTH)) mschaefer@9229: facets.add(FloodHeightProcessor.createFloodHeightFacet(context, hash, this.id, result, 1, resultIndex)); gernotbelger@9205: gernotbelger@9205: for (int j = 0; j < waterlevelCount; j++) { gernotbelger@9205: mschaefer@9252: // final String waterlevelLabel = result.getMainValueLabel(j); gernotbelger@9205: // FIXME: use label as label for theme gernotbelger@9205: gernotbelger@9215: // final int facetIndex, final int resultIndex, final int dataIndex 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@9252: final String nameW = Resources.getMsg(context.getMeta(), "sinfo.chart.flood_duration.curve.w"); mschaefer@9252: final String nameQ = Resources.getMsg(context.getMeta(), "sinfo.chart.flood_duration.curve.q"); mschaefer@9252: facets.add(FloodDurationCurveProcessor.createFloodDurationWCurveFacet(context, hash, this.id, result, 0, resultIndex, nameW)); mschaefer@9252: facets.add(FloodDurationCurveProcessor.createFloodDurationQCurveFacet(context, hash, this.id, result, 1, resultIndex, nameQ)); mschaefer@9257: if (waterlevelCount >= 1) { mschaefer@9257: facets.add(FloodDurationCurveProcessor.createMainValuesWFacet(context, hash, this.id, result, 0, resultIndex, mschaefer@9257: Resources.getMsg(context.getMeta(), "sinfo.chart.flood_duration.curve.mainw"))); mschaefer@9257: facets.add(FloodDurationCurveProcessor.createMainValuesQFacet(context, hash, this.id, result, 1, resultIndex, mschaefer@9257: Resources.getMsg(context.getMeta(), "sinfo.chart.flood_duration.curve.mainq"))); mschaefer@9257: } mschaefer@9259: facets.add(FloodDurationCurveProcessor.createInfrastructureWFacet(context, hash, this.id, result, 0, resultIndex, mschaefer@9259: Resources.getMsg(context.getMeta(), "sinfo.chart.flood_duration.curve.facet.infrastructure"))); mschaefer@9252: 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: }