001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.planning.ldm.plan;
028:
029: import org.cougaar.planning.ldm.measure.CountRate;
030: import org.cougaar.planning.ldm.measure.Rate;
031:
032: /**
033: * An AspectValue represented by a rate measure
034: */
035:
036: public class AspectRate extends TypedAspectValue {
037: private Rate rate_value;
038:
039: protected AspectRate(int type, Rate new_rate_value) {
040: super (type);
041: rate_value = new_rate_value;
042: }
043:
044: private static boolean hack_warnedUser; // FIXME big hack!
045:
046: public static AspectValue create(int type, Object o) {
047: if (o instanceof Number) {
048: double v = ((Number) o).doubleValue();
049: if (v != 0.0) {
050: if (!hack_warnedUser) {
051: // this bug can easily occur in the thousands, so we
052: // only make a fuss this once
053: hack_warnedUser = true;
054: org.cougaar.util.log.LoggerFactory
055: .getInstance()
056: .createLogger(AspectRate.class)
057: .warn(
058: "BUG 2529: create("
059: + type
060: + ", "
061: + o
062: + ") with non-rate type "
063: + (o == null ? "null" : (o
064: .getClass()
065: .getName()
066: + ": " + o))
067: + "! This will be the *only* warning!",
068: new RuntimeException("Trace"));
069: }
070: }
071: // bogus!
072: o = CountRate.newUnitsPerDay(v);
073: }
074:
075: if (o instanceof Rate) {
076: return new AspectRate(type, (Rate) o);
077: } else {
078: throw new IllegalArgumentException(
079: "Cannot create an AspectRate from " + o);
080: }
081: }
082:
083: public static AspectValue create(int type, Rate r) {
084: return new AspectRate(type, r);
085: }
086:
087: public static AspectValue create(int type, int v) {
088: return new AspectRate(type, CountRate
089: .newUnitsPerDay((double) v));
090: }
091:
092: public static AspectValue create(int type, float v) {
093: return new AspectRate(type, CountRate
094: .newUnitsPerDay((double) v));
095: }
096:
097: public static AspectValue create(int type, long v) {
098: return new AspectRate(type, CountRate
099: .newUnitsPerDay((double) v));
100: }
101:
102: public static AspectValue create(int type, double v) {
103: return new AspectRate(type, CountRate.newUnitsPerDay(v));
104: }
105:
106: /** Non-preferred alias for #create(int, Rate).
107: **/
108: public static final AspectRate newAspectRate(int type, Rate r) {
109: return new AspectRate(type, r);
110: }
111:
112: /** The rate value of the aspect.
113: * @note the preferred accessor is #rateValue()
114: */
115: public final Rate getRateValue() {
116: return rate_value;
117: }
118:
119: public final Rate rateValue() {
120: return rate_value;
121: }
122:
123: /** return the common-unit value of the rate.
124: * @note A better solution is to use rateValue and specify the unit of measure.
125: **/
126: public final double doubleValue() {
127: return (double) rateValue().getValue(
128: rateValue().getCommonUnit());
129: }
130:
131: /** return the common-unit value of the rate.
132: * @note A better solution is to use rateValue and specify the unit of measure.
133: **/
134: public final long longValue() {
135: return (long) doubleValue();
136: }
137:
138: /** return the common-unit value of the rate.
139: * @note A better solution is to use rateValue and specify the unit of measure.
140: **/
141: public final float floatValue() {
142: return (float) doubleValue();
143: }
144:
145: /** return the common-unit value of the rate.
146: * @note A better solution is to use rateValue and specify the unit of measure.
147: **/
148: public final int intValue() {
149: return (int) doubleValue();
150: }
151:
152: public boolean equals(Object v) {
153: if (!(v instanceof AspectRate)) {
154: return false;
155: }
156: AspectRate rate_v = (AspectRate) v;
157:
158: return (rate_v.getAspectType() == getAspectType() && rate_v
159: .rateValue().equals(rateValue()));
160: }
161:
162: public String toString() {
163: return rate_value.toString() + "[" + getType() + "]";
164: }
165: }
|