view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataValueFilter.java @ 8055:cd35b76f1ef8

Sediment load. More off year based calculations.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 18 Jul 2014 13:03:28 +0200
parents 72760ca2fc2b
children 25feef564d09
line wrap: on
line source
/* Copyright (C) 2014 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.model.minfo;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Value;
import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Value.Filter;

public final class SedimentLoadDataValueFilter {

    private SedimentLoadDataValueFilter() {
    }

    public static final class Not implements Filter {

        private Filter parent;

        public Not(Filter parent) {
            this.parent = parent;
        }

        @Override
        public boolean accept(Value value) {
            return !parent.accept(value);
        }
    } // class Not

    public static abstract class Composite implements Filter {
        protected List<Filter> filters;

        public Composite() {
            filters = new ArrayList<Filter>();
        }

        public Composite add(Filter filter) {
            filters.add(filter);
            return this;
        }
    }

    public static final class And extends Composite {

        public And() {
        }

        @Override
        public boolean accept(Value value) {
            for (Filter filter: filters) {
                if (!filter.accept(value)) {
                    return false;
                }
            }
            return true;
        }
    } // class And

    public static final class Or extends Composite {

        public Or() {
        }

        @Override
        public boolean accept(Value value) {
            for (Filter filter: filters) {
                if (filter.accept(value)) {
                    return true;
                }
            }
            return false;
        }
    } // class Or

    public static final class Year implements Filter {

        private int year;

        public Year(int year) {
            this.year = year;
        }

        @Override
        public boolean accept(Value value) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(value.getLoad().getStartTime());
            return cal.get(Calendar.YEAR) == year;
        }
    } // class Year

    public static final class IsEpoch implements Filter {

        public static final IsEpoch INSTANCE = new IsEpoch();

        private IsEpoch() {
        }

        @Override
        public boolean accept(Value value) {
            return value.getLoad().isEpoch();
        }
    } // class Year

    public static final class TimeRangeIntersects implements Filter {

        private Date a;
        private Date b;

        public TimeRangeIntersects(int year) {
            this(year, year);
        }

        public TimeRangeIntersects(int startYear, int endYear) {
            this(firstJan(Math.min(startYear, endYear)),
                lastDec(Math.max(startYear, endYear)));
        }

        private static Date firstJan(int year) {
            Calendar cal = Calendar.getInstance();
            cal.set(year, 1, 1, 0, 0, 0);
            return cal.getTime();
        }

        private static Date lastDec(int year) {
            Calendar cal = Calendar.getInstance();
            cal.set(year, 12, 31, 23, 59, 59);
            return cal.getTime();
        }

        public TimeRangeIntersects(Date a, Date b) {
            if (a.after(b)) {
                this.b = a;
                this.a = b;
            } else {
                this.a = a;
                this.b = b;
            }
        }
        @Override
        public boolean accept(Value value) {
            Date c = value.getLoad().getStartTime();
            Date d = value.getLoad().getStopTime();
            return d == null
                ? c.compareTo(a) >= 0 && c.compareTo(b) <= 0
                : !(a.after(d) || c.after(b));
        }
    } // class TimeRangeIntersects
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org