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.core.wp.bootstrap;
028:
029: import java.util.Collection;
030: import java.util.Collections;
031: import java.util.HashSet;
032: import java.util.Iterator;
033: import java.util.Map;
034: import java.util.Set;
035: import org.cougaar.core.component.Component;
036: import org.cougaar.core.component.ServiceBroker;
037: import org.cougaar.core.component.ServiceProvider;
038: import org.cougaar.core.mts.MessageAddress;
039: import org.cougaar.core.service.LoggingService;
040: import org.cougaar.util.GenericStateModelAdapter;
041:
042: /**
043: * This component provides the {@link PeersService}, to tell the
044: * server about their peer servers.
045: * <p>
046: * This is a very simple implementation that is based on the
047: * ConfigService. This could be enhanced to discover peers.
048: */
049: public class PeersManager extends GenericStateModelAdapter implements
050: Component {
051:
052: private ServiceBroker sb;
053:
054: private LoggingService log;
055:
056: private EnsureIsFoundService ensureService;
057:
058: private Set servers;
059:
060: private PeersSP peersSP;
061:
062: public void setServiceBroker(ServiceBroker sb) {
063: this .sb = sb;
064: }
065:
066: public void setLoggingService(LoggingService log) {
067: this .log = log;
068: }
069:
070: public void setEnsureIsFoundService(
071: EnsureIsFoundService ensureService) {
072: this .ensureService = ensureService;
073: }
074:
075: public void load() {
076: super .load();
077:
078: servers = findServers();
079:
080: ensureService = (EnsureIsFoundService) sb.getService(this ,
081: EnsureIsFoundService.class, null);
082: if (ensureService == null) {
083: if (log.isWarnEnabled()) {
084: log.warn("Unable to obtain EnsureIsFoundService");
085: }
086: } else {
087: // ensure that our peer servers are found
088: for (Iterator iter = servers.iterator(); iter.hasNext();) {
089: MessageAddress addr = (MessageAddress) iter.next();
090: ensureService.add(addr.getAddress());
091: }
092: }
093:
094: // advertise our service
095: peersSP = new PeersSP();
096: sb.addService(PeersService.class, peersSP);
097: }
098:
099: public void unload() {
100: if (peersSP != null) {
101: sb.revokeService(PeersService.class, peersSP);
102: peersSP = null;
103: }
104:
105: if (ensureService != null) {
106: // no longer watching these servers
107: for (Iterator iter = servers.iterator(); iter.hasNext();) {
108: MessageAddress addr = (MessageAddress) iter.next();
109: ensureService.remove(addr.getAddress());
110: }
111: sb.releaseService(this , EnsureIsFoundService.class,
112: ensureService);
113: ensureService = null;
114: }
115:
116: super .unload();
117: }
118:
119: protected Map getBundles() {
120: return ConfigReader.getBundles();
121: }
122:
123: protected Set findServers() {
124: Set ret = new HashSet();
125:
126: Map m = getBundles();
127: if (m != null) {
128: for (Iterator iter = m.values().iterator(); iter.hasNext();) {
129: Bundle b = (Bundle) iter.next();
130: MessageAddress addr = Util.parseServer(b);
131: if (addr != null) {
132: ret.add(addr);
133: }
134: }
135: }
136:
137: ret = Collections.unmodifiableSet(ret);
138: return ret;
139: }
140:
141: protected Set getServers() {
142: return servers;
143: }
144:
145: private class PeersSP implements ServiceProvider {
146: private final PeersService INSTANCE = new PeersService() {
147: public Set getServers() {
148: return PeersManager.this .getServers();
149: }
150: };
151:
152: public Object getService(ServiceBroker sb, Object requestor,
153: Class serviceClass) {
154: if (!PeersService.class.isAssignableFrom(serviceClass)) {
155: return null;
156: }
157: if (requestor instanceof PeersService.Client) {
158: // initialize client
159: PeersService.Client psc = (PeersService.Client) requestor;
160: Set s = PeersManager.this .getServers();
161: if (s != null && !s.isEmpty()) {
162: psc.addAll(s);
163: }
164: }
165: return INSTANCE;
166: }
167:
168: public void releaseService(ServiceBroker sb, Object requestor,
169: Class serviceClass, Object service) {
170: }
171: }
172: }
|