You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by na...@apache.org on 2008/06/11 19:18:53 UTC

svn commit: r666738 - in /incubator/tuscany/java/sca/modules: core/src/main/java/org/apache/tuscany/sca/core/context/ implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/

Author: nash
Date: Wed Jun 11 10:18:53 2008
New Revision: 666738

URL: http://svn.apache.org/viewvc?rev=666738&view=rev
Log:
Fix TUSCANY-2312

Modified:
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java
    incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java
    incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java?rev=666738&r1=666737&r2=666738&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java Wed Jun 11 10:18:53 2008
@@ -126,8 +126,6 @@
         // sca:component1/component11/component112/service1?
         this.compositeActivator = compositeActivator;
         this.conversationManager = this.compositeActivator.getConversationManager();
-        //RuntimeWire wire = this.reference.getRuntimeWire(this.binding);
-        // init(wire);
         initCallbackID();
     }
 
@@ -163,7 +161,6 @@
             this.binding = wire.getSource().getBinding();
             this.compositeActivator = ((ComponentContextImpl)component.getComponentContext()).getCompositeActivator();
             this.conversationManager = this.compositeActivator.getConversationManager();
-            // init(wire);
             initCallbackID();
         }
     }
@@ -289,17 +286,7 @@
                 if (parameters != null) {
                     refParams = parameters;
                     this.callbackID = parameters.getCallbackID();
-                    
-                    if (parameters.getConversationID() != null){
-                        ExtendedConversation conversation = conversationManager.getConversation(parameters.getConversationID());
-                        
-                        if (conversation == null){
-                            conversation = conversationManager.startConversation(parameters.getConversationID());
-                        }
-                        this.conversation = conversation;
-                    } else {
-                        this.conversation = null;
-                    }
+                    attachConversation(parameters.getConversationID());
                 }
 
                 for (Binding binding : reference.getBindings()) {
@@ -444,6 +431,17 @@
         this.conversation = conversation;
     }
 
+    public void attachConversation(Object conversationID) {
+        if (conversationID != null) {
+            ExtendedConversation conversation = conversationManager.getConversation(conversationID);
+            if (conversation == null){
+                conversation = conversationManager.startConversation(conversationID);
+            }
+            this.conversation = conversation;
+        } else {
+            this.conversation = null;
+        }
+    }
 
     protected ReferenceParameters getReferenceParameters() {
         ReferenceParameters parameters = new ReferenceParametersImpl();

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java?rev=666738&r1=666737&r2=666738&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/RequestContextImpl.java Wed Jun 11 10:18:53 2008
@@ -66,9 +66,7 @@
         CallableReference<B> callableReference = component.getComponentContext().getCallableReference(null, component, service);
         ReferenceParameters parameters = msgContext.getFrom().getReferenceParameters();
         ((CallableReferenceImpl<B>) callableReference).attachCallbackID(parameters.getCallbackID());
-        if (callableReference.getConversation() != null) {
-            ((CallableReferenceImpl<B>) callableReference).attachConversationID(parameters.getConversationID());
-        }
+        ((CallableReferenceImpl<B>) callableReference).attachConversation(parameters.getConversationID());
         return callableReference;
     }
 

Modified: incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java?rev=666738&r1=666737&r2=666738&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java Wed Jun 11 10:18:53 2008
@@ -29,6 +29,7 @@
 import org.apache.tuscany.sca.interfacedef.ConversationSequence;
 import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
 import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
 import org.apache.tuscany.sca.invocation.Invoker;
 import org.apache.tuscany.sca.invocation.Message;
@@ -59,6 +60,12 @@
         this.allowsPBR = ((JavaImplementation)component.getImplementation()).isAllowsPassByReference(method);
     }
 
+    public JavaImplementationInvoker(Operation operation, RuntimeComponent component) {
+        // used if the method can't be computed statically in advance 
+        this.operation = operation;
+        this.scopeContainer = ((ScopedRuntimeComponent)component).getScopeContainer();
+    }
+
     @SuppressWarnings("unchecked")
     public Message invoke(Message msg) {
         Operation op = msg.getOperation();
@@ -104,11 +111,21 @@
             }
 
             Object instance = wrapper.getInstance();
+
+            // If the method couldn't be computed statically, or the instance being
+            // invoked is a user-specified callback object that doesn't implement
+            // the service interface from which the reflective method was obtained,
+            // compute the method object dynamically for this invocation.
+            Method imethod = method;
+            if (imethod == null || !imethod.getDeclaringClass().isInstance(instance)) {
+                imethod = JavaInterfaceUtil.findMethod(instance.getClass(), operation);
+            }
+            
             Object ret;
             if (payload != null && !payload.getClass().isArray()) {
-                ret = method.invoke(instance, payload);
+                ret = imethod.invoke(instance, payload);
             } else {
-                ret = method.invoke(instance, (Object[])payload);
+                ret = imethod.invoke(instance, (Object[])payload);
             }
 
             scopeContainer.returnWrapper(wrapper, contextId);

Modified: incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java?rev=666738&r1=666737&r2=666738&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java Wed Jun 11 10:18:53 2008
@@ -19,6 +19,7 @@
 
 package org.apache.tuscany.sca.implementation.java.invocation;
 
+import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
@@ -37,7 +38,10 @@
 import org.apache.tuscany.sca.implementation.java.injection.RequestContextObjectFactory;
 import org.apache.tuscany.sca.implementation.java.injection.ResourceHost;
 import org.apache.tuscany.sca.implementation.java.injection.ResourceObjectFactory;
+import org.apache.tuscany.sca.interfacedef.Interface;
 import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
 import org.apache.tuscany.sca.invocation.Invoker;
 import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
@@ -145,7 +149,25 @@
         try {
             return componentContextProvider.createInvoker(operation);
         } catch (NoSuchMethodException e) {
-            throw new IllegalArgumentException(e);
+            // It's possible that the instance being invoked is a user-specified
+            // callback object that isn't an instance of the component implementation
+            // class.  As an attempt to deal with this, look up a method object from
+            // the service interface.  This isn't foolproof, as it's possible that
+            // the service interface isn't a Java interface, or that the callback
+            // object has the right method signature without implementing the
+            // callback interface.  There is code in JavaImplementationInvoker
+            // to deal with these possibilities.
+            Interface iface = service.getInterfaceContract().getInterface();
+            if (iface instanceof JavaInterface) {
+                try {
+                    Method method = JavaInterfaceUtil.findMethod(((JavaInterface)iface).getJavaClass(), operation);
+                    return new JavaImplementationInvoker(operation, method, componentContextProvider.getComponent());
+                } catch (NoSuchMethodException e1) {
+                    throw new IllegalArgumentException(e1);
+                }
+            } else {
+                return new JavaImplementationInvoker(operation, componentContextProvider.getComponent());
+            }
         }
     }