/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Portions Copyright 2007 Sun Microsystems, Inc. */ package org.opends.server.admin; import java.util.HashMap; import java.util.Map; /** * This enumeration defines various duration units. */ public enum DurationUnit { /** * A millisecond unit. */ MILLI_SECONDS(1L, "ms", "milliseconds"), /** * A second unit. */ SECONDS(1000L, "s", "seconds"), /** * A minute unit. */ MINUTES((long) 60 * 1000, "m", "minutes"), /** * An hour unit. */ HOURS((long) 60 * 60 * 1000, "h", "hours"), /** * A day unit. */ DAYS((long) 24 * 60 * 60 * 1000, "d", "days"), /** * A week unit. */ WEEKS((long) 7 * 24 * 60 * 60 * 1000, "w", "weeks"); // A lookup table for resolving a unit from its name. private static final Map nameToUnit; static { nameToUnit = new HashMap(); for (DurationUnit unit : DurationUnit.values()) { nameToUnit.put(unit.shortName, unit); nameToUnit.put(unit.longName, unit); } } // The size of the unit in milli-seconds. private final long sz; // The abbreviation of the unit. private final String shortName; // The long name of the unit. private final String longName; // Private constructor. private DurationUnit(long sz, String shortName, String longName) { this.sz = sz; this.shortName = shortName; this.longName = longName; } /** * Get the unit corresponding to the provided unit name. * * @param s * The name of the unit. Can be the abbreviated or long name and can * contain white space and mixed case characters. * @return Returns the unit corresponding to the provided unit name. * @throws IllegalArgumentException * If the provided name did not correspond to a known duration unit. */ public static DurationUnit getUnit(String s) throws IllegalArgumentException { DurationUnit unit = nameToUnit.get(s.trim().toLowerCase()); if (unit == null) { throw new IllegalArgumentException("Illegal duration unit \"" + s + "\""); } return unit; } /** * Get the abbreviated name of this unit. * * @return Returns the abbreviated name of this unit. */ public String getShortName() { return shortName; } /** * Get the long name of this unit. * * @return Returns the long name of this unit. */ public String getLongName() { return longName; } /** * Get the number of milli-seconds that this unit represents. * * @return Returns the number of milli-seconds that this unit represents. */ public long getDuration() { return sz; } /** * Converts the specified duration in this unit to milli-seconds. * * @param duration * The duration. * @return Returns the number of milli-seconds that the duration represents. */ public long getDuration(double duration) { return (long) (sz * duration); } /** * Converts a duration in this unit to the specified unit. * * @param duration * The duration. * @param unit * The required unit. * @return Returns a value representing the duration in the specified unit. */ public double getDuration(double duration, DurationUnit unit) { return (sz * duration) / unit.sz; } /** * Get the best-fit unit for the specified duration in this unit. For example, * if this unit is minutes and the duration 120 is provided, then the best fit * unit is hours: 2h. Similarly, if the duration is 0.5, then the best fit * unit will by seconds: 30s. * * @param duration * The duration. * @return Returns the best-fit unit for the specified duration in this unit. */ public DurationUnit getBestFitUnit(double duration) { for (DurationUnit unit : new DurationUnit[]{WEEKS, DAYS, HOURS, MINUTES, SECONDS}) { double v = getDuration(duration, unit); if (Double.isInfinite(v) || Double.isNaN(v) || v == 0) { return this; } if (v >= 1 && Math.floor(v) == Math.ceil(v)) { return unit; } } return MILLI_SECONDS; } /** * {@inheritDoc} *

* This implementation returns the abbreviated name of this duration unit. */ @Override public String toString() { return shortName; } }