org.jumpmind.symmetric.statistic.AbstractStatsByPeriodMap.java Source code

Java tutorial

Introduction

Here is the source code for org.jumpmind.symmetric.statistic.AbstractStatsByPeriodMap.java

Source

/**
 * Licensed to JumpMind Inc under one or more contributor
 * license agreements.  See the NOTICE file distributed
 * with this work for additional information regarding
 * copyright ownership.  JumpMind Inc licenses this file
 * to you under the GNU General Public License, version 3.0 (GPLv3)
 * (the "License"); you may not use this file except in compliance
 * with the License.
 *
 * You should have received a copy of the GNU General Public License,
 * version 3.0 (GPLv3) along with this library; if not, see
 * <http://www.gnu.org/licenses/>.
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.jumpmind.symmetric.statistic;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;

import org.apache.commons.lang.time.DateUtils;

abstract public class AbstractStatsByPeriodMap<T, M extends AbstractNodeHostStats> extends TreeMap<Date, T> {

    private static final long serialVersionUID = 1L;

    public AbstractStatsByPeriodMap(Date start, Date end, List<M> list, int periodSizeInMinutes) {
        Iterator<M> stats = list.iterator();
        Calendar startCal = Calendar.getInstance();
        startCal.setTime(start);
        startCal.set(Calendar.SECOND, 0);
        startCal.set(Calendar.MILLISECOND, 0);
        startCal.set(Calendar.MINUTE, round(startCal.get(Calendar.MINUTE)));
        Date periodStart = startCal.getTime();
        Date periodEnd = DateUtils.addMinutes(periodStart, periodSizeInMinutes);
        M stat = null;
        while (periodStart.before(end)) {
            if (stat == null && stats.hasNext()) {
                stat = stats.next();
            }
            if (stat != null && (periodStart.equals(stat.getStartTime()) || periodStart.before(stat.getStartTime()))
                    && periodEnd.after(stat.getStartTime())) {
                add(periodStart, stat);
                stat = null;
            } else {
                if (stat != null && stat.getStartTime().before(periodStart)) {
                    stat = null;
                }
                if (!containsKey(periodStart)) {
                    addBlank(periodStart);
                }
                periodStart = periodEnd;
                periodEnd = DateUtils.addMinutes(periodStart, periodSizeInMinutes);
            }
        }
    }

    abstract protected void addBlank(Date periodStart);

    abstract protected void add(Date periodStart, M stat);

    protected int round(int value) {
        return 5 * new BigDecimal((double) value / 5d).setScale(2, BigDecimal.ROUND_HALF_DOWN).intValue();
    }
}