Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/BedQualityPeriodsSelect.java @ 8653:dbec49147f54
(issue1755) Do not create interpolated themes and disable export of non interpolatable data.
Due to the fact that data can contain NaN's which will be filtered out
before creating the interpolator this requires the actual check
for interpolatable data when data is set in the ResultValue
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Wed, 01 Apr 2015 17:10:03 +0200 |
parents | 22f01b7e802e |
children | 8dbb969091c5 |
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.minfo; import java.util.List; import java.util.Date; import java.util.TreeSet; import java.text.DateFormat; import org.apache.log4j.Logger; import org.dive4elements.river.artifacts.states.DefaultState; import org.w3c.dom.Element; import org.dive4elements.river.artifacts.access.RangeAccess; import org.dive4elements.river.artifacts.access.BedQualityAccess; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.model.minfo.BedOverview; import org.dive4elements.river.artifacts.model.minfo.BedOverviewFactory; import org.dive4elements.river.artifacts.model.minfo.BedloadOverview; import org.dive4elements.river.artifacts.model.minfo.BedloadOverviewFactory; import org.dive4elements.river.artifacts.model.DateRange; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.utils.Formatter; import org.dive4elements.river.utils.KMIndex; import org.dive4elements.artifacts.common.utils.XMLUtils; import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifactdatabase.data.StateData; public class BedQualityPeriodsSelect extends DefaultState { /** The log used in this class. */ private static Logger log = Logger.getLogger(BedQualityPeriodsSelect.class); private static final String I18N_NO_DATA = "state.minfo.bed.error.no_data"; private static final String I18N_NO_DATA_FOR_PERIOD = "state.minfo.bed.error.no_data_for_period"; /** * The default constructor that initializes an empty State object. */ public BedQualityPeriodsSelect() { } /** Get either the start and end date of the data at the current position. */ protected Long[] getDataMinMaxDate(Artifact artifact) { D4EArtifact arti = (D4EArtifact) artifact; RangeAccess access = new RangeAccess(arti); double a = access.getFrom(true); double b = access.getTo(true); BedOverview overview = BedOverviewFactory.getOverview(access.getRiverName()); BedloadOverview overview2 = BedloadOverviewFactory.getOverview(access.getRiverName()); /* Filter is not implemented and only checks if a complete * KMIndex list is acceptable or not. So KMFiltering wont work */ KMIndex<List<Date>> entries = overview.filter(BedOverview.ACCEPT); KMIndex<List<Date>> loads = overview2.filter(BedloadOverview.ACCEPT); TreeSet<Date> allDates = new TreeSet<Date>(); for (int i = 0; i < entries.size(); i++) { if (entries.get(i).getKm() >= a && entries.get(i).getKm() <= b) { allDates.addAll(entries.get(i).getValue()); } } for (int i = 0; i < loads.size(); i++) { if (loads.get(i).getKm() >= a && loads.get(i).getKm() <= b) { allDates.addAll(loads.get(i).getValue()); } } if (allDates.size() < 2) { return null; } return new Long[] {allDates.first().getTime(), allDates.last().getTime()}; } @Override protected Element[] createItems( XMLUtils.ElementCreator cr, Artifact artifact, String name, CallContext context) { if (!name.equals("periods")) { return null; } Long[] values = getDataMinMaxDate(artifact); if (values == null) { return null; } Element def = createItem( cr, new String[] {"default", values[0].toString() + "," + values[1].toString()}); return new Element[] { def }; } @Override public void validate(Artifact artifact, CallContext context) throws IllegalArgumentException { D4EArtifact arti = (D4EArtifact) artifact; BedQualityAccess access = new BedQualityAccess(arti, context); Long[] minMax = getDataMinMaxDate(artifact); if (minMax == null) { throw new IllegalArgumentException(Resources.getMsg(context.getMeta(), I18N_NO_DATA, I18N_NO_DATA)); } long min = minMax[0]; long max = minMax[1]; for (DateRange range: access.getDateRanges()) { long a = range.getFrom().getTime(); long b = range.getTo().getTime(); log.debug("min max a b " + min + " " + max + " " + a + " " + b); if (b < min || a > max || a > b) { DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); throw new IllegalArgumentException(Resources.getMsg(context.getMeta(), I18N_NO_DATA_FOR_PERIOD, I18N_NO_DATA_FOR_PERIOD, new Object[] {df.format(range.getFrom()), df.format(range.getTo())})); } } } @Override protected String getUIProvider() { return "bedquality_periods_select"; } }