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