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.planning.plugin;
028:
029: import java.util.*;
030: import org.cougaar.util.log.Logger;
031: import org.cougaar.core.component.Binder;
032: import org.cougaar.core.component.BinderFactory;
033: import org.cougaar.core.component.ServiceBroker;
034: import org.cougaar.core.component.ServiceFilter;
035: import org.cougaar.core.component.ServiceFilterBinder;
036: import org.cougaar.core.mts.MessageAddress;
037: import org.cougaar.core.mts.Message;
038: import org.cougaar.core.service.BlackboardService;
039: import org.cougaar.core.service.LoggingService;
040: import org.cougaar.core.service.AgentIdentificationService;
041: import org.cougaar.planning.ldm.plan.Task;
042:
043: /** A Binder for plugins which complains when various known-bad plugin behaviors
044: * are observed.
045: * Currently, it complains (at warn level) about non-local Tasks which are added or changed.
046: **/
047: public class PluginSanityBinder extends ServiceFilter {
048: private Logger _log;
049:
050: public void setLoggingService(LoggingService l) {
051: _log = l;
052: }
053:
054: protected Logger log() {
055: return _log;
056: }
057:
058: private AgentIdentificationService _ais;
059: private MessageAddress _ma;
060:
061: public void setAgentIdentificationService(
062: AgentIdentificationService s) {
063: _ais = s;
064: _ma = s != null ? s.getMessageAddress() : null;
065: }
066:
067: protected MessageAddress getMessageAddress() {
068: return _ma;
069: }
070:
071: // strictly-speaking, this is a BinderFactory and Enforcer is the actual binder
072:
073: // activate the Enforcer
074: public Binder getBinder(Object child) {
075: return new Enforcer(this , child);
076: }
077:
078: /** Enforcer installs service proxies as needed **/
079: protected class Enforcer extends ServiceFilterBinder {
080: public Enforcer(BinderFactory bf, Object child) {
081: super (bf, child);
082: }
083:
084: // install the ServiceBroker proxy
085: protected ServiceBroker createFilteringServiceBroker(
086: ServiceBroker sb) {
087: return new EnforcerServiceBroker(sb);
088: }
089:
090: // Sb proxy to insert Service Proxies
091: protected class EnforcerServiceBroker extends
092: FilteringServiceBroker {
093: public EnforcerServiceBroker(ServiceBroker sb) {
094: super (sb);
095: }
096:
097: // insert our own BlackboardServiceProxy
098: protected Object getServiceProxy(Object service,
099: Class serviceClass, Object client) {
100: if (service instanceof BlackboardService) {
101: return new BlackboardServiceProxy(
102: (BlackboardService) service, client);
103: }
104: return null;
105: }
106: }
107: }
108:
109: /** PluginSanityBinder's BlackboardService.
110: * Here we check for any obvious subscription/BB bad behavior.
111: * In particular, we log complaints when:
112: **
113: **/
114: private class BlackboardServiceProxy extends
115: BlackboardService.Delegate {
116: private final Object client;
117:
118: public BlackboardServiceProxy(BlackboardService bs,
119: Object client) {
120: super (bs);
121: this .client = client;
122: if (log().isInfoEnabled()) {
123: log().info("SanityChecking " + client);
124: }
125: }
126:
127: public void publishAdd(Object o) {
128: auditPublishAdd(o);
129: super .publishAdd(o);
130: }
131:
132: public void publishRemove(Object o) {
133: auditPublishRemove(o);
134: super .publishRemove(o);
135: }
136:
137: public void publishChange(Object o) {
138: auditPublishChange(o);
139: super .publishChange(o);
140: }
141:
142: public void publishChange(Object o, Collection changes) {
143: auditPublishChange(o);
144: super .publishChange(o, changes);
145: }
146: }
147:
148: void auditPublishAdd(Object o) {
149: if (o instanceof Task) {
150: Task t = (Task) o;
151: if (!equalp(t.getSource(), getMessageAddress())) {
152: log().warn("publishAdd of non-local task: " + t);
153: }
154: }
155: }
156:
157: void auditPublishRemove(Object o) {
158: }
159:
160: void auditPublishChange(Object o) {
161: if (o instanceof Task) {
162: Task t = (Task) o;
163: if (!equalp(t.getSource(), getMessageAddress())) {
164: log().warn("publishChange of non-local task: " + t);
165: }
166: }
167: }
168:
169: static final boolean equalp(Object a, Object b) {
170: return (a == null) ? (b == null) : (a.equals(b));
171: }
172: }
|