view artifacts/src/main/java/org/dive4elements/river/artifacts/states/LocationDistanceSelect.java @ 9175:34dc0163ad2d

DistancePanel Berechnungsstrecke->Darstellungsbereich Refactoring
author gernotbelger
date Mon, 25 Jun 2018 17:58:11 +0200
parents 07df414d5d88
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