view artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java @ 9425:3f49835a00c3

Extended CrossSectionFacet so it may fetch different data from within the artifact result. Also allows to have acces to the potentially already computed artifact result via its normal computation cache.
author gernotbelger
date Fri, 17 Aug 2018 15:31:02 +0200
parents 9744ce3c3853
children 7d7aa54afe0c
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.states.fixation;

import java.text.DateFormat;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang.math.DoubleRange;
import org.apache.log4j.Logger;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.FixRealizingAccess;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.CrossSectionWaterLineFacet;
import org.dive4elements.river.artifacts.model.DataFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.ReportFacet;
import org.dive4elements.river.artifacts.model.WQCKms;
import org.dive4elements.river.artifacts.model.WQKms;
import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculation;
import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult;
import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet;
import org.dive4elements.river.artifacts.model.fixings.FixResultColumn;
import org.dive4elements.river.artifacts.model.fixings.FixResultColumns;
import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet;
import org.dive4elements.river.artifacts.model.fixings.FixWaterlevelFacet;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.artifacts.states.DefaultState;
import org.dive4elements.river.utils.Formatter;

/**
 * State to compute the fixation realizing (vollmer) results.
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class FixRealizingCompute extends DefaultState implements FacetTypes {

    private static final long serialVersionUID = 1L;

    /** The log used in this class. */
    private static Logger log = Logger.getLogger(FixRealizingCompute.class);

    public static final String I18N_WQ_CURVE = "fix.vollmer.wq.curve";

    /**
     * The default constructor that initializes an empty State object.
     */
    public FixRealizingCompute() {
    }

    @Override
    public Object computeAdvance(final D4EArtifact artifact, final String hash, final CallContext context, final List<Facet> facets, final Object old) {
        log.debug("FixRealizingCompute.computeAdvance");

        CalculationResult res;

        final FixRealizingAccess access = new FixRealizingAccess(artifact);

        if (old instanceof CalculationResult) {
            res = (CalculationResult) old;
        } else {
            final FixRealizingCalculation calc = new FixRealizingCalculation(access);
            res = calc.calculate();
        }

        if (facets == null) {
            return res;
        }

        if (res.getReport().hasProblems()) {
            facets.add(new ReportFacet());
        }

        final String stateId = getID();
        final CallMeta meta = context.getMeta();

        final FixRealizingResult fixRes = (FixRealizingResult) res.getData();
        final WQKms[] wqkms = fixRes != null ? fixRes.getWQKms() : new WQKms[0];

        for (int i = 0; i < wqkms.length; i++) {
            String nameW = null;
            String nameQ = null;

            if (access.isQ()) {
                nameQ = wqkms[i].getName();
                nameW = "W(" + nameQ + ")";
            } else {
                nameW = wqkms[i].getName();
                nameQ = "Q(" + nameW + ")";
            }

            facets.add(new FixWaterlevelFacet(i, FIX_WQ_LS, nameW, ComputeType.ADVANCE, hash, stateId));
            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, stateId));
            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, stateId));
            facets.add(new CrossSectionWaterLineFacet(i, nameW, ComputeType.ADVANCE, hash, stateId, Integer.valueOf(i)));

            // XXX: THIS CAN NOT HAPPEN! REMOVE IT!
            if (wqkms[i] instanceof WQCKms) {
                final String nameC = nameW.replace("benutzerdefiniert", "benutzerdefiniert [korrigiert]");
                facets.add(new FixWaterlevelFacet(i, DISCHARGE_LONGITUDINAL_C, nameC));
            }
        }

        int facetIndex = 0;

        if (fixRes != null && wqkms.length > 0) {

            final DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy");
            final UniqueDateFormatter cf = new UniqueDateFormatter(df);

            final FixResultColumns columns = fixRes.getFixResultColumns();
            final Collection<FixResultColumn> fixEvents = columns.getSortedColumns();
            for (final FixResultColumn event : fixEvents) {

                final String facetDescription = cf.format(event.getDate());
                final DoubleRange stationRange = event.getStationRange();

                facets.add(new FixReferenceEventsFacet(facetIndex++, event.getColumnId(), FIX_EVENTS, facetDescription, stationRange));
            }

            facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, stateId));
            facets.add(new DataFacet(WST, "WST data", ComputeType.ADVANCE, hash, stateId));
            facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, hash, stateId));
        }

        facets.add(new DataFacet(AT, "AT data", ComputeType.ADVANCE, hash, stateId));

        if (fixRes != null)
            facets.add(new FixWQCurveFacet(0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " (" + access.getFunction() + ")"));

        return res;
    }
}

http://dive4elements.wald.intevation.org