teichmann@8037: /* Copyright (C) 2014 by Bundesanstalt für Gewässerkunde teichmann@8037: * Software engineering by Intevation GmbH teichmann@8037: * teichmann@8037: * This file is Free Software under the GNU AGPL (>=v3) teichmann@8037: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@8037: * documentation coming with Dive4Elements River for details. teichmann@8037: */ teichmann@8037: package org.dive4elements.river.artifacts.model.minfo; teichmann@8037: teichmann@8037: import java.util.ArrayList; teichmann@8037: import java.util.Calendar; teichmann@8037: import java.util.Date; teichmann@8037: import java.util.List; teichmann@8037: teichmann@8186: import org.dive4elements.river.backend.utils.DateUtil; tom@8180: teichmann@8037: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Value; teichmann@8037: import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Value.Filter; teichmann@8037: teichmann@8037: public final class SedimentLoadDataValueFilter { teichmann@8037: teichmann@8037: private SedimentLoadDataValueFilter() { teichmann@8037: } teichmann@8037: teichmann@8055: public static final class Not implements Filter { teichmann@8055: teichmann@8055: private Filter parent; teichmann@8055: teichmann@8055: public Not(Filter parent) { teichmann@8055: this.parent = parent; teichmann@8055: } teichmann@8055: teichmann@8055: @Override teichmann@8055: public boolean accept(Value value) { teichmann@8055: return !parent.accept(value); teichmann@8055: } teichmann@8055: } // class Not teichmann@8055: teichmann@8037: public static abstract class Composite implements Filter { teichmann@8037: protected List filters; teichmann@8037: teichmann@8037: public Composite() { teichmann@8037: filters = new ArrayList(); teichmann@8037: } teichmann@8037: teichmann@8068: public Composite(Filter filter) { teichmann@8068: this(); teichmann@8068: add(filter); teichmann@8068: } teichmann@8068: teichmann@8055: public Composite add(Filter filter) { teichmann@8037: filters.add(filter); teichmann@8055: return this; teichmann@8037: } teichmann@8037: } teichmann@8037: teichmann@8037: public static final class And extends Composite { teichmann@8037: teichmann@8037: public And() { teichmann@8037: } teichmann@8037: teichmann@8068: public And(Filter filter) { teichmann@8068: super(filter); teichmann@8068: } teichmann@8068: teichmann@8037: @Override teichmann@8037: public boolean accept(Value value) { teichmann@8037: for (Filter filter: filters) { teichmann@8037: if (!filter.accept(value)) { teichmann@8037: return false; teichmann@8037: } teichmann@8037: } teichmann@8037: return true; teichmann@8037: } teichmann@8037: } // class And teichmann@8037: teichmann@8037: public static final class Or extends Composite { teichmann@8037: teichmann@8037: public Or() { teichmann@8037: } teichmann@8037: teichmann@8068: public Or(Composite filter) { teichmann@8068: super(filter); teichmann@8068: } teichmann@8068: teichmann@8037: @Override teichmann@8037: public boolean accept(Value value) { teichmann@8037: for (Filter filter: filters) { teichmann@8037: if (filter.accept(value)) { teichmann@8037: return true; teichmann@8037: } teichmann@8037: } teichmann@8037: return false; teichmann@8037: } teichmann@8037: } // class Or teichmann@8037: teichmann@8037: public static final class Year implements Filter { teichmann@8037: teichmann@8037: private int year; teichmann@8037: teichmann@8037: public Year(int year) { teichmann@8037: this.year = year; teichmann@8037: } teichmann@8037: teichmann@8037: @Override teichmann@8037: public boolean accept(Value value) { teichmann@8037: Calendar cal = Calendar.getInstance(); teichmann@8037: cal.setTime(value.getLoad().getStartTime()); teichmann@8037: return cal.get(Calendar.YEAR) == year; teichmann@8037: } teichmann@8037: } // class Year teichmann@8037: teichmann@8037: public static final class IsEpoch implements Filter { teichmann@8037: teichmann@8037: public static final IsEpoch INSTANCE = new IsEpoch(); teichmann@8037: teichmann@8037: private IsEpoch() { teichmann@8037: } teichmann@8037: teichmann@8037: @Override teichmann@8037: public boolean accept(Value value) { teichmann@8037: return value.getLoad().isEpoch(); teichmann@8037: } teichmann@8037: } // class Year teichmann@8037: teichmann@8037: public static final class TimeRangeIntersects implements Filter { teichmann@8037: teichmann@8037: private Date a; teichmann@8037: private Date b; teichmann@8037: teichmann@8055: public TimeRangeIntersects(int year) { teichmann@8055: this(year, year); teichmann@8055: } teichmann@8055: teichmann@8053: public TimeRangeIntersects(int startYear, int endYear) { tom@8180: this(DateUtil.getStartDateFromYear(Math.min(startYear, endYear)), tom@8180: DateUtil.getEndDateFromYear(Math.max(startYear, endYear))); teichmann@8053: } teichmann@8053: teichmann@8037: public TimeRangeIntersects(Date a, Date b) { teichmann@8037: if (a.after(b)) { teichmann@8037: this.b = a; teichmann@8037: this.a = b; teichmann@8037: } else { teichmann@8037: this.a = a; teichmann@8037: this.b = b; teichmann@8037: } teichmann@8037: } teichmann@8060: teichmann@8037: @Override teichmann@8037: public boolean accept(Value value) { teichmann@8037: Date c = value.getLoad().getStartTime(); teichmann@8037: Date d = value.getLoad().getStopTime(); teichmann@8037: return d == null teichmann@8037: ? c.compareTo(a) >= 0 && c.compareTo(b) <= 0 teichmann@8037: : !(a.after(d) || c.after(b)); teichmann@8037: } teichmann@8037: } // class TimeRangeIntersects teichmann@8060: teichmann@8060: public static final class IsOfficial implements Filter { teichmann@8060: teichmann@8060: public static final IsOfficial INSTANCE = new IsOfficial(); teichmann@8060: teichmann@8060: private IsOfficial() { teichmann@8060: } teichmann@8060: teichmann@8060: @Override teichmann@8060: public boolean accept(Value value) { teichmann@8060: return value.getLoad().getKind() == 1; teichmann@8060: } teichmann@8060: } // class IsOfficial teichmann@8037: } teichmann@8037: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : teichmann@8037: