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.qos.ca;
028:
029: import java.util.Enumeration;
030: import java.util.Collection;
031: import java.util.Iterator;
032:
033: import org.cougaar.core.blackboard.IncrementalSubscription;
034: import org.cougaar.core.component.ServiceBroker;
035: import org.cougaar.core.service.BlackboardService;
036: import org.cougaar.core.service.LoggingService;
037: import org.cougaar.util.UnaryPredicate;
038:
039: /**
040: * This class is the abstract implementation of a facet creates facts
041: * representing the creation or modification of Java Beans.
042: *
043: */
044: abstract public class BeanToFactFacetImpl extends FacetImpl {
045: private IncrementalSubscription sub;
046: private LoggingService log;
047:
048: protected BeanToFactFacetImpl(CoordinationArtifact owner,
049: ServiceBroker sb, ConnectionSpec spec, RolePlayer player) {
050: super (owner, sb, spec, player);
051: log = (LoggingService) sb.getService(this ,
052: LoggingService.class, null);
053: initialize(spec);
054: linkPlayer();
055: }
056:
057: abstract protected UnaryPredicate getPredicate();
058:
059: abstract protected Object beanToFact(Object bean);
060:
061: abstract protected Object changesToFact(Object bean,
062: Collection changes);
063:
064: protected void initialize(ConnectionSpec spec) {
065: }
066:
067: private void do_execute(BlackboardService bbs) {
068: if (sub == null || !sub.hasChanged()) {
069: if (log.isDebugEnabled())
070: log.debug("No Bean changes");
071: return;
072: }
073:
074: RolePlayer player = getPlayer();
075:
076: Enumeration en;
077:
078: // New Beans
079: en = sub.getAddedList();
080: while (en.hasMoreElements()) {
081: Object bean = en.nextElement();
082: if (log.isDebugEnabled()) {
083: log.debug("Observed added " + bean);
084: }
085: Object fact = beanToFact(bean);
086: if (fact instanceof Collection) {
087: Iterator itr = ((Collection) fact).iterator();
088: while (itr.hasNext())
089: player.assertFact(itr.next());
090: } else if (fact != null) {
091: player.assertFact(fact);
092: }
093: }
094:
095: // Changed Beans
096: en = sub.getChangedList();
097: while (en.hasMoreElements()) {
098: Object bean = en.nextElement();
099: if (log.isDebugEnabled()) {
100: log.debug("Observed changed " + bean);
101: }
102: Collection changes = sub.getChangeReports(bean);
103: Object fact = changesToFact(bean, changes);
104: if (fact instanceof Collection) {
105: Iterator itr = ((Collection) fact).iterator();
106: while (itr.hasNext()) {
107: Object change_fact = itr.next();
108: if (change_fact != null)
109: player.assertFact(change_fact);
110: }
111: } else if (fact != null) {
112: player.assertFact(fact);
113: }
114: }
115:
116: // Remove Beans. TBD
117: en = sub.getRemovedList();
118: while (en.hasMoreElements()) {
119: Object bean = en.nextElement();
120: if (log.isDebugEnabled()) {
121: log.debug("Observed removed " + bean);
122: }
123: }
124: }
125:
126: public void setupSubscriptions(BlackboardService bbs) {
127: UnaryPredicate pred = getPredicate();
128: sub = (IncrementalSubscription) bbs.subscribe(pred);
129:
130: if (!sub.getAddedCollection().isEmpty() && log.isDebugEnabled())
131: log.debug("Subscription has initial contents");
132: do_execute(bbs);
133: }
134:
135: public void execute(BlackboardService bbs) {
136: do_execute(bbs);
137: }
138:
139: }
|