package org.oddjob.schedules;
import java.util.Date;
import org.oddjob.arooa.utils.DateHelper;
/**
* An Interval that extends to, but does not include the to date.
*
* @author rob
*
*/
public class IntervalTo extends IntervalBase implements ScheduleResult {
private static final long serialVersionUID = 2009022700L;
/**
* Create a point interval.
*
* @param on
*/
public IntervalTo(Date on) {
super(on);
}
/**
* Create an interval up to the to Date. The upTo date
* must be at least a millisecond greater than the from date.
* If they are the same then use the single date constructor.
*
* @param from
* @param upTo
*/
public IntervalTo(Date from, Date upTo) {
super(from.getTime(), upTo.getTime() - 1);
}
/**
* Create an copy of the given Interval.
*
* @param interval
*/
public IntervalTo(Interval interval) {
super(interval.getFromDate().getTime(),
interval.getToDate().getTime() - 1);
}
/**
* Get the upTo date which is a millisecond after the
* inclusive to date.
*
* @return
*/
public Date getToDate() {
return new Date(getEndDate().getTime() + 1);
}
/**
* Provide an interval which is the result of this Limit
* being limited by the given interval. This interval is the outer
* interval and the given interval is the refinement.
* <p>
* Results are determined as follows.
* <ul>
* <li>Simple Refinement - the given limit interval.</li>
* <li>Extended Refinement - the given limit interval.</li>
* <li>Eager Refinement - null.</li>
* <li>Anti refinement - null.</li>
* <li>Disjointed - null</li>
* </ul>
*
* @param other The other interval. may be null.
* @return The new interval.
*/
public Interval limit(Interval limit) {
if (limit == null) {
return null;
}
if (limit.getFromDate().compareTo(this.getFromDate()) < 0) {
return null;
}
if (limit.getFromDate().compareTo(this.getEndDate()) > 0) {
return null;
}
Date newStart;
if (this.getFromDate().compareTo(limit.getFromDate()) < 0) {
newStart = limit.getFromDate();
}
else {
newStart = this.getFromDate();
}
return new IntervalTo(newStart, limit.getToDate());
}
/**
* Crude implementation of hashCode, so intervals could
* be stored in HashSets.
*
*/
public int hashCode() {
return getFromDate().hashCode() + getToDate().hashCode();
}
/**
* Test if two intervals are equivalent.
* <p>
* Intervals are equivalent if there start and end times
* are the same.
*
* @param other The interval to test against.
* @return true if they are equal.
*/
public boolean equals(Object other) {
if (!(other instanceof Interval)) {
return false;
}
if (other instanceof ScheduleResult
&& !getUseNext().equals(
((ScheduleResult) other).getUseNext())) {
return false;
}
else {
Interval interval = (Interval) other;
return this.getToDate().equals(interval.getToDate())
&& this.getFromDate().equals(interval.getFromDate());
}
}
/**
* Return a string representation of this interval.
*/
public String toString() {
if (getFromDate().equals(getEndDate())) {
return "at " +
DateHelper.formatDateTimeInteligently(getFromDate());
}
else {
return DateHelper.formatDateTimeInteligently(getFromDate()) +
" up to " +
DateHelper.formatDateTimeInteligently(getToDate());
}
}
@Override
public Date getUseNext() {
return getToDate();
}
}