Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java @ 4902:e1566938d04c
Added new functions to datacage templating language.
* get minimum of location/distance:
dc:fromValue($ld_mode, $ld_locations, $ld_from)
- returns -Double.MAX_VALUE if no min exists.
* get maximum of location/distance:
dc:toValue($ld_mode, $ld_locations, $ld_to)
- returns Double.MAX_VALUE if no max exists.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Tue, 29 Jan 2013 17:11:26 +0100 |
parents | d9af29a4bb85 |
children |
line wrap: on
line source
package de.intevation.flys.artifacts.states; import gnu.trove.TDoubleArrayList; import org.apache.log4j.Logger; import org.w3c.dom.Element; import de.intevation.artifacts.Artifact; import de.intevation.artifacts.CallContext; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.artifactdatabase.data.StateData; import de.intevation.flys.artifacts.FLYSArtifact; /** * This state is used to realize the input of multiple locations as string. * * The string should be a whitespace separated list of double values where each * double value represents a location. * * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class LocationSelect extends LocationDistanceSelect { /** The logger used in this class.*/ private static Logger logger = Logger.getLogger(LocationSelect.class); public LocationSelect() { } /** UI Provider (which input method should the client provide to user. */ @Override protected String getUIProvider() { return "location_panel"; } @Override protected Element[] createItems( XMLUtils.ElementCreator cr, Artifact artifact, String name, CallContext context) { double[] minmax = getMinMax(artifact); double minVal = Double.MIN_VALUE; double maxVal = Double.MAX_VALUE; if (minmax != null) { minVal = minmax[0]; maxVal = minmax[1]; } else { logger.warn("Could not read min/max distance values!"); } if (name.equals(LOCATIONS)) { Element min = createItem( cr, new String[] {"min", new Double(minVal).toString()}); Element max = createItem( cr, new String[] {"max", new Double(maxVal).toString()}); return new Element[] { min, max }; } return null; } /** Validates data from artifact. */ @Override public boolean validate(Artifact artifact) throws IllegalArgumentException { logger.debug("LocationSelect.validate"); FLYSArtifact flys = (FLYSArtifact) artifact; StateData data = getData(flys, LOCATIONS); String locationStr = data != null ? (String) data.getValue() : null; if (locationStr == null || locationStr.length() == 0) { logger.error("No locations given."); throw new IllegalArgumentException("error_empty_state"); } double[] minmax = getMinMax(artifact); double[] mm = extractLocations(locationStr); logger.debug("Inserted min location: " + mm[0]); logger.debug("Inserted max location: " + mm[mm.length-1]); return validateBounds(minmax[0], minmax[1], mm[0], mm[mm.length-1], 0d); } /** * This method takes a string that consist of whitespace separated double * values and returns the double values as array. * * @param locationStr The locations inserted in this state. * * @return the locations as array. */ protected double[] extractLocations(String locationStr) { String[] tmp = locationStr.split(" "); TDoubleArrayList locations = new TDoubleArrayList(); for (String l: tmp) { try { locations.add(Double.parseDouble(l)); } catch (NumberFormatException nfe) { logger.warn(nfe, nfe); } } locations.sort(); return locations.toNativeArray(); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :