From a40e527938d76ba71f211da7e327adb50384ba69 Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 11 Nov 2009 23:26:33 +0000 Subject: Moving 1.x tags git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835157 13f79535-47bb-0310-9956-ffa450edef68 --- .../tuscany/sca/node/impl/ComponentInfoImpl.java | 47 +++ .../sca/node/impl/ComponentManagerServiceImpl.java | 111 +++++ .../sca/node/impl/DomainManagerServiceImpl.java | 166 ++++++++ .../sca/node/impl/NodeManagerServiceImpl.java | 148 +++++++ .../tuscany/sca/node/impl/SCADomainFinderImpl.java | 67 ++++ .../tuscany/sca/node/impl/SCADomainImpl.java | 445 +++++++++++++++++++++ .../tuscany/sca/node/impl/SCANodeFactoryImpl.java | 71 ++++ .../apache/tuscany/sca/node/impl/SCANodeImpl.java | 378 +++++++++++++++++ .../apache/tuscany/sca/node/impl/SCANodeUtil.java | 332 +++++++++++++++ 9 files changed, 1765 insertions(+) create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentInfoImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentManagerServiceImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/DomainManagerServiceImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeManagerServiceImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainFinderImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeFactoryImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java create mode 100644 sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeUtil.java (limited to 'sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node') diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentInfoImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentInfoImpl.java new file mode 100644 index 0000000000..5e38c6bb81 --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentInfoImpl.java @@ -0,0 +1,47 @@ +/* + * 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.node.impl; + +import java.io.Serializable; + +import org.apache.tuscany.sca.node.ComponentInfo; + +public class ComponentInfoImpl implements ComponentInfo, Serializable { + + private String name; + private boolean started; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isStarted() { + return started; + } + + public void setStarted(boolean started) { + this.started = started; + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentManagerServiceImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentManagerServiceImpl.java new file mode 100644 index 0000000000..3e135c7ebf --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/ComponentManagerServiceImpl.java @@ -0,0 +1,111 @@ +/* + * 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.node.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.core.assembly.ActivationException; +import org.apache.tuscany.sca.core.assembly.RuntimeComponentImpl; +import org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime; +import org.apache.tuscany.sca.node.ComponentListener; +import org.apache.tuscany.sca.node.ComponentManager; + +public class ComponentManagerServiceImpl implements ComponentManager { + + protected List listeners = new CopyOnWriteArrayList(); + protected String domainURI; + protected String nodeName; + protected Composite nodeComposite; + protected ReallySmallRuntime nodeRuntime; + + public ComponentManagerServiceImpl(String domainURI, String nodeName, Composite nodeComposite, ReallySmallRuntime nodeRuntime) { + this.domainURI = domainURI; + this.nodeName = nodeName; + this.nodeComposite = nodeComposite; + this.nodeRuntime = nodeRuntime; + } + + public void addComponentListener(ComponentListener listener) { + this.listeners.add(listener); + } + + public void removeComponentListener(ComponentListener listener) { + this.listeners.remove(listener); + } + + public Component getComponent(String componentName) { + for (Composite composite: nodeComposite.getIncludes()) { + for (Component component: composite.getComponents()) { + if (component.getName().equals(componentName)) { + return component; + } + } + } + return null; + } + + public List getComponents() { + List components = new ArrayList(); + for (Composite composite: nodeComposite.getIncludes()) { + components.addAll(composite.getComponents()); + } + return components; + } + + public void startComponent(Component component) throws ActivationException { + nodeRuntime.getCompositeActivator().start(component); + notifyComponentStarted(component); + } + + public void stopComponent(Component component) throws ActivationException { + nodeRuntime.getCompositeActivator().stop(component); + notifyComponentStopped(component); + } + + public void notifyComponentStarted(Component component) { + for (ComponentListener listener : listeners) { + try { + listener.componentStarted(component); + } catch (Exception e) { + e.printStackTrace(); // TODO: log + } + } + } + + public void notifyComponentStopped(Component component) { + for (ComponentListener listener : listeners) { + try { + listener.componentStopped(component); + } catch (Exception e) { + e.printStackTrace(); // TODO: log + } + } + } + + public boolean isComponentStarted(Component component) { + RuntimeComponentImpl runtimeComponent = (RuntimeComponentImpl)component; + return runtimeComponent.isStarted(); + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/DomainManagerServiceImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/DomainManagerServiceImpl.java new file mode 100644 index 0000000000..1363af724f --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/DomainManagerServiceImpl.java @@ -0,0 +1,166 @@ +/* + * 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.node.impl; + +import java.lang.reflect.UndeclaredThrowableException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.tuscany.sca.domain.DomainManagerNodeEventService; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; +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 DomainManagerServiceImpl implements DomainManagerNodeEventService{ + + private final static Logger logger = Logger.getLogger(DomainManagerServiceImpl.class.getName()); + + @Property + protected int retryCount = 100; + + @Property + protected int retryInterval = 5000; //ms + + @Reference + protected DomainManagerNodeEventService domainManager; + + public String registerNode(String nodeURI, String nodeURL) { + + String returnValue = null; + + for (int i =0; i < retryCount; i++){ + try { + returnValue = domainManager.registerNode(nodeURI, nodeURL); + break; + } catch(UndeclaredThrowableException ex) { + logger.log(Level.INFO, "Trying to regsiter node " + + nodeURI + + " at endpoint " + + nodeURL); + + } + + try { + Thread.sleep(retryInterval); + } catch(InterruptedException ex) { + } + } + + return returnValue; + } + + public String removeNode(String nodeURI) { + return domainManager.removeNode(nodeURI); + } + + public void registerContribution(String nodeURI, String contributionURI, String contributionURL){ + domainManager.registerContribution(nodeURI, contributionURI, contributionURL); + } + + public void unregisterContribution(String contributionURI){ + domainManager.unregisterContribution(contributionURI); + } + + + public String registerServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName, String URL){ + + String dummy = null; + + for (int i =0; i < retryCount; i++){ + try { + dummy = domainManager.registerServiceEndpoint(domainUri, nodeUri, serviceName, bindingName, URL); + break; + } catch(UndeclaredThrowableException ex) { + logger.log(Level.INFO, "Trying to connect to domain " + + domainUri + + " to register service " + + serviceName); + + } + + try { + Thread.sleep(retryInterval); + } catch(InterruptedException ex) { + } + } + + return dummy; + } + + public String removeServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName){ + + String dummy = null; + + for (int i =0; i < retryCount; i++){ + try { + dummy = domainManager.removeServiceEndpoint(domainUri, nodeUri, serviceName, bindingName); + break; + } catch(UndeclaredThrowableException ex) { + logger.log(Level.INFO, "Trying to connect to domain " + + domainUri + + " to remove service " + + serviceName); + + } + + try { + Thread.sleep(retryInterval); + } catch(InterruptedException ex) { + } + } + + return dummy; + } + + public String findServiceEndpoint(String domainUri, String serviceName, String bindingName){ + + + String url = null; + + for (int i =0; i < retryCount; i++){ + try { + url = domainManager.findServiceEndpoint(domainUri, serviceName, bindingName); + break; + } catch(UndeclaredThrowableException ex) { + logger.log(Level.INFO, "Trying to connect to domain " + + domainUri + + " to find service " + + serviceName); + + } + + try { + Thread.sleep(retryInterval); + } catch(InterruptedException ex) { + } + } + + return url; + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeManagerServiceImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeManagerServiceImpl.java new file mode 100644 index 0000000000..64b58da5d7 --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeManagerServiceImpl.java @@ -0,0 +1,148 @@ +/* + * 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.node.impl; + +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.core.assembly.ActivationException; +import org.apache.tuscany.sca.core.assembly.RuntimeComponentImpl; +import org.apache.tuscany.sca.domain.SCADomain; +import org.apache.tuscany.sca.node.ComponentInfo; +import org.apache.tuscany.sca.node.ComponentManagerService; +import org.apache.tuscany.sca.node.NodeManagerInitService; +import org.apache.tuscany.sca.node.NodeManagerService; +import org.apache.tuscany.sca.node.SCANode; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +/** + * Manages a node implementation + * + * @version $Rev: 552343 $ $Date: 2007-09-11 18:45:36 +0100 (Tue, 11 Sep 2007) $ + */ +@Scope("COMPOSITE") +@Service(interfaces = {NodeManagerService.class, NodeManagerInitService.class, ComponentManagerService.class}) +public class NodeManagerServiceImpl implements NodeManagerService, NodeManagerInitService, ComponentManagerService { + + private final static Logger logger = Logger.getLogger(NodeManagerServiceImpl.class.getName()); + + private SCANodeImpl node; + + + // NodeManagerInitService + + public void setNode(SCANode node) { + this.node = (SCANodeImpl)node; + } + + // NodeManagerSerivice + + /** + * Returns the URI of the SCA node. That URI is the endpoint of the + * SCA node administration service. + * + * @return the URI of the SCA node + */ + public String getURI(){ + return node.getURI(); + } + + /** + * Add an SCA contribution into the node. + * + * @param uri the URI of the contribution + * @param url the URL of the contribution + */ + public void addContribution(String contributionURI, String contributionURL){ + try { + node.addContribution(contributionURI, new URL(contributionURL)); + } catch (Exception ex){ + // TODO - sort out exceptions passing across binding.sca + logger.log(Level.SEVERE, ex.toString()); + } + } + + /** + * deploy deployable composite on the node. + * + * @param composite + */ + public void deployComposite(String compositeName) { + try { + node.deployComposite(QName.valueOf(compositeName)); + } catch (Exception ex){ + // TODO - sort out exceptions passing across binding.sca + logger.log(Level.SEVERE, ex.toString()); + } + } + + /** + * Start the SCA node service. + */ + public void start(){ + try { + node.start(); + } catch (Exception ex){ + // TODO - sort out exceptions passing across binding.sca + logger.log(Level.SEVERE, ex.toString()); + } + } + + /** + * Stop the SCA node service. + */ + public void stop(){ + try { + node.stop(); + } catch (Exception ex){ + // TODO - sort out exceptions passing across binding.sca + logger.log(Level.SEVERE, ex.toString()); + } + } + + // ComponentManagerService + + public List getComponentInfos() { + List componentInfos = new ArrayList(); + for (Component component : node.getComponents()) { + ComponentInfo componentInfo = new ComponentInfoImpl(); + componentInfo.setName(component.getName()); + componentInfo.setStarted(((RuntimeComponentImpl)component).isStarted()); + componentInfos.add(componentInfo); + } + return componentInfos; + } + + public ComponentInfo getComponentInfo(String componentName) { + Component component = node.getComponent(componentName); + ComponentInfo componentInfo = new ComponentInfoImpl(); + componentInfo.setName(component.getName()); + componentInfo.setStarted(((RuntimeComponentImpl)component).isStarted()); + return componentInfo; + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainFinderImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainFinderImpl.java new file mode 100644 index 0000000000..c8842100a0 --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainFinderImpl.java @@ -0,0 +1,67 @@ +/* + * 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.node.impl; + +import java.util.HashMap; + +import org.apache.tuscany.sca.domain.DomainException; +import org.apache.tuscany.sca.domain.SCADomain; +import org.apache.tuscany.sca.node.NodeException; +import org.apache.tuscany.sca.node.SCADomainFinder; + +/** + * A finder for SCA domains. + * + * @version $Rev: 580520 $ $Date: 2007-09-29 00:50:25 +0100 (Sat, 29 Sep 2007) $ + */ +public class SCADomainFinderImpl extends SCADomainFinder { + + private static HashMap domains = new HashMap(); + + /** + * Returns a new SCA domain finder instance. + * + * @return a new SCA domain finder + */ + public SCADomainFinderImpl() { + + } + + /** + * Finds an existing SCA domain. + * + * @param domainURI the URI of the domain, this is the endpoint + * URI of the domain administration service + * @return the SCA domain + */ + public SCADomain getSCADomain(String domainURI) throws DomainException { + SCADomain scaDomain = domains.get(domainURI); + + if (scaDomain == null) { + scaDomain = new SCADomainImpl(domainURI); + //domains.put(domainURI, scaDomain); + // TODO - not caching local domains as currently the local domain can + // - only handle one node + // - provides the management endpoint for that node + } + return scaDomain; + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainImpl.java new file mode 100644 index 0000000000..5e9a8c0407 --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCADomainImpl.java @@ -0,0 +1,445 @@ + /* + * 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.node.impl; + +import java.net.URI; +import java.net.URL; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.SCABindingFactory; +import org.apache.tuscany.sca.assembly.xml.Constants; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.DeployedArtifact; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.service.ContributionService; +import org.apache.tuscany.sca.core.assembly.ActivationException; +import org.apache.tuscany.sca.core.context.ServiceReferenceImpl; +import org.apache.tuscany.sca.domain.DomainException; +import org.apache.tuscany.sca.domain.DomainManagerNodeEventService; +import org.apache.tuscany.sca.domain.model.Domain; +import org.apache.tuscany.sca.host.embedded.impl.EmbeddedSCADomain; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; +import org.apache.tuscany.sca.node.NodeManagerInitService; +import org.apache.tuscany.sca.node.SCADomainProxySPI; +import org.apache.tuscany.sca.node.SCANode; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentContext; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; +import org.osoa.sca.CallableReference; +import org.osoa.sca.ServiceReference; +import org.osoa.sca.ServiceRuntimeException; + +/** + * A local representation of the sca domain running on a single node + * + * @version $Rev: 552343 $ $Date: 2007-09-09 23:54:46 +0100 (Sun, 09 Sep 2007) $ + */ +public class SCADomainImpl implements SCADomainProxySPI { + + private final static Logger logger = Logger.getLogger(SCADomainImpl.class.getName()); + + // the domain used to talk to the rest of the domain + private EmbeddedSCADomain domainManagementRuntime; + + // class loader used to get the runtime going + private ClassLoader domainClassLoader; + + // representation of the private state of the node that the domain is running on + private String domainURI; + private URL domainURL; + + // proxy to the domain + private DomainManagerNodeEventService domainManager; + + // proxy to the node manager + private NodeManagerInitService nodeManagerInit; + private String nodeManagerUrl; + + // the local node implementation + private SCANodeImpl nodeImpl; + + // methods defined on the implementation only + + /** + * Creates a domain proxy connected to a wider domain. + * + * @param domainUri - identifies what host and port the domain service is running on, e.g. http://localhost:8081 + * @throws ActivationException + */ + public SCADomainImpl(String domainURI) throws DomainException { + this.domainURI = domainURI; + this.domainClassLoader = SCADomainImpl.class.getClassLoader(); + init(); + } + + /** + * Start the composite that connects to the domain manager + */ + private void init() + throws DomainException { + try { + // check where domain and node uris are urls, they will be used to configure various + // endpoints if they are + URI tmpURI; + try { + tmpURI = new URI(domainURI); + if (tmpURI.isAbsolute() == true){ + domainURL = tmpURI.toURL(); + } + } catch(Exception ex) { + domainURL = null; + } + + // Check if node has been given a valid domain name to connect to + if (domainURL == null) { + logger.log(Level.INFO, "Domain will be started stand-alone as domain URL is not provided"); + } else { + // load the composite that allows this domain representation to + // connect to the rest of the domain + String domainCompositeName = "node.composite"; + URL contributionURL = SCANodeUtil.findContributionURLFromCompositeNameOrPath(domainClassLoader, null, new String[]{domainCompositeName} ); + + if ( contributionURL != null ){ + logger.log(Level.INFO, "Domain management configured from " + contributionURL); + + // start a local domain in order to talk to the logical domain + domainManagementRuntime = new EmbeddedSCADomain(domainClassLoader, domainURI); + domainManagementRuntime.start(); + + // add node composite to the management domain + ContributionService contributionService = domainManagementRuntime.getContributionService(); + Contribution contribution = null; + + contribution = contributionService.contribute(domainURI, + contributionURL, + false); + + Composite composite = null; + for (DeployedArtifact artifact: contribution.getArtifacts()) { + if (domainCompositeName.equals(artifact.getURI())) { + composite = (Composite)artifact.getModel(); + } + } + + if (composite != null) { + + domainManagementRuntime.getDomainComposite().getIncludes().add(composite); + domainManagementRuntime.getCompositeBuilder().build(composite); + + // deal with the special case of registering the node manager service + // in service discovery. It's not on an SCA binding. + // TODO - really want to be able to hand out service references but they + // don't serialize out over web services yet. + SCANodeUtil.fixUpNodeServiceUrls(domainManagementRuntime.getDomainComposite().getIncludes().get(0).getComponents(), null); + SCANodeUtil.fixUpNodeReferenceUrls(domainManagementRuntime.getDomainComposite().getIncludes().get(0).getComponents(), domainURL); + + domainManagementRuntime.getCompositeActivator().activate(composite); + domainManagementRuntime.getCompositeActivator().start(composite); + + // get the management components out of the domain so that they + // can be configured/used. + domainManager = domainManagementRuntime.getService(DomainManagerNodeEventService.class, "DomainManagerComponent"); + nodeManagerInit = domainManagementRuntime.getService(NodeManagerInitService.class, "NodeManagerComponent/NodeManagerInitService"); + + // Now get the uri back out of the component now it has been built and started + // TODO - this doesn't pick up the url from external hosting environments + nodeManagerUrl = SCANodeUtil.getNodeManagerServiceUrl(domainManagementRuntime.getDomainComposite().getIncludes().get(0).getComponents()); + + } else { + throw new ActivationException("Domain management contribution " + + contributionURL + + " found but could not be loaded"); + } + } else { + throw new ActivationException("Doamin management contribution " + + domainCompositeName + + " not found on the classpath"); + } + } + } catch(Exception ex) { + throw new DomainException(ex); + } + } + + // SPI methods + + public String addNode(String nodeURI, String nodeURL){ + // Does nothing in the proxy + return null; + } + + public String removeNode(String nodeURI){ + // Does nothing in the proxy + return null; + } + + public void addNode(SCANode nodeImpl) throws DomainException { + this.nodeImpl = (SCANodeImpl)nodeImpl; + + // register node with wider domain + if (domainURL != null){ + // pass this object into the node manager service + nodeManagerInit.setNode(nodeImpl); + + try { + // go out and add this node to the wider domain + domainManager.registerNode(nodeImpl.getURI(),nodeManagerUrl); + + } catch(Exception ex) { + logger.log(Level.SEVERE, + "Can't connect to domain manager at: " + + domainURL); + throw new DomainException(ex); + } + } + } + + public void removeNode(SCANode nodeImpl) throws DomainException { + + if (domainURL != null){ + // remove the node from node manager service + //nodeManagerInit.removeNode(nodeImpl); + + try { + // go out and add this node to the wider domain + domainManager.removeNode(nodeImpl.getURI()); + } catch(Exception ex) { + logger.log(Level.SEVERE, + "Can't connect to domain manager at: " + + domainURL); + throw new DomainException(ex); + } + } + + this.nodeImpl = null; + } + + public void registerContribution(String nodeURI, String contributionURI, String contributionURL){ + domainManager.registerContribution(nodeURI, contributionURI, contributionURL); + } + + public void unregisterContribution(String contributionURI){ + domainManager.unregisterContribution(contributionURI); + } + + + public String registerServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName, String URL){ + return domainManager.registerServiceEndpoint(domainUri, nodeUri, serviceName, bindingName, URL); + } + + public String removeServiceEndpoint(String domainUri, String nodeUri, String serviceName, String bindingName){ + return domainManager.removeServiceEndpoint(domainUri, nodeUri, serviceName, bindingName); + } + + public String findServiceEndpoint(String domainUri, String serviceName, String bindingName){ + return domainManager.findServiceEndpoint(domainUri, serviceName, bindingName); + } + + public Domain getDomainModel(){ + return null; + } + + + // API methods + + public void start() throws DomainException { + // TODO - what happens here? + } + + public void stop() throws DomainException { + try { + // Stop the domain + domainManagementRuntime.stop(); + } catch (Exception ex) { + throw new DomainException(ex); + } + + } + + public String getURI(){ + return domainURI; + } + + public void addContribution(String contributionURI, URL contributionURL) throws DomainException { + try { + nodeImpl.addContribution(contributionURI, contributionURL); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public void removeContribution(String uri) throws DomainException { + try { + //nodeImpl.removeContributions(); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public void addDeploymentComposite(String contributionURI, String compositeXML) throws DomainException { + // TODO + } + + public void addToDomainLevelComposite(QName qname) throws DomainException { + try { + nodeImpl.deployComposite(qname); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public void removeFromDomainLevelComposite(QName qname) throws DomainException { + try { + //nodeImpl.stopComposite(); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public void startComposite(QName qname) throws DomainException { + try { + nodeImpl.deployComposite(qname); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public void stopComposite(QName qname) throws DomainException { + try { + //nodeImpl.stopComposite(); + } catch(Exception ex) { + new DomainException(ex); + } + } + + public > R cast(B target) throws IllegalArgumentException { + return (R)nodeImpl.getNodeRuntime().getProxyFactory().cast(target); + } + + public B getService(Class businessInterface, String serviceName) { + ServiceReference serviceReference = getServiceReference(businessInterface, serviceName); + if (serviceReference == null) { + throw new ServiceRuntimeException("Service not found: " + serviceName); + } + return serviceReference.getService(); + } + + private ServiceReference createServiceReference(Class businessInterface, String targetURI) { + try { + AssemblyFactory assemblyFactory = nodeImpl.getNodeRuntime().getAssemblyFactory(); + Composite composite = assemblyFactory.createComposite(); + composite.setName(new QName(Constants.SCA10_TUSCANY_NS, "default")); + RuntimeComponent component = (RuntimeComponent)assemblyFactory.createComponent(); + component.setName("default"); + component.setURI("default"); + nodeImpl.getNodeRuntime().getCompositeActivator().configureComponentContext(component); + composite.getComponents().add(component); + RuntimeComponentReference reference = (RuntimeComponentReference)assemblyFactory.createComponentReference(); + reference.setName("default"); + ModelFactoryExtensionPoint factories = + nodeImpl.getNodeRuntime().getExtensionPointRegistry().getExtensionPoint(ModelFactoryExtensionPoint.class); + JavaInterfaceFactory javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); + InterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract(); + interfaceContract.setInterface(javaInterfaceFactory.createJavaInterface(businessInterface)); + reference.setInterfaceContract(interfaceContract); + component.getReferences().add(reference); + reference.setComponent(component); + SCABindingFactory scaBindingFactory = factories.getFactory(SCABindingFactory.class); + SCABinding binding = scaBindingFactory.createSCABinding(); + binding.setURI(targetURI); + reference.getBindings().add(binding); + return new ServiceReferenceImpl(businessInterface, component, reference, binding, nodeImpl.getNodeRuntime() + .getProxyFactory(), nodeImpl.getNodeRuntime().getCompositeActivator()); + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + } + + public ServiceReference getServiceReference(Class businessInterface, String name) { + + // Extract the component name + String componentName; + String serviceName; + int i = name.indexOf('/'); + if (i != -1) { + componentName = name.substring(0, i); + serviceName = name.substring(i + 1); + + } else { + componentName = name; + serviceName = null; + } + + // Lookup the component in the domain + Component component = null; + + if (nodeImpl != null) { + component = nodeImpl.getComponent(componentName); + + if (component == null) { + // The component is not local in the partition, try to create a remote service ref + return createServiceReference(businessInterface, name); + } + } + + RuntimeComponentContext componentContext = null; + + // If the component is a composite, then we need to find the + // non-composite component that provides the requested service + if (component.getImplementation() instanceof Composite) { + for (ComponentService componentService : component.getServices()) { + if (serviceName == null || serviceName.equals(componentService.getName())) { + CompositeService compositeService = (CompositeService)componentService.getService(); + if (compositeService != null) { + if (serviceName != null) { + serviceName = "$promoted$." + serviceName; + } + componentContext = + ((RuntimeComponent)compositeService.getPromotedComponent()).getComponentContext(); + return componentContext.createSelfReference(businessInterface, compositeService + .getPromotedService()); + } + break; + } + } + // No matching service is found + throw new ServiceRuntimeException("Composite service not found: " + name); + } else { + componentContext = ((RuntimeComponent)component).getComponentContext(); + if (serviceName != null) { + return componentContext.createSelfReference(businessInterface, serviceName); + } else { + return componentContext.createSelfReference(businessInterface); + } + } + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeFactoryImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeFactoryImpl.java new file mode 100644 index 0000000000..adc15b7404 --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeFactoryImpl.java @@ -0,0 +1,71 @@ +/* + * 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.node.impl; + +import org.apache.tuscany.sca.domain.DomainException; +import org.apache.tuscany.sca.node.NodeException; +import org.apache.tuscany.sca.node.SCANode; +import org.apache.tuscany.sca.node.SCANodeFactory; + +/** + * A finder for SCA domains. + * + * @version $Rev: 580520 $ $Date: 2007-09-29 00:50:25 +0100 (Sat, 29 Sep 2007) $ + */ +public class SCANodeFactoryImpl extends SCANodeFactory { + + + /** + * Returns a new SCA domain finder instance. + * + * @return a new SCA domain finder + */ + public SCANodeFactoryImpl() { + + } + + /** + * Finds an existing SCA domain. + * + * @param domainURI the URI of the domain, this is the endpoint + * URI of the domain administration service + * @return the SCA domain + */ + public SCANode createSCANode(String nodeURI, String domainURI) throws NodeException { + return new SCANodeImpl(nodeURI, domainURI, null); + } + + /** + * Creates a new SCA node as part of a node group. Groups of nodes are used in load balancing + * and failover scenarios where each node in the group runs the same contribution and + * active composites + * + * @param nodeURI the URI of the node, this is the endpoint URI of the + * node administration service + * @param domainURI the URI of the domain that the node belongs to + * @param nodeGroupURI the uri of the node group. This is the enpoint URI of the head of the + * group of nodes. For example, in load balancing scenarios this will be the loaded balancer itself + * @return a new SCA node. + */ + public SCANode createSCANode(String nodeURI, String domainURI, String nodeGroupURI) throws NodeException { + return new SCANodeImpl(nodeURI, domainURI, nodeGroupURI); + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java new file mode 100644 index 0000000000..de33e8db1f --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeImpl.java @@ -0,0 +1,378 @@ + /* + * 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.node.impl; + +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.xml.Constants; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.DeployedArtifact; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.resolver.impl.ModelResolverImpl; +import org.apache.tuscany.sca.contribution.service.ContributionService; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.assembly.ActivationException; +import org.apache.tuscany.sca.domain.SCADomain; +import org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime; +import org.apache.tuscany.sca.node.NodeException; +import org.apache.tuscany.sca.node.NodeFactoryImpl; +import org.apache.tuscany.sca.node.SCADomainFinder; +import org.apache.tuscany.sca.node.SCANode; + +/** + * A local representation of the sca domain running on a single node + * + * @version $Rev: 552343 $ $Date: 2007-09-09 23:54:46 +0100 (Sun, 09 Sep 2007) $ + */ +public class SCANodeImpl implements SCANode { + + private final static Logger logger = Logger.getLogger(SCANodeImpl.class.getName()); + + // class loader used to get application resources + private ClassLoader nodeClassLoader; + + // identity and endpoints for the node and the domain it belongs to + private String nodeURI; + private URL nodeURL; + private String domainURI; + private URL domainURL; + private String nodeGroupURI; + + // The tuscany runtime that does the hard work + private ReallySmallRuntime nodeRuntime; + + // the top level components in this node. A subset of the the domain level composite + private Composite nodeComposite; + + // the domain that the node belongs to. This object acts as a proxy to the domain + private SCADomain scaDomain; + + // collection for managing contributions that have been added to the node + private Map contributions = new HashMap(); + private Map composites = new HashMap(); + private List compositesToStart = new ArrayList(); + + // methods defined on the implementation only + + /** + * Creates a node connected to a wider domain. To find its place in the domain + * node and domain identifiers must be provided. + * + * @param domainUri - identifies what host and port the domain service is running on, e.g. http://localhost:8081 + * @param nodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082 + * @param nodeGroupURI the uri of the node group. This is the enpoint URI of the head of the + * group of nodes. For example, in load balancing scenarios this will be the loaded balancer itself + * @throws ActivationException + */ + public SCANodeImpl(String nodeURI, String domainURI, String nodeGroupURI) throws NodeException { + this.domainURI = domainURI; + this.nodeURI = nodeURI; + this.nodeGroupURI = nodeGroupURI; + this.nodeClassLoader = Thread.currentThread().getContextClassLoader(); + init(); + } + + /** + * Creates a node connected to a wider domain and allows a classpath to be specified. + * To find its place in the domain node and domain identifiers must be provided. + * + * @param domainUri - identifies what host and port the domain service is running on, e.g. http://localhost:8081 + * @param nodeUri - if this is a url it is assumed that this will be used as root url for management components, e.g. http://localhost:8082 + * @param nodeGroupURI the uri of the node group. This is the enpoint URI of the head of the + * group of nodes. For example, in load balancing scenarios this will be the loaded balancer itself + * @param cl - the ClassLoader to use for loading system resources for the node + * @throws ActivationException + */ + public SCANodeImpl(String nodeURI, String domainURI, String nodeGroupURI, ClassLoader cl) throws NodeException { + this.domainURI = domainURI; + this.nodeURI = nodeURI; + this.nodeGroupURI = nodeGroupURI; + this.nodeClassLoader = cl; + init(); + } + + /** + * Work out if we are representing a domain in memory or can go out to the network to + * get domain information. This all depends on whether there is a management + * composite on the classpath + */ + private void init() throws NodeException { + try { + + // create a node runtime for the domain contributions to run on + nodeRuntime = new ReallySmallRuntime(nodeClassLoader); + + // Start the runtime + nodeRuntime.start(); + + // Create an in-memory domain level composite + AssemblyFactory assemblyFactory = nodeRuntime.getAssemblyFactory(); + nodeComposite = assemblyFactory.createComposite(); + nodeComposite.setName(new QName(Constants.SCA10_NS, "node")); + nodeComposite.setURI(nodeURI); + + // add the top level composite into the composite activator + nodeRuntime.getCompositeActivator().setDomainComposite(nodeComposite); + + // check whether node uri is an absolute url, + try { + URI tmpURI = new URI(nodeURI); + if (tmpURI.isAbsolute()){ + nodeURL = tmpURI.toURL(); + } + } catch(Exception ex) { + nodeURL = null; + } + + // create a link to the domain + scaDomain = SCADomainFinder.newInstance().getSCADomain(domainURI); + + // add the node to the domain + ((SCADomainImpl)scaDomain).addNode(this); + + // If a non-null domain name is provided make the node available to the model + // this causes the runtime to start registering binding-sca service endpoints + // with the domain so only makes sense if we know we have a domain to talk to + if (domainURI != null) { + ModelFactoryExtensionPoint factories = nodeRuntime.getExtensionPointRegistry().getExtensionPoint(ModelFactoryExtensionPoint.class); + NodeFactoryImpl nodeFactory = new NodeFactoryImpl(this); + factories.addFactory(nodeFactory); + } + + } catch(Exception ex) { + throw new NodeException(ex); + } + } + + // temp methods to help integrate with existing code + + public ReallySmallRuntime getNodeRuntime() { + return nodeRuntime; + } + + public Component getComponent(String componentName) { + for (Composite composite: nodeComposite.getIncludes()) { + for (Component component: composite.getComponents()) { + if (component.getName().equals(componentName)) { + return component; + } + } + } + return null; + } + + public List getComponents() { + List components = new ArrayList(); + for (Composite composite: nodeComposite.getIncludes()) { + components.addAll(composite.getComponents()); + } + return components; + } + + /** + * Stating to think about how a node advertises what it can do. + * Maybe need to turn this round and ask the node to decide whether it + * can process a list of artifacts + * @return + */ + public List getFeatures() { + List featureList = new ArrayList(); + + ExtensionPointRegistry registry = nodeRuntime.getExtensionPointRegistry(); + + // TODO - how to get registered features? + ModelFactoryExtensionPoint factories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class); + + return null; + } + + + // API methods + + public void start() throws NodeException { + startComposites(); + } + + public void stop() throws NodeException { + try { + // remove contributions + removeAllContributions(); + } catch (Exception ex) { + throw new NodeException(ex); + } + } + + public String getURI(){ + return nodeURI; + } + + public SCADomain getDomain(){ + return scaDomain; + } + + public void addContribution(String contributionURI, URL contributionURL) throws NodeException { + addContribution(contributionURI, contributionURL, null); + } + + public void addContribution(String contributionURI, URL contributionURL, ClassLoader contributionClassLoader ) throws NodeException { + try { + if (contributionURL != null) { + ModelResolver modelResolver = null; + + // if the contribution is to be resolved using a separate class loader + // then create a new model resolver + if (contributionClassLoader != null) { + modelResolver = new ModelResolverImpl(contributionClassLoader); + } + + // Add the contribution to the node + ContributionService contributionService = nodeRuntime.getContributionService(); + Contribution contribution = contributionService.contribute(contributionURI, + contributionURL, + modelResolver, + false); + + // remember the contribution + contributions.put(contributionURI, contribution); + + // remember all the composites that have been found + for (DeployedArtifact artifact : contribution.getArtifacts()) { + if (artifact.getModel() instanceof Composite) { + Composite composite = (Composite)artifact.getModel(); + composites.put(composite.getName(), composite); + } + } + + // remember all the deployable composites ready to be started + for (Composite composite : contribution.getDeployables()) { + compositesToStart.add(composite.getName()); + } + + + // add the contribution to the domain. It will generally already be there + // unless the contribution has been added to the node itself. + ((SCADomainImpl)scaDomain).registerContribution(nodeURI, contributionURI, contributionURL.toExternalForm()); + + } else { + throw new ActivationException("Contribution " + contributionURL + " not found"); + } + } catch (Exception ex) { + throw new NodeException(ex); + } + } + + private void removeAllContributions() throws NodeException { + try { + // stop any running composites + stopComposites(); + + // Remove all contributions + for (String contributionURI : contributions.keySet()){ + nodeRuntime.getContributionService().remove(contributionURI); + contributions.remove(contributionURI); + } + } catch (Exception ex) { + throw new NodeException(ex); + } + } + + public void deployComposite(QName compositeName) throws NodeException { + // if the named composite is not already in the list then + // add it + if (compositesToStart.indexOf(compositeName) == -1 ){ + compositesToStart.add(compositeName); + } + } + + private void startComposites() throws NodeException { + try { + if (compositesToStart.size() == 0 ){ + logger.log(Level.INFO, nodeURI + + " has no composites to start" ); + } else { + for (QName compositeName : compositesToStart) { + Composite composite = composites.get(compositeName); + + if (composite == null) { + logger.log(Level.INFO, "Composite not found during start: " + compositeName); + } else { + logger.log(Level.INFO, "Starting composite: " + compositeName); + + // Add the composite to the top level domain + nodeComposite.getIncludes().add(composite); + nodeRuntime.getCompositeBuilder().build(composite); + + // activate the composite + nodeRuntime.getCompositeActivator().activate(composite); + + //start the composite + nodeRuntime.getCompositeActivator().start(composite); + } + } + } + + } catch (Exception ex) { + throw new NodeException(ex); + } + } + + private void stopComposites() throws NodeException { + + try { + if (compositesToStart.size() == 0 ){ + throw new NodeException("Stopping node " + + nodeURI + + " with no composite started"); + } + for (QName compositeName : compositesToStart) { + logger.log(Level.INFO, "Stopping composite: " + compositeName); + + Composite composite = composites.get(compositeName); + + nodeRuntime.getCompositeActivator().stop(composite); + nodeRuntime.getCompositeActivator().deactivate(composite); + + composites.remove(compositeName); + } + + compositesToStart.clear(); + } catch (NodeException ex) { + throw ex; + + } catch (Exception ex) { + throw new NodeException(ex); + } + + } + +} diff --git a/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeUtil.java b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeUtil.java new file mode 100644 index 0000000000..e01df1e32b --- /dev/null +++ b/sca-java-1.x/tags/1.0.1/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/SCANodeUtil.java @@ -0,0 +1,332 @@ +/* + * 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.node.impl; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.ServerSocket; +import java.net.URI; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.List; +import java.util.logging.Logger; + +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.service.util.FileHelper; +import org.apache.tuscany.sca.core.assembly.ActivationException; + + +/** + * Some utility methods for the Node implementation + * + * @version $Rev: 556897 $ $Date: 2007-09-07 12:41:52 +0100 (Fri, 07 Sep 2007) $ + */ +public class SCANodeUtil { + private final static Logger logger = Logger.getLogger(SCANodeUtil.class.getName()); + + /** + * Given a contribution path an array of composite names or neither this method finds + * a suitable contribution to load + * + * @param classLoader + * @param compositePath + * @param composites + * @return the contribution URL + * @throws MalformedURLException + */ + + public static URL findContributionURLFromCompositeNameOrPath(ClassLoader classLoader, String contributionPath, String[] composites) + throws MalformedURLException { + + String contributionArtifactPath = null; + URL contributionArtifactURL = null; + + + if (contributionPath != null && contributionPath.length() > 0) { + + //encode spaces as they would cause URISyntaxException + contributionPath = contributionPath.replace(" ", "%20"); + URI contributionURI = URI.create(contributionPath); + if (contributionURI.isAbsolute() || composites.length == 0) { + return new URL(contributionPath); + } else { + // contributionArtifactURL = classLoader.getResource(contributionPath); + // if (contributionArtifactURL == null) { + // throw new IllegalArgumentException("Composite not found: " + contributionArtifactPath); + // } + } + } + + if ( contributionArtifactURL == null){ + if (composites != null && composites.length > 0 && composites[0].length() > 0) { + + // Here the SCADomain was started with a reference to a composite file + contributionArtifactPath = composites[0]; + contributionArtifactURL = classLoader.getResource(contributionArtifactPath); + if (contributionArtifactURL == null) { + throw new IllegalArgumentException("Composite not found: " + contributionArtifactPath); + } + } else { + + // Here the SCANode was started without any reference to a composite file + // We are going to look for an sca-contribution.xml or sca-contribution-generated.xml + + // Look for META-INF/sca-contribution.xml + contributionArtifactPath = Contribution.SCA_CONTRIBUTION_META; + contributionArtifactURL = classLoader.getResource(contributionArtifactPath); + + // Look for META-INF/sca-contribution-generated.xml + if (contributionArtifactURL == null) { + contributionArtifactPath = Contribution.SCA_CONTRIBUTION_GENERATED_META; + contributionArtifactURL = classLoader.getResource(contributionArtifactPath); + } + + // Look for META-INF/sca-deployables directory + if (contributionArtifactURL == null) { + contributionArtifactPath = Contribution.SCA_CONTRIBUTION_DEPLOYABLES; + contributionArtifactURL = classLoader.getResource(contributionArtifactPath); + } + } + } + + if (contributionArtifactURL == null) { + throw new IllegalArgumentException("Can't determine contribution deployables. Either specify a composite file, or use an sca-contribution.xml file to specify the deployables."); + } + + URL contributionURL = null; + // "jar:file://....../something.jar!/a/b/c/app.composite" + try { + String url = contributionArtifactURL.toExternalForm(); + String protocol = contributionArtifactURL.getProtocol(); + if ("file".equals(protocol)) { + // directory contribution + if (url.endsWith(contributionArtifactPath)) { + String location = url.substring(0, url.lastIndexOf(contributionArtifactPath)); + // workaround from evil url/uri form maven + contributionURL = FileHelper.toFile(new URL(location)).toURI().toURL(); + } + + } else if ("jar".equals(protocol)) { + // jar contribution + String location = url.substring(4, url.lastIndexOf("!/")); + // workaround for evil url/uri from maven + contributionURL = FileHelper.toFile(new URL(location)).toURI().toURL(); + } + } catch (MalformedURLException mfe) { + throw new IllegalArgumentException(mfe); + } + + return contributionURL; + } + + /** + * A rather ugly method to find and fix the url of the service, assuming that there + * is one. + * + * we can't get this out of a service reference + * the component itself doesn't know how to get it + * the binding can't to do it automatically as it's not the sca binding + * + * TODO - This would be better done by passing out a serializable reference to service discovery + * but this doesn't work yet + * + * @return node manager url + */ + public static void fixUpNodeServiceUrls(List nodeComponents, URL nodeUrlString) + throws MalformedURLException, UnknownHostException { + + for(Component component : nodeComponents){ + for (ComponentService service : component.getServices() ){ + for (Binding binding : service.getBindings() ) { + fixUpNodeServiceBindingUrl(binding, nodeUrlString); + } + } + } + } + + /** + * Find and return the URL of the NodeManagerService + * + * @param nodeComponents + * @return + */ + public static String getNodeManagerServiceUrl(List nodeComponents){ + String nodeManagerUrl = null; + + for(Component component : nodeComponents){ + for (ComponentService service : component.getServices() ){ + + if ( service.getName().equals("NodeManagerService")) { + nodeManagerUrl = service.getBindings().get(0).getURI(); + } + } + } + + return nodeManagerUrl; + } + + /** + * For node management services that use the http(s) protocol then use the node url as the enpoint + * if it has been specified otherwise find a port that isn't in use and make sure the domain name + * is the real domain name + * + * @param binding + * @param nodeURL the URL provided as the identifier of the node + */ + public static void fixUpNodeServiceBindingUrl(Binding binding, URL manualUrl) + throws MalformedURLException, UnknownHostException{ + + String urlString = binding.getURI(); + + // only going to fiddle with bindings that use HTTP protocol + if( (urlString == null) || + ((urlString.startsWith("http") != true ) && + (urlString.startsWith("https") != true )) || + (binding instanceof SCABinding)) { + return; + } + + URL bindingUrl = new URL(urlString); + String originalHost = bindingUrl.getHost(); + String newHost = null; + int originalPort = bindingUrl.getPort(); + int newPort = 0; + + if (manualUrl != null) { + // the required url has been specified manually + newHost = manualUrl.getHost(); + newPort = manualUrl.getPort(); + + if ( newHost.equals("localhost")){ + newHost = InetAddress.getLocalHost().getHostName(); + } + } else { + // discover the host and port information + newHost = InetAddress.getLocalHost().getHostName(); + newPort = findFreePort(originalPort); + } + + // replace the old with the new + urlString = urlString.replace(String.valueOf(originalPort), String.valueOf(newPort)); + urlString = urlString.replace(originalHost, newHost); + + // set the address back into the NodeManager binding. + binding.setURI(urlString); + } + + /** + * Find a port on this machine that isn't in use. + * + * @param startPort + * @return + */ + public static int findFreePort(int startPort) + { + boolean portIsBusy = true; + int freePort = startPort; + + do { + try { + ServerSocket socket = new ServerSocket(freePort); + portIsBusy = false; + socket.close(); + break; + } + catch (IOException ex) { + // the port is busy + freePort = freePort + 1; + } + } while (portIsBusy || freePort > 9999); + + return freePort; + } + + /** + * For node services that have to talk to the domain fix up the reference URL using the + * provided domain url if it has been provided + * + * @param nodeComponents + * @param domainUrlString + * @throws MalformedURLException + * @throws UnknownHostException + */ + public static void fixUpNodeReferenceUrls(List nodeComponents, URL domainUrl) + throws MalformedURLException, UnknownHostException, ActivationException{ + + for(Component component : nodeComponents){ + for (ComponentReference reference : component.getReferences() ){ + if ( reference.getName().equals("domainManager") || + reference.getName().equals("scaDomainService")) { + for (Binding binding : reference.getBindings() ) { + fixUpNodeReferenceBindingUrl(binding, domainUrl); + } + } + } + } + } + + /** + * For node management references to the domain fix up the binding URLs so that they point + * to the endpoint described in the domainURL + * + * @param binding + * @param nodeURL the URL provided as the identifier of the node + */ + public static void fixUpNodeReferenceBindingUrl(Binding binding, URL manualUrl) + throws MalformedURLException, UnknownHostException, ActivationException{ + + String urlString = binding.getURI(); + + // only going to fiddle with bindings that use HTTP protocol + if( (urlString == null) || + ((urlString.startsWith("http") != true ) && + (urlString.startsWith("https") != true )) || + (binding instanceof SCABinding) ) { + return; + } + + URL bindingUrl = new URL(urlString); + String originalHost = bindingUrl.getHost(); + String newHost = null; + int originalPort = bindingUrl.getPort(); + int newPort = 0; + + if (manualUrl != null) { + // the required url has been specified manually + newHost = manualUrl.getHost(); + newPort = manualUrl.getPort(); + } else { + throw new ActivationException("domain uri can't be null"); + } + + // replace the old with the new + urlString = urlString.replace(String.valueOf(originalPort), String.valueOf(newPort)); + urlString = urlString.replace(originalHost, newHost); + + // set the address back into the NodeManager binding. + binding.setURI(urlString); + } +} -- cgit v1.2.3