view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java @ 2089:0da8874bd378

Added initial state to map artifact to be able to advance and step back. The map artifact overrides describe() to have the complete UI information in the describe response document. flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Fri, 06 Jan 2012 12:02:10 +0000
parents 853cd2120d69
children 6e67b5dd8c4c
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);

    /** The name of the StateData object that stores the location string.*/
    public static final String FIELD_LOCATIONS = "ld_locations";


    public LocationSelect() {
    }


    @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(FIELD_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;
    }


    @Override
    public boolean validate(Artifact artifact)
    throws IllegalArgumentException
    {
        logger.debug("LocationSelect.validate");

        FLYSArtifact flys = (FLYSArtifact) artifact;
        StateData    data = getData(flys, FIELD_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 :

http://dive4elements.wald.intevation.org