001: /*
002: * <copyright>
003: *
004: * Copyright 2002-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.core.adaptivity;
028:
029: /**
030: * The base class for OperatingMode and Condition implementations.
031: * These two concepts differ only in that an OperatingMode can be set
032: * by the AdaptivityEngine whereas a Condition is under the
033: * control of the component establishing the Condition.
034: **/
035: public class OMCBase implements java.io.Serializable {
036: private String name;
037: private Comparable value;
038: private OMCRangeList allowedValues;
039:
040: /**
041: * Constructor using default initial value.
042: * @param name the name of this
043: * @param allowedValues the allowed value ranges. It is illegal to
044: * set a value that is not in the allowed ranges.
045: **/
046: protected OMCBase(String name, OMCRangeList allowedValues) {
047: this .name = name;
048: this .allowedValues = allowedValues;
049: this .value = allowedValues.getEffectiveValue();
050: }
051:
052: /**
053: * Constructor with a specific initialvalue.
054: * @param name the name of this
055: * @param allowedValues the allowed value ranges. It is illegal to
056: * set a value that is not in the allowed ranges.
057: * @param initialValue the initial value. Must not be null. All
058: * subsequent values that are set for this must have the same class
059: * as the initial value.
060: **/
061: protected OMCBase(String name, OMCRangeList allowedValues,
062: Comparable initialValue) {
063: this (name, allowedValues);
064: setValue(initialValue);
065: }
066:
067: /**
068: * Gets the name
069: * @return the name
070: **/
071: public String getName() {
072: return name;
073: }
074:
075: /**
076: * Gets the list if allowed value ranges. The allowed value ranges
077: * are set in the constructor and immutable thereafter.
078: * @return the list of allowed value ranges.
079: **/
080: public OMCRangeList getAllowedValues() {
081: return allowedValues;
082: }
083:
084: /**
085: * Gets the current value
086: * @return the current value
087: **/
088: public Comparable getValue() {
089: return value;
090: }
091:
092: /**
093: * Set a new value for this. The new value must be in the list of
094: * allowed value ranges. This method is protected because the
095: * ability to set a new value must be under the control of a
096: * responsible component. Subclasses will override this with public
097: * or package protected versions as needed.
098: * @param newValue the new value. Must be an allowed value.
099: **/
100: protected void setValue(Comparable newValue) {
101: if (!allowedValues.isAllowed(newValue)) {
102: throw new IllegalArgumentException("setValue: " + getName()
103: + " = " + newValue + " not allowed");
104: }
105: if (value.compareTo(newValue) == 0)
106: return; // Already set to this value
107: value = newValue;
108: }
109:
110: /**
111: * Furnish a useful string representation.
112: * @return the name and value separated by an equals sign.
113: **/
114: public String toString() {
115: return getName() + " = " + getValue();
116: }
117: }
|