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