view artifacts/src/main/java/org/dive4elements/river/artifacts/states/SoundingsSelect.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 2da486c7c05f
children ba3ad54edbae
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;

import java.text.NumberFormat;
import java.util.Collections;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.common.model.KVP;
import org.dive4elements.artifacts.common.utils.XMLUtils;
import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.model.BedHeight;
import org.dive4elements.river.model.River;
import org.dive4elements.river.utils.Formatter;
import org.dive4elements.river.utils.RiverUtils;
import org.w3c.dom.Element;

public abstract class SoundingsSelect extends DefaultState {

    private static final String SOUNDINGS = "soundings";

    public static final String PREFIX_SINGLE = "single-";

    /** Private log. */
    private static final Logger log = Logger.getLogger(SoundingsSelect.class);

    @Override
    protected final void appendItems(final Artifact artifact, final ElementCreator creator, final String name, final CallContext context,
            final Element select) {
        try {
            creator.addAttr(select, "type", "multiattribute", true);

            appendMeta(creator, select);

            getOptions(artifact, name, context, creator, select);
        }
        catch (final IllegalArgumentException iae) {
            log.warn("Illegal argument", iae);
        }
    }

    private static Element order(final ElementCreator creator, final String name, final String order) {
        final Element element = creator.create(name);
        creator.addAttr(element, "order", order, false);
        return element;
    }

    private void appendMeta(final ElementCreator creator, final Element select) {

        final Element meta = creator.create("meta");
        meta.appendChild(order(creator, "year", "0"));
        meta.appendChild(order(creator, "value", "1"));
        meta.appendChild(order(creator, "analyzed_range", "2"));
        meta.appendChild(order(creator, "label", "3"));
        meta.appendChild(order(creator, "minfo_type", "4"));

        select.appendChild(meta);

    }

    private KVP<String, String>[] getOptions(final Artifact artifact, final String parameterName, final CallContext context, final ElementCreator creator,
            final Element select) throws IllegalArgumentException {
        log.debug("Get options for parameter: '" + parameterName + "'");

        if (!testParameterName(parameterName)) {
            throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
        }

        final River river = RiverUtils.getRiver((D4EArtifact) artifact);
        final double lo = ((D4EArtifact) artifact).getDataAsDouble("ld_from");
        final double hi = ((D4EArtifact) artifact).getDataAsDouble("ld_to");

        final double kmLo = Math.min(lo, hi);
        final double kmHi = Math.max(lo, hi);

        appendSingles(river, kmLo, kmHi, creator, select, context);

        final List<KVP<String, String>> kvp = Collections.<KVP<String, String>>emptyList();
        return kvp.toArray(new KVP[kvp.size()]);
    }

    private void appendSingles(final River river, final double kmLo, final double kmHi, final ElementCreator creator, final Element select,
            final CallContext context) {
        final List<BedHeight> singles = BedHeight.getBedHeights(river, kmLo, kmHi);

        if (singles != null) {
            final int size = singles.size();

            log.debug("Found " + size + " singles.");

            final NumberFormat nf = Formatter.getCalculationKm(context.getMeta());
            for (int i = 0; i < size; i++) {
                final BedHeight s = singles.get(i);

                final String id = PREFIX_SINGLE + s.getId();
                final String value = s.getDescription();

                final Integer year = s.getYear();
                final Element item = creator.create("item");
                creator.addAttr(item, "label", value, true);
                creator.addAttr(item, "value", id, true);
                creator.addAttr(item, "analyzed_range", nf.format(s.getRange().getA()) + " - " + nf.format(s.getRange().getB()));
                creator.addAttr(item, "year", year != null ? s.getYear().toString() : "");
                creator.addAttr(item, "minfo_type", s.getType().getName());
                select.appendChild(item);
            }
        }
        if (log.isDebugEnabled()) {
            log.debug("appended singles");
            log.debug(XMLUtils.toString(select));
        }
    }

    @Override
    protected final Element createStaticData(final D4EArtifact flys, final ElementCreator creator, final CallContext cc, final String name, final String value,
            final String type) {
        final Element data = creator.create("data");
        creator.addAttr(data, "name", name, true);
        creator.addAttr(data, "type", type, true);
        creator.addAttr(data, "label", Resources.getMsg(cc.getMeta(), name, name), true);

        final String[] values = value.split(";");

        for (final String val : values) {
            final Element item = creator.create("item");
            creator.addAttr(item, "value", val, true);
            creator.addAttr(item, "label", getLabelFor(cc, name, val), true);

            data.appendChild(item);
        }

        return data;
    }

    private String getLabelFor(final CallContext cc, final String parameterName, final String value) throws IllegalArgumentException {
        if (!testParameterName(parameterName)) {
            throw new IllegalArgumentException("Invalid parameter for state: '" + parameterName + "'");
        }

        if (value.indexOf(PREFIX_SINGLE) >= 0) {
            return getLabelForSingle(cc, value);
        }
        return value;
    }

    private String getLabelForSingle(final CallContext cc, final String value) {
        final String id = value.replace(PREFIX_SINGLE, "");
        try {
            final BedHeight s = BedHeight.getBedHeightById(Integer.parseInt(id));

            if (s != null) {
                return s.getDescription();
            } else {
                return "no value for '" + id + "'";
            }
        }
        catch (final NumberFormatException nfe) {
            log.warn("Could not parse id from string '" + id + "'", nfe);
        }

        return "n.A.";
    }

    /**
     * This method might be used to test, if a parameter name
     * is handled by this state.
     *
     * @param parameterName
     *            The name of a parameter.
     *
     * @return true, if parameterName is one of <i>MAIN_CHANNEL</i> or
     *         <i>TOTAL_CHANNEL</i>. Otherwise false.
     */
    private boolean testParameterName(final String parameterName) {
        if (parameterName == null || parameterName.length() == 0) {
            return false;
        } else if (parameterName.equals(SOUNDINGS)) {
            return true;
        } else {
            return false;
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org