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.mts.base;
028:
029: import org.cougaar.core.component.ServiceBroker;
030: import org.cougaar.core.component.ServiceProvider;
031: import org.cougaar.core.mts.MessageAddress;
032: import org.cougaar.core.mts.MessageTransportClient;
033:
034: /**
035: * The parent class of all Link Protocols. Instantiable subclasses
036: * are required to do two things: they must be able to say whether or
037: * not they can deal with any particular addresss (addressKnown), and
038: * they must be able to supply a DestinationLink instance for any
039: * address they can deal with (getDestinationLink). They will also be
040: * given the opportunity to "register" clients, if they have any
041: * interest in doing so (for instance, an RMI transport might use this
042: * as an opportunity to publish an MTImpl for the client on a
043: * nameserver).
044: *
045: * LinkProtocols are implicitly factories for the creation of
046: * DestinationLinks, so the class is declared to extend AspectFactory,
047: * in order to allow aspects to be added to the Links. The aspect
048: * attachment is handled in each specific transport class.
049: *
050: * Finally, LinkProtocols can act as ServiceProviders for
051: * protocol-specific services.
052: */
053: abstract public class LinkProtocol extends BoundComponent implements
054: ServiceProvider {
055: private MessageDeliverer deliverer;
056:
057: protected class ServiceProxy implements LinkProtocolService {
058: public boolean addressKnown(MessageAddress address) {
059: return LinkProtocol.this .addressKnown(address);
060: }
061: }
062:
063: // LinkProtocol implementations must supply these!
064:
065: /**
066: * Create a DestinationLink for the given protocol/destination
067: * pair.
068: */
069: abstract public DestinationLink getDestinationLink(
070: MessageAddress destination);
071:
072: /**
073: * Handle any required local and/or nameservice registration for
074: * the given client.
075: */
076: abstract public void registerClient(MessageTransportClient client);
077:
078: /**
079: * Handle any required local and/or nameservice de-registration
080: * for the given client.
081: */
082: abstract public void unregisterClient(MessageTransportClient client);
083:
084: /**
085: * Determine whether or not the given protocol understands the
086: * given address. */
087: abstract public boolean addressKnown(MessageAddress address);
088:
089: protected LinkProtocol() {
090: // System.out.println("Made LinkProtocol " +this);
091: }
092:
093: protected MessageDeliverer getDeliverer() {
094: if (deliverer == null) {
095: ServiceBroker sb = getServiceBroker();
096: deliverer = (MessageDeliverer) sb.getService(this ,
097: MessageDeliverer.class, null);
098: }
099: return deliverer;
100: }
101:
102: // Allow subclasses to provide their own load()
103: protected void super _load() {
104: super .load();
105: getRegistry().addLinkProtocol(this );
106: }
107:
108: public void load() {
109: super _load();
110: }
111:
112: // Default is no-op. Socket based protocols (RMI, HTTP, CORBA,
113: // etc) will have work to do.
114: public void ipAddressChanged() {
115: }
116:
117: public Object getService(ServiceBroker sb, Object requestor,
118: Class serviceClass) {
119: return null;
120: }
121:
122: public void releaseService(ServiceBroker sb, Object requestor,
123: Class serviceClass, Object service) {
124: }
125:
126: public Object attachAspects(Object delegate, Class type) {
127: return getAspectSupport().attachAspects(delegate, type);
128: }
129:
130: }
|