01: /*
02: * <copyright>
03: *
04: * Copyright 1997-2004 BBNT Solutions, LLC
05: * under sponsorship of the Defense Advanced Research Projects
06: * Agency (DARPA).
07: *
08: * You can redistribute this software and/or modify it under the
09: * terms of the Cougaar Open Source License as published on the
10: * Cougaar Open Source Website (www.cougaar.org).
11: *
12: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
14: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
15: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
16: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23: *
24: * </copyright>
25: */
26:
27: package org.cougaar.mts.base;
28:
29: import org.cougaar.core.component.Container;
30: import org.cougaar.core.component.ServiceBroker;
31: import org.cougaar.mts.std.AttributedMessage;
32:
33: /**
34: * The default, and for now only, implementation of {@link SendQueue}.
35: * The implementation of <strong>sendMessage</strong> simply adds the
36: * message to the queue. This kind of queue includes its own thread,
37: * which invokes <strong>dispatch</strong> as each message is popped
38: * off the queue. This, in turn, requests the {@link Router} to route
39: * the message to the appropriate {@link DestinationQueue}.
40: *
41: */
42: public final class SendQueueImpl extends MessageQueue implements
43: SendQueue {
44: private Router router;
45:
46: public SendQueueImpl(String name, Container container) {
47: super (name, container);
48: container.add(this );
49: }
50:
51: public void load() {
52: super .load();
53: ServiceBroker sb = getServiceBroker();
54: router = (Router) sb.getService(this , Router.class, null);
55: }
56:
57: /**
58: * This is the callback from the internal thread. */
59: boolean dispatch(AttributedMessage message) {
60: router.routeMessage(message);
61: return true;
62: }
63:
64: /**
65: * The implementation of this SendQueue method simply adds the
66: * message to the internal queue (a CircularQueue). */
67: public void sendMessage(AttributedMessage message) {
68: add(message);
69: }
70:
71: /**
72: * In a system with more than one SendQueue, each would have a
73: * unique name. If the SendQueueFactory is ever asked to make a
74: * queue with a name that's alreayd in use, it will instead find
75: * the existing queue by means of this method. */
76: public boolean matches(String name) {
77: return name.equals(getName());
78: }
79:
80: }
|