/* This file is part of jTotus. jTotus is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. jTotus is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with jTotus. If not, see <http://www.gnu.org/licenses/>. */ package org.jtotus.common; import java.util.Date; import java.util.Iterator; import org.joda.time.DateTime; /** * * @author Evgeni Kappinen */ public class DateIterator implements Iterator<Date>, Iterable<Date> { private int step = 1; private DateTime toDate; private DateTime fromDate; private DateTime current; private boolean debug = false; private boolean first = true; // Starts with past date(fromDate) and going towards ending date public DateIterator(Date tmpStart, Date tmpEnd) { fromDate = new DateTime(tmpEnd); toDate = new DateTime(tmpStart); if (toDate.compareTo(fromDate) < 0) { System.err.printf("Warning startin date is afte ending date! Reversing dates(" + fromDate.toDate() + ":" + toDate.toDate() + "\n"); DateTime tmp = fromDate.toDateTime(); fromDate = toDate; toDate = tmp; System.err.printf("New time startin date is afte ending date! Reversing dates(" + fromDate.toDate() + ":" + toDate.toDate() + "\n"); } // DateTimeFormatter formater = DateTimeFormat.forPattern("dd-MM-yyyy"); // System.err.printf("Assigned start2:%s, toDate:%s\n", formater.print(fromDate), formater.print(toDate)); current = fromDate.toDateTime(); } // Starts with past date(fromDate) and going towards ending date public DateIterator(DateTime startDate, DateTime endDate) { fromDate = startDate.toDateTime(); toDate = endDate.toDateTime(); if (!toDate.isAfter(fromDate)) { System.err.printf("Warning startin date is afte ending date! Reversing dates(" + fromDate.toDate() + ":" + toDate.toDate() + "\n"); DateTime tmp = fromDate.toDateTime(); fromDate = toDate; toDate = tmp; System.err.printf("New time startin date is afte ending date! Reversing dates(" + fromDate.toDate() + ":" + toDate.toDate() + "\n"); } current = fromDate.toDateTime(); } public void setStep(int stepSize) { step = stepSize; } public boolean hasNext() { DateTime rangeCheck = current.toDateTime().plusDays(step); //Skip weekends // while (DayisHoliday.isHoliday(rangeCheck)) { // rangeCheck = rangeCheck.plusDays(1); // } return rangeCheck.isBefore(toDate) || rangeCheck.isEqual(toDate); } public DateTime nextInCalendar() { if (!first) { current = current.plusDays(step); } first = false; //Skip weekends // while (DayisHoliday.isHoliday(current)) { // current = current.plusDays(1); // } // // if (debug) { // System.out.printf("nextInCalendar:%s \n", current.toString()); // } return current.toDateTime(); } public Date next() { return nextInCalendar().toDate(); } public void remove() { throw new UnsupportedOperationException("Cannot remove"); } public void reset() { current = fromDate.toDateTime(); first = true; } public Date getCurrent() { return current.toDate(); } public DateTime getCurrentAsCalendar() { return current.toDateTime(); } public void move(int i) { for (int jump = 0; this.hasNext() && jump <= i; jump++) { this.next(); } } public Iterator<Date> iterator() { current = fromDate.toDateTime(); return this; } }