view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java @ 4241:49cb65d5932d

Improved the historical discharge calculation. The calculation now creates new HistoricalWQKms (new subclass of WQKms). Those WQKms are used to create new facets from (new) type 'HistoricalDischargeCurveFacet'. The chart generator is improved to support those facets.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 24 Oct 2012 14:34:35 +0200
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 :

http://dive4elements.wald.intevation.org