You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2011/01/15 12:44:45 UTC

svn commit: r1059305 - in /tuscany/sca-java-2.x/trunk/modules/domain-node: pom.xml src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java

Author: antelder
Date: Sat Jan 15 11:44:44 2011
New Revision: 1059305

URL: http://svn.apache.org/viewvc?rev=1059305&view=rev
Log:
Update  getService to work with services on remote nodes

Added:
    tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java   (with props)
Modified:
    tuscany/sca-java-2.x/trunk/modules/domain-node/pom.xml
    tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java

Modified: tuscany/sca-java-2.x/trunk/modules/domain-node/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/domain-node/pom.xml?rev=1059305&r1=1059304&r2=1059305&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/domain-node/pom.xml (original)
+++ tuscany/sca-java-2.x/trunk/modules/domain-node/pom.xml Sat Jan 15 11:44:44 2011
@@ -59,10 +59,22 @@
         
          <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-binding-ws-wsdlgen</artifactId>
+            <artifactId>tuscany-domain-hazelcast</artifactId>
             <version>2.0-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>         
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-assembly-xml</artifactId>
+            <version>2.0-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws-wsdlgen</artifactId>
+            <version>2.0-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
 

Modified: tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java?rev=1059305&r1=1059304&r2=1059305&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/runtime/impl/NodeImpl.java Sat Jan 15 11:44:44 2011
@@ -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.En
 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> T getService(Class<T> interfaze, String serviceURI) throws NoSuchServiceException {
-        
+
         List<Endpoint> 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> T getRemoteProxy(Class<T> 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() {

Added: tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java?rev=1059305&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java Sat Jan 15 11:44:44 2011
@@ -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"));
+    }
+
+}

Propchange: tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/node2/TwoNodesTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date