view flys-artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java@1b73b731f7bd
children
line wrap: on
line source
package org.dive4elements.river.artifacts.states;

import java.text.NumberFormat;

import java.util.List;

import org.apache.log4j.Logger;
import org.w3c.dom.Element;

import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator;
import org.dive4elements.river.artifacts.FLYSArtifact;
import org.dive4elements.river.artifacts.WINFOArtifact;
import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess;
import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.DataFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.HistoricalDischargeCurveFacet;
import org.dive4elements.river.artifacts.model.HistoricalDischargeData;
import org.dive4elements.river.artifacts.model.HistoricalDischargeDifferenceFacet;
import org.dive4elements.river.artifacts.model.HistoricalDischargeFacet;
import org.dive4elements.river.artifacts.model.HistoricalDischargeWQFacet;
import org.dive4elements.river.artifacts.model.HistoricalWQKms;
import org.dive4elements.river.artifacts.model.HistoricalWQTimerange;
import org.dive4elements.river.artifacts.model.ReportFacet;
import org.dive4elements.river.artifacts.model.WQKms;
import org.dive4elements.river.artifacts.model.WQTimerange;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.model.TimeInterval;


/**
 * State to calculate historical discharge curves.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class HistoricalDischargeComputeState
extends    DefaultState
implements FacetTypes {

    private static final Logger logger = Logger
        .getLogger(HistoricalDischargeComputeState.class);

    public static final String DEFAULT_UNIT = "cm";
    public static final String I18N_WQ_CURVE_FACET_RANGE = "historical_discharge.wq.curve_range";
    public static final String I18N_WQ_CURVE_FACET_SINCE = "historical_discharge.wq.curve_since";

    @Override
    protected void appendItems(Artifact artifact, ElementCreator creator,
        String name, CallContext context, Element select) {
        // TODO IMPLEMENT ME
    }

    @Override
    public Object computeAdvance(FLYSArtifact artifact, String hash,
        CallContext context, List<Facet> facets, Object old) {
        logger.debug("HistoricalDischargeComputeState.computeAdvance");

        WINFOArtifact winfo = (WINFOArtifact) artifact;

        CalculationResult res = old instanceof CalculationResult ? (CalculationResult) old
            : winfo.getHistoricalDischargeData();

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

        if (res.getReport().hasProblems()) {
            facets.add(new ReportFacet(ComputeType.ADVANCE, hash, id));
        }

        HistoricalDischargeData data = (HistoricalDischargeData) res.getData();
        HistoricalDischargeAccess access = new HistoricalDischargeAccess(
            artifact);

        WQTimerange[] wqts = (WQTimerange[]) data.getWQTimeranges();
        if (wqts != null && wqts.length > 0) {
            facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE,
                hash, id));

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

            prepareFacets(facets, wqts, access);
        }

        WQKms[] wqs = (WQKms[]) data.getWQs();
        if (wqs != null && wqs.length > 0) {
            prepareWQFacets(context, facets, wqs, access, hash);
        }

        return res;
    }

    protected void prepareFacets(List<Facet> facets, WQTimerange[] wqts,
        HistoricalDischargeAccess access) {
        int i = 0;

        for (WQTimerange wqt : wqts) {
            logger.debug("Prepare facet for: " + wqt.getName());

            EvaluationMode evalMode = access.getEvaluationMode();
            if (evalMode == EvaluationMode.W) {
                facets.add(new HistoricalDischargeFacet(i,
                    HISTORICAL_DISCHARGE_Q, createFacetTitle(wqt)));

                if (wqt instanceof HistoricalWQTimerange) {
                    logger
                        .debug("Create another facet for historical differences.");

                    // TODO CREATE BETTER TITLE FOR FACETS (issue1180)
                    facets.add(new HistoricalDischargeDifferenceFacet(i,
                        HISTORICAL_DISCHARGE_Q_DIFF, "DIFF: " + wqt.getName()));
                }
            }
            else {
                facets.add(new HistoricalDischargeFacet(i,
                    HISTORICAL_DISCHARGE_W, createFacetTitle(wqt)));

                if (wqt instanceof HistoricalWQTimerange) {
                    logger
                        .debug("Create another facet for historical differences.");

                    // TODO CREATE BETTER TITLE FOR FACETS
                    facets.add(new HistoricalDischargeDifferenceFacet(i,
                        HISTORICAL_DISCHARGE_W_DIFF, "DIFF: " + wqt.getName()));
                }
            }

            i++;
        }
    }

    protected void prepareWQFacets(CallContext cc, List<Facet> facets,
        WQKms[] wqs, HistoricalDischargeAccess access, String hash) {
        double[] ws = access.getWs();
        double[] qs = access.getQs();

        NumberFormat format = NumberFormat.getInstance(
                        Resources.getLocale(cc.getMeta()));
        for (int k = 0; k < ws.length; k++) {
            facets.add(new HistoricalDischargeWQFacet(k,
                HISTORICAL_DISCHARGE_WQ_W, "W=" + format.format(ws[k]), ComputeType.ADVANCE,
                hash, getID(), ws[k]));
        }

        for (int k = 0; k < qs.length; k++) {
            facets.add(new HistoricalDischargeWQFacet(k,
                HISTORICAL_DISCHARGE_WQ_Q, "Q=" + format.format(qs[k]), ComputeType.ADVANCE,
                hash, getID(), qs[k]));
        }

        int idx = 0;
        for (WQKms wqkms : wqs) {
            String title = null;
            if (wqkms instanceof HistoricalWQKms) {
                title = createDischargeCurveTitle(cc, (HistoricalWQKms) wqkms);
            }
            else {
                title = wqkms.getName();
            }

            facets.add(new HistoricalDischargeCurveFacet(idx,
                HISTORICAL_DISCHARGE_WQ_CURVE, title, ComputeType.ADVANCE,
                getID(), hash));
            idx++;
        }
    }

    /** Create title for a Discharge-curve, including date. */
    protected String createDischargeCurveTitle(CallContext cc,
        HistoricalWQKms wqkms) {
        TimeInterval timeInterval = wqkms.getTimeInterval();

        if (timeInterval.getStopTime() != null) {
            return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_RANGE,
                I18N_WQ_CURVE_FACET_RANGE, timeInterval.getStartTime(),
                timeInterval.getStopTime());
        }
        else {
            return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_SINCE,
                I18N_WQ_CURVE_FACET_SINCE, timeInterval.getStartTime());
        }
    }


    /** Create string for facets name/description. */
    protected String createFacetTitle(WQTimerange wqt) {
        String name = wqt.getName();

        return name != null && name.indexOf("W") >= 0 ? createFacetTitleW(wqt)
            : createFacetTitleQ(wqt);
    }

    protected String createFacetTitleW(WQTimerange wqt) {
        String name = wqt.getName();
        return name + " " + DEFAULT_UNIT;
    }

    protected String createFacetTitleQ(WQTimerange wqt) {
        return wqt.getName();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org