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/20 13:52:36 UTC

svn commit: r557971 - in /incubator/tuscany/java/sca: itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ itest/conversations/src/test/java/org/apache/tuscany/sca/itest/conversational/ modules/core/src/main/java/org/apac...

Author: slaws
Date: Fri Jul 20 04:52:32 2007
New Revision: 557971

URL: http://svn.apache.org/viewvc?view=rev&rev=557971
Log:
TUSCANY-1377

Provide and implementation for the Conversation interface and allow is to be shared between a ServiceReference and the proxy that the service reference creates. In order to keep to a minimum the number of interface changes required there is some casting required at present. 

Added:
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ConversationImpl.java
Modified:
    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/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessScope.java
    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/component/CallableReferenceImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ServiceReferenceImpl.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/invocation/JDKProxyService.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ProxyFactory.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/WireObjectFactory.java

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=557971&r1=557970&r2=557971
==============================================================================
--- 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 Fri Jul 20 04:52:32 2007
@@ -73,11 +73,13 @@
 	    serviceReference.setConversationID("MyConversation");
 	    
 	    ConversationalService callableReference = serviceReference.getService();
-	    
+	        
 	    callableReference.initializeCount(1);
 	    callableReference.incrementCount();
-	    int count = callableReference.retrieveCount();
+	    clientCount = callableReference.retrieveCount();
 	    callableReference.endConversation();
+	    
+	    serviceReference.getConversation().end();
 	    
         return clientCount;
     }

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=557971&r1=557970&r2=557971
==============================================================================
--- 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 Fri Jul 20 04:52:32 2007
@@ -45,7 +45,7 @@
 public class ConversationalServiceStatefulImpl implements ConversationalService {
 
     @ConversationID
-    private String conversationId;
+    protected String conversationId;
     
    // @Callback - not working yet
     protected ConversationalCallback conversationalCallback; 

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=557971&r1=557970&r2=557971
==============================================================================
--- 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 Fri Jul 20 04:52:32 2007
@@ -48,13 +48,13 @@
 public class ConversationalServiceStatelessImpl implements ConversationalService {
     
     @ConversationID
-    String conversationId;
+    protected String conversationId;
     
     // @Callback - not working yet
     protected ConversationalCallback conversationalCallback; 
     
     // static area in which to hold conversational data
-    private HashMap<String, Integer> conversationalState = new HashMap<String, Integer>();
+    private static HashMap<String, Integer> conversationalState = new HashMap<String, Integer>();
 
 
     public void init(){
@@ -73,6 +73,7 @@
     public void incrementCount(){
         Integer conversationalCount = conversationalState.get(conversationId);
         conversationalCount++;
+        conversationalState.put(conversationId, conversationalCount);
     }
     
     public int retrieveCount(){

Modified: incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessScope.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessScope.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessScope.java (original)
+++ incubator/tuscany/java/sca/itest/conversations/src/main/java/org/apache/tuscany/sca/itest/conversational/impl/ConversationalServiceStatelessScope.java Fri Jul 20 04:52:32 2007
@@ -30,7 +30,7 @@
 public class ConversationalServiceStatelessScope implements ConversationalService {
 
     @ConversationID
-    String cid;
+    protected String cid;
 
     static Map<String, Integer> state = new HashMap<String, Integer>();
     

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=557971&r1=557970&r2=557971
==============================================================================
--- 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 Fri Jul 20 04:52:32 2007
@@ -56,7 +56,7 @@
         
         // need to check that initialization and destruction run correctly
     } 
-    
+   
     @Test
     public void testStatelessConversation() {
         int count = conversationalClientStateless.runConversationFromReference();

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/CallableReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/CallableReferenceImpl.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/CallableReferenceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/CallableReferenceImpl.java Fri Jul 20 04:52:32 2007
@@ -18,7 +18,10 @@
  */
 package org.apache.tuscany.sca.core.component;
 
+import org.apache.tuscany.sca.core.invocation.WireObjectFactory;
+import org.apache.tuscany.sca.core.runtime.RuntimeWireImpl;
 import org.apache.tuscany.sca.factory.ObjectFactory;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
 import org.osoa.sca.CallableReference;
 import org.osoa.sca.Conversation;
 
@@ -50,7 +53,10 @@
     }
 
     public Conversation getConversation() {
-        return null;
+        
+        Conversation conversation = ((WireObjectFactory<B>)factory).getConversation();
+                
+        return conversation;
     }
 
     public Object getCallbackID() {

Added: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ConversationImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ConversationImpl.java?view=auto&rev=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ConversationImpl.java (added)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ConversationImpl.java Fri Jul 20 04:52:32 2007
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.sca.core.component;
+
+import org.osoa.sca.Conversation;
+
+
+/**
+ * Default implementation of a Conversation.
+ *
+ * @version $Rev: 557524 $ $Date: 2007-07-19 09:46:56 +0100 (Thu, 19 Jul 2007) $
+ */
+public class ConversationImpl implements Conversation {
+    
+    private Object conversationId;
+
+    public Object getConversationID() {
+        return conversationId;
+    }
+
+    public void setConversationID(Object conversationId) {
+        this.conversationId = conversationId;
+    }
+    
+    public void end() {
+        conversationId = null;
+    }
+}

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ServiceReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ServiceReferenceImpl.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ServiceReferenceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/component/ServiceReferenceImpl.java Fri Jul 20 04:52:32 2007
@@ -20,6 +20,7 @@
 
 import org.apache.tuscany.sca.core.invocation.ThreadMessageContext;
 import org.apache.tuscany.sca.factory.ObjectFactory;
+import org.osoa.sca.Conversation;
 import org.osoa.sca.ServiceReference;
 
 /**
@@ -34,11 +35,23 @@
     }
 
     public Object getConversationID() {
-        return ThreadMessageContext.getMessageContext().getConversationID();
+        Conversation conversation = getConversation();
+        Object conversationId = null;
+        
+        if (conversation != null){
+            conversationId = getConversation().getConversationID();
+        }
+        return conversationId;
     }
 
     public void setConversationID(Object conversationId) throws IllegalStateException {
-        ThreadMessageContext.getMessageContext().setConversationID((String)conversationId);
+        Conversation conversation = getConversation();
+        
+        if (conversation != null){
+            ((ConversationImpl)getConversation()).setConversationID(conversationId);
+        } else {
+            throw new IllegalStateException("setConversationId called when service in not conversational");
+        }
     }
 
     public void setCallbackID(Object callbackID) {

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=557971&r1=557970&r2=557971
==============================================================================
--- 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 Fri Jul 20 04:52:32 2007
@@ -20,6 +20,8 @@
 
 import java.util.UUID;
 
+import org.apache.tuscany.sca.core.component.ConversationImpl;
+import org.apache.tuscany.sca.core.runtime.RuntimeWireImpl;
 import org.apache.tuscany.sca.interfacedef.ConversationSequence;
 import org.apache.tuscany.sca.interfacedef.Interface;
 import org.apache.tuscany.sca.interfacedef.Operation;
@@ -28,6 +30,7 @@
 import org.apache.tuscany.sca.invocation.Message;
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.osoa.sca.Conversation;
 
 /**
  * Base class for performing invocations on a wire. Subclasses are responsible for retrieving and supplying the
@@ -37,8 +40,8 @@
  */
 public abstract class AbstractInvocationHandler {
     protected boolean conversational;
+    protected ConversationImpl conversation;
     private boolean conversationStarted;
-    private String conversationId;
     private MessageFactory messageFactory;
 
     protected AbstractInvocationHandler(MessageFactory messageFactory, boolean conversational) {
@@ -46,15 +49,34 @@
         this.messageFactory = messageFactory;
     }
 
+    public void setConversation(Conversation conversation){
+        this.conversation = (ConversationImpl)conversation;
+    }
+    
     protected Object invoke(InvocationChain chain, Object[] args, RuntimeWire wire) throws Throwable {
 
         Message msgContext = ThreadMessageContext.getMessageContext();
         Message msg = messageFactory.createMessage();
+               
         if (conversational) {
-            if (conversationStarted == false) {
+            if (conversation == null){
+                // the conversation info is not being shared 
+                // with a service reference object so create a
+                // new one here
+                conversation = new ConversationImpl();
+            }
+            Object conversationId = conversation.getConversationID();
+            
+            // create automatic 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();
+                conversation.setConversationID(conversationId);
             }
-            msg.setConversationID(conversationId);
+            //TODO - assuming that the conversation ID is a strin here when
+            //       it can be any object that is serializable to XML
+            msg.setConversationID((String)conversationId);
         }
 
         Invoker headInvoker = chain.getHeadInvoker();
@@ -67,6 +89,9 @@
             if (sequence == ConversationSequence.CONVERSATION_END) {
                 msg.setConversationSequence(ConversationSequence.CONVERSATION_END);
                 conversationStarted = false;
+                if (conversation != null){
+                    conversation.setConversationID(null);
+                }
             } else if (sequence == ConversationSequence.CONVERSATION_CONTINUE) {
                 if (conversationStarted) {
                     msg.setConversationSequence(ConversationSequence.CONVERSATION_CONTINUE);

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKProxyService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKProxyService.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKProxyService.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKProxyService.java Fri Jul 20 04:52:32 2007
@@ -26,6 +26,7 @@
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.runtime.RuntimeWire;
 import org.osoa.sca.CallableReference;
+import org.osoa.sca.Conversation;
 
 /**
  * the default implementation of a wire service that uses JDK dynamic proxies
@@ -46,13 +47,22 @@
         this.messageFactory = messageFactory;
     }
 
+    /** 
+     * The original createProxy method assumes that the proxy doesn't want to 
+     * share conversation state so sets the conversaton object to null
+     */
     public <T> T createProxy(Class<T> interfaze, RuntimeWire wire) throws ProxyCreationException {
+        return createProxy(interfaze, wire, null);
+    }
+    
+    public <T> T createProxy(Class<T> interfaze, RuntimeWire wire, Conversation conversation) throws ProxyCreationException {
         assert interfaze != null;
         assert wire != null;
         JDKInvocationHandler handler = new JDKInvocationHandler(messageFactory, interfaze, wire);
+        handler.setConversation(conversation);
         ClassLoader cl = interfaze.getClassLoader();
         return interfaze.cast(Proxy.newProxyInstance(cl, new Class[] {interfaze}, handler));
-    }
+    }    
 
     public Object createCallbackProxy(Class<?> interfaze, List<RuntimeWire> wires) throws ProxyCreationException {
         ClassLoader cl = interfaze.getClassLoader();

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ProxyFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ProxyFactory.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ProxyFactory.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ProxyFactory.java Fri Jul 20 04:52:32 2007
@@ -22,6 +22,7 @@
 
 import org.apache.tuscany.sca.runtime.RuntimeWire;
 import org.osoa.sca.CallableReference;
+import org.osoa.sca.Conversation;
 
 /**
  * Creates proxies that implement Java interfaces and invocation handlers for fronting wires
@@ -39,6 +40,16 @@
      * @throws ProxyCreationException
      */
     <T> T createProxy(Class<T> interfaze, RuntimeWire wire) throws ProxyCreationException;
+
+    /**
+     * Creates a Java proxy for the given wire and accepts
+     * a conversation object to represent conversational state
+     *
+     * @param interfaze the interface the proxy implements
+     * @param wire      the wire to proxy @return the proxy
+     * @throws ProxyCreationException
+     */
+    <T> T createProxy(Class<T> interfaze, RuntimeWire wire, Conversation conversation) throws ProxyCreationException;
 
     /**
      * Creates a Java proxy for the service contract callback

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/WireObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/WireObjectFactory.java?view=diff&rev=557971&r1=557970&r2=557971
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/WireObjectFactory.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/WireObjectFactory.java Fri Jul 20 04:52:32 2007
@@ -18,9 +18,14 @@
  */
 package org.apache.tuscany.sca.core.invocation;
 
+import org.apache.tuscany.sca.core.component.ConversationImpl;
 import org.apache.tuscany.sca.factory.ObjectCreationException;
 import org.apache.tuscany.sca.factory.ObjectFactory;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.runtime.EndpointReference;
 import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.osoa.sca.Conversation;
 
 /**
  * Uses a wire to return an object instance
@@ -32,6 +37,9 @@
     private RuntimeWire wire;
     private ProxyFactory proxyService;
     private boolean optimizable;
+    
+    // if the wire targets a conversational service this holds the conversation state 
+    private Conversation conversation = null;    
 
     /**
      * Constructor.
@@ -46,10 +54,24 @@
         this.interfaze = interfaze;
         this.wire = wire;
         this.proxyService = proxyService;
+        
+        // look to see if the target is conversational and if so create 
+        // a conversation
+        EndpointReference wireTarget = wire.getTarget();
+        InterfaceContract contract = wireTarget.getInterfaceContract();
+        Interface contractInterface = contract.getInterface();
+       
+        if (contractInterface != null && contractInterface.isConversational()){
+            conversation = new ConversationImpl();          
+        }        
     }
 
     public T getInstance() throws ObjectCreationException {
-        return interfaze.cast(proxyService.createProxy(interfaze, wire));
+        return interfaze.cast(proxyService.createProxy(interfaze, wire, conversation));
+    }
+    
+    public Conversation getConversation() {
+        return conversation;
     }
 
 }



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