package org.ripple.power.timer; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class Minute extends RegularTimer implements Serializable { /** * */ private static final long serialVersionUID = 1L; public static final int FIRST_MINUTE_IN_HOUR = 0; public static final int LAST_MINUTE_IN_HOUR = 59; private Day day; private byte hour; private byte minute; private long firstMillisecond; private long lastMillisecond; public Minute() { this(new Date()); } public Minute(int minute, Hour hour) { this.minute = (byte) minute; this.hour = (byte) hour.getHour(); this.day = hour.getDay(); peg(Calendar.getInstance()); } public Minute(Date time) { this(time, TimeZone.getDefault(), Locale.getDefault()); } public Minute(Date time, TimeZone zone) { this(time, zone, Locale.getDefault()); } public Minute(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); int min = calendar.get(Calendar.MINUTE); this.minute = (byte) min; this.hour = (byte) calendar.get(Calendar.HOUR_OF_DAY); this.day = new Day(time, zone, locale); peg(calendar); } public Minute(int minute, int hour, int day, int month, int year) { this(minute, new Hour(hour, new Day(day, month, year))); } public Day getDay() { return this.day; } public Hour getHour() { return new Hour(this.hour, this.day); } public int getHourValue() { return this.hour; } public int getMinute() { return this.minute; } @Override public long getFirstMillisecond() { return this.firstMillisecond; } @Override public long getLastMillisecond() { return this.lastMillisecond; } @Override public void peg(Calendar calendar) { this.firstMillisecond = getFirstMillisecond(calendar); this.lastMillisecond = getLastMillisecond(calendar); } @Override public RegularTimer previous() { Minute result; if (this.minute != FIRST_MINUTE_IN_HOUR) { result = new Minute(this.minute - 1, getHour()); } else { Hour h = (Hour) getHour().previous(); if (h != null) { result = new Minute(LAST_MINUTE_IN_HOUR, h); } else { result = null; } } return result; } @Override public RegularTimer next() { Minute result; if (this.minute != LAST_MINUTE_IN_HOUR) { result = new Minute(this.minute + 1, getHour()); } else { Hour nextHour = (Hour) getHour().next(); if (nextHour != null) { result = new Minute(FIRST_MINUTE_IN_HOUR, nextHour); } else { result = null; } } return result; } @Override public long getSerialIndex() { long hourIndex = this.day.getSerialIndex() * 24L + this.hour; return hourIndex * 60L + this.minute; } @Override public long getFirstMillisecond(Calendar calendar) { int year = this.day.getYear(); int month = this.day.getMonth() - 1; int d = this.day.getDayOfMonth(); calendar.clear(); calendar.set(year, month, d, this.hour, this.minute, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTimeInMillis(); } @Override public long getLastMillisecond(Calendar calendar) { int year = this.day.getYear(); int month = this.day.getMonth() - 1; int d = this.day.getDayOfMonth(); calendar.clear(); calendar.set(year, month, d, this.hour, this.minute, 59); calendar.set(Calendar.MILLISECOND, 999); return calendar.getTimeInMillis(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof Minute)) { return false; } Minute that = (Minute) obj; if (this.minute != that.minute) { return false; } if (this.hour != that.hour) { return false; } return true; } @Override public int hashCode() { int result = 17; result = 37 * result + this.minute; result = 37 * result + this.hour; result = 37 * result + this.day.hashCode(); return result; } @Override public int compareTo(Object o1) { int result; if (o1 instanceof Minute) { Minute m = (Minute) o1; result = getHour().compareTo(m.getHour()); if (result == 0) { result = this.minute - m.getMinute(); } } else if (o1 instanceof RegularTimer) { result = 0; } else { result = 1; } return result; } public static Minute parseMinute(String s) { Minute result = null; s = s.trim(); String daystr = s.substring(0, Math.min(10, s.length())); Day day = Day.parseDay(daystr); if (day != null) { String hmstr = s.substring( Math.min(daystr.length() + 1, s.length()), s.length()); hmstr = hmstr.trim(); String hourstr = hmstr.substring(0, Math.min(2, hmstr.length())); int hour = Integer.parseInt(hourstr); if ((hour >= 0) && (hour <= 23)) { String minstr = hmstr.substring( Math.min(hourstr.length() + 1, hmstr.length()), hmstr.length()); int minute = Integer.parseInt(minstr); if ((minute >= 0) && (minute <= 59)) { result = new Minute(minute, new Hour(hour, day)); } } } return result; } }