You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2007/07/21 09:37:25 UTC

svn commit: r558264 - in /incubator/tuscany/java/sca: itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ itest/conversations/src/main/resour...

Author: slaws
Date: Sat Jul 21 00:37:22 2007
New Revision: 558264

URL: http://svn.apache.org/viewvc?view=rev&rev=558264
Log:
TUSCANY-1377
Fix up stateful callbacks. There are still issues. Primarily is you use application defined  conversation ids the callback will not automatically be associated with the calling instance

Modified:
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalCallback.java
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalService.java
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatefulImpl.java
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatelessImpl.java
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatefulImpl.java
    incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessImpl.java
    incubator/tuscany/java/sca/itest/conversations/src/main/resources/conversational.composite
    incubator/tuscany/java/sca/itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ConversationalTest.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/AbstractInvocationHandler.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/scope/ConversationalScopeContainer.java

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalCallback.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalCallback.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalCallback.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalCallback.java Sat Jul 21 00:37:22 2007
@@ -34,10 +34,8 @@
 @Conversational
 public interface ConversationalCallback {
 	
-    @Init
     public void init();
     
-    @Destroy
     public void destroy();
     
     public void initializeCount(int count);

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalService.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalService.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/ConversationalService.java Sat Jul 21 00:37:22 2007
@@ -18,6 +18,7 @@
  */
 package org.apache.tuscany.sca.itest.conversational;
 
+import org.osoa.sca.annotations.Callback;
 import org.osoa.sca.annotations.Conversational;
 import org.osoa.sca.annotations.Destroy;
 import org.osoa.sca.annotations.EndsConversation;
@@ -32,6 +33,7 @@
  */
 @Remotable
 @Conversational
+@Callback(ConversationalCallback.class)
 public interface ConversationalService {
 	
     public void init();

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatefulImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatefulImpl.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatefulImpl.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatefulImpl.java Sat Jul 21 00:37:22 2007
@@ -55,12 +55,17 @@
     
     // @Reference - not yet
     protected ConversationalReferenceClient conversationalReferenceClient;
+      
+    private int clientCount = 0;
+    private int callbackCount = 0;  
     
-    private int clientCount;
-    private int callbackCount;  
+    
+    // a static member variable that records the number of times this service is called
+    public static StringBuffer calls = new StringBuffer();        
 	
     // From ConversationalClient
 	public int runConversationFromInjectedReference(){
+	    calls.append("runConversationFromInjectedReference,");	    
 	    conversationalService.initializeCount(1);
 	    conversationalService.incrementCount();
 	    clientCount = conversationalService.retrieveCount();
@@ -69,6 +74,7 @@
 	    return clientCount;
 	}
     public int runConversationFromServiceReference(){
+        calls.append("runConversationFromServiceReference,");
         ServiceReference<ConversationalService> serviceReference = componentContext.getServiceReference(ConversationalService.class, 
                                                                                                         "conversationalService");
         ConversationalService callableReference = serviceReference.getService();
@@ -83,6 +89,7 @@
         return clientCount;
     }	
     public int runConversationWithUserDefinedConversationId(){
+        calls.append("runConversationWithUserDefinedConversationId,");
         ServiceReference<ConversationalService> serviceReference = componentContext.getServiceReference(ConversationalService.class, 
                                                                                                         "conversationalService");
         serviceReference.setConversationID("MyConversation");
@@ -99,6 +106,7 @@
         return clientCount;
     }    
     public int runConversationCheckingScope(){
+        calls.append("runConversationCheckingScope,");
         // run a conversation
         return runConversationFromInjectedReference();
         
@@ -106,47 +114,67 @@
         // init/destroy were called
     }    
 	public int runConversationWithCallback(){
+	    calls.append("runConversationWithCallback,");
+	    callbackCount = 2;
+        conversationalService.initializeCountCallback(1);
+        conversationalService.incrementCountCallback();
+        clientCount = conversationalService.retrieveCountCallback();
+        conversationalService.endConversationCallback();
+        
         return clientCount;
     } 
 	public int runConversationHavingPassedReference(){
+	    calls.append("runConversationHavingPassedReference,");
         return clientCount;
     }
 	public int runConversationError(){
+	    calls.append("runConversationError,");
         return clientCount;
     }
     public int runConversationAgeTimeout(){
+        calls.append("runConversationAgeTimeout,");
         return clientCount;
     }
     public int runConversationIdleTimeout(){
+        calls.append("runConversationIdleTimeout,");
         return clientCount;
     }
     public int runConversationPrincipleError(){
+        calls.append("runConversationPrincipleError,");
         return clientCount;
     }
     
     
     // From ConversationalCallback
+    @Init
     public void init(){
+        calls.append("init,");
 
     }
     
+    @Destroy
     public void destroy(){
+        calls.append("destroy,");
         
     }
     
     public void initializeCount(int count){
-        callbackCount = 0;
+        calls.append("initializeCount,");
+        callbackCount += count;
     }
     
     public void incrementCount(){
+        calls.append("incrementCount,");
         callbackCount++;
     }
     
     public int retrieveCount(){
+        calls.append("retrieveCount,");
         return  callbackCount;
     }
     
     public void endConversation(){
+        calls.append("endConversation,");
         
     }
 

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatelessImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatelessImpl.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatelessImpl.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalClientStatelessImpl.java Sat Jul 21 00:37:22 2007
@@ -52,11 +52,15 @@
     // @Reference - not yet
     protected ConversationalReferenceClient conversationalReferenceClient;
     
-    private int clientCount;
-    private int callbackCount;
+    private int clientCount = 0;
+    private int callbackCount = 0;
+    
+    // a static member variable that records the number of times this service is called
+    public static StringBuffer calls = new StringBuffer();    
 	
     // From ConversationalClient
     public int runConversationFromInjectedReference(){
+        calls.append("runConversationFromInjectedReference,");
         conversationalService.initializeCount(1);
         conversationalService.incrementCount();
         clientCount = conversationalService.retrieveCount();
@@ -65,6 +69,7 @@
         return clientCount;
     }
     public int runConversationFromServiceReference(){
+        calls.append("runConversationFromServiceReference,");
         ServiceReference<ConversationalService> serviceReference = componentContext.getServiceReference(ConversationalService.class, 
                                                                                                         "conversationalService");       
         ConversationalService callableReference = serviceReference.getService();
@@ -79,6 +84,7 @@
         return clientCount;
     }   
     public int runConversationWithUserDefinedConversationId(){
+        calls.append("runConversationWithUserDefinedConversationId,");
         ServiceReference<ConversationalService> serviceReference = componentContext.getServiceReference(ConversationalService.class, 
                                                                                                         "conversationalService");       
         ConversationalService callableReference = serviceReference.getService();
@@ -93,6 +99,7 @@
         return clientCount;
     }    
     public int runConversationCheckingScope(){
+        calls.append("runConversationCheckingScope,");
         // run a conversation
         return runConversationFromInjectedReference();
         
@@ -100,47 +107,66 @@
         // init/destroy were called
     }
     public int runConversationWithCallback(){
+        calls.append("runConversationWithCallback,");
+        conversationalService.initializeCountCallback(1);
+        conversationalService.incrementCountCallback();
+        clientCount = conversationalService.retrieveCountCallback();
+        conversationalService.endConversationCallback();
+        
         return clientCount;
     } 
     public int runConversationHavingPassedReference(){
+        calls.append("runConversationHavingPassedReference,");
         return clientCount;
     }	
 	public int runConversationError(){
+        calls.append("runConversationError,");
         return clientCount;
     }
     public int runConversationAgeTimeout(){
+        calls.append("runConversationAgeTimeout,");
         return clientCount;
     }
     public int runConversationIdleTimeout(){
+        calls.append("runConversationIdleTimeout,");
         return clientCount;
     }
     public int runConversationPrincipleError(){
+        calls.append("runConversationPrincipleError,");
         return clientCount;
     }
     
     
     // From ConversationalCallback
+    @Init
     public void init(){
+        calls.append("init,");
 
     }
     
+    @Destroy
     public void destroy(){
+        calls.append("destroy,");
         
     }
     
     public void initializeCount(int count){
+        calls.append("initializeCount,");
         callbackCount = 0;
     }
     
     public void incrementCount(){
+        calls.append("incrementCount,");
         callbackCount++;
     }
     
     public int retrieveCount(){
+        calls.append("retrieveCount,");
         return  callbackCount;
     }
     
     public void endConversation(){
+        calls.append("endConversation,");
         
     }
 

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatefulImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatefulImpl.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatefulImpl.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatefulImpl.java Sat Jul 21 00:37:22 2007
@@ -48,61 +48,64 @@
     @ConversationID
     protected String conversationId;
     
-   // @Callback - not working yet
+    @Callback
     protected ConversationalCallback conversationalCallback; 
     
     // local count - accumulates during the conversation
     private int count = 0;
-    
-    // a member variable that records whether init processing happens
-    private static int initValue = 0;
-    
-    // lets us check the init value after class instances have gone
-    public static int getInitValue(){
-        return initValue;
-    }
-
+          
+    // a static member variable that records the number of times this service is called
+    public static StringBuffer calls = new StringBuffer();
+   
     @Init
     public void init(){
-        initValue = initValue - 5;
+        calls.append("init,");
     }
     
     @Destroy
     public void destroy(){
-        initValue = initValue + 10;
+        calls.append("destroy,");
     }
     
     public void initializeCount(int count){
+        calls.append("initializeCount,");       
         this.count = count;
     }
     
     public void incrementCount(){
+        calls.append("incrementCount,");        
         count++;
     }
     
     public int retrieveCount(){
+        calls.append("retrieveCount,"); 
         return count;
     }
     
     public void initializeCountCallback(int count){
-        initializeCount(count);
+        calls.append("initializeCountCallback,"); 
+        this.count = count;
         conversationalCallback.initializeCount(count);
     }
     
     public void incrementCountCallback(){
-        incrementCount();
+        calls.append("incrementCountCallback,"); 
+        count++;
         conversationalCallback.incrementCount();
     }
     
     public int retrieveCountCallback(){
+        calls.append("retrieveCountCallback,"); 
         return conversationalCallback.retrieveCount();
     }
     
     public void endConversation(){
+        calls.append("endConversation,"); 
         count = 0;
     }
     
     public void endConversationCallback(){
+        calls.append("endConversationCallback,"); 
         conversationalCallback.endConversation();
     }
 }

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessImpl.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessImpl.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessImpl.java Sat Jul 21 00:37:22 2007
@@ -50,65 +50,67 @@
     @ConversationID
     protected String conversationId;
     
-    // @Callback - not working yet
+    @Callback
     protected ConversationalCallback conversationalCallback; 
     
     // static area in which to hold conversational data
     private static HashMap<String, Integer> conversationalState = new HashMap<String, Integer>();
-
-
-    // a member variable that records whether init processing happens
-    private static int initValue = 0;
-    
-    // lets us check the init value after class instances have gone
-    public static int getInitValue(){
-        return initValue;
-    }
-
+   
+    // a static member variable that records the number of times this service is called
+    public static StringBuffer calls = new StringBuffer();
+   
     @Init
     public void init(){
-        initValue = initValue - 5;
+        calls.append("init,");
     }
     
     @Destroy
     public void destroy(){
-        initValue = initValue + 10;
+        calls.append("destroy,");
     }
     
     public void initializeCount(int count){
+        calls.append("initializeCount,");
         Integer conversationalCount = new Integer(count); 
         conversationalState.put(conversationId, conversationalCount);
     }
     
     public void incrementCount(){
+        calls.append("incrementCount,");
         Integer conversationalCount = conversationalState.get(conversationId);
         conversationalCount++;
         conversationalState.put(conversationId, conversationalCount);
     }
     
     public int retrieveCount(){
+        calls.append("retrieveCount,");
         return conversationalState.get(conversationId).intValue();
     }
     
     public void initializeCountCallback(int count){
+        calls.append("initializeCountCallback,");
         initializeCount(count);
         conversationalCallback.initializeCount(count);
     }
     
     public void incrementCountCallback(){
+        calls.append("incrementCountCallback,");
         incrementCount();
         conversationalCallback.incrementCount();
     }
     
     public int retrieveCountCallback(){
+        calls.append("retrieveCountCallback,");
         return conversationalCallback.retrieveCount();
     }
     
     public void endConversation(){
+        calls.append("endConversation,");
         conversationalState.remove(conversationId);
     }
     
     public void endConversationCallback(){
+        calls.append("endConversationCallback,");       
         conversationalCallback.endConversation();
     }   
 }

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/resources/conversational.composite
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/resources/conversational.composite?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/resources/conversational.composite (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/resources/conversational.composite Sat Jul 21 00:37:22 2007
@@ -31,7 +31,19 @@
         <implementation.java class="org.apache.tuscany.sca.itest.conversational.impl.ConversationalClientStatelessImpl"/>
         <!--reference name="conversationalReferenceClient" target="ConversationalReferenceClient"/-->       
         <reference name="conversationalService" target="ConversationalServiceStateful"/>
-    </component>      
+    </component>     
+    
+    <component name="ConversationalStatefulClientStatelessService">
+        <implementation.java class="org.apache.tuscany.sca.itest.conversational.impl.ConversationalClientStatefulImpl"/>
+        <!--reference name="conversationalReferenceClient" target="ConversationalReferenceClient"/-->       
+        <reference name="conversationalService" target="ConversationalServiceStatelessSL"/>
+    </component>   
+    
+    <component name="ConversationalStatefulClientStatefulService">
+        <implementation.java class="org.apache.tuscany.sca.itest.conversational.impl.ConversationalClientStatefulImpl"/>
+        <!--reference name="conversationalReferenceClient" target="ConversationalReferenceClient"/-->       
+        <reference name="conversationalService" target="ConversationalServiceStateful"/>
+    </component>   
     
     <!--component name="ConversationalReferenceClient">
         <implementation.java class="org.apache.tuscany.sca.test.AnotherServiceImpl"/>

Modified: incubator/tuscany/java/sca/itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ConversationalTest.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ConversationalTest.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ConversationalTest.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ConversationalTest.java Sat Jul 21 00:37:22 2007
@@ -22,7 +22,10 @@
 import junit.framework.Assert;
 
 import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.itest.conversational.impl.ConversationalClientStatefulImpl;
+import org.apache.tuscany.sca.itest.conversational.impl.ConversationalClientStatelessImpl;
 import org.apache.tuscany.sca.itest.conversational.impl.ConversationalServiceStatefulImpl;
+import org.apache.tuscany.sca.itest.conversational.impl.ConversationalServiceStatelessImpl;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -32,6 +35,8 @@
     private SCADomain domain;
     private ConversationalClient conversationalStatelessClientStatelessService;
     private ConversationalClient conversationalStatelessClientStatefulService;
+    private ConversationalClient conversationalStatefulClientStatelessService;
+    private ConversationalClient conversationalStatefulClientStatefulService;    
 
     @Before
     public void setUp() throws Exception {
@@ -43,62 +48,151 @@
         conversationalStatelessClientStatefulService  = domain.getService(ConversationalClient.class,
                                                                           "ConversationalStatelessClientStatefulService");
 
+        conversationalStatefulClientStatelessService  = domain.getService(ConversationalClient.class,
+                                                                          "ConversationalStatefulClientStatelessService");
+
+        conversationalStatefulClientStatefulService   = domain.getService(ConversationalClient.class,
+                                                                          "ConversationalStatefulClientStatefulService");
+
+
+        // reset the place where we record the sequence of calls passing
+        // through each component instance
+        ConversationalServiceStatelessImpl.calls = new StringBuffer();
+        ConversationalServiceStatefulImpl.calls  = new StringBuffer();
+        ConversationalClientStatelessImpl.calls  = new StringBuffer();         
+        ConversationalClientStatefulImpl.calls   = new StringBuffer();
+               
     }
 
     @After
     public void tearDown() throws Exception {
         domain.close();
     }
-   
-    // Stateful service tests
+  
+    // stateless client stateful service tests
+    // =======================================
     @Test
-    public void testStatefulConversationFromInjectedReference() {
+    public void testStatelessStatefulConversationFromInjectedReference() {
         int count = conversationalStatelessClientStatefulService.runConversationFromInjectedReference();
         Assert.assertEquals(2, count);
     } 
     
     @Test
-    public void testStatefulConversationFromServiceReference() {
+    public void testStatelessStatefulConversationFromServiceReference() {
         int count = conversationalStatelessClientStatefulService.runConversationFromServiceReference();
         Assert.assertEquals(2, count);
     }          
     
     @Test
-    public void testStatefulConversationWithUserDefinedConversationId() {
+    public void testStatelessStatefulConversationWithUserDefinedConversationId() {
         int count = conversationalStatelessClientStatefulService.runConversationWithUserDefinedConversationId();
         Assert.assertEquals(2, count);
     }    
     
     @Test
-    public void testStatefulConversationCheckingScope() {
+    public void testStatelessStatefulConversationCheckingScope() {
         int count = conversationalStatelessClientStatefulService.runConversationCheckingScope();
-        int initCount = ConversationalServiceStatefulImpl.getInitValue();
-        Assert.assertEquals(5, initCount);
-    }    
+        Assert.assertEquals("init,initializeCount,incrementCount,retrieveCount,endConversation,destroy,", 
+                            ConversationalServiceStatefulImpl.calls.toString());
+    }  
+    
+    @Test
+    public void testStatelessStatefulConversationWithCallback() {
+        int count = conversationalStatelessClientStatefulService.runConversationWithCallback();
+        Assert.assertEquals(0, count);
+               
+        Assert.assertEquals("init,runConversationWithCallback,init,initializeCount,destroy,init,incrementCount,destroy,init,retrieveCount,destroy,init,endConversation,destroy,destroy,", 
+                            ConversationalClientStatelessImpl.calls.toString());        
+    }         
     
-    // Stateless service tests
+    // stateless client stateless service tests
+    // ========================================
     @Test
-    public void testStatelessConversationFromInjectedReference() {
+    public void testStatelessStatelessConversationFromInjectedReference() {
         int count = conversationalStatelessClientStatelessService.runConversationFromInjectedReference();
         Assert.assertEquals(2, count);
     } 
     
     @Test
-    public void testStatelessConversationFromServiceReference() {
+    public void testStatelessStatelessConversationFromServiceReference() {
         int count = conversationalStatelessClientStatelessService.runConversationFromServiceReference();
         Assert.assertEquals(2, count);
     }    
     
     @Test
-    public void testStatelessConversationWithUserDefinedConversationId() {
+    public void testStatelessStatelessConversationWithUserDefinedConversationId() {
         int count = conversationalStatelessClientStatelessService.runConversationWithUserDefinedConversationId();
         Assert.assertEquals(2, count);
     }    
     
     @Test
-    public void testStatelessConversationCheckingScope() {
+    public void testStatelessStatelessConversationCheckingScope() {
         int count = conversationalStatelessClientStatelessService.runConversationCheckingScope();
-        int initCount = ConversationalServiceStatefulImpl.getInitValue();
-        Assert.assertEquals(15, initCount);
+        Assert.assertEquals("init,initializeCount,destroy,init,incrementCount,destroy,init,retrieveCount,destroy,init,endConversation,destroy,", 
+                            ConversationalServiceStatelessImpl.calls.toString());
+    }       
+
+    // stateful client stateful service tests  
+    // ======================================
+    @Test
+    public void testStatefulStatefulConversationFromInjectedReference() {
+        int count = conversationalStatefulClientStatefulService.runConversationFromInjectedReference();
+        Assert.assertEquals(2, count);
+    } 
+    
+    @Test
+    public void testStatefulStatefulConversationFromServiceReference() {
+        int count = conversationalStatefulClientStatefulService.runConversationFromServiceReference();
+        Assert.assertEquals(2, count);
+    }          
+    
+    @Test
+    public void testStatefulStatefulConversationWithUserDefinedConversationId() {
+        int count = conversationalStatefulClientStatefulService.runConversationWithUserDefinedConversationId();
+        Assert.assertEquals(2, count);
+    }    
+    
+    @Test
+    public void testStatefulStatefulConversationCheckingScope() {
+        int count = conversationalStatefulClientStatefulService.runConversationCheckingScope();
+        Assert.assertEquals("init,initializeCount,incrementCount,retrieveCount,endConversation,destroy,", 
+                            ConversationalServiceStatefulImpl.calls.toString());
+    }  
+
+    @Test
+    public void testStatefulStatefulConversationWithCallback() {
+        int count = conversationalStatefulClientStatefulService.runConversationWithCallback();
+        Assert.assertEquals(4, count);
+               
+        Assert.assertEquals("init,runConversationWithCallback,initializeCount,incrementCount,retrieveCount,endConversation,destroy,", 
+                            ConversationalClientStatefulImpl.calls.toString());        
+    }      
+    
+    // stateful client stateless service tests  
+    // =======================================
+    @Test
+    public void testStatefulStatelessConversationFromInjectedReference() {
+        int count = conversationalStatefulClientStatelessService.runConversationFromInjectedReference();
+        Assert.assertEquals(2, count);
+    } 
+    
+    @Test
+    public void testStatefulStatelessConversationFromServiceReference() {
+        int count = conversationalStatefulClientStatelessService.runConversationFromServiceReference();
+        Assert.assertEquals(2, count);
+    }    
+    
+    @Test
+    public void testStatefulStatelessConversationWithUserDefinedConversationId() {
+        int count = conversationalStatefulClientStatelessService.runConversationWithUserDefinedConversationId();
+        Assert.assertEquals(2, count);
+    }    
+    
+    @Test
+    public void testStatefulStatelessConversationCheckingScope() {
+        int count = conversationalStatefulClientStatelessService.runConversationCheckingScope();
+        Assert.assertEquals("init,initializeCount,destroy,init,incrementCount,destroy,init,retrieveCount,destroy,init,endConversation,destroy,", 
+                            ConversationalServiceStatelessImpl.calls.toString());
     }       
+        
 }

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/AbstractInvocationHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/AbstractInvocationHandler.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/AbstractInvocationHandler.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/AbstractInvocationHandler.java Sat Jul 21 00:37:22 2007
@@ -56,25 +56,51 @@
     protected Object invoke(InvocationChain chain, Object[] args, RuntimeWire wire) throws Throwable {
 
         Message msgContext = ThreadMessageContext.getMessageContext();
+        Object  msgContextConversationId = msgContext.getConversationID();
+        
         Message msg = messageFactory.createMessage();
                
+        // make sure that the conversation id is set so it can be put in the 
+        // outgoing messages. The id can come from one of three places
+        // 1 - Generated here (if the source is stateless)
+        // 2 - Specified by the application (through a service reference)
+        // 3 - from the message context (if the source is stateful)
+        //
+        // TODO - number 3 seems a little shaky as we end up propogating
+        //        a conversationId through the source component. If we don't
+        //        do this though we can't correlate the callback call with the
+        //        current target instance. Currently specifying an application
+        //        conversationId in this case also means that the callback
+        //        can't be correlated with the source component instance 
         if (conversational) {
             if (conversation == null){
-                // the conversation info is not being shared 
-                // with a service reference object so create a
-                // new one here
+                // this is a callback so create a conversation to 
+                // hold onto the conversation state for the lifetime of the
+                // stateful callback
                 conversation = new ConversationImpl();
             }
             Object conversationId = conversation.getConversationID();
             
-            // create automatic conversation id if one doesn't exist 
+            // create a conversation id if one doesn't exist 
             // already. This could be because we are in the middle of a
             // conversation or the conversation hasn't started but the
             if ((conversationStarted == false) && (conversationId == null)) {
-                conversationId = createConversationID();
+                
+                // It the current component is already in a conversation
+                // the use this just in case this message has a stateful 
+                // callback. In which case the callback will come back
+                // to the correct instance. 
+                // TODO - need a better mechanism for identifyng the 
+                //        stateful callback case
+                if (msgContextConversationId == null) {
+                    conversationId = createConversationID();
+                } else {
+                    conversationId = msgContextConversationId;
+                }
+
                 conversation.setConversationID(conversationId);
             }
-            //TODO - assuming that the conversation ID is a strin here when
+            //TODO - assuming that the conversation ID is a string here when
             //       it can be any object that is serializable to XML
             msg.setConversationID((String)conversationId);
         }

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/scope/ConversationalScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/scope/ConversationalScopeContainer.java?view=diff&rev=558264&r1=558263&r2=558264
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/scope/ConversationalScopeContainer.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/scope/ConversationalScopeContainer.java Sat Jul 21 00:37:22 2007
@@ -27,11 +27,14 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.tuscany.sca.core.invocation.ThreadMessageContext;
+import org.apache.tuscany.sca.invocation.Message;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
 import org.apache.tuscany.sca.scope.InstanceWrapper;
 import org.apache.tuscany.sca.scope.PersistenceException;
 import org.apache.tuscany.sca.scope.Scope;
 import org.apache.tuscany.sca.scope.ScopedImplementationProvider;
+import org.apache.tuscany.sca.scope.TargetDestructionException;
 import org.apache.tuscany.sca.scope.TargetResolutionException;
 import org.apache.tuscany.sca.store.Store;
 import org.osoa.sca.ConversationEndedException;
@@ -127,14 +130,30 @@
 
     protected InstanceWrapper getInstanceWrapper(boolean create,Object contextId) throws TargetResolutionException {    
         
+        // we might get a null context if the target service has
+        // conversational scope but only its callback interface 
+        // is conversational. In this case we need to invent a 
+        // conversation Id here to store the service against
+        // and populate the thread context
+        if (contextId == null){
+            contextId = new String("1234");
+            Message msgContext = ThreadMessageContext.getMessageContext();
+            
+            if (msgContext != null){
+                msgContext.setConversationID(contextId.toString());
+            }
+            
+        }
+        
         InstanceLifeCycleWrapper anInstanceWrapper = this.instanceLifecycleCollection.get(contextId);
+        
         if (anInstanceWrapper == null && !create)
                 return null;
         
         if (anInstanceWrapper == null) 
         {
-         anInstanceWrapper = new InstanceLifeCycleWrapper(contextId);  
-         this.instanceLifecycleCollection.put(contextId, anInstanceWrapper);
+            anInstanceWrapper = new InstanceLifeCycleWrapper(contextId);  
+            this.instanceLifecycleCollection.put(contextId, anInstanceWrapper);
         }
         // If an existing intsance is found return it only if its not expired and update its 
         // last referenced time. 
@@ -161,11 +180,11 @@
     public void remove() throws PersistenceException {
     }
     
-    // The remove is invoked when a conversation is explcitly ended.  This can occur by using the @EndsConversation or API.  
+    // The remove is invoked when a conversation is explicitly ended.  This can occur by using the @EndsConversation or API.  
     // In this case the instance is immediately removed.  A new conversation will be started on the next operation
     // associated with this conversationId's service reference. 
     //
-    public void remove(Object contextId) {
+    public void remove(Object contextId) throws TargetDestructionException {
         if (this.instanceLifecycleCollection.containsKey(contextId)) 
         {
          InstanceLifeCycleWrapper anInstanceLifeCycleWrapper = this.instanceLifecycleCollection.get(contextId);
@@ -173,9 +192,10 @@
          anInstanceLifeCycleWrapper.removeInstanceWrapper();
         } 
     }  
+       
     
     /*
-     *  This ia an inner class that keeps track of the lifecycle of a conversation scoped
+     *  This is an inner class that keeps track of the lifecycle of a conversation scoped
      *  implementation instance.   
      * 
      */
@@ -223,12 +243,14 @@
           return ctx;
         }
         
-        private void removeInstanceWrapper()
+        private void removeInstanceWrapper() throws TargetDestructionException 
         {
+          InstanceWrapper ctx =  getInstanceWrapper();
+          ctx.stop();
           wrappers.remove(this.instanceId);       
         }
         
-        private void createInstance()throws TargetResolutionException 
+        private void createInstance() throws TargetResolutionException 
         {
             InstanceWrapper instanceWrapper = createInstanceWrapper();
             instanceWrapper.start();
@@ -261,8 +283,12 @@
             InstanceLifeCycleWrapper anInstanceLifeCycleWrapper = anEntry.getValue();
             if (anInstanceLifeCycleWrapper.isExpired())
             {
-              anInstanceLifeCycleWrapper.removeInstanceWrapper();
-              this.instanceLifecycleCollection.remove(anInstanceLifeCycleWrapper.instanceId);
+              try {
+                  anInstanceLifeCycleWrapper.removeInstanceWrapper();
+                  this.instanceLifecycleCollection.remove(anInstanceLifeCycleWrapper.instanceId);
+              } catch (Exception ex) {
+                  // TODO - what to do with any asynchronous exceptions?
+              }
             }
           }             
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org