/* | |
* | |
* 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); | |
} | |
} |