Mercurial > dive4elements > river
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 :