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());
+ }
}
}