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.resolver;
028:
029: import org.cougaar.core.agent.Agent; // inlined
030: import org.cougaar.core.component.Component;
031: import org.cougaar.core.component.ServiceBroker;
032: import org.cougaar.core.component.ServiceProvider;
033: import org.cougaar.core.component.ServiceRevokedListener;
034: import org.cougaar.core.node.NodeControlService;
035: import org.cougaar.core.service.LoggingService;
036: import org.cougaar.core.service.wp.Request;
037: import org.cougaar.core.service.wp.Response;
038: import org.cougaar.core.service.wp.WhitePagesService;
039: import org.cougaar.util.GenericStateModelAdapter;
040:
041: /**
042: * This component is the front-end for the client-side white pages
043: * resolver, which advertises the {@link WhitePagesService}.
044: * <p>
045: * This is really just a front-end to the {@link CacheManager}'s
046: * {@link LookupService} and the {@link LeaseManager}'s {@link
047: * ModifyService}.
048: */
049: public class Resolver extends GenericStateModelAdapter implements
050: Component {
051: private ServiceBroker sb;
052: private ServiceBroker rootsb;
053: private LoggingService log;
054:
055: private CacheService cacheService;
056: private LeaseService leaseService;
057: private ServiceProvider whitePagesSP;
058:
059: public void setServiceBroker(ServiceBroker sb) {
060: this .sb = sb;
061: }
062:
063: public void setNodeControlService(NodeControlService ncs) {
064: rootsb = (ncs == null ? null : ncs.getRootServiceBroker());
065: }
066:
067: public void setLoggingService(LoggingService log) {
068: this .log = log;
069: }
070:
071: public void load() {
072: super .load();
073:
074: if (log.isDebugEnabled()) {
075: log.debug("Loading resolver");
076: }
077:
078: // get the key services that should be created by our
079: // subcomponents.
080: cacheService = (CacheService) sb.getService(this ,
081: CacheService.class, null);
082: if (cacheService == null) {
083: throw new RuntimeException("Unable to obtain CacheService");
084: }
085: leaseService = (LeaseService) sb.getService(this ,
086: LeaseService.class, null);
087: if (leaseService == null) {
088: throw new RuntimeException("Unable to obtain LeaseService");
089: }
090:
091: whitePagesSP = new WhitePagesSP();
092: rootsb.addService(WhitePagesService.class, whitePagesSP);
093:
094: if (log.isInfoEnabled()) {
095: log.info("Loaded white pages resolver");
096: }
097: }
098:
099: public void unload() {
100: super .unload();
101:
102: // revoke white pages service
103: if (whitePagesSP != null) {
104: rootsb.revokeService(WhitePagesService.class, whitePagesSP);
105: whitePagesSP = null;
106: }
107:
108: if (leaseService != null) {
109: sb.releaseService(this , LeaseService.class, leaseService);
110: leaseService = null;
111: }
112: if (cacheService != null) {
113: sb.releaseService(this , CacheService.class, cacheService);
114: cacheService = null;
115: }
116:
117: if (log != null) {
118: sb.releaseService(this , LoggingService.class, log);
119: log = null;
120: }
121: }
122:
123: private class WhitePagesSP implements ServiceProvider {
124: public Object getService(ServiceBroker sb, Object requestor,
125: Class serviceClass) {
126: if (WhitePagesService.class.isAssignableFrom(serviceClass)) {
127: String agent = ((requestor instanceof ResolverClient) ? ((ResolverClient) requestor)
128: .getAgent()
129: : null); // assume it's our node-agent
130: return new WhitePagesS(agent);
131: } else {
132: return null;
133: }
134: }
135:
136: public void releaseService(ServiceBroker sb, Object requestor,
137: Class serviceClass, Object service) {
138: }
139: }
140:
141: private class WhitePagesS extends WhitePagesService {
142:
143: private final String agent;
144:
145: public WhitePagesS(String agent) {
146: this .agent = agent;
147: }
148:
149: public Response submit(Request req) {
150: if (log.isDetailEnabled()) {
151: log.detail("Resolver intercept wp request: " + req);
152: }
153: Response res = req.createResponse();
154:
155: cacheService.submit(res);
156:
157: boolean bind = (req instanceof Request.Bind || req instanceof Request.Unbind);
158:
159: if (bind) {
160: leaseService.submit(res, agent);
161: }
162: return res;
163: }
164: }
165: }
|