blob: c73754bc3b6bf35a659c4b15bc36a069bf50c018 [file] [log] [blame]
/*
*
* Apache Geronimo JCache Spec 1.0
*
* Copyright (C) 2003 - 2014 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package javax.cache.expiry;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
public class Duration implements Serializable {
public static final long serialVersionUID = 201305101442L;
public static final Duration ETERNAL = new Duration();
public static final Duration ONE_DAY = new Duration(DAYS, 1);
public static final Duration ONE_HOUR = new Duration(HOURS, 1);
public static final Duration THIRTY_MINUTES = new Duration(MINUTES, 30);
public static final Duration TWENTY_MINUTES = new Duration(MINUTES, 20);
public static final Duration TEN_MINUTES = new Duration(MINUTES, 10);
public static final Duration FIVE_MINUTES = new Duration(MINUTES, 5);
public static final Duration ONE_MINUTE = new Duration(MINUTES, 1);
public static final Duration ZERO = new Duration(SECONDS, 0);
private final TimeUnit timeUnit;
private final long durationAmount;
public Duration() {
this.timeUnit = null;
this.durationAmount = 0;
}
public Duration(final TimeUnit timeUnit, final long durationAmount) {
if (timeUnit == null) {
if (durationAmount == 0) {
this.timeUnit = null;
this.durationAmount = 0;
} else {
throw new NullPointerException();
}
} else {
switch (timeUnit) {
case NANOSECONDS:
case MICROSECONDS:
throw new IllegalArgumentException("Must specify a TimeUnit of milliseconds or higher.");
default:
this.timeUnit = timeUnit;
break;
}
if (durationAmount < 0) {
throw new IllegalArgumentException("Cannot specify a negative durationAmount.");
}
this.durationAmount = durationAmount;
}
}
public Duration(final long startTime, final long endTime) {
if (startTime == Long.MAX_VALUE || endTime == Long.MAX_VALUE) {
timeUnit = null;
durationAmount = 0;
} else if (startTime < 0) {
throw new IllegalArgumentException("Cannot specify a negative startTime.");
} else if (endTime < 0) {
throw new IllegalArgumentException("Cannot specify a negative endTime.");
} else {
timeUnit = TimeUnit.MILLISECONDS;
durationAmount = Math.max(startTime, endTime) - Math.min(startTime, endTime);
}
}
public TimeUnit getTimeUnit() {
return timeUnit;
}
public long getDurationAmount() {
return durationAmount;
}
public boolean isEternal() {
return timeUnit == null && durationAmount == 0;
}
public boolean isZero() {
return timeUnit != null && durationAmount == 0;
}
public long getAdjustedTime(final long time) {
if (isEternal()) {
return Long.MAX_VALUE;
}
return time + timeUnit.toMillis(durationAmount);
}
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
} else if (other == null || getClass() != other.getClass()) {
return false;
} else {
final Duration duration = (Duration) other;
if (this.timeUnit == null && duration.timeUnit == null &&
this.durationAmount == duration.durationAmount) {
return true;
} else if (this.timeUnit != null && duration.timeUnit != null) {
long time1 = timeUnit.toMillis(durationAmount);
long time2 = duration.timeUnit.toMillis(duration.durationAmount);
return time1 == time2;
}
return false;
}
}
@Override
public int hashCode() {
return timeUnit == null ? -1 : (int) timeUnit.toMillis(durationAmount);
}
}