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.servicediscovery.util;
028:
029: import java.io.Serializable;
030: import java.util.Iterator;
031:
032: import org.cougaar.planning.ldm.plan.Role;
033: import org.cougaar.servicediscovery.description.ServiceClassification;
034: import org.cougaar.servicediscovery.description.ServiceInfo;
035: import org.cougaar.servicediscovery.description.ServiceInfoScorer;
036:
037: import org.cougaar.util.log.Logger;
038: import org.cougaar.util.log.Logging;
039:
040: /**
041: * ServiceDiscovery Service scoring function using <code>Role</code> name.<br>
042: * <pre>
043: * Uses 1 criteria -
044: * service role must match scorer role (in Commercial Service Scheme)
045: *</pre><p>
046: * All passing descriptions get a score of 1, all failing descriptions get
047: * a score of -1.
048: * <p>
049: * <code>SDClientPlugin</code> creates the <code>RoleScorer</code> and attaches it to the <code>MMQueryRequest</code>.
050: * <code>MatchmakerPlugin</code> uses the <code>RoleScorer</code> to evaluate service descriptions
051: * returned from the yellow pages. All passing service descriptions are added
052: * to the <code>MMQueryRequest</code> results field.
053: */
054: public class RoleScorer implements ServiceInfoScorer, Serializable {
055: // Note this is how a non-component can get a Logger
056: private static Logger logger = Logging.getLogger(RoleScorer.class);
057: private Role myRole; // The role we want
058:
059: public RoleScorer(Role role) {
060: myRole = role;
061: }
062:
063: /**
064: * What Role is being requested?
065: * @return the Role required for this request
066: **/
067: public Role getRole() {
068: return myRole;
069: }
070:
071: /**
072: * Will be called by MatchmakerPlugin for each ServiceInfo. Returned score will
073: * be added to the ScoredServiceDescription associated with the Service.
074: *
075: * @param serviceInfo The ServiceInfo returned by the YP for which we want a score
076: * @return int representing score. Client responsible for
077: * understanding the precise value. Current usage assumes lowest value >= 0
078: * is the best. Values less than 0 indicate the provider is not suitable.
079: *
080: */
081: public int scoreServiceInfo(ServiceInfo serviceInfo) {
082: // We just use the role score
083: int roleScore = getRoleScore(serviceInfo);
084:
085: return roleScore;
086: }
087:
088: /**
089: * Score the role portion -- lowest non-negative score is best.
090: * Note that it assumes that the Role is in the Commercial Service Scheme.
091: */
092: private int getRoleScore(ServiceInfo serviceInfo) {
093: String serviceRole = null;
094:
095: // Find the correct service classification code
096: for (Iterator iterator = serviceInfo
097: .getServiceClassifications().iterator(); iterator
098: .hasNext();) {
099: ServiceClassification classification = (ServiceClassification) iterator
100: .next();
101: // Here we assume / require where the Role will be classified
102: if (classification.getClassificationSchemeName().equals(
103: UDDIConstants.COMMERCIAL_SERVICE_SCHEME)) {
104:
105: serviceRole = classification.getClassificationCode();
106: break;
107: }
108: }
109:
110: if (serviceRole == null) {
111: if (logger.isInfoEnabled()) {
112: logger
113: .info("Ignoring service (score is -1) with a bad service role for provider: "
114: + serviceInfo.getProviderName());
115: }
116: return -1;
117: } else if (!serviceRole.equals(myRole.toString())) {
118: // If this is not the role we're looking for, score it down
119: if (logger.isInfoEnabled()) {
120: logger
121: .info("Ignoring service (score is -1) with (wrong) Role of: "
122: + serviceRole
123: + ", was looking for role "
124: + myRole
125: + " for provider: "
126: + serviceInfo.getProviderName());
127: }
128: return -1;
129: } else {
130: // This is the role we're looking for!
131: if (logger.isInfoEnabled()) {
132: logger
133: .info("Found good service (score is 0) with matching Role of: "
134: + serviceRole
135: + " on provider: "
136: + serviceInfo.getProviderName());
137: }
138: return 0;
139: }
140: }
141:
142: public String toString() {
143: return "<RoleScorer Role: " + myRole + ">";
144: }
145: }
|