001: /*--
002:
003: Copyright (C) 2002-2005 Adrian Price.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: adrianprice@sourceforge.net.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Adrian Price (adrianprice@users.sourceforge.net).
027:
028: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
029: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
030: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
032: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
034: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
036: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
037: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
038: POSSIBILITY OF SUCH DAMAGE.
039:
040: For more information on OBE, please see
041: <http://obe.sourceforge.net/>.
042:
043: */
044:
045: package org.obe.xpdl.model.misc;
046:
047: import org.apache.commons.logging.Log;
048: import org.apache.commons.logging.LogFactory;
049: import org.obe.util.AbstractBean;
050:
051: public final class Duration extends AbstractBean {
052: private static final long serialVersionUID = -4251576301062064086L;
053:
054: private static final Log log = LogFactory.getLog(Duration.class);
055:
056: private int _value;
057: private DurationUnit _unit;
058:
059: /**
060: * Default public no-args constructor to keep Castor happy.
061: */
062: public Duration() {
063: }
064:
065: /**
066: * Construct a new Duration. A value of 0 signals an unlimited duration.
067: * The duration unit may be null to specify that the default should be used.
068: * The default is determined at runtime.
069: *
070: * @param value The duration value
071: * @param unit The unit of measurement
072: */
073: public Duration(int value, DurationUnit unit) {
074: _value = value;
075: _unit = unit;
076:
077: log.debug("Duration(" + value + ", " + unit + ')');
078: }
079:
080: /**
081: * Construct a new Duration.
082: *
083: * @param duration The duration value
084: * @throws NumberFormatException
085: */
086: public Duration(String duration) throws NumberFormatException {
087: setDuration(duration);
088: }
089:
090: /**
091: * Returns the duration as a string.
092: *
093: * @return The duration string.
094: */
095: public String getDuration() {
096: return toString();
097: }
098:
099: /**
100: * Sets the duration as a string.
101: *
102: * @param duration The duration string.
103: */
104: public void setDuration(String duration) {
105: if (duration == null) {
106: throw new IllegalArgumentException(
107: "Duration string cannot be null");
108: }
109:
110: StringBuffer intBuffer = new StringBuffer();
111: DurationUnit unit = null;
112: for (int i = 0; i < duration.length(); i++) {
113: char c = duration.charAt(i);
114: if (Character.isDigit(c)) {
115: intBuffer.append(c);
116: } else if (Character.isLetter(c)) {
117: char[] cArray = { c };
118: unit = DurationUnit.valueOf(new String(cArray));
119: }
120: }
121:
122: _value = intBuffer.length() == 0 ? 0 : Integer
123: .parseInt(intBuffer.toString());
124: _unit = unit;
125: }
126:
127: /**
128: * The duration value.
129: *
130: * @return The duration value
131: */
132: public int getValue() {
133: return _value;
134: }
135:
136: public void setValue(int value) {
137: _value = value;
138: }
139:
140: /**
141: * Return this duration's unit. This method may return null if the unit is
142: * not specified.
143: *
144: * @return The duration unit or null
145: */
146: public DurationUnit getUnit() {
147: return _unit;
148: }
149:
150: public void setUnit(DurationUnit unit) {
151: _unit = unit;
152: }
153:
154: /**
155: * Get the duration's unit. The specified default duration unit is used if
156: * this duration has no specified duration unit.
157: *
158: * @param defaultUnit The default unit if no unit specified
159: * @return The duration unit
160: */
161: public DurationUnit getUnit(DurationUnit defaultUnit) {
162: return _unit == null ? defaultUnit : _unit;
163: }
164:
165: /**
166: * Get the duration represented as millseconds. The specified default
167: * duration unit is used this duration has no specified duration unit.
168: *
169: * @param defaultUnit The default unit if no unit specified
170: * @return The number of milliseconds for this duration
171: */
172: public long getDurationInMilliseconds(DurationUnit defaultUnit) {
173: int value = _value;
174: DurationUnit unit = getUnit(defaultUnit);
175: return value == 0 ? 0 : value * unit.toMilliseconds();
176: }
177:
178: /**
179: * Return a String representation of the Duration.
180: *
181: * @return A string
182: */
183: public String toString() {
184: StringBuffer buffer = new StringBuffer();
185: buffer.append(_value);
186: if (_unit != null) {
187: buffer.append(_unit);
188: }
189: return buffer.toString();
190: }
191:
192: /**
193: * Parse the duration string into a Duration object.
194: *
195: * @param duration The duration string.
196: * @return The Duration object.
197: * @throws NumberFormatException
198: */
199: public static Duration valueOf(String duration)
200: throws NumberFormatException {
201:
202: return duration == null ? null : new Duration(duration);
203: }
204: }
|