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.core.qos.rss;
028:
029: import org.cougaar.core.agent.Agent;
030: import org.cougaar.core.component.ComponentDescription;
031: import org.cougaar.core.component.ComponentDescriptions;
032: import org.cougaar.core.component.ContainerSupport;
033: import org.cougaar.core.component.ServiceBroker;
034: import org.cougaar.core.component.ServiceProvider;
035: import org.cougaar.core.node.ComponentInitializerService;
036: import org.cougaar.core.node.NodeControlService;
037: import org.cougaar.core.node.NodeIdentificationService;
038: import org.cougaar.core.qos.metrics.DataFeedRegistrationService;
039: import org.cougaar.core.qos.metrics.MetricsService;
040: import org.cougaar.core.qos.metrics.MetricsUpdateService;
041: import org.cougaar.core.thread.ThreadServiceProvider;
042: import org.cougaar.qos.qrs.RSSUtils;
043:
044: /**
045: * This Component/Container provides the RSS-based implementation of the
046: * MetricsService and MetricsUpdateService, and instantiates the
047: * implementations, RSSMetricsServiceImpl and RSSMetricsUpdateServiceImpl
048: * respectively, as child Components.
049: *
050: * @see MetricsService
051: * @see MetricsUpdateService
052: * @see RSSMetricsServiceImpl
053: * @see RSSMetricsUpdateServiceImpl
054: */
055: public final class RSSMetricsServiceProvider extends ContainerSupport
056: implements ServiceProvider {
057: private MetricsService retriever;
058: private MetricsUpdateService updater;
059: private DataFeedRegistrationService registrar;
060:
061: private void makeUpdaterService() {
062: updater = new RSSMetricsUpdateServiceImpl();
063: add(updater);
064: }
065:
066: private void makeRetrieverService() {
067: retriever = new RSSMetricsServiceImpl();
068: add(retriever);
069: registrar = (DataFeedRegistrationService) retriever;
070: }
071:
072: // This is done before child-components are created
073: public void loadHighPriorityComponents() {
074: super .loadHighPriorityComponents();
075: ServiceBroker sb = getServiceBroker();
076: NodeControlService ncs = sb.getService(this ,
077: NodeControlService.class, null);
078: ServiceBroker rootsb = ncs.getRootServiceBroker();
079:
080: // DataFeeds could need a thread service
081: // JAZ needs a ComponentDescription?
082: ThreadServiceProvider tsp = new ThreadServiceProvider();
083: tsp.setParameter("name=Metrics");
084: add(tsp);
085:
086: // Make a Timer available to RSS and TEC
087: //
088: // We must do this before we load our subcomponents, otherwise RSSUtils
089: // will spawn a default (non-ThreadService-backed) timer thread
090: RSSUtils
091: .setScheduler(new CougaarTimer(getChildServiceBroker()));
092:
093: // Childern Components need Registration Service
094: // but the Registration need the MetricServiceImplementation
095: // make Metric Updater Service
096: makeUpdaterService();
097: rootsb.addService(MetricsUpdateService.class, this );
098: // make Metric Service and Feed registration service
099: makeRetrieverService();
100: rootsb.addService(MetricsService.class, this );
101: // register registration service
102: sb.addService(DataFeedRegistrationService.class, this );
103: }
104:
105: // Service Provider API
106:
107: public Object getService(ServiceBroker sb, Object requestor,
108: Class<?> serviceClass) {
109: if (serviceClass == MetricsService.class) {
110: return retriever;
111: } else if (serviceClass == MetricsUpdateService.class) {
112: return updater;
113: } else if (serviceClass == DataFeedRegistrationService.class) {
114: return registrar;
115: } else {
116: return null;
117: }
118: }
119:
120: public void releaseService(ServiceBroker sb, Object requestor,
121: Class<?> serviceClass, Object service) {
122: }
123:
124: // Container API
125:
126: protected ComponentDescriptions findInitialComponentDescriptions() {
127: ServiceBroker sb = getServiceBroker();
128: ComponentInitializerService cis = sb.getService(this ,
129: ComponentInitializerService.class, null);
130: NodeIdentificationService nis = sb.getService(this ,
131: NodeIdentificationService.class, null);
132: try {
133: String cp = specifyContainmentPoint();
134: String id = nis.getMessageAddress().toString();
135: ComponentDescription[] descs = cis
136: .getComponentDescriptions(id, cp);
137: // Want only items _below_. Could filter (not doing so now)
138: return new ComponentDescriptions(descs);
139: } catch (ComponentInitializerService.InitializerException cise) {
140: cise.printStackTrace();
141: return null;
142: } finally {
143: sb.releaseService(this , ComponentInitializerService.class,
144: cis);
145: sb.releaseService(this , NodeIdentificationService.class,
146: nis);
147: }
148: }
149:
150: protected String specifyContainmentPoint() {
151: return Agent.INSERTION_POINT + ".MetricsServices";
152: }
153: }
|