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.core.examples.mobility.test;
028:
029: import java.util.Collection;
030: import java.util.Enumeration;
031: import java.util.Iterator;
032: import org.cougaar.core.blackboard.CollectionSubscription;
033: import org.cougaar.core.blackboard.IncrementalSubscription;
034: import org.cougaar.core.mobility.Ticket;
035: import org.cougaar.core.mobility.ldm.MobilityFactory;
036: import org.cougaar.core.mobility.ldm.MoveAgent;
037: import org.cougaar.core.mts.MessageAddress;
038: import org.cougaar.core.plugin.ComponentPlugin;
039: import org.cougaar.core.service.DomainService;
040: import org.cougaar.core.service.LoggingService;
041: import org.cougaar.core.util.UID;
042: import org.cougaar.core.util.UniqueObject;
043: import org.cougaar.util.UnaryPredicate;
044:
045: /**
046: * Base class for simple mobility testing.
047: *
048: * @see QuickMoverPlugin
049: */
050: public abstract class AbstractMoverPlugin extends ComponentPlugin {
051:
052: protected MessageAddress agentId;
053:
054: protected LoggingService log;
055:
056: protected MobilityFactory mobilityFactory;
057:
058: protected IncrementalSubscription moveAgentSub;
059:
060: public void setLoggingService(LoggingService log) {
061: this .log = log;
062: }
063:
064: // get the mobility factory via service
065: public void setDomainService(DomainService domain) {
066:
067: // get the mobility factory
068: this .mobilityFactory = (MobilityFactory) domain
069: .getFactory("mobility");
070:
071: if (mobilityFactory == null) {
072: // see CDG section 5.2.5
073: throw new RuntimeException(
074: "Mobility domain not loaded -- check your \""
075: + "LDMDomain.ini\" configuration");
076: }
077: }
078:
079: protected void setupSubscriptions() {
080: agentId = getAgentIdentifier();
081:
082: // watch for changed MoveAgent objects
083: moveAgentSub = (IncrementalSubscription) blackboard
084: .subscribe(createMovePredicate(agentId));
085: }
086:
087: protected void execute() {
088: if (moveAgentSub.hasChanged()) {
089: // watch for changes
090: Enumeration en = moveAgentSub.getChangedList();
091: while (en.hasMoreElements()) {
092: MoveAgent ma = (MoveAgent) en.nextElement();
093: MoveAgent.Status mstat = ma.getStatus();
094: if (mstat != null) {
095: handleCompletedMove(ma);
096: }
097: }
098: }
099: }
100:
101: protected abstract void handleCompletedMove(MoveAgent ma);
102:
103: protected MoveAgent findMoveAgent(UID moveAgentUID) {
104: Collection real = moveAgentSub.getCollection();
105: int n = real.size();
106: if (n > 0) {
107: for (Iterator iter = real.iterator(); iter.hasNext();) {
108: MoveAgent ma = (MoveAgent) iter.next();
109: if (ma.getUID().equals(moveAgentUID)) {
110: return ma;
111: }
112: }
113: }
114: return null;
115: }
116:
117: private static UniqueObject query(CollectionSubscription sub,
118: UID uid) {
119: Collection real = sub.getCollection();
120: int n = real.size();
121: if (n > 0) {
122: for (Iterator iter = real.iterator(); iter.hasNext();) {
123: Object o = iter.next();
124: if (o instanceof UniqueObject) {
125: UniqueObject uo = (UniqueObject) o;
126: UID x = uo.getUID();
127: if (uid.equals(x)) {
128: return uo;
129: }
130: }
131: }
132: }
133: return null;
134: }
135:
136: private static UnaryPredicate createMovePredicate(
137: final MessageAddress agentId) {
138: return new UnaryPredicate() {
139: public boolean execute(Object o) {
140: if (o instanceof MoveAgent) {
141: MoveAgent ma = (MoveAgent) o;
142: return (agentId.equals(ma.getSource()));
143: }
144: return false;
145: }
146: };
147: }
148:
149: protected Ticket createTicket(String mobileAgent, // name of agent to move
150: String origNode, // node where the agent is at right now
151: String destNode, // destination for the move
152: boolean forceRestart // restart even if at the destination
153: ) {
154:
155: // create addresses
156: MessageAddress mobileAgentId = ((mobileAgent != null) ? (MessageAddress
157: .getMessageAddress(mobileAgent))
158: : null);
159: MessageAddress origNodeId = ((origNode != null) ? (MessageAddress
160: .getMessageAddress(origNode))
161: : null);
162: MessageAddress destNodeId = ((destNode != null) ? (MessageAddress
163: .getMessageAddress(destNode))
164: : null);
165:
166: return createTicket(mobileAgentId, origNodeId, destNodeId,
167: forceRestart);
168: }
169:
170: protected Ticket createTicket(MessageAddress mobileAgentId, // name of agent to move
171: MessageAddress origNodeId, // node where the agent is at right now
172: MessageAddress destNodeId, // destination for the move
173: boolean forceRestart // restart even if at the destination
174: ) {
175:
176: // create move "ticket"
177: Object ticketId = mobilityFactory.createTicketIdentifier();
178: Ticket ticket = new Ticket(ticketId, mobileAgentId, origNodeId,
179: destNodeId, forceRestart);
180:
181: return ticket;
182: }
183:
184: protected void requestMove(Ticket ticket) {
185: // create MoveAgent object
186: MoveAgent ma = mobilityFactory.createMoveAgent(ticket);
187: blackboard.publishAdd(ma);
188: }
189: }
|