package org.jblooming.agenda;
import org.jblooming.utilities.DateUtilities;
import org.jblooming.waf.settings.ApplicationState;
import org.jblooming.waf.settings.I18n;
import java.util.*;
import net.sf.json.JSONObject;
public class ScheduleMinute extends ScheduleSupport implements Schedule {
public ScheduleMinute() {
}
public ScheduleMinute(Date start, int duration) {
this (start,duration,1,1);
}
/**
* @param start
* @param duration in millis
* @param freq in minutes
* @param rep if 0 infinite
*/
public ScheduleMinute(Date start, int duration, int freq, int rep) {
this.setStart(start);
this.setDuration(duration);
this.setFreq((freq > 0 ? freq : 1));
this.setRepeat(rep);
recalculateFields();
}
public ScheduleMinute(Date start,int startTime, int duration) {
this (start,startTime,duration,1,1);
}
public ScheduleMinute(Date start, int startTime, int duration, int freq, int rep) {
this.setStartTime(startTime);
this.setStart(start);
CompanyCalendar cal = new CompanyCalendar();
cal.setTimeInMillis(this.getValidityStartTime());
cal.setMillisFromMidnight(startTime);
this.setStart(cal.getTime());
this.setDuration(duration);
this.setFreq((freq > 0 ? freq : 1));
this.setRepeat(rep);
recalculateFields();
}
public void recalculateFields() {
CompanyCalendar cal = new CompanyCalendar();
cal.setTimeInMillis(this.getValidityStartTime());
this.setStartTime(cal.getMillisFromMidnight());
if (this.getRepeat() > 0) {
int freq = (this.getFreq()>0?this.getFreq() :1);
int val = ((this.getRepeat() - 1) * freq);
cal.add(Calendar.MINUTE, val);
} else {
this.setRepeat(0);
cal = new CompanyCalendar();
cal.setTime(CompanyCalendar.MAX_DATE);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
cal.add(Calendar.MILLISECOND, this.getStartTime());
}
cal.add(Calendar.MILLISECOND, (int)this.getDuration());
this.setEnd(cal.getTime());
}
public long getNextFireTimeAfter(long afterTime) {
long returnTime = Long.MAX_VALUE;
if (afterTime <= getEnd().getTime()) {
// if (afterTime >= getStart().getTime()) {
if (afterTime > getStart().getTime()) {
CompanyCalendar cal = new CompanyCalendar();
long lstart = getStart().getTime();
cal.setTimeInMillis(lstart);
TimeZone timeZone = cal.getTimeZone();
int offset = (timeZone.getOffset(lstart) - timeZone.getOffset(afterTime)); // questo server per calcolare i millisecondi effettivi in caso di ora legale
long distInMillisec = afterTime - lstart - offset;
double ddistInMinutes = (double) distInMillisec / (double) CompanyCalendar.MILLIS_IN_MINUTE;
int distInMinutes = (int) ddistInMinutes;
int freq = (this.getFreq()>0?this.getFreq() :1);
int rest = freq - (int) distInMinutes % freq;
cal.setTime(getStart());
cal.add(Calendar.MINUTE, (int) distInMinutes + rest);
if (cal.getTime().getTime() <= getEnd().getTime())
returnTime = cal.getTime().getTime() + offset;
} else
returnTime = getStart().getTime();
}
return returnTime;
}
public long getPreviousFireTimeBefore(long beforeTime) {
long returnTime = Long.MIN_VALUE;
// if (beforeTime >= getStart().getTime() && beforeTime <= getEnd().getTime()) {
if (beforeTime > getStart().getTime()) {
if(beforeTime > getEnd().getTime())
beforeTime = getEnd().getTime();
CompanyCalendar cal = new CompanyCalendar();
long lstart = getStart().getTime();
cal.setTimeInMillis(lstart);
TimeZone timeZone = cal.getTimeZone();
int ofset = (timeZone.getOffset(lstart) - timeZone.getOffset(beforeTime)); // questo server per calcolare i millisecondi effettivi in caso di ora legale
long distInMillisec = beforeTime - lstart - ofset;
double ddistInMinute = (double) distInMillisec / (double) CompanyCalendar.MILLIS_IN_MINUTE;
int distInMinute = (int) ddistInMinute;
int freq = (this.getFreq()>0?this.getFreq() :1);
int rest = (int) distInMinute % freq;
cal.setTime(getStart());
cal.add(Calendar.MINUTE, (int) distInMinute - rest);
returnTime = cal.getTimeInMillis();
}
return returnTime;
}
public String getName() {
return "minutes";
}
public String toString() {
return DateUtilities.dateToString(getStart(), "yyyy MM dd HH:mm:ss") + " - " + DateUtilities.dateToString(getEnd(), "yyyy MM dd HH:mm:ss");
}
public JSONObject jsonify() {
JSONObject ret = super.jsonify();
ret.element("type","minute");
return ret;
}
}