Author: nash
Date: Thu Jun 12 07:57:16 2008
New Revision: 667121

URL: http://svn.apache.org/viewvc?rev=667121&view=rev
Log:
Fix problem when conversation ends abnormally because of system exception

Modified:
    
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvBadCallback.java
    
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvClientImpl.java
    
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvNonSerCallback.java
    
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvObjectCallback.java
    
incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
    
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java

Modified: 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvBadCallback.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvBadCallback.java?rev=667121&r1=667120&r2=667121&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvBadCallback.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvBadCallback.java
 Thu Jun 12 07:57:16 2008
@@ -18,9 +18,11 @@
  */
 package org.apache.tuscany.sca.test;
 
+import java.io.Serializable;
+
 import junit.framework.Assert;
 
-public class CallBackSetCallbackConvBadCallback {
+public class CallBackSetCallbackConvBadCallback implements Serializable {
 
     public CallBackSetCallbackConvBadCallback() {
         super();
@@ -32,7 +34,6 @@
         //
         System.out.println("CallBackSetCallbackBadCallback: callback called");
         Assert.fail("CallBackSetCallbackConvBadCallback: callback called");
-        return;
     }
 
 }

Modified: 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvClientImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvClientImpl.java?rev=667121&r1=667120&r2=667121&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvClientImpl.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvClientImpl.java
 Thu Jun 12 07:57:16 2008
@@ -29,14 +29,14 @@
 
 @Service(CallBackSetCallbackConvClient.class)
 @Scope("CONVERSATION")
-public class CallBackSetCallbackConvClientImpl implements 
CallBackSetCallbackConvClient,
-        //FIXME: remove the following hack, needed to get around current 
JavaImplementationInvoker limitation
-        CallBackSetCallbackConvCallback {
+public class CallBackSetCallbackConvClientImpl implements 
CallBackSetCallbackConvClient {
 
     @Context
     protected ComponentContext componentContext;
+
     @Reference
     protected CallBackSetCallbackConvService aCallBackService;
+
     private CallBackSetCallbackConvObjectCallback aCallbackObject = null;
 
     public void run() {
@@ -84,7 +84,7 @@
         ServiceReference<CallBackSetCallbackConvService> aCallBackServiceRef
                 = componentContext.cast(aCallBackService);
         aCallBackServiceRef.setCallback(aCallbackObject);
-        aCallBackService.knockKnock("Knock Knock");
+        aCallBackService.knockKnock("Knock Knock 7");
 
         Assert.assertEquals("CallBackSetCallbackConv - Test7", 2, 
aCallbackObject.getCount());
 
@@ -105,7 +105,7 @@
             ServiceReference<CallBackSetCallbackConvService> 
aCallBackServiceRef
                     = componentContext.cast(aCallBackService);
             aCallBackServiceRef.setCallback(new 
CallBackSetCallbackConvBadCallback());
-            aCallBackService.knockKnock("Knock Knock");
+            aCallBackService.knockKnock("Knock Knock 8");
         }
 
         //
@@ -143,12 +143,12 @@
             ServiceReference<CallBackSetCallbackConvService> 
aCallBackServiceRef
                     = componentContext.cast(aCallBackService);
             aCallBackServiceRef.setCallback(new 
CallBackSetCallbackConvNonSerCallback());
-            aCallBackService.knockKnock("Knock Knock");
+            aCallBackService.knockKnock("Knock Knock 9");
         }
         //
         // This should catch an appropriate exception.
         //
-        catch (IllegalStateException goodEx)
+        catch (IllegalArgumentException goodEx)
         {
             System.out.println("correct exception " + goodEx);
             correctException = true;
@@ -160,14 +160,4 @@
 
     }
 
-    //FIXME: remove the following methods, needed to get around current 
JavaImplementationInvoker limitation
-
-    public void callBackMessage(String aString) {
-        throw new 
IllegalStateException("CallbackSetCallbackConvClientImpl.callbackMessage 
called");
-    }
-
-    public void callBackIncrement(String aString) {
-        throw new 
IllegalStateException("CallbackSetCallbackConvClientImpl.callbackIncrement 
called");
-    }
-
 }

Modified: 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvNonSerCallback.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvNonSerCallback.java?rev=667121&r1=667120&r2=667121&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvNonSerCallback.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvNonSerCallback.java
 Thu Jun 12 07:57:16 2008
@@ -18,10 +18,11 @@
  */
 package org.apache.tuscany.sca.test;
 
+import junit.framework.Assert;
+
 public class CallBackSetCallbackConvNonSerCallback implements 
CallBackSetCallbackConvCallback {
 
     private int callBackCount = 0;
-    private Object monitor;
 
     public CallBackSetCallbackConvNonSerCallback() {
         super();
@@ -35,24 +36,21 @@
         return callBackCount;
     }
 
-    public void setMonitor(Object anObject) {
-        monitor = anObject;
-    }
-
     public void callBackMessage(String aString) {
-
+        //
+        // This callback method should never be called.
+        //
         System.out.println("Entering CallBackSetCallbackConvNonSerCallback 
callBackMessage: " + aString);
-
+        Assert.fail("CallBackSetCallbackConvNonSerCallback: callbackMessage 
called");
     }
 
     public void callBackIncrement(String aString) {
-
-        System.out.println("Entering callback increment: " + aString);
-
-        synchronized (monitor) {
-            this.incrementCallBackCount();
-            monitor.notify();
-        }
+        //
+        // This callback method should never be called.
+        //
+        System.out.println("Entering callbackIncrement: " + aString);
+        this.incrementCallBackCount();
+        Assert.fail("CallBackSetCallbackConvNonSerCallback: callbackIncrement 
called");
     }
 
 }

Modified: 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvObjectCallback.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvObjectCallback.java?rev=667121&r1=667120&r2=667121&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvObjectCallback.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/callback-set-conversation/src/main/java/org/apache/tuscany/sca/test/CallBackSetCallbackConvObjectCallback.java
 Thu Jun 12 07:57:16 2008
@@ -18,11 +18,9 @@
  */
 package org.apache.tuscany.sca.test;
 
+import java.io.Serializable;
 
-public class CallBackSetCallbackConvObjectCallback
-        //FIXME: remove the following hack, needed to get around current 
JavaImplementationInvoker limitation
-        extends CallBackSetCallbackConvClientImpl
-        //implements CallBackSetCallbackConvCallback
+public class CallBackSetCallbackConvObjectCallback implements 
CallBackSetCallbackConvCallback, Serializable
 {
     private int callBackCount = 0;
 

Modified: 
incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java?rev=667121&r1=667120&r2=667121&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
 Thu Jun 12 07:57:16 2008
@@ -281,6 +281,7 @@
         conversationPreinvoke(msg, wire);
         handleCallback(msg, wire, currentConversationID);
         ThreadMessageContext.setMessageContext(msg);
+        boolean abnormalEndConversation = false;
         try {
             // dispatch the wire down the chain and get the response
             Message resp = headInvoker.invoke(msg);
@@ -299,7 +300,7 @@
                         }
                         
                         if (businessException == false){
-                            
operation.setConversationSequence(ConversationSequence.CONVERSATION_END);
+                            abnormalEndConversation = true;
                         }
                     } catch (Exception ex){
                         // TODO - sure what the best course of action is here. 
We have
@@ -310,7 +311,7 @@
             }
             return body;
         } finally {
-            conversationPostInvoke(msg, wire);
+            conversationPostInvoke(msg, wire, abnormalEndConversation);
             ThreadMessageContext.setMessageContext(msgContext);
         }
     }
@@ -346,7 +347,7 @@
             }
         }
 
-        Interface interfaze = msg.getOperation().getInterface();
+        Interface interfaze = 
msg.getFrom().getCallbackEndpoint().getInterfaceContract().getInterface();
         if (callbackObject != null) {
             if (callbackObject instanceof ServiceReference) {
                 EndpointReference callbackRef = 
((CallableReferenceImpl)callbackObject).getEndpointReference();
@@ -357,6 +358,10 @@
                         throw new IllegalArgumentException(
                                                            "Callback object 
for stateless callback is not a ServiceReference");
                     } else {
+                        if (!(callbackObject instanceof Serializable)) {
+                            throw new IllegalArgumentException(
+                                          "Callback object for stateful 
callback is not Serializable");
+                        }
                         ScopeContainer scopeContainer = 
getConversationalScopeContainer(wire);
                         if (scopeContainer != null) {
                             InstanceWrapper wrapper = new 
CallbackObjectWrapper(callbackObject);
@@ -402,7 +407,7 @@
 
         // if this is a local wire then schedule conversation timeouts based 
on the timeout
         // parameters from the service implementation. If this isn't a local 
wire then
-        // the RuntimeWireInvker will take care of this
+        // the RuntimeWireInvoker will take care of this
         if (wire.getTarget().getComponent() != null){
             conversation.updateLastReferencedTime();
         }
@@ -418,13 +423,15 @@
      * @throws TargetDestructionException
      */
     @SuppressWarnings("unchecked")
-    private void conversationPostInvoke(Message msg, RuntimeWire wire) throws 
TargetDestructionException {
+    private void conversationPostInvoke(Message msg, RuntimeWire wire, boolean 
abnormalEndConversation)
+                     throws TargetDestructionException {
         Operation operation = msg.getOperation();
         ConversationSequence sequence = operation.getConversationSequence();
         // We check that conversation has not already ended as there is only 
one
         // conversation manager in the runtime and so, in the case of remote 
bindings, 
         // the conversation will already have been stopped when we get back to 
the client
-        if ((sequence == ConversationSequence.CONVERSATION_END) && 
(conversation.getState() != ConversationState.ENDED)) {
+        if ((sequence == ConversationSequence.CONVERSATION_END || 
abnormalEndConversation) &&
+            (conversation.getState() != ConversationState.ENDED)) {
 
             // remove conversation id from scope container
             ScopeContainer scopeContainer = 
getConversationalScopeContainer(wire);

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=667121&r1=667120&r2=667121&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
 Thu Jun 12 07:57:16 2008
@@ -121,7 +121,7 @@
                 try {
                     imethod = 
JavaInterfaceUtil.findMethod(instance.getClass(), operation);
                 } catch (NoSuchMethodException e) {
-                    throw new IllegalArgumentException(e);
+                    throw new IllegalArgumentException("Callback object does 
not provide method " + e.getMessage());
                 }
             }
             


Reply via email to