You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ke...@apache.org on 2010/08/03 15:06:07 UTC

svn commit: r981859 - /tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java

Author: kelvingoodson
Date: Tue Aug  3 13:06:07 2010
New Revision: 981859

URL: http://svn.apache.org/viewvc?rev=981859&view=rev
Log:
implement interface contract compatibility checking -- allows oasis JCA_9008_TestCase to receive the required IllegalArgumentException when the contracts are incompatible. In some cases we can't reliably introspect in a platform neutral way to discover the implementation's interface contract, so in this case we fluff up an interface contract on the basis of the business interface, just as we have done more generally in the past.

Modified:
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java

Modified: tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java?rev=981859&r1=981858&r2=981859&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java Tue Aug  3 13:06:07 2010
@@ -47,6 +47,7 @@ import org.apache.tuscany.sca.interfaced
 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.JavaInterfaceContract;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
 import org.apache.tuscany.sca.runtime.CompositeActivator;
 import org.apache.tuscany.sca.runtime.EndpointReferenceBinder;
@@ -59,6 +60,8 @@ import org.oasisopen.sca.RequestContext;
 import org.oasisopen.sca.ServiceReference;
 import org.oasisopen.sca.ServiceRuntimeException;
 
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+
 /**
  * Implementation of ComponentContext that delegates to a ComponentContextProvider.
  *
@@ -75,6 +78,7 @@ public class ComponentContextImpl implem
     private final JavaInterfaceFactory javaInterfaceFactory;
     private final PropertyValueFactory propertyFactory;
     private final EndpointReferenceBinder eprBinder;
+    private final ExtensionPointRegistry registry;
 
     public ComponentContextImpl(ExtensionPointRegistry registry,
                                 CompositeContext compositeContext,
@@ -96,6 +100,7 @@ public class ComponentContextImpl implem
 
         this.eprBinder = utilities.getUtility(EndpointReferenceBinder.class);
 
+        this.registry = registry;
     }
 
     public String getURI() {
@@ -106,12 +111,18 @@ public class ComponentContextImpl implem
         return proxyFactory.cast(target);
     }
 
-    public <B> B getService(Class<B> businessInterface, String referenceName) {
-        ServiceReference<B> serviceRef = getServiceReference(businessInterface, referenceName);
-        return serviceRef.getService();
+    public <B> B getService(Class<B> businessInterface, String referenceName) throws IllegalArgumentException {
+    	B service = null;
+    	
+     	ServiceReference<B> serviceRef = getServiceReference(businessInterface, referenceName);
+     	if(serviceRef != null) {
+            service = serviceRef.getService();
+     	}
+
+        return service;
     }
 
-    public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, String referenceName) {
+    public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, String referenceName) throws IllegalArgumentException {
 
         for (ComponentReference ref : component.getReferences()) {
             if (referenceName.equals(ref.getName())) {
@@ -121,10 +132,17 @@ public class ComponentContextImpl implem
                         + " has multiplicity "
                         + multiplicity);
                 }
-                return getServiceReference(businessInterface, (RuntimeEndpointReference)getEndpointReference(ref));
+                if (ref.getEndpointReferences().size() < 1) {
+                    return null;
+                }
+                ServiceReference<B> sr = getServiceReference(businessInterface, (RuntimeEndpointReference)getEndpointReference(ref));
+                if (sr == null) {
+                    throw new IllegalArgumentException("Reference " + referenceName + " is null");
+                }
+                return sr;
             }
         }
-        throw new ServiceRuntimeException("Reference not found: " + referenceName);
+        throw new IllegalArgumentException("[JCA80011] Reference not found: " + referenceName);
 
     }
 
@@ -305,6 +323,8 @@ public class ComponentContextImpl implem
      */
     public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface,
                                                        RuntimeEndpointReference endpointReference) {
+    	ServiceReference<B> result = null;
+    	
         try {
             InterfaceContract interfaceContract = endpointReference.getComponentTypeReferenceInterfaceContract();
             if (businessInterface == null) {
@@ -312,20 +332,24 @@ public class ComponentContextImpl implem
             }
             RuntimeComponentReference ref = (RuntimeComponentReference)endpointReference.getReference();
             InterfaceContract refInterfaceContract = getInterfaceContract(interfaceContract, businessInterface);
-            if (refInterfaceContract != interfaceContract) {
-                ref = (RuntimeComponentReference)ref.clone();
-                if (interfaceContract != null) {
-                    ref.setInterfaceContract(interfaceContract);
-                } else {
-                    ref.setInterfaceContract(refInterfaceContract);
-                }
+            if (refInterfaceContract != null) {
+	            if (refInterfaceContract != interfaceContract) {
+	                ref = (RuntimeComponentReference)ref.clone();
+	                if (interfaceContract != null) {
+	                    ref.setInterfaceContract(interfaceContract);
+	                } else {
+	                    ref.setInterfaceContract(refInterfaceContract);
+	                }
+	            }
+ 
+	            ref.setComponent(component);
+	            result = new ServiceReferenceImpl<B>(businessInterface, endpointReference, component.getComponentContext().getCompositeContext());
             }
-            ref.setComponent(component);
-            return new ServiceReferenceImpl<B>(businessInterface, endpointReference, component.getComponentContext()
-                .getCompositeContext());
         } catch (Exception e) {
             throw new ServiceRuntimeException(e);
         }
+        
+        return result;
     }
 
     public <B> ServiceReference<B> getServiceReference(Class<B> businessInterface, RuntimeEndpoint endpoint) {
@@ -412,6 +436,11 @@ public class ComponentContextImpl implem
         if (businessInterface == null) {
             return interfaceContract;
         }
+        if (interfaceContract == null) {
+            JavaInterfaceContract ic = javaInterfaceFactory.createJavaInterfaceContract();
+            ic.setInterface(javaInterfaceFactory.createJavaInterface(businessInterface));
+            return ic;
+        }
         boolean compatible = false;
         if (interfaceContract != null && interfaceContract.getInterface() != null) {
             Interface interfaze = interfaceContract.getInterface();
@@ -420,19 +449,24 @@ public class ComponentContextImpl implem
                 if (businessInterface.isAssignableFrom(cls)) {
                     compatible = true;
                 }
-            }
-        }
+                if(!compatible) {
+                    InterfaceContract biContract = javaInterfaceFactory.createJavaInterfaceContract();
+                    JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(businessInterface);
+                    biContract.setInterface(callInterface);
+                    if (callInterface.getCallbackClass() != null) {
+                        biContract.setCallbackInterface(javaInterfaceFactory.createJavaInterface(callInterface
+                            .getCallbackClass()));
+                    }
+                	InterfaceContractMapper ifcm = registry.getExtensionPoint(InterfaceContractMapper.class);
+                	compatible = ifcm.isCompatibleSubset(biContract , interfaceContract);
+                }
 
-        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()));
             }
         }
+        
+        if(!compatible) {
+        	interfaceContract = null;
+        }
 
         return interfaceContract;
     }