001: /*
002: * <copyright>
003: *
004: * Copyright 2003-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: package org.cougaar.lib.aggagent.client;
027:
028: import org.cougaar.lib.aggagent.query.AggregationResultSet;
029: import org.w3c.dom.Element;
030:
031: /**
032: * Provides support for event driven monitoring of active
033: * AggregationResultSet(s) on the aggregation agent.
034: *
035: * Maintains a collection of monitored result sets and keeps them updated
036: * based on changes on the aggregation agent's blackboard. To react to these
037: * changes either:
038: * <UL>
039: * <LI>add update listener(s) to this monitor class and receive events for
040: * changes to all monitored result sets or</LI>
041: * <LI>add update listener(s) to 'live' result sets provided by monitor and
042: * receive events only for those objects</LI>
043: * </UL>
044: */
045: public class ResultSetMonitor extends Monitor {
046: /**
047: * Create a new monitor to monitor a set of objects on the aggregation
048: * agent. Each monitor is used to monitor a single type of object
049: * (e.g. AlertMonitor, ResultSetMonitor).
050: *
051: * @param serverURL aggregation agent cluster's text URL
052: * @param updateMethod method used to keep monitored objects updated
053: * PULL_METHOD - periodically pull incremental updates
054: * from passive session on aggregation
055: * agent. Create new connection with
056: * each pull.
057: * KEEP_ALIVE_METHOD - create keep alive session
058: * with aggregation agent. Incremental
059: * updates are pushed to the client
060: * over this pipe.
061: */
062: public ResultSetMonitor(String serverURL, int updateMethod) {
063: super (serverURL, AggregationResultSet.RESULT_SET_TAG,
064: updateMethod);
065: }
066:
067: /**
068: * Monitor a result set managed by the aggregation agent. Returns a 'live'
069: * result set for a given persistent query. Update listeners can be added
070: * to this live object to react to changes to that object. If monitor is
071: * not set to monitor-all-objects, this result set is added to this
072: * monitor's set of monitored objects.
073: *
074: * @param queryId id of query result adapter on aggregation agent that is
075: * maintaining this result set.
076: *
077: * @return a live result set that is actively being updated to match a
078: * subject object on the aggregation agent.
079: */
080: public AggregationResultSet monitorResultSet(String queryId) {
081: AggregationResultSet resultSet = new AggregationResultSet();
082: AggregationResultSet monitoredResultSet = (AggregationResultSet) monitorObject(
083: queryId, resultSet);
084: return monitoredResultSet;
085: }
086:
087: /**
088: * Remove this result set from the set of result sets being monitored.
089: * This method has a negligible effect if monitor-all is turned on
090: * (old live result set object will die, but new one will take it's place
091: * if that object is still on the log plan).
092: *
093: * @param queryId id of query result adapter on aggregation agent that is
094: * maintaining this result set.
095: *
096: * @return previously live result set that was removed.
097: */
098: public AggregationResultSet stopMonitoringResultSet(String queryId) {
099: return (AggregationResultSet) stopMonitoringObject(queryId);
100: }
101:
102: /**
103: * Provides a xml representation of a given query identifier.
104: *
105: * @param identifier an object that uniquely identifies an object on the
106: * aggregation agent. Must be able to use this object
107: * as a hashtable key (i.e. must have proper equals()
108: * and hashcode() methods).
109: *
110: * @return a xml representation of given query identifier.
111: */
112: protected String createIdTag(Object identifier) {
113: return "<query id=\"" + identifier + "\"/>\n";
114: }
115:
116: /**
117: * Called when a update event (either add or change) is reported by the
118: * aggregation agent to a result set described by the given xml element
119: * tree.
120: *
121: * @param monitoredElement xml element tree that describes the updated
122: * result set.
123: *
124: * @return a live result set object updated based on the given xml
125: */
126: protected Object update(Element monitoredElement) {
127: String queryId = monitoredElement
128: .getAttribute(AggregationResultSet.QUERY_ID_ATT);
129: AggregationResultSet newRs = new AggregationResultSet(
130: monitoredElement);
131: AggregationResultSet monitoredRs = (AggregationResultSet) monitorObject(
132: queryId, newRs);
133: monitoredRs.update(newRs);
134: return monitoredRs;
135: }
136:
137: /**
138: * Called when a remove event is reported by the aggregation agent to a
139: * result set described by the given xml element tree.
140: *
141: * @param monitoredElement xml element tree that describes the removed
142: * result set.
143: *
144: * @return previously live result set that was removed.
145: */
146: protected Object remove(Element monitoredElement) {
147: String queryId = monitoredElement
148: .getAttribute(AggregationResultSet.QUERY_ID_ATT);
149: AggregationResultSet removedRS = stopMonitoringResultSet(queryId);
150: removedRS.fireObjectRemoved();
151: return removedRS;
152: }
153: }
|