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.domain;
028:
029: import java.util.Collection;
030: import java.util.Enumeration;
031: import java.util.HashMap;
032: import java.util.Iterator;
033:
034: import org.cougaar.core.blackboard.ABATranslation;
035: import org.cougaar.core.blackboard.Blackboard;
036: import org.cougaar.core.blackboard.CollectionSubscription;
037: import org.cougaar.core.blackboard.Directive;
038: import org.cougaar.core.blackboard.PublishHistory;
039: import org.cougaar.core.blackboard.UniqueObjectSet;
040: import org.cougaar.core.util.UID;
041: import org.cougaar.core.util.UniqueObject;
042: import org.cougaar.multicast.AttributeBasedAddress;
043: import org.cougaar.util.UnaryPredicate;
044:
045: /**
046: * Standard implementation of {@link RootPlan}.
047: */
048: public class RootPlanImpl implements RootPlan, XPlan,
049: SupportsDelayedLPActions {
050: private Blackboard blackboard;
051:
052: /** is this a UniqueObject? */
053: private static final UnaryPredicate uniqueObjectP = new UniqueObjectPredicate();
054:
055: private static final class UniqueObjectPredicate implements
056: UnaryPredicate {
057: public boolean execute(Object o) {
058: return (o instanceof UniqueObject)
059: && (((UniqueObject) o).getUID() != null);
060: }
061: }
062:
063: /** Private container for UniqueObject lookup. */
064: private UniqueObjectSet uniqueObjectSet = new UniqueObjectSet();
065: private CollectionSubscription uniqueObjectCollection;
066:
067: public void setupSubscriptions(Blackboard blackboard) {
068: this .blackboard = blackboard;
069: uniqueObjectCollection = new CollectionSubscription(
070: uniqueObjectP, uniqueObjectSet);
071: blackboard.subscribe(uniqueObjectCollection);
072: }
073:
074: public UniqueObject findUniqueObject(UID uid) {
075: return uniqueObjectSet.findUniqueObject(uid);
076: }
077:
078: // Implementation of BlackboardServesLogProvider
079:
080: /**
081: * Apply predicate against the entire "Blackboard".
082: * User provided predicate
083: */
084: public Enumeration searchBlackboard(UnaryPredicate predicate) {
085: return blackboard.searchBlackboard(predicate);
086: }
087:
088: public int countBlackboard(UnaryPredicate predicate) {
089: return blackboard.countBlackboard(predicate);
090: }
091:
092: /**
093: * Add Object to the RootPlan Collection
094: * (All subscribers will be notified)
095: */
096: public void add(Object o) {
097: blackboard.add(o);
098: }
099:
100: /**
101: * Removed Object to the RootPlan Collection
102: * (All subscribers will be notified)
103: */
104: public void remove(Object o) {
105: blackboard.remove(o);
106: }
107:
108: /**
109: * Change Object to the RootPlan Collection
110: * (All subscribers will be notified)
111: */
112: public void change(Object o) {
113: blackboard.change(o, null);
114: }
115:
116: /**
117: * Change Object to the RootPlan Collection
118: * (All subscribers will be notified)
119: */
120: public void change(Object o, Collection changes) {
121: blackboard.change(o, changes);
122: }
123:
124: /**
125: * Alias for sendDirective(Directive, null);
126: */
127: public void sendDirective(Directive dir) {
128: blackboard.sendDirective(dir, null);
129: }
130:
131: /**
132: * Reliably send a directive.
133: * <p>
134: * The message transport takes pains to retransmit this message
135: * until it is acknowledged, even if agents crash. When a crashed
136: * agent recovers, the blackboard invokes the {@link
137: * RestartLogicProvider}s.
138: */
139: public void sendDirective(Directive dir, Collection changes) {
140: blackboard.sendDirective(dir, changes);
141: }
142:
143: public PublishHistory getHistory() {
144: return blackboard.getHistory();
145: }
146:
147: //
148: // DelayedLPAction support
149: //
150:
151: private Object dlpLock = new Object();
152: private HashMap dlpas = new HashMap(11);
153: private HashMap dlpas1 = new HashMap(11);
154:
155: public void executeDelayedLPActions() {
156: synchronized (dlpLock) {
157: // loop in case we get cascades somehow (we don't seem to)
158: while (dlpas.size() > 0) {
159: // flip the map
160: HashMap pending = dlpas;
161: dlpas = dlpas1;
162: dlpas1 = pending;
163:
164: // scan the pending map
165: for (Iterator i = pending.values().iterator(); i
166: .hasNext();) {
167: DelayedLPAction dla = (DelayedLPAction) i.next();
168: try {
169: dla.execute(this );
170: } catch (RuntimeException re) {
171: System.err.println("DelayedLPAction " + dla
172: + " threw: " + re);
173: re.printStackTrace();
174: }
175: }
176:
177: // clear the pending queue before iterating.
178: pending.clear();
179: }
180: }
181: }
182:
183: public void delayLPAction(DelayedLPAction dla) {
184: synchronized (dlpLock) {
185: DelayedLPAction old = (DelayedLPAction) dlpas.get(dla);
186: if (old != null) {
187: old.merge(dla);
188: } else {
189: dlpas.put(dla, dla);
190: }
191: }
192: }
193:
194: public ABATranslation getABATranslation(AttributeBasedAddress aba) {
195: return blackboard.getABATranslation(aba);
196: }
197: }
|