view artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java @ 9415:9744ce3c3853

Rework of fixanalysis computation and dWt and WQ facets. Got rid of strange remapping and bitshifting code by explicitely saving the column information and using it in the facets. The facets also put the valid station range into their xml-metadata
author gernotbelger
date Thu, 16 Aug 2018 16:27:53 +0200
parents ddcd52d239cd
children 3f49835a00c3
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 id = 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, id));
            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, id));
            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, id));
            facets.add(new CrossSectionWaterLineFacet(i, nameW));

            // 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, id));
            facets.add(new DataFacet(WST, "WST data", ComputeType.ADVANCE, hash, id));
            facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, hash, id));
        }

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

        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