view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhState.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents ee5ce13016ed
children 23945061daec
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.artifacts.sinfo.tkhstate;

import java.util.List;

import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.ChartArtifact;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.model.Calculation;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.DataFacet;
import org.dive4elements.river.artifacts.model.EmptyFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.ReportFacet;
import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
import org.dive4elements.river.artifacts.sinfo.common.D50Processor;
import org.dive4elements.river.artifacts.sinfo.common.FlowDepthProcessor;
import org.dive4elements.river.artifacts.sinfo.common.TauProcessor;
import org.dive4elements.river.artifacts.sinfo.common.TkhProcessor;
import org.dive4elements.river.artifacts.sinfo.common.VelocityProcessor;
import org.dive4elements.river.artifacts.states.DefaultState;

/** State in which a waterlevel has been calculated. */
public class TkhState extends DefaultState {

    /// ** The log that is used in this state. */
    // private static Logger log = Logger.getLogger(FlowDepthState.class);

    private static final long serialVersionUID = 1L;

    /**
     * From this state can only be continued trivially.
     */
    @Override
    protected String getUIProvider() {
        return "continue";
    }

    @Override
    public Object computeFeed(final D4EArtifact artifact, final String hash, final CallContext context, final List<Facet> facets, final Object old) {
        // FIXME: why is this necessary?
        if (artifact instanceof ChartArtifact) {
            facets.add(new EmptyFacet());
            return null;
        }

        return compute((SINFOArtifact) artifact, context, hash, facets, old);
    }

    @Override
    public Object computeAdvance(final D4EArtifact artifact, final String hash, final CallContext context, final List<Facet> facets, final Object old) {
        if (artifact instanceof ChartArtifact) {
            facets.add(new EmptyFacet());
            return null;
        }
        return compute((SINFOArtifact) artifact, context, hash, facets, old);
    }

    /**
     * Compute result or returned object from cache, create facets.
     *
     * @param old
     *            Object that was cached.
     */
    private Object compute(final SINFOArtifact sinfo, final CallContext context, final String hash, final List<Facet> facets, final Object old) {

        final CalculationResult res = doCompute(sinfo, context, old);

        if (facets == null)
            return res;

        final TkhCalculationResults results = (TkhCalculationResults) res.getData();

        /* add themes for chart, for each result */
        final List<TkhCalculationResult> resultList = results.getResults();
        for (int index = 0; index < resultList.size(); index++) {

            final TkhCalculationResult result = resultList.get(index);

            facets.add(TkhProcessor.createTkhFacet(context, hash, this.id, result, index));

            facets.add(FlowDepthProcessor.createFlowDepthFilteredFacet(context, hash, this.id, result, index));
            facets.add(FlowDepthProcessor.createFlowDepthRawFacet(context, hash, this.id, result, index));

            facets.add(VelocityProcessor.createVelocityFacet(context, hash, this.id, result, index));
            facets.add(D50Processor.createD50Facet(context, hash, this.id, result, index));
            facets.add(TauProcessor.createTauFacet(context, hash, this.id, result, index));
        }

        if (!resultList.isEmpty()) {
            facets.add(new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id));
            facets.add(new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id));
        }

        final Calculation report = res.getReport();

        if (report.hasProblems())
            facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id));

        return res;
    }

    private CalculationResult doCompute(final SINFOArtifact sinfo, final CallContext context, final Object old) {
        if (old instanceof CalculationResult)
            return (CalculationResult) old;

        return new TkhCalculation(context).calculate(sinfo);
    }
}

http://dive4elements.wald.intevation.org