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: import java.util.Collections;
030: import java.util.Set;
031:
032: import org.cougaar.core.mts.MessageAddress;
033: import org.cougaar.core.relay.Relay;
034: import org.cougaar.core.util.UID;
035: import org.cougaar.core.util.UniqueObject;
036:
037: /**
038: * A remotely-controlled Condition. Allows an adaptivity engine in one
039: * agent to control a Condition of the adaptivity engine in another
040: * agent. It is instantiated in the controlling agent and transferred
041: * to the controlled agent using the Relay logic providers. A copy
042: * of the instance is published in the controlled agent's blackboard
043: * and used like any other Condition.
044: **/
045: public class InterAgentOperatingMode extends OperatingModeImpl
046: implements Relay.Source, UniqueObject, java.io.Serializable {
047: // this can't be transient like other relays, cause not storing
048: // target separately
049: private Set targets = Collections.EMPTY_SET;
050: private UID uid;
051:
052: // Constructors
053: public InterAgentOperatingMode(String name,
054: OMCRangeList allowedValues) {
055: super (name, allowedValues, allowedValues.getEffectiveValue());
056: }
057:
058: public InterAgentOperatingMode(String name,
059: OMCRangeList allowedValues, Comparable value) {
060: super (name, allowedValues, value);
061: }
062:
063: // Initialization methods
064: /**
065: * Set the message address of the target. This implementation
066: * presumes that there is but one target.
067: * @param target the address of the target agent.
068: **/
069: public void setTarget(MessageAddress target) {
070: targets = Collections.singleton(target);
071: }
072:
073: // UniqueObject interface
074: public UID getUID() {
075: return uid;
076: }
077:
078: /**
079: * Set the UID (unique identifier) of this UniqueObject. Used only
080: * during initialization.
081: * @param uid the UID to be given to this
082: **/
083: public void setUID(UID uid) {
084: if (this .uid != null)
085: throw new RuntimeException("Attempt to change UID");
086: this .uid = uid;
087: }
088:
089: // Relay.Source interface
090:
091: /**
092: * @return null -- this is the source copy of the Relay.
093: */
094: public MessageAddress getSource() {
095: return null;
096: }
097:
098: /**
099: * Get all the addresses of the target agents to which this Relay
100: * should be sent. For this implementation this is always a
101: * singleton set contain just one target.
102: **/
103: public Set getTargets() {
104: return targets;
105: }
106:
107: /**
108: * Get an object representing the value of this Relay suitable
109: * for transmission. This implementation uses itself to represent
110: * its Content.
111: **/
112: public Object getContent() {
113: return this ;
114: }
115:
116: /**
117: * @return a factory to convert the content to a Relay Target.
118: **/
119: public Relay.TargetFactory getTargetFactory() {
120: return InterAgentConditionFactory.INSTANCE;
121: }
122:
123: /**
124: * Set the response that was sent from a target. For LP use only.
125: * This implemenation does nothing because responses are not needed
126: * or used.
127: **/
128: public int updateResponse(MessageAddress target, Object response) {
129: // No response expected
130: return Relay.NO_CHANGE;
131: }
132:
133: /**
134: * This factory creates a new InterAgentCondition.
135: **/
136: private static class InterAgentConditionFactory implements
137: Relay.TargetFactory, java.io.Serializable {
138: public static final InterAgentConditionFactory INSTANCE = new InterAgentConditionFactory();
139:
140: private InterAgentConditionFactory() {
141: }
142:
143: public Relay.Target create(UID uid, MessageAddress source,
144: Object content, Relay.Token owner) {
145: InterAgentOperatingMode iaom = (InterAgentOperatingMode) content;
146: return new InterAgentCondition(iaom, uid, source, owner);
147: }
148:
149: private Object readResolve() {
150: return INSTANCE;
151: }
152: }
153: }
|