view artifacts/src/main/java/org/dive4elements/river/artifacts/states/LocationDistanceSelect.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 34dc0163ad2d
children
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 org.apache.log4j.Logger;
import org.dive4elements.artifactdatabase.data.StateData;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.WINFOArtifact;
import org.dive4elements.river.artifacts.access.RangeAccess;
import org.dive4elements.river.artifacts.resources.Resources;

/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class LocationDistanceSelect extends ComputationRangeState {

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

    /** The name of the 'mode' field. */
    public static final String MODE = "ld_mode";

    /** The name of the 'locations' field. */
    public static final String LOCATIONS = "ld_locations";

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

    @Override
    protected String getUIProvider() {
        return "location_distance_panel";
    }

    /** Validates the range (or location). */
    @Override
    public boolean validate(final Artifact artifact) throws IllegalArgumentException {
        log.debug("LocationDistanceSelect.validate");

        final D4EArtifact flys = (D4EArtifact) artifact;
        final StateData mode = getData(flys, MODE);
        final String mValue = mode != null ? (String) mode.getValue() : null;
        if (mValue != null) {
            if (mValue.equals("distance")) {
                return super.validate(flys);
            } else {
                return validateLocations(flys);
            }
        }
        return false;
    }

    /** Validate selected locations. */
    protected boolean validateLocations(final D4EArtifact flys) throws IllegalArgumentException {
        final StateData dValues = getData(flys, LOCATIONS);
        final String values = dValues != null ? (String) dValues.getValue() : null;

        if (values == null || values.length() == 0) {
            throw new IllegalArgumentException("error_empty_state");
        }

        final double[] absMinMax = getMinMax(flys);
        final double[] relMinMax = getMinMaxFromString(values);

        if (relMinMax[0] < absMinMax[0] || relMinMax[0] > absMinMax[1]) {
            throw new IllegalArgumentException("error_feed_from_out_of_range");
        }

        if (relMinMax[1] > absMinMax[1] || relMinMax[1] < absMinMax[0]) {
            throw new IllegalArgumentException("error_feed_to_out_of_range");
        }

        return true;
    }

    /**
     * Extracts the min/max values from String <i>s</i>. An
     * IllegalArgumentException is thrown if there is a value that throws a
     * NumberFormatException.
     *
     * @param s
     *            String that contains whitespace separated double values.
     *
     * @return a 2dmin array [min,max].
     */
    public static double[] getMinMaxFromString(final String s) throws IllegalArgumentException {
        final String[] values = s.split(" ");

        final double[] minmax = new double[] { Double.MAX_VALUE, -Double.MAX_VALUE };

        for (final String v : values) {
            try {
                final double value = Double.valueOf(v);

                minmax[0] = minmax[0] < value ? minmax[0] : value;
                minmax[1] = minmax[1] > value ? minmax[1] : value;
            }
            catch (final NumberFormatException nfe) {
                throw new IllegalArgumentException("error_invalid_double_value");
            }
        }

        return minmax;
    }

    public static double[] getLocations(final WINFOArtifact flys) {
        final RangeAccess ra = new RangeAccess(flys);
        return ra.getLocations();
    }

    @Override
    protected String getTitle(final CallContext context) {
        // REMARK: that is how it should be: return Resources.getMsg(context.getMeta(), getID());
        return Resources.getMsg(context.getMeta(), "state.title.location_distance_state");
    }

}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org