package au.com.vaadinutils.jasper.scheduler.entities;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.joda.time.DateTime;
import au.com.vaadinutils.jasper.scheduler.ReportEmailSchedule;
import com.google.common.base.Preconditions;
public enum ScheduleMode
{
ONE_TIME("Run once only")
{
@Override
public Date getNextRuntime(ReportEmailSchedule schedule, Date now)
{
return schedule.getOneTimeRunDateTime();
}
},
DAY_OF_WEEK("Week days")
{
@Override
public Date getNextRuntime(ReportEmailSchedule schedule, Date now)
{
String[] days = schedule.getScheduledDaysOfWeek().split(",");
Preconditions.checkArgument(days.length > 0);
List<Integer> intDays = new LinkedList<Integer>();
for (String day : days)
{
int iDay = Integer.parseInt(day);
Preconditions.checkArgument(iDay > 0 && iDay < 8);
intDays.add(iDay);
}
Collections.sort(intDays);
DateTime result = getFirstPossibleTime(schedule, now);
while (!intDays.contains(result.getDayOfWeek()))
{
result = result.plusDays(1);
}
return result.toDate();
}
},
DAY_OF_MONTH("Monthly")
{
@Override
public Date getNextRuntime(ReportEmailSchedule schedule, Date now)
{
Integer day = schedule.getScheduledDayOfMonth();
Preconditions.checkArgument(day > 0 && day < 32);
DateTime result = getFirstPossibleTime(schedule, now);
if (result.getDayOfMonth() > day)
{
// move to next month
result = result.withDayOfMonth(1).plusMonths(1);
}
if (result.getDayOfMonth() < day)
{
// move to correct day
int lastDayOfMonth = result.withDayOfMonth(1).plusMonths(1).minusDays(1).getDayOfMonth();
result = result.withDayOfMonth(Math.min(day, lastDayOfMonth));
}
return result.toDate();
}
},
EVERY_DAY("Daily")
{
@Override
public Date getNextRuntime(ReportEmailSchedule schedule, Date now)
{
return getFirstPossibleTime(schedule, now).toDate();
}
};
Logger logger = LogManager.getLogger();
String name;
ScheduleMode(String name)
{
this.name = name;
}
@Override
public String toString()
{
return name;
}
static private DateTime getFirstPossibleTime(ReportEmailSchedule schedule, Date now)
{
DateTime scheduleTime = new DateTime(schedule.getTimeOfDayToRun());
DateTime result = new DateTime(now);
scheduleTime = scheduleTime.withDate(result.getYear(), result.getMonthOfYear(), result.getDayOfMonth());
if (scheduleTime.isBefore(result))
{
result = result.plusDays(1);
}
result = result.withTime(scheduleTime.getHourOfDay(), scheduleTime.getMinuteOfHour(),
scheduleTime.getSecondOfMinute(), 0);
return result;
}
abstract public Date getNextRuntime(ReportEmailSchedule schedule, Date now);
}