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