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: // Later this will move elsewhere...
028: package org.cougaar.core.qos.rss;
029:
030: import org.cougaar.core.component.ServiceBroker;
031: import org.cougaar.core.node.NodeIdentificationService;
032: import org.cougaar.core.qos.metrics.Constants;
033: import org.cougaar.qos.ResourceStatus.ResourceNode;
034: import org.cougaar.qos.qrs.AbstractContextInstantiater;
035: import org.cougaar.qos.qrs.ContextInstantiater;
036: import org.cougaar.qos.qrs.DataFormula;
037: import org.cougaar.qos.qrs.RSS;
038: import org.cougaar.qos.qrs.ResourceContext;
039:
040: /**
041: * This RSS ResourcContext represents subsystems in a Node, other than agents.
042: * Its parent in the RSS hierarchy tree is a Node. It's identified by the name
043: * of the service and defines two local formulas for CPU load.
044: * <p>
045: * The currently supported "services" are defined by the metrics and mts
046: * containers. Other subsystems like servlet management and persistence might be
047: * supported later.
048: *
049: * @see NodeDS
050: */
051: public class ServiceDS extends CougaarDS {
052: static void register() {
053: ContextInstantiater cinst = new AbstractContextInstantiater() {
054: public ResourceContext instantiateContext(
055: String[] parameters, ResourceContext parent)
056: throws ParameterError {
057: return new ServiceDS(parameters, parent);
058: }
059:
060: public Object identifyParameters(String[] parameters) {
061: if (parameters == null || parameters.length != 1) {
062: return null;
063: }
064: return parameters[0];
065: }
066:
067: };
068: registerContextInstantiater("Service", cinst);
069: }
070:
071: private static final String SERVICENAME = "servicename".intern();
072:
073: public ServiceDS(String[] parameters, ResourceContext parent)
074: throws ParameterError {
075: super (parameters, parent);
076: }
077:
078: protected boolean useParentPath() {
079: return false;
080: }
081:
082: // Service DataScopes can be the first element in a path. They must
083: // find or make the corresponding NodeDS and return that as the
084: // preferred parent.
085: protected ResourceContext preferredParent(RSS root) {
086: ServiceBroker sb = (ServiceBroker) root
087: .getProperty("ServiceBroker");
088: NodeIdentificationService node_id_svc = sb.getService(this ,
089: NodeIdentificationService.class, null);
090: String nodeID = node_id_svc.getMessageAddress().toString();
091:
092: String[] params = { nodeID };
093: ResourceNode node = new ResourceNode();
094: node.kind = "Node";
095: node.parameters = params;
096: ResourceNode[] path = { node };
097: ResourceContext parent = root.getPathContext(path);
098: setParent(parent);
099: return parent;
100: }
101:
102: protected void verifyParameters(String[] parameters)
103: throws ParameterError {
104: if (parameters == null || parameters.length != 1) {
105: throw new ParameterError(
106: "ServiceDS: wrong number of parameters");
107: }
108: if (!(parameters[0] != null)) {
109: throw new ParameterError("ServiceDS: wrong parameter type");
110: } else {
111: // could canonicalize here
112: String servicename = parameters[0];
113: bindSymbolValue(SERVICENAME, servicename);
114: historyPrefix = "Service" + KEY_SEPR + servicename;
115: }
116: }
117:
118: protected DataFormula instantiateFormula(String kind) {
119: if (kind.equals(Constants.CPU_LOAD_AVG)
120: || kind.equals(Constants.CPU_LOAD_MJIPS)) {
121: return new DecayingHistoryFormula(historyPrefix, kind);
122: } else {
123: return null;
124: }
125: }
126:
127: }
|