teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.states.minfo; raimund@3751: andre@8625: import java.util.List; andre@8625: import java.util.Date; andre@8625: import java.util.TreeSet; andre@8637: import java.text.DateFormat; andre@8625: raimund@3751: import org.apache.log4j.Logger; raimund@3751: teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState; raimund@3751: andre@8625: import org.w3c.dom.Element; andre@8625: andre@8625: import org.dive4elements.river.artifacts.access.RangeAccess; andre@8637: import org.dive4elements.river.artifacts.access.BedQualityAccess; andre@8625: import org.dive4elements.river.artifacts.D4EArtifact; andre@8625: import org.dive4elements.river.artifacts.model.minfo.BedOverview; andre@8625: import org.dive4elements.river.artifacts.model.minfo.BedOverviewFactory; andre@8625: import org.dive4elements.river.artifacts.model.minfo.BedloadOverview; andre@8625: import org.dive4elements.river.artifacts.model.minfo.BedloadOverviewFactory; andre@8637: import org.dive4elements.river.artifacts.model.DateRange; andre@8637: import org.dive4elements.river.artifacts.resources.Resources; andre@8625: andre@8637: import org.dive4elements.river.utils.Formatter; andre@8625: import org.dive4elements.river.utils.KMIndex; andre@8625: andre@8625: import org.dive4elements.artifacts.common.utils.XMLUtils; andre@8625: import org.dive4elements.artifacts.Artifact; andre@8625: import org.dive4elements.artifacts.CallContext; andre@8625: andre@8625: import org.dive4elements.artifactdatabase.data.StateData; andre@8625: andre@8625: raimund@3751: public class BedQualityPeriodsSelect extends DefaultState { raimund@3751: teichmann@8202: /** The log used in this class. */ teichmann@8202: private static Logger log = Logger.getLogger(BedQualityPeriodsSelect.class); raimund@3751: andre@8637: private static final String I18N_NO_DATA = andre@8637: "state.minfo.bed.error.no_data"; andre@8637: andre@8637: private static final String I18N_NO_DATA_FOR_PERIOD = andre@8637: "state.minfo.bed.error.no_data_for_period"; raimund@3751: raimund@3751: /** raimund@3751: * The default constructor that initializes an empty State object. raimund@3751: */ raimund@3751: public BedQualityPeriodsSelect() { raimund@3751: } raimund@3751: andre@8625: /** Get either the start and end date of the data at the current position. */ andre@8625: protected Long[] getDataMinMaxDate(Artifact artifact) { andre@8625: D4EArtifact arti = (D4EArtifact) artifact; andre@8625: RangeAccess access = new RangeAccess(arti); andre@8625: double a = access.getFrom(); andre@8625: double b = access.getTo(); andre@8625: andre@8625: if (a > b) { andre@8625: double buf = a; andre@8625: a = b; andre@8625: b = buf; andre@8625: } andre@8625: andre@8625: BedOverview overview = BedOverviewFactory.getOverview(access.getRiverName()); andre@8625: BedloadOverview overview2 = BedloadOverviewFactory.getOverview(access.getRiverName()); andre@8625: andre@8625: /* Filter is not implemented and only checks if a complete andre@8625: * KMIndex list is acceptable or not. So KMFiltering wont work */ andre@8625: KMIndex> entries = overview.filter(BedOverview.ACCEPT); andre@8625: KMIndex> loads = overview2.filter(BedloadOverview.ACCEPT); andre@8625: TreeSet allDates = new TreeSet(); andre@8625: andre@8625: for (int i = 0; i < entries.size(); i++) { andre@8625: if (entries.get(i).getKm() >= a && entries.get(i).getKm() <= b) { andre@8625: allDates.addAll(entries.get(i).getValue()); andre@8625: } andre@8625: } andre@8625: for (int i = 0; i < loads.size(); i++) { andre@8625: if (loads.get(i).getKm() >= a && loads.get(i).getKm() <= b) { andre@8625: allDates.addAll(loads.get(i).getValue()); andre@8625: } andre@8625: } andre@8625: if (allDates.size() < 2) { andre@8625: return null; andre@8625: } andre@8625: andre@8625: return new Long[] {allDates.first().getTime(), andre@8625: allDates.last().getTime()}; andre@8625: } andre@8625: andre@8625: @Override andre@8625: protected Element[] createItems( andre@8625: XMLUtils.ElementCreator cr, andre@8625: Artifact artifact, andre@8625: String name, andre@8625: CallContext context) andre@8625: { andre@8625: if (!name.equals("periods")) { andre@8625: return null; andre@8625: } andre@8625: Long[] values = getDataMinMaxDate(artifact); andre@8625: if (values == null) { andre@8625: return null; andre@8625: } andre@8625: Element def = createItem( andre@8625: cr, andre@8625: new String[] {"default", values[0].toString() + "," + values[1].toString()}); andre@8625: andre@8625: return new Element[] { def }; andre@8625: } andre@8625: raimund@3751: @Override andre@8637: public void validate(Artifact artifact, CallContext context) andre@8637: throws IllegalArgumentException { andre@8637: D4EArtifact arti = (D4EArtifact) artifact; andre@8637: BedQualityAccess access = new BedQualityAccess(arti, context); andre@8637: andre@8637: Long[] minMax = getDataMinMaxDate(artifact); andre@8637: if (minMax == null) { andre@8637: throw new IllegalArgumentException(Resources.getMsg(context.getMeta(), andre@8637: I18N_NO_DATA, andre@8637: I18N_NO_DATA)); andre@8637: } andre@8637: andre@8637: long min = minMax[0]; andre@8637: long max = minMax[1]; andre@8637: for (DateRange range: access.getDateRanges()) { andre@8637: long a = range.getFrom().getTime(); andre@8637: long b = range.getFrom().getTime(); andre@8637: if ((a < min || a > max) && andre@8637: ( b < min || b > max)) { andre@8637: DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); andre@8637: throw new IllegalArgumentException(Resources.getMsg(context.getMeta(), andre@8637: I18N_NO_DATA_FOR_PERIOD, andre@8637: I18N_NO_DATA_FOR_PERIOD, andre@8637: new Object[] {df.format(range.getFrom()), andre@8637: df.format(range.getTo())})); andre@8637: } andre@8637: } andre@8637: } andre@8637: andre@8637: @Override raimund@3751: protected String getUIProvider() { raimund@3751: return "bedquality_periods_select"; raimund@3751: } raimund@3751: raimund@3751: }