package org.ripple.power.timer;
import java.lang.reflect.Constructor;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public abstract class RegularTimer implements TimePeriod, MonthConstants {
public static RegularTimer createInstance(Class<?> c, Date millisecond,
TimeZone zone) {
RegularTimer result = null;
try {
Constructor<?> constructor = c.getDeclaredConstructor(new Class[] {
Date.class, TimeZone.class });
result = (RegularTimer) constructor.newInstance(new Object[] {
millisecond, zone });
} catch (Exception e) {
}
return result;
}
public static Class<?> downsize(Class<?> c) {
if (c.equals(Year.class)) {
return Quarter.class;
} else if (c.equals(Quarter.class)) {
return Month.class;
} else if (c.equals(Week.class)) {
return Week.class;
} else if (c.equals(Month.class)) {
return Day.class;
} else if (c.equals(Day.class)) {
return Hour.class;
} else if (c.equals(Hour.class)) {
return Minute.class;
} else if (c.equals(Minute.class)) {
return Second.class;
} else if (c.equals(Second.class)) {
return Millisecond.class;
} else {
return Millisecond.class;
}
}
public abstract RegularTimer previous();
public abstract RegularTimer next();
public abstract long getSerialIndex();
public static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
public static final Calendar WORKING_CALENDAR = Calendar
.getInstance(DEFAULT_TIME_ZONE);
public abstract void peg(Calendar calendar);
@Override
public Date getStart() {
return new Date(getFirstMillisecond());
}
@Override
public Date getEnd() {
return new Date(getLastMillisecond());
}
public abstract long getFirstMillisecond();
public long getFirstMillisecond(TimeZone zone) {
Calendar calendar = Calendar.getInstance(zone);
return getFirstMillisecond(calendar);
}
public abstract long getFirstMillisecond(Calendar calendar);
public abstract long getLastMillisecond();
public long getLastMillisecond(TimeZone zone) {
Calendar calendar = Calendar.getInstance(zone);
return getLastMillisecond(calendar);
}
public abstract long getLastMillisecond(Calendar calendar);
public long getMiddleMillisecond() {
long m1 = getFirstMillisecond();
long m2 = getLastMillisecond();
return m1 + (m2 - m1) / 2;
}
public long getMiddleMillisecond(TimeZone zone) {
Calendar calendar = Calendar.getInstance(zone);
long m1 = getFirstMillisecond(calendar);
long m2 = getLastMillisecond(calendar);
return m1 + (m2 - m1) / 2;
}
public long getMiddleMillisecond(Calendar calendar) {
long m1 = getFirstMillisecond(calendar);
long m2 = getLastMillisecond(calendar);
return m1 + (m2 - m1) / 2;
}
public long getMillisecond(TimePeriodAnchor anchor, Calendar calendar) {
if (anchor.equals(TimePeriodAnchor.START)) {
return getFirstMillisecond(calendar);
} else if (anchor.equals(TimePeriodAnchor.MIDDLE)) {
return getMiddleMillisecond(calendar);
} else if (anchor.equals(TimePeriodAnchor.END)) {
return getLastMillisecond(calendar);
} else {
throw new IllegalStateException("Unrecognised anchor: " + anchor);
}
}
@Override
public String toString() {
return String.valueOf(getStart());
}
}