view artifacts/src/main/java/org/dive4elements/river/artifacts/states/SoundingsSelect.java @ 8452:b9a8463ac636

(issue1732) When duplication wsplgen artificats fix shapefile layers The shapefile layers are copied but still contained the old names and paths and the wms layer refered to layers from the old artifact. This was broken. Now the old artificat id is replaced by the new artifact id in the mapfiles. Duplication most wsplgen artifacts should now work.
author Andre Heinecke <andre.heinecke@intevation.de>
date Tue, 28 Oct 2014 18:52:35 +0100
parents e4606eae8ea5
children 6d8d7425a6b5
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.model.BedHeightSingle;
import org.dive4elements.river.model.River;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.utils.Formatter;
import org.dive4elements.river.utils.RiverUtils;
import org.w3c.dom.Element;


public class SoundingsSelect extends DefaultState {

    public static final String SOUNDINGS = "soundings";

    public static final String PREFIX_SINGLE = "single-";

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


    @Override
    public String getUIProvider() {
        return "parameter-matrix";
    }

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

            appendMeta(creator, select);

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

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

    private void appendMeta(ElementCreator creator, Element select) {

        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);

    }

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

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

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

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

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

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


    protected void appendSingles(
        River river,
        double kmLo,
        double kmHi,
        ElementCreator creator,
        Element select,
        CallContext context
    ) {
        List<BedHeightSingle> singles =
            BedHeightSingle.getBedHeightSingles(river, kmLo, kmHi);

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

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

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

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

                Integer year = s.getYear();
                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 Element createStaticData(
        D4EArtifact   flys,
        ElementCreator creator,
        CallContext    cc,
        String         name,
        String         value,
        String         type
    ) {
        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);

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

        for (String val: values) {
            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;
    }

    protected String getLabelFor(
        CallContext cc,
        String      parameterName,
        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;
    }


    protected String getLabelForSingle(CallContext cc, String value) {
        String id = value.replace(PREFIX_SINGLE, "");
        try {
            BedHeightSingle s = BedHeightSingle.getBedHeightSingleById(
                Integer.parseInt(id));

            if (s != null) {
                return s.getDescription();
            }
            else {
                return "no value for '" + id + "'";
            }
        }
        catch (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.
     */
    protected boolean testParameterName(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