view artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/BedQualityDistanceSelect.java @ 8682:5102733c4567

issue1755 Prevent out of bounds access when there is no data If there is no data it will default to the complete river. In the following overview you can then see that there is no data. Better then a "Error changing state".
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 13 Apr 2015 11:03:00 +0200
parents 39ce099a6551
children 1116079e6624
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013, 2015 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.minfo;

import java.util.Date;
import java.util.List;

import org.w3c.dom.Element;

import org.apache.log4j.Logger;

import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.RiverAccess;
import org.dive4elements.river.artifacts.states.DistanceSelect;
import org.dive4elements.river.utils.KMIndex;

import org.dive4elements.river.artifacts.model.minfo.BedOverview;
import org.dive4elements.river.artifacts.model.minfo.BedOverviewFactory;

import org.dive4elements.artifacts.common.utils.XMLUtils;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;

import org.dive4elements.artifactdatabase.data.StateData;

/** Extended Distance Select with default values appropiate for BedQuality */
public class BedQualityDistanceSelect extends DistanceSelect {

    private static Logger log = Logger.getLogger(BedQualityDistanceSelect.class);

    /**
     * The default constructor that initializes an empty State object.
     */
    public BedQualityDistanceSelect() {
    }

    @Override
    protected Element createData(
        XMLUtils.ElementCreator cr,
        Artifact    artifact,
        StateData   data,
        CallContext context)
    {
        Element ele = super.createData(cr, artifact, data, context);
        if (!data.getName().equals("ld_from") && !data.getName().equals("ld_to")) {
            return ele;
        }

        D4EArtifact arti = (D4EArtifact) artifact;
        RiverAccess access = new RiverAccess(arti);

        /* Bit of an overkill here but it will be cached and accessed
         * in the next state anyway. */
        BedOverview overview = BedOverviewFactory.getOverview(access.getRiverName());

        if (overview == null) {
            log.warn("No overview found for river '" + access.getRiverName() + "'");
            return ele;
        }

        KMIndex<List<Date>> entries = overview.filter(BedOverview.ACCEPT);
        if (entries.size() == 0) {
            log.warn("No data found for river '" + access.getRiverName() + "'");
            return ele;
        }
        entries.sort();

        if (data.getName().equals("ld_from")) {
            cr.addAttr(ele, "defaultLabel", data.getName(), true);
            cr.addAttr(ele, "defaultValue", Double.toString(entries.get(0).getKm()), true);
        } else if (data.getName().equals("ld_to")) {
            cr.addAttr(ele, "defaultLabel", data.getName(), true);
            cr.addAttr(ele, "defaultValue", Double.toString(entries.get(entries.size()-1).getKm()), true);
        }

        return ele;
    }
}

http://dive4elements.wald.intevation.org