From bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a Mon Sep 17 00:00:00 2001 From: dims Date: Tue, 17 Jun 2008 00:23:01 +0000 Subject: Move Tuscany from Incubator to top level. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/domain/impl/SCADomainServiceImpl.java | 200 +++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 branches/sca-java-1.0/modules/domain-impl/src/main/java/org/apache/tuscany/sca/domain/impl/SCADomainServiceImpl.java (limited to 'branches/sca-java-1.0/modules/domain-impl/src/main/java/org/apache/tuscany/sca/domain/impl/SCADomainServiceImpl.java') diff --git a/branches/sca-java-1.0/modules/domain-impl/src/main/java/org/apache/tuscany/sca/domain/impl/SCADomainServiceImpl.java b/branches/sca-java-1.0/modules/domain-impl/src/main/java/org/apache/tuscany/sca/domain/impl/SCADomainServiceImpl.java new file mode 100644 index 0000000000..2f73809a89 --- /dev/null +++ b/branches/sca-java-1.0/modules/domain-impl/src/main/java/org/apache/tuscany/sca/domain/impl/SCADomainServiceImpl.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.domain.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.tuscany.sca.domain.SCADomainService; +import org.apache.tuscany.sca.domain.ServiceInfo; +import org.osoa.sca.annotations.Scope; + + +/** + * Stores details of services exposed and retrieves details of remote services + * + * @version $Rev: 552343 $ $Date: 2007-09-07 12:41:52 +0100 (Fri, 07 Sep 2007) $ + */ +@Scope("COMPOSITE") +public class SCADomainServiceImpl implements SCADomainService { + + private final static Logger logger = Logger.getLogger(SCADomainServiceImpl.class.getName()); + + List serviceEndpoints = new ArrayList(); + + public class ServiceEndpoint { + public String domainUri; + public String nodeUri; + public String serviceName; + public String bindingName; + public String url; + + public ServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName, String URL){ + this.domainUri = domainUri; + this.nodeUri = nodeUri; + this.serviceName = serviceName; + this.bindingName = bindingName; + this.url = URL; + } + + public boolean match(String domainUri, String serviceName, String bindingName) { + // trap the case where the we are trying to map + // ComponentName/Service name with a registered ComponentName - this is OK + // ComponentName with a registered ComponentName/ServiceName - this should fail + + boolean serviceNameMatch = false; + + if (this.serviceName.equals(serviceName)) { + serviceNameMatch = true; + } else { + int s = serviceName.indexOf('/'); + if ((s != -1) && + (this.serviceName.equals(serviceName.substring(0, s)))){ + serviceNameMatch = true; + } + } + + return ((this.domainUri.equals(domainUri)) && + (serviceNameMatch) && + (this.bindingName.equals(bindingName))); + } + + public String getUrl() { + return url; + } + + @Override + public String toString (){ + return "[" + + domainUri + " " + + nodeUri + " " + + serviceName + " " + + bindingName + " " + + url + + "]"; + } + } + + /** + * Accepts information about a service endpoint and holds onto it + * + * @param domainUri the string uri for the distributed domain + * @param nodeUri the string uri for the current node + * @param serviceName the name of the service that is exposed and the provided endpoint + * @param bindingName the remote binding that is providing the endpoint + * @param url the enpoint url + */ + public String registerServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName, String URL){ + // if the service name ends in a "/" remove it + String modifiedServiceName = null; + if ( serviceName.endsWith("/") ) { + modifiedServiceName = serviceName.substring(0, serviceName.length() - 1); + } else { + modifiedServiceName = serviceName; + } + + + ServiceEndpoint serviceEndpoint = new ServiceEndpoint (domainUri, nodeUri, modifiedServiceName, bindingName, URL); + serviceEndpoints.add(serviceEndpoint); + logger.log(Level.INFO, "Registered service: " + serviceEndpoint.toString()); + return ""; + } + + /** + * Removes information about a service endpoint + * + * @param domainUri the string uri for the distributed domain + * @param nodeUri the string uri for the current node + * @param serviceName the name of the service that is exposed and the provided endpoint + * @param bindingName the remote binding that is providing the endpoint + */ + public String removeServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName){ + + List serviceEndpointsToRemove = new ArrayList(); + + for(ServiceEndpoint serviceEndpoint : serviceEndpoints){ + if ( serviceEndpoint.match(domainUri, serviceName, bindingName)){ + serviceEndpointsToRemove.add(serviceEndpoint); + } + } + + for(ServiceEndpoint serviceEndpointToRemove : serviceEndpointsToRemove){ + serviceEndpoints.remove(serviceEndpointToRemove); + logger.log(Level.INFO, "Removed service: " + serviceName ); + } + + return ""; + } + + /** + * Locates information about a service endpoint + * + * @param domainUri the string uri for the distributed domain + * @param serviceName the name of the service that is exposed and the provided endpoint + * @param bindingName the remote binding that we want to find an endpoint for + * @return url the endpoint url + */ + public String findServiceEndpoint(String domainUri, String serviceName, String bindingName){ + logger.log(Level.INFO, "Finding service: [" + + domainUri + " " + + serviceName + " " + + bindingName + + "]"); + + String url = ""; + + for(ServiceEndpoint serviceEndpoint : serviceEndpoints){ + if ( serviceEndpoint.match(domainUri, serviceName, bindingName)){ + url = serviceEndpoint.getUrl(); + // if you want to temporarily modify the registered port + // numbers for debugging uncomment this line + //url = replacePort(url, "8085", "8086"); + logger.log(Level.INFO, "Found service url: " + url); + } + } + return url; + } + + /** + * Converts a port number to something else to allow for debugging using a + * HTTP sniffer + * @param url + * @param fromPort the port to look for + * @param toPort the port to replace it with + * @return the new url + */ + private String replacePort(String url, String fromPort, String toPort) { + return url.replace(fromPort, toPort); + } + + public ServiceInfo getServiceInfo(){ + + ServiceEndpoint serviceEndpoint = serviceEndpoints.get(0); + + return new ServiceInfoImpl(serviceEndpoint.domainUri, + serviceEndpoint.nodeUri, + serviceEndpoint.serviceName, + serviceEndpoint.bindingName, + serviceEndpoint.url); + } + +} -- cgit v1.2.3