You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2010/02/10 00:49:33 UTC

svn commit: r908285 - in /tuscany/sca-java-2.x/trunk/modules/sca-client-impl: META-INF/MANIFEST.MF src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java

Author: rfeng
Date: Tue Feb  9 23:49:32 2010
New Revision: 908285

URL: http://svn.apache.org/viewvc?rev=908285&view=rev
Log:
Fix the sca client to use a resolved endpoint

Modified:
    tuscany/sca-java-2.x/trunk/modules/sca-client-impl/META-INF/MANIFEST.MF
    tuscany/sca-java-2.x/trunk/modules/sca-client-impl/src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java

Modified: tuscany/sca-java-2.x/trunk/modules/sca-client-impl/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/sca-client-impl/META-INF/MANIFEST.MF?rev=908285&r1=908284&r2=908285&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/sca-client-impl/META-INF/MANIFEST.MF (original)
+++ tuscany/sca-java-2.x/trunk/modules/sca-client-impl/META-INF/MANIFEST.MF Tue Feb  9 23:49:32 2010
@@ -7,10 +7,14 @@
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
 Bundle-Description: Apache Tuscany SCA Client Impl
 Import-Package: org.apache.tuscany.sca.assembly;version="2.0.0",
- org.apache.tuscany.sca.core;version="2.0.0",
  org.apache.tuscany.sca.context;version="2.0.0",
+ org.apache.tuscany.sca.core;version="2.0.0",
+ org.apache.tuscany.sca.core.invocation;version="2.0.0",
+ org.apache.tuscany.sca.interfacedef;version="2.0.0",
+ org.apache.tuscany.sca.interfacedef.java;version="2.0.0",
  org.apache.tuscany.sca.node;version="2.0.0",
  org.apache.tuscany.sca.node.impl;version="2.0.0",
+ org.apache.tuscany.sca.policy;version="2.0.0",
  org.apache.tuscany.sca.runtime;version="2.0.0",
  org.oasisopen.sca;version="2.0.0",
  org.oasisopen.sca.client;version="2.0.0"

Modified: tuscany/sca-java-2.x/trunk/modules/sca-client-impl/src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/sca-client-impl/src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java?rev=908285&r1=908284&r2=908285&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/sca-client-impl/src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/sca-client-impl/src/main/java/org/apache/tuscany/sca/client/impl/SCAClientFactoryImpl.java Tue Feb  9 23:49:32 2010
@@ -23,9 +23,25 @@
 import java.util.List;
 import java.util.UUID;
 
+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.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.context.CompositeContext;
 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.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.node.Node;
 import org.apache.tuscany.sca.node.NodeFactory;
 import org.apache.tuscany.sca.node.impl.NodeFactoryImpl;
@@ -34,10 +50,10 @@
 import org.apache.tuscany.sca.runtime.EndpointRegistry;
 import org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
-import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
 import org.oasisopen.sca.NoSuchDomainException;
 import org.oasisopen.sca.NoSuchServiceException;
-import org.oasisopen.sca.ServiceReference;
 import org.oasisopen.sca.ServiceRuntimeException;
 import org.oasisopen.sca.client.SCAClientFactory;
 import org.oasisopen.sca.client.SCAClientFactoryFinder;
@@ -48,10 +64,13 @@
         SCAClientFactory.factoryFinder = factoryFinder;
     }
 
-    private ExtensionPointRegistry extensionsRegistry;
-    private EndpointRegistry endpointRegistry;
-    private NodeFactoryImpl nodeFactory;
-    private CompositeContext compositeContext;
+    private final ExtensionPointRegistry extensionsRegistry;
+    private final AssemblyFactory assemblyFactory;
+    private final JavaInterfaceFactory javaInterfaceFactory;
+    private final ProxyFactory proxyFactory;
+    private final EndpointRegistry endpointRegistry;
+    private final NodeFactoryImpl nodeFactory;
+    private final CompositeContext compositeContext;
     
     public SCAClientFactoryImpl(URI domainURI) throws NoSuchDomainException {
         super(domainURI);
@@ -66,6 +85,11 @@
         if (endpointRegistry == null) {
             throw new NoSuchDomainException(domainURI.toString());
         }
+        FactoryExtensionPoint factories = extensionsRegistry.getExtensionPoint(FactoryExtensionPoint.class);
+        this.assemblyFactory = factories.getFactory(AssemblyFactory.class);
+        this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class);
+        this.proxyFactory = new ExtensibleProxyFactory(extensionsRegistry.getExtensionPoint(ProxyFactoryExtensionPoint.class));
+
         String client = "sca.client." + UUID.randomUUID();
         this.compositeContext =
             new CompositeContext(extensionsRegistry, endpointRegistry, null, domainURI.toString(), client);
@@ -80,22 +104,18 @@
         }
         Endpoint endpoint = eps.get(0); // TODO: what should be done with multiple endpoints?
 
-        Node localNode = findLocalNode(endpoint);
-        if (localNode != null) {
-            return localNode.getService(serviceInterface, serviceName);
-        }
+//        Node localNode = findLocalNode(endpoint);
+//        if (localNode != null) {
+//            return localNode.getService(serviceInterface, serviceName);
+//        }
         
-        RuntimeComponent component;
+        RuntimeEndpointReference epr;
         try {
-            component = (RuntimeComponent) endpoint.getComponent().clone();
-        } catch (CloneNotSupportedException e) {
+            epr = createEndpointReference(endpoint, serviceInterface);
+        } catch (Exception e) {
             throw new ServiceRuntimeException(e);
         }
-        compositeContext.bindComponent(component);
-        RuntimeEndpoint runtimeEndpoint = (RuntimeEndpoint) component.getServices().get(0).getEndpoints().get(0);
-        runtimeEndpoint.setRemote(true);
-        ServiceReference<T> serviceReference = component.getComponentContext().getServiceReference(serviceInterface, runtimeEndpoint);
-        return serviceReference.getService();
+        return proxyFactory.createProxy(serviceInterface, epr);
         
     }
 
@@ -110,4 +130,84 @@
         return null;
     }
 
+    private RuntimeEndpointReference createEndpointReference(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(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.WIRED_TARGET_FOUND_AND_MATCHED);
+    
+        endpointReference.setTargetEndpoint(endpoint);
+        if (endpoint.isRemote()) {
+            endpointReference.setRemote(true);
+        }
+    
+        componentReference.getEndpointReferences().add(endpointReference);
+        ((RuntimeComponentReference)componentReference).setComponent((RuntimeComponent)component);
+        ((RuntimeEndpointReference)endpointReference).bind(compositeContext);
+    
+        return (RuntimeEndpointReference) endpointReference;
+    }
+
+    /**
+     * @param interfaceContract
+     * @param businessInterface
+     * @return
+     * @throws CloneNotSupportedException
+     * @throws InvalidInterfaceException
+     */
+    private InterfaceContract getInterfaceContract(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 interfaceContract;
+    }
+
 }