From 999c66e0e2398c38007b437f8c14154b725203a9 Mon Sep 17 00:00:00 2001 From: antelder Date: Sat, 15 Jan 2011 11:44:44 +0000 Subject: Update getService to work with services on remote nodes git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1059305 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/tuscany/sca/runtime/impl/NodeImpl.java | 135 ++++++++++++++++++++- .../apache/tuscany/sca/node2/TwoNodesTestCase.java | 49 ++++++++ 2 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java (limited to 'sca-java-2.x/trunk/modules/domain-node/src') diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java index 2721bf4496..32f01698bf 100644 --- a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java +++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java @@ -31,15 +31,32 @@ import java.util.Set; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +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.Composite; import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference; +import org.apache.tuscany.sca.assembly.Multiplicity; +import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.common.java.io.IOHelper; +import org.apache.tuscany.sca.context.CompositeContext; import org.apache.tuscany.sca.contribution.Artifact; import org.apache.tuscany.sca.contribution.Contribution; import org.apache.tuscany.sca.contribution.ContributionMetadata; import org.apache.tuscany.sca.contribution.processor.ContributionReadException; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.deployment.Deployer; +import org.apache.tuscany.sca.interfacedef.Interface; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.monitor.ValidationException; import org.apache.tuscany.sca.runtime.ActivationException; @@ -48,7 +65,10 @@ import org.apache.tuscany.sca.runtime.EndpointRegistry; import org.apache.tuscany.sca.runtime.Node; import org.apache.tuscany.sca.runtime.NodeFactory; import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; +import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; import org.oasisopen.sca.NoSuchServiceException; +import org.oasisopen.sca.ServiceRuntimeException; public class NodeImpl implements Node { @@ -260,7 +280,7 @@ public class NodeImpl implements Node { } public T getService(Class interfaze, String serviceURI) throws NoSuchServiceException { - + List endpoints = endpointRegistry.findEndpoint(serviceURI); if (endpoints.size() < 1) { throw new NoSuchServiceException(serviceURI); @@ -269,12 +289,119 @@ public class NodeImpl implements Node { String serviceName = null; if (serviceURI.contains("/")) { int i = serviceURI.indexOf("/"); - if (i < serviceURI.length()-1) { - serviceName = serviceURI.substring(i+1); + if (i < serviceURI.length() - 1) { + serviceName = serviceURI.substring(i + 1); + } + } + + Endpoint ep = endpoints.get(0); + if (((RuntimeComponent)ep.getComponent()).getComponentContext() != null) { + return ((RuntimeComponent)ep.getComponent()).getServiceReference(interfaze, serviceName).getService(); + } else { + return getRemoteProxy(interfaze, ep); + } + } + + private T getRemoteProxy(Class serviceInterface, Endpoint endpoint) throws NoSuchServiceException { + FactoryExtensionPoint factories = extensionPointRegistry.getExtensionPoint(FactoryExtensionPoint.class); + AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class); + JavaInterfaceFactory javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); + ProxyFactory proxyFactory = + new ExtensibleProxyFactory(extensionPointRegistry.getExtensionPoint(ProxyFactoryExtensionPoint.class)); + + CompositeContext compositeContext = + new CompositeContext(extensionPointRegistry, endpointRegistry, null, null, null, + deployer.getSystemDefinitions()); + + RuntimeEndpointReference epr; + try { + epr = + createEndpointReference(javaInterfaceFactory, + compositeContext, + assemblyFactory, + endpoint, + serviceInterface); + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + + return proxyFactory.createProxy(serviceInterface, epr); + } + + private RuntimeEndpointReference createEndpointReference(JavaInterfaceFactory javaInterfaceFactory, + CompositeContext compositeContext, + AssemblyFactory assemblyFactory, + Endpoint endpoint, + Class businessInterface) + throws CloneNotSupportedException, InvalidInterfaceException { + Component component = endpoint.getComponent(); + ComponentService service = endpoint.getService(); + ComponentReference componentReference = assemblyFactory.createComponentReference(); + componentReference.setName("sca.client." + service.getName()); + + componentReference.setCallback(service.getCallback()); + componentReference.getTargets().add(service); + componentReference.getPolicySets().addAll(service.getPolicySets()); + componentReference.getRequiredIntents().addAll(service.getRequiredIntents()); + componentReference.getBindings().add(endpoint.getBinding()); + + InterfaceContract interfaceContract = service.getInterfaceContract(); + Service componentTypeService = service.getService(); + if (componentTypeService != null && componentTypeService.getInterfaceContract() != null) { + interfaceContract = componentTypeService.getInterfaceContract(); + } + interfaceContract = getInterfaceContract(javaInterfaceFactory, interfaceContract, businessInterface); + componentReference.setInterfaceContract(interfaceContract); + componentReference.setMultiplicity(Multiplicity.ONE_ONE); + // component.getReferences().add(componentReference); + + // create endpoint reference + EndpointReference endpointReference = assemblyFactory.createEndpointReference(); + endpointReference.setComponent(component); + endpointReference.setReference(componentReference); + endpointReference.setBinding(endpoint.getBinding()); + endpointReference.setUnresolved(false); + endpointReference.setStatus(EndpointReference.Status.WIRED_TARGET_FOUND_AND_MATCHED); + + endpointReference.setTargetEndpoint(endpoint); + + componentReference.getEndpointReferences().add(endpointReference); + ((RuntimeComponentReference)componentReference).setComponent((RuntimeComponent)component); + ((RuntimeEndpointReference)endpointReference).bind(compositeContext); + + return (RuntimeEndpointReference)endpointReference; + } + + private InterfaceContract getInterfaceContract(JavaInterfaceFactory javaInterfaceFactory, + InterfaceContract interfaceContract, + Class businessInterface) throws CloneNotSupportedException, + InvalidInterfaceException { + if (businessInterface == null) { + return interfaceContract; + } + boolean compatible = false; + if (interfaceContract != null && interfaceContract.getInterface() != null) { + Interface interfaze = interfaceContract.getInterface(); + if (interfaze instanceof JavaInterface) { + Class cls = ((JavaInterface)interfaze).getJavaClass(); + if (cls != null && businessInterface.isAssignableFrom(cls)) { + compatible = true; + } + } + } + + if (!compatible) { + // The interface is not assignable from the interface contract + interfaceContract = javaInterfaceFactory.createJavaInterfaceContract(); + JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(businessInterface); + interfaceContract.setInterface(callInterface); + if (callInterface.getCallbackClass() != null) { + interfaceContract.setCallbackInterface(javaInterfaceFactory.createJavaInterface(callInterface + .getCallbackClass())); } } - return ((RuntimeComponent)endpoints.get(0).getComponent()).getServiceReference(interfaze, serviceName).getService(); + return interfaceContract; } public String getDomainName() { diff --git a/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java b/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java new file mode 100644 index 0000000000..42949e2924 --- /dev/null +++ b/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java @@ -0,0 +1,49 @@ +/* + * 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.node2; + +import junit.framework.Assert; + +import org.apache.tuscany.sca.contribution.processor.ContributionReadException; +import org.apache.tuscany.sca.monitor.ValidationException; +import org.apache.tuscany.sca.runtime.ActivationException; +import org.apache.tuscany.sca.runtime.Node; +import org.apache.tuscany.sca.runtime.NodeFactory; +import org.junit.Test; +import org.oasisopen.sca.NoSuchDomainException; +import org.oasisopen.sca.NoSuchServiceException; + +import sample.Helloworld; + +public class TwoNodesTestCase { + + @Test + public void testInstallDeployable() throws NoSuchServiceException, NoSuchDomainException, ContributionReadException, ActivationException, ValidationException { +// Node node1 = NodeFactory.newInstance().createNode("uri:TwoNodesTestCase?multicast=off&bind=127.0.0.1:44331"); + Node node1 = NodeFactory.newInstance().createNode("uri:TwoNodesTestCase"); + node1.installContribution("helloworld", "src/test/resources/sample-helloworld.jar", null, null, true); + +// Node node2 = NodeFactory.newInstance().createNode("uri:TwoNodesTestCase?multicast=off&bind=127.0.0.1:44332&wka=127.0.0.1:44331"); + Node node2 = NodeFactory.newInstance().createNode("uri:TwoNodesTestCase"); + + Helloworld helloworldService = node2.getService(Helloworld.class, "HelloworldComponent"); + Assert.assertEquals("Hello petra", helloworldService.sayHello("petra")); + } + +} -- cgit v1.2.3