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.servicediscovery.transaction;
028:
029: import java.io.Serializable;
030: import java.util.Collections;
031: import java.util.Set;
032:
033: import org.cougaar.core.mts.MessageAddress;
034: import org.cougaar.core.relay.Relay;
035: import org.cougaar.core.util.UID;
036: import org.cougaar.servicediscovery.description.ProviderDescription;
037:
038: /**
039: * Package-private implementation of a ProviderDescriptionQuery.
040: * <p>
041: * This uses the Relay support to transfer the data
042: * between the source agent and target agent.
043: */
044: public class ProviderDescriptionQueryImpl implements
045: ProviderDescriptionQuery, Relay.Source, Relay.Target,
046: Serializable {
047:
048: private final UID uid;
049: private final MessageAddress source;
050: private final MessageAddress target;
051: private final UID requestUID;
052: private final String key;
053: private ProviderDescription providerDesc;
054:
055: private transient Set _targets;
056: private transient Relay.TargetFactory _factory;
057:
058: public ProviderDescriptionQueryImpl(UID uid, MessageAddress source,
059: MessageAddress target, UID requestUID, String key) {
060: this .uid = uid;
061: this .source = source;
062: this .target = target;
063: this .requestUID = requestUID;
064: this .key = key;
065:
066: if ((uid == null) || (source == null) || (target == null)
067: || (requestUID == null) || (key == null)) {
068: throw new IllegalArgumentException(
069: "null uid/source/target/requestUID/key");
070: }
071:
072: if (source.equals(target)) {
073: throw new IllegalArgumentException(
074: "Source and target addresses are equal (" + uid
075: + ", " + source + ", " + target + ")");
076: }
077: cacheTargets();
078: }
079:
080: /**
081: * UID support from unique-object.
082: * @return The UID of the object.
083: */
084: public UID getUID() {
085: return uid;
086: }
087:
088: /**
089: * Set the UID.
090: * @param uid the UID of the object.
091: */
092: public void setUID(UID uid) {
093: throw new UnsupportedOperationException();
094: }
095:
096: /**
097: * Address of the requesting agent.
098: * @return The address of the agent.
099: */
100: public MessageAddress getSource() {
101: return source;
102: }
103:
104: /**
105: * Address of the agent that was contacted.
106: * @return The address of the agent.
107: */
108: public MessageAddress getTarget() {
109: return target;
110: }
111:
112: /**
113: * Unique identifier of the request for provider descriptions.
114: * @return UID of the request object.
115: */
116: public UID getRequestUID() {
117: return requestUID;
118: }
119:
120: /**
121: * The key for looking up the provider's description.
122: * @return Key that maps to provider's description.
123: */
124: public String getKey() {
125: return key;
126: }
127:
128: /**
129: * Provider description describing the provider and its services.
130: * @return ProviderDescription matching the request.
131: */
132: public ProviderDescription getProviderDescription() {
133: return providerDesc;
134: }
135:
136: /**
137: * Set the provider description.
138: * @param providerDesc the ProviderDescripton
139: */
140: public void setProviderDescription(ProviderDescription providerDesc) {
141: this .providerDesc = providerDesc;
142: // caller *must* "publishChange()" this object to make
143: // the provider desc be sent back to the caller.
144: }
145:
146: // Relay.Source:
147: private void cacheTargets() {
148: _targets = Collections.singleton(target);
149: _factory = new ProviderDescriptionQueryImplFactory(target);
150: }
151:
152: public Set getTargets() {
153: return _targets;
154: }
155:
156: public Object getContent() {
157: return this ;
158: }
159:
160: public Relay.TargetFactory getTargetFactory() {
161: return _factory;
162: }
163:
164: public int updateResponse(MessageAddress target, Object response) {
165: // assert targetAgent.equals(target)
166: // assert response != null
167: ProviderDescriptionQueryImpl r = (ProviderDescriptionQueryImpl) response;
168: ProviderDescription pd = r.getProviderDescription();
169: // check for change
170: if ((providerDesc == null) ? (pd != null) : (!providerDesc
171: .equals(pd))) {
172: providerDesc = pd;
173: return Relay.RESPONSE_CHANGE;
174: } else {
175: return Relay.NO_CHANGE;
176: }
177: }
178:
179: // Relay.Target:
180:
181: public Object getResponse() {
182: return (providerDesc != null ? this : null);
183: }
184:
185: public int updateContent(Object content, Token token) {
186: return Relay.NO_CHANGE;
187: }
188:
189: public boolean equals(Object o) {
190: if (o == this ) {
191: return true;
192: } else if (!(o instanceof ProviderDescriptionQueryImpl)) {
193: return false;
194: } else {
195: UID u = ((ProviderDescriptionQueryImpl) o).uid;
196: return uid.equals(u);
197: }
198: }
199:
200: public int hashCode() {
201: return uid.hashCode();
202: }
203:
204: private void readObject(java.io.ObjectInputStream os)
205: throws ClassNotFoundException, java.io.IOException {
206: os.defaultReadObject();
207: cacheTargets();
208: }
209:
210: public String toString() {
211: return "ProviderDescriptionQuery {" + "\n uid: " + uid
212: + "\n source: " + source + "\n target: "
213: + target + "\n requestUID: " + requestUID
214: + "\n key: " + key + "\n providerDesc: "
215: + providerDesc + "\n}";
216: }
217:
218: /**
219: * Simple factory implementation.
220: */
221: private static class ProviderDescriptionQueryImplFactory implements
222: Relay.TargetFactory, Serializable {
223:
224: private final MessageAddress target;
225:
226: public ProviderDescriptionQueryImplFactory(MessageAddress target) {
227: this .target = target;
228: }
229:
230: public Relay.Target create(UID uid, MessageAddress source,
231: Object content, Relay.Token token) {
232: ProviderDescriptionQueryImpl p = (ProviderDescriptionQueryImpl) content;
233: return new ProviderDescriptionQueryImpl(p.uid, p.source,
234: p.target, p.requestUID, p.key);
235: }
236: }
237: }
|