/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.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://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.logic;
import org.openmrs.logic.op.ComparisonOperator;
import org.openmrs.logic.op.Operand;
/**
* Represents a duration of time — e.g., one year, two weeks, or 18 months. Used within
* criteria. Use the <code>Duration duration = Duration.days(5.0);</code> to get a duration object
*
* @see org.openmrs.logic.LogicCriteria
*/
public class Duration implements Operand {
public static enum Units {
SECONDS, MINUTES, HOURS, DAYS, WEEKS, MONTHS, YEARS
}
private Double duration;
private Units units;
/**
* Private contructor used by the static methods on this class. Use the
* <code>Duration duration = Duration.days(5.0);</code> to get a duration object
*
* @param duration
* @param units
*/
private Duration(Double duration, Units units) {
this.duration = duration;
this.units = units;
}
public Double getDuration() {
return duration;
}
public Units getUnits() {
return units;
}
/**
* Returns the equivalent duration in days
*
* @return the equivalent duration in days
*/
public Double getDurationInDays() {
switch (units) {
case SECONDS:
return duration / 86400;
case MINUTES:
return duration / 1440;
case HOURS:
return duration / 24;
case DAYS:
return duration;
case WEEKS:
return duration * 7;
case MONTHS:
return duration * 30;
case YEARS:
return duration * 365;
default:
return 0d;
}
}
/**
* Returns the equivalent duration in milliseconds
*
* @return the equivalent duration in milliseconds
*/
public long getDurationInMillis() {
long d = duration.longValue();
switch (units) {
case SECONDS:
return d * 1000;
case MINUTES:
return d * 60000;
case HOURS:
return d * 3600000;
case DAYS:
return d * 86400000;
case WEEKS:
return d * 10080000;
case MONTHS:
return d * 2628000000L;
case YEARS:
return d * 31536000000L;
default:
return 0;
}
}
/**
* Returns a duration for the given number of seconds
*
* @param duration number of seconds for duration
* @return <code>Duration</code> object for given number of seconds
*/
public static Duration seconds(Double duration) {
return new Duration(duration, Units.SECONDS);
}
/**
* Returns a duration for the given number of seconds
*
* @param duration number of seconds for duration
* @return <code>Duration</code> object for given number of seconds
*/
public static Duration seconds(int duration) {
return seconds(new Double(duration));
}
/**
* Returns a duration for the given number of minutes
*
* @param duration number of minutes for duration
* @return <code>Duration</code> object for given number of minutes
*/
public static Duration minutes(Double duration) {
return new Duration(duration, Units.MINUTES);
}
/**
* Returns a duration for the given number of minutes
*
* @param duration number of minutes for duration
* @return <code>Duration</code> object for given number of minutes
*/
public static Duration minutes(int duration) {
return minutes(new Double(duration));
}
/**
* Returns a duration for the given number of hours
*
* @param duration number of hours for duration
* @return <code>Duration</code> object for given number of hours
*/
public static Duration hours(Double duration) {
return new Duration(duration, Units.HOURS);
}
/**
* Returns a duration for the given number of hours
*
* @param duration number of hours for duration
* @return <code>Duration</code> object for given number of hours
*/
public static Duration hours(int duration) {
return hours(new Double(duration));
}
/**
* Returns a duration for the given number of days
*
* @param duration number of days for duration
* @return <code>Duration</code> object with specified number of days
*/
public static Duration days(Double duration) {
return new Duration(duration, Units.DAYS);
}
/**
* Returns a duration for the given number of days
*
* @param duration number of days for duration
* @return <code>Duration</code> object with specified number of days
*/
public static Duration days(int duration) {
return days(new Double(duration));
}
/**
* Returns a duration for the given number of weeks
*
* @param duration number of weeks for duration
* @return <code>Duration</code> object with specified number of weeks
*/
public static Duration weeks(Double duration) {
return new Duration(duration, Units.WEEKS);
}
/**
* Returns a duration for the given number of weeks
*
* @param duration number of weeks for duration
* @return <code>Duration</code> object with specified number of weeks
*/
public static Duration weeks(int duration) {
return weeks(new Double(duration));
}
/**
* Returns a duration for the given number of months
*
* @param duration number of months for duration
* @return <code>Duration</code> object with specified number of months
*/
public static Duration months(Double duration) {
return new Duration(duration, Units.MONTHS);
}
/**
* Returns a duration for the given number of months
*
* @param duration number of months for duration
* @return <code>Duration</code> object with specified number of months
*/
public static Duration months(int duration) {
return months(new Double(duration));
}
/**
* Returns a duration for the given number of years
*
* @param duration number of years for duration
* @return <code>Duration</code> object with specified number of years
*/
public static Duration years(Double duration) {
return new Duration(duration, Units.YEARS);
}
/**
* Returns a duration for the given number of years
*
* @param duration number of years for duration
* @return <code>Duration</code> object with specified number of years
*/
public static Duration years(int duration) {
return years(new Double(duration));
}
/**
* @see org.openmrs.logic.op.Operand#supports(org.openmrs.logic.op.ComparisonOperator)
*/
public boolean supports(ComparisonOperator operator) {
return (ComparisonOperator.WITHIN.equals(operator));
}
}