You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2007/01/16 18:40:09 UTC

svn commit: r496794 - in /incubator/tuscany/java/sca/kernel/core/src: main/java/org/apache/tuscany/core/builder/ test/java/org/apache/tuscany/core/builder/

Author: jmarino
Date: Tue Jan 16 09:40:08 2007
New Revision: 496794

URL: http://svn.apache.org/viewvc?view=rev&rev=496794
Log:
work for supporting synchronous forward invocations and non-blocking callback invocations

Added:
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java   (contents, props changed)
      - copied, changed from r496499, incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/CallbackConnectionTestCase.java
Removed:
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/CallbackConnectionTestCase.java
Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?view=diff&rev=496794&r1=496793&r2=496794
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Tue Jan 16 09:40:08 2007
@@ -193,7 +193,7 @@
 
             if (source instanceof ServiceBinding) {
                 // services are a special case: invoker must go on the inbound and outbound chains
-                if (target instanceof Component && (isOneWayOperation || operationHasCallback)) {
+                if (target instanceof Component && isOneWayOperation) {// || operationHasCallback)) {
                     // if the target is a component and the operation is non-blocking
                     connect(outboundChain, inboundChain, invoker, true);
                 } else {
@@ -203,7 +203,7 @@
                 InboundInvocationChain chain = binding.getInboundWire().getInvocationChains().get(operation);
                 chain.setTargetInvoker(invoker);
             } else {
-                if (target instanceof Component && (isOneWayOperation || operationHasCallback)) {
+                if (target instanceof Component && isOneWayOperation) {// || operationHasCallback)) {
                     // if the target is a component and the operation is non-blocking
                     connect(outboundChain, inboundChain, invoker, true);
                 } else {
@@ -240,7 +240,13 @@
                 } catch (TargetInvokerCreationException e) {
                     throw new WireConnectException("Error connecting source and target", sourceWire, targetWire, e);
                 }
-                connect(outboundChain, inboundChain, invoker, false);
+                boolean isOneWayOperation = targetOp.isNonBlocking();
+                if (target instanceof Component && isOneWayOperation) {// || operationHasCallback)) {
+                    // if the target is a component and the operation is non-blocking
+                    connect(outboundChain, inboundChain, invoker, true);
+                } else {
+                    connect(outboundChain, inboundChain, invoker, false);
+                }
             } else if (source instanceof ReferenceBinding) {
                 ReferenceBinding binding = (ReferenceBinding) source;
                 ServiceContract sourceContract = sourceWire.getServiceContract();

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java?view=auto&rev=496794
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java Tue Jan 16 09:40:08 2007
@@ -0,0 +1,172 @@
+/*
+ * 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.core.builder;
+
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tuscany.spi.QualifiedName;
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.services.work.NotificationListener;
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+import org.apache.tuscany.spi.wire.InboundInvocationChain;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.Interceptor;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.apache.tuscany.spi.wire.OutboundInvocationChain;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.WireService;
+
+import junit.framework.TestCase;
+import org.apache.tuscany.core.component.WorkContextImpl;
+import org.apache.tuscany.core.wire.InboundInvocationChainImpl;
+import org.apache.tuscany.core.wire.InboundWireImpl;
+import org.apache.tuscany.core.wire.OutboundInvocationChainImpl;
+import org.apache.tuscany.core.wire.OutboundWireImpl;
+import org.apache.tuscany.core.wire.jdk.JDKWireService;
+import org.easymock.EasyMock;
+
+/**
+ * Verifies connections with non-blocking forward and callback invocations
+ *
+ * @version $Rev$ $Date$
+ */
+public class NonBlockingForwardNonBlockingCallbackConnectionTestCase extends TestCase {
+    private Operation<Type> operation;
+    private Operation<Type> callbackOperation;
+    private ServiceContract<Type> contract;
+    private ConnectorImpl connector;
+
+    public void testNonBlockingForwardAndNonBlockingCallbackAtomicToAtomic() throws Exception {
+        AtomicComponent target = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(target.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(target.getName()).andReturn("target").anyTimes();
+        EasyMock.expect(target.createTargetInvoker(EasyMock.eq("service"),
+            EasyMock.isA(Operation.class),
+            EasyMock.isA(InboundWire.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(target);
+
+        InboundWire inboundWire = new InboundWireImpl();
+        inboundWire.setContainer(target);
+        inboundWire.setServiceContract(contract);
+        InboundInvocationChain inboundChain = new InboundInvocationChainImpl(operation);
+        inboundChain.addInterceptor(new NonBlockingForwardNonBlockingCallbackConnectionTestCase.MockInterceptor());
+        inboundWire.addInvocationChain(operation, inboundChain);
+
+        AtomicComponent source = createSource();
+        OutboundWire outboundWire = new OutboundWireImpl();
+        outboundWire.setContainer(source);
+        outboundWire.setServiceContract(contract);
+        outboundWire.setTargetName(new QualifiedName("target/service"));
+        OutboundInvocationChain outboundChain = new OutboundInvocationChainImpl(operation);
+        outboundWire.addInvocationChain(operation, outboundChain);
+
+        InboundInvocationChain callbackInboundChain = new InboundInvocationChainImpl(callbackOperation);
+        callbackInboundChain
+            .addInterceptor(new NonBlockingForwardNonBlockingCallbackConnectionTestCase.MockInterceptor());
+        Map<Operation<?>, InboundInvocationChain> chains = new HashMap<Operation<?>, InboundInvocationChain>();
+        chains.put(callbackOperation, callbackInboundChain);
+        outboundWire.addTargetCallbackInvocationChains(chains);
+
+        connector.connect(outboundWire, inboundWire, true);
+
+        // test the forward request
+        Message msg = new MessageImpl();
+        msg.setBody("foo");
+        Message ret = outboundChain.getHeadInterceptor().invoke(msg);
+        assertEquals(null, ret.getBody());
+
+        // test the callback
+        msg = new MessageImpl();
+        msg.setBody("callback");
+        Map<Operation<?>, OutboundInvocationChain> callbackChains =
+            inboundWire.getSourceCallbackInvocationChains("source");
+        OutboundInvocationChain callbackInvocationChain = callbackChains.get(callbackOperation);
+        ret = callbackInvocationChain.getHeadInterceptor().invoke(msg);
+        assertEquals(null, ret.getBody());
+
+        EasyMock.verify(source);
+        EasyMock.verify(target);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        WorkContext context = new WorkContextImpl();
+        WireService wireService = new JDKWireService(null, null);
+        WorkScheduler scheduler = new MockWorkScheduler();
+        connector = new ConnectorImpl(wireService, null, scheduler, context);
+        operation = new Operation<Type>("bar", null, null, null);
+        operation.setNonBlocking(true);
+        callbackOperation = new Operation<Type>("callback", null, null, null);
+        callbackOperation.setNonBlocking(true);
+        contract = new JavaServiceContract();
+        Map<String, Operation<Type>> ops = new HashMap<String, Operation<Type>>();
+        ops.put("callback", callbackOperation);
+        contract.setCallbackOperations(ops);
+    }
+
+    private AtomicComponent createSource() throws Exception {
+        AtomicComponent component = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(component.getName()).andReturn("source").atLeastOnce();
+        EasyMock.expect(component.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(component.createTargetInvoker(EasyMock.eq("callback"),
+            EasyMock.isA(Operation.class),
+            (InboundWire) EasyMock.isNull())).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(component);
+        return component;
+    }
+
+    private class MockInterceptor implements Interceptor {
+
+        public Message invoke(Message msg) {
+            return msg;
+        }
+
+        public void setNext(Interceptor next) {
+
+        }
+
+        public Interceptor getNext() {
+            return null;
+        }
+
+        public boolean isOptimizable() {
+            return false;
+        }
+    }
+
+    private class MockWorkScheduler implements WorkScheduler {
+
+        public <T extends Runnable> void scheduleWork(T work, NotificationListener<T> listener) {
+            throw new UnsupportedOperationException();
+        }
+
+        public <T extends Runnable> void scheduleWork(T work) {
+            work.run();
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardNonBlockingCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java?view=auto&rev=496794
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java Tue Jan 16 09:40:08 2007
@@ -0,0 +1,171 @@
+/*
+ * 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.core.builder;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.InboundInvocationChain;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.OutboundInvocationChain;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.apache.tuscany.spi.wire.WireService;
+import org.apache.tuscany.spi.wire.Interceptor;
+import org.apache.tuscany.spi.QualifiedName;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+import org.apache.tuscany.spi.services.work.NotificationListener;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+import org.apache.tuscany.core.wire.InboundWireImpl;
+import org.apache.tuscany.core.wire.InboundInvocationChainImpl;
+import org.apache.tuscany.core.wire.OutboundWireImpl;
+import org.apache.tuscany.core.wire.OutboundInvocationChainImpl;
+import org.apache.tuscany.core.wire.jdk.JDKWireService;
+import org.apache.tuscany.core.component.WorkContextImpl;
+
+/**
+ * Verifies connections with non-blocking forward and synchronous callback invocations
+ *
+ * @version $Rev$ $Date$
+ */
+public class NonBlockingForwardSyncCallbackConnectionTestCase extends TestCase {
+    private Operation<Type> operation;
+    private Operation<Type> callbackOperation;
+    private ServiceContract<Type> contract;
+    private ConnectorImpl connector;
+
+    public void testNonBlockingForwardAndSyncCallbackAtomicToAtomic() throws Exception {
+        AtomicComponent target = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(target.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(target.getName()).andReturn("target").anyTimes();
+        EasyMock.expect(target.createTargetInvoker(EasyMock.eq("service"),
+            EasyMock.isA(Operation.class),
+            EasyMock.isA(InboundWire.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(target);
+
+        InboundWire inboundWire = new InboundWireImpl();
+        inboundWire.setContainer(target);
+        inboundWire.setServiceContract(contract);
+        InboundInvocationChain inboundChain = new InboundInvocationChainImpl(operation);
+        inboundChain.addInterceptor(new NonBlockingForwardSyncCallbackConnectionTestCase.MockInterceptor());
+        inboundWire.addInvocationChain(operation, inboundChain);
+
+        AtomicComponent source = createSource();
+        OutboundWire outboundWire = new OutboundWireImpl();
+        outboundWire.setContainer(source);
+        outboundWire.setServiceContract(contract);
+        outboundWire.setTargetName(new QualifiedName("target/service"));
+        OutboundInvocationChain outboundChain = new OutboundInvocationChainImpl(operation);
+        outboundWire.addInvocationChain(operation, outboundChain);
+
+        InboundInvocationChain callbackInboundChain = new InboundInvocationChainImpl(callbackOperation);
+        callbackInboundChain.addInterceptor(new NonBlockingForwardSyncCallbackConnectionTestCase.MockInterceptor());
+        Map<Operation<?>, InboundInvocationChain> chains = new HashMap<Operation<?>, InboundInvocationChain>();
+        chains.put(callbackOperation, callbackInboundChain);
+        outboundWire.addTargetCallbackInvocationChains(chains);
+
+        connector.connect(outboundWire, inboundWire, true);
+
+        // test the forward request
+        Message msg = new MessageImpl();
+        msg.setBody("foo");
+        Message ret = outboundChain.getHeadInterceptor().invoke(msg);
+        assertEquals(null, ret.getBody());
+
+        // test the callback
+        msg = new MessageImpl();
+        msg.setBody("callback");
+        Map<Operation<?>, OutboundInvocationChain> callbackChains =
+            inboundWire.getSourceCallbackInvocationChains("source");
+        OutboundInvocationChain callbackInvocationChain = callbackChains.get(callbackOperation);
+        ret = callbackInvocationChain.getHeadInterceptor().invoke(msg);
+        assertEquals("callback", ret.getBody());
+
+        EasyMock.verify(source);
+        EasyMock.verify(target);
+    }
+
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        WorkContext context = new WorkContextImpl();
+        WireService wireService = new JDKWireService(null, null);
+        WorkScheduler scheduler = new NonBlockingForwardSyncCallbackConnectionTestCase.MockWorkScheduler();
+        connector = new ConnectorImpl(wireService, null, scheduler, context);
+        operation = new Operation<Type>("bar", null, null, null);
+        operation.setNonBlocking(true);
+        callbackOperation = new Operation<Type>("callback", null, null, null);
+        contract = new JavaServiceContract();
+        Map<String, Operation<Type>> ops = new HashMap<String, Operation<Type>>();
+        ops.put("callback", callbackOperation);
+        contract.setCallbackOperations(ops);
+    }
+
+    private AtomicComponent createSource() throws Exception {
+        AtomicComponent component = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(component.getName()).andReturn("source").atLeastOnce();
+        EasyMock.expect(component.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(component.createTargetInvoker(EasyMock.eq("callback"),
+            EasyMock.isA(Operation.class),
+            (InboundWire) EasyMock.isNull())).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(component);
+        return component;
+    }
+
+    private class MockInterceptor implements Interceptor {
+
+        public Message invoke(Message msg) {
+            return msg;
+        }
+
+        public void setNext(Interceptor next) {
+
+        }
+
+        public Interceptor getNext() {
+            return null;
+        }
+
+        public boolean isOptimizable() {
+            return false;
+        }
+    }
+
+    private class MockWorkScheduler implements WorkScheduler {
+
+        public <T extends Runnable> void scheduleWork(T work, NotificationListener<T> listener) {
+            throw new UnsupportedOperationException();
+        }
+
+        public <T extends Runnable> void scheduleWork(T work) {
+            work.run();
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/NonBlockingForwardSyncCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java (from r496499, incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/CallbackConnectionTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java?view=diff&rev=496794&p1=incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/CallbackConnectionTestCase.java&r1=496499&p2=incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java&r2=496794
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/CallbackConnectionTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java Tue Jan 16 09:40:08 2007
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.tuscany.spi.QualifiedName;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.ReferenceBinding;
 import org.apache.tuscany.spi.component.ServiceBinding;
@@ -31,110 +32,183 @@
 import org.apache.tuscany.spi.wire.InboundInvocationChain;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.Interceptor;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.apache.tuscany.spi.wire.OutboundInvocationChain;
 import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
 
 import junit.framework.TestCase;
+import org.apache.tuscany.core.wire.InboundInvocationChainImpl;
 import org.apache.tuscany.core.wire.InboundWireImpl;
+import org.apache.tuscany.core.wire.OutboundInvocationChainImpl;
 import org.apache.tuscany.core.wire.OutboundWireImpl;
 import org.apache.tuscany.core.wire.jdk.JDKWireService;
 import org.easymock.EasyMock;
 
 /**
+ * Verifies connections with synchronous forward and callback invocations
+ *
  * @version $Rev$ $Date$
  */
-public class CallbackConnectionTestCase extends TestCase {
+public class SynchronousForwardCallbackConnectionTestCase extends TestCase {
     private Operation<Type> operation;
+    private Operation<Type> callbackOperation;
     private ServiceContract<Type> contract;
     private ConnectorImpl connector;
 
-    public void testAtomicOutboundInboundCallbackConnect() throws Exception {
-        AtomicComponent component = EasyMock.createMock(AtomicComponent.class);
-        EasyMock.expect(component.isSystem()).andReturn(false).anyTimes();
-        EasyMock.expect(component.getName()).andReturn("source").atLeastOnce();
-        EasyMock.expect(component.createTargetInvoker(EasyMock.eq("bar"),
+    public void testSyncForwardAndCallbackAtomicToAtomic() throws Exception {
+        AtomicComponent target = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(target.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(target.getName()).andReturn("target").anyTimes();
+        EasyMock.expect(target.createTargetInvoker(EasyMock.eq("service"),
             EasyMock.isA(Operation.class),
-            (InboundWire) EasyMock.isNull())).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
-        EasyMock.replay(component);
+            EasyMock.isA(InboundWire.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(target);
 
         InboundWire inboundWire = new InboundWireImpl();
-        inboundWire.setContainer(component);
+        inboundWire.setContainer(target);
         inboundWire.setServiceContract(contract);
+        InboundInvocationChain inboundChain = new InboundInvocationChainImpl(operation);
+        inboundChain.addInterceptor(new MockInterceptor());
+        inboundWire.addInvocationChain(operation, inboundChain);
+
+        AtomicComponent source = createSource();
         OutboundWire outboundWire = new OutboundWireImpl();
-        outboundWire.setContainer(component);
+        outboundWire.setContainer(source);
         outboundWire.setServiceContract(contract);
+        outboundWire.setTargetName(new QualifiedName("target/service"));
+        OutboundInvocationChain outboundChain = new OutboundInvocationChainImpl(operation);
+        outboundWire.addInvocationChain(operation, outboundChain);
 
-        InboundInvocationChain inboundChain = EasyMock.createMock(InboundInvocationChain.class);
-        EasyMock.expect(inboundChain.getOperation()).andReturn(operation).anyTimes();
-        Interceptor interceptor = EasyMock.createNiceMock(Interceptor.class);
-        EasyMock.expect(inboundChain.getHeadInterceptor()).andReturn(interceptor);
-        EasyMock.replay(inboundChain);
+        InboundInvocationChain callbackInboundChain = new InboundInvocationChainImpl(callbackOperation);
+        callbackInboundChain.addInterceptor(new MockInterceptor());
         Map<Operation<?>, InboundInvocationChain> chains = new HashMap<Operation<?>, InboundInvocationChain>();
-        chains.put(operation, inboundChain);
+        chains.put(callbackOperation, callbackInboundChain);
         outboundWire.addTargetCallbackInvocationChains(chains);
 
         connector.connect(outboundWire, inboundWire, true);
-        EasyMock.verify(inboundChain);
-        EasyMock.verify(component);
+
+        // test the forward request
+        Message msg = new MessageImpl();
+        msg.setBody("foo");
+        Message ret = outboundChain.getHeadInterceptor().invoke(msg);
+        assertEquals("foo", ret.getBody());
+
+        // test the callback
+        msg = new MessageImpl();
+        msg.setBody("callback");
+        Map<Operation<?>, OutboundInvocationChain> callbackChains =
+            inboundWire.getSourceCallbackInvocationChains("source");
+        OutboundInvocationChain callbackInvocationChain = callbackChains.get(callbackOperation);
+        ret = callbackInvocationChain.getHeadInterceptor().invoke(msg);
+        assertEquals("callback", ret.getBody());
+
+        EasyMock.verify(source);
+        EasyMock.verify(target);
     }
 
-    public void testReferenceOutboundInboundCallbackConnect() throws Exception {
-        ReferenceBinding binding = EasyMock.createMock(ReferenceBinding.class);
-        EasyMock.expect(binding.isSystem()).andReturn(false).anyTimes();
-        EasyMock.expect(binding.getName()).andReturn("source").atLeastOnce();
-        EasyMock.expect(binding.createTargetInvoker(EasyMock.isA(ServiceContract.class),
+    public void testSyncForwardAndCallbackAtomicToReferenceBinding() throws Exception {
+        ReferenceBinding target = EasyMock.createMock(ReferenceBinding.class);
+        EasyMock.expect(target.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(target.createTargetInvoker(EasyMock.isA(ServiceContract.class),
             EasyMock.isA(Operation.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
-        EasyMock.replay(binding);
+        EasyMock.replay(target);
 
         InboundWire inboundWire = new InboundWireImpl();
-        inboundWire.setContainer(binding);
+        inboundWire.setContainer(target);
         inboundWire.setServiceContract(contract);
+        InboundInvocationChain inboundChain = new InboundInvocationChainImpl(operation);
+        inboundChain.addInterceptor(new MockInterceptor());
+        inboundWire.addInvocationChain(operation, inboundChain);
+
+        AtomicComponent source = createSource();
         OutboundWire outboundWire = new OutboundWireImpl();
-        outboundWire.setContainer(binding);
+        outboundWire.setContainer(source);
         outboundWire.setServiceContract(contract);
+        outboundWire.setTargetName(new QualifiedName("target/service"));
+        OutboundInvocationChain outboundChain = new OutboundInvocationChainImpl(operation);
+        outboundWire.addInvocationChain(operation, outboundChain);
 
-        InboundInvocationChain inboundChain = EasyMock.createMock(InboundInvocationChain.class);
-        EasyMock.expect(inboundChain.getOperation()).andReturn(operation).anyTimes();
-        Interceptor interceptor = EasyMock.createNiceMock(Interceptor.class);
-        EasyMock.expect(inboundChain.getHeadInterceptor()).andReturn(interceptor);
-        EasyMock.replay(inboundChain);
+        InboundInvocationChain callbackInboundChain = new InboundInvocationChainImpl(callbackOperation);
+        callbackInboundChain.addInterceptor(new MockInterceptor());
         Map<Operation<?>, InboundInvocationChain> chains = new HashMap<Operation<?>, InboundInvocationChain>();
-        chains.put(operation, inboundChain);
+        chains.put(callbackOperation, callbackInboundChain);
         outboundWire.addTargetCallbackInvocationChains(chains);
 
         connector.connect(outboundWire, inboundWire, true);
-        EasyMock.verify(inboundChain);
-        EasyMock.verify(binding);
+        // test the forward request
+        Message msg = new MessageImpl();
+        msg.setBody("foo");
+        Message ret = outboundChain.getHeadInterceptor().invoke(msg);
+        assertEquals("foo", ret.getBody());
+
+        // test the callback
+        msg = new MessageImpl();
+        msg.setBody("callback");
+        Map<Operation<?>, OutboundInvocationChain> callbackChains =
+            inboundWire.getSourceCallbackInvocationChains("source");
+        OutboundInvocationChain callbackInvocationChain = callbackChains.get(callbackOperation);
+        ret = callbackInvocationChain.getHeadInterceptor().invoke(msg);
+        assertEquals("callback", ret.getBody());
+
+        EasyMock.verify(target);
+        EasyMock.verify(source);
     }
 
-    public void testServiceOutboundInboundCallbackConnect() throws Exception {
-        ServiceBinding binding = EasyMock.createMock(ServiceBinding.class);
-        EasyMock.expect(binding.isSystem()).andReturn(false).anyTimes();
-        EasyMock.expect(binding.getName()).andReturn("source").atLeastOnce();
-        EasyMock.expect(binding.createTargetInvoker(EasyMock.isA(ServiceContract.class),
+    public void testSyncForwardAndCallbackReferenceBindingToServiceBinding() throws Exception {
+        ReferenceBinding source = EasyMock.createMock(ReferenceBinding.class);
+        EasyMock.expect(source.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(source.getName()).andReturn("source").atLeastOnce();
+        EasyMock.expect(source.createTargetInvoker(EasyMock.isA(ServiceContract.class),
+            EasyMock.isA(Operation.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(source);
+
+        ServiceBinding target = EasyMock.createMock(ServiceBinding.class);
+        EasyMock.expect(target.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(target.createTargetInvoker(EasyMock.isA(ServiceContract.class),
             EasyMock.isA(Operation.class))).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
-        EasyMock.replay(binding);
+        EasyMock.replay(target);
 
         InboundWire inboundWire = new InboundWireImpl();
-        inboundWire.setContainer(binding);
+        inboundWire.setContainer(target);
         inboundWire.setServiceContract(contract);
+        InboundInvocationChain inboundChain = new InboundInvocationChainImpl(operation);
+        inboundChain.addInterceptor(new MockInterceptor());
+        inboundWire.addInvocationChain(operation, inboundChain);
+
         OutboundWire outboundWire = new OutboundWireImpl();
-        outboundWire.setContainer(binding);
+        outboundWire.setContainer(source);
         outboundWire.setServiceContract(contract);
+        outboundWire.setTargetName(new QualifiedName("target/service"));
+        OutboundInvocationChain outboundChain = new OutboundInvocationChainImpl(operation);
+        outboundWire.addInvocationChain(operation, outboundChain);
 
-        InboundInvocationChain inboundChain = EasyMock.createMock(InboundInvocationChain.class);
-        EasyMock.expect(inboundChain.getOperation()).andReturn(operation).anyTimes();
-        Interceptor interceptor = EasyMock.createNiceMock(Interceptor.class);
-        EasyMock.expect(inboundChain.getHeadInterceptor()).andReturn(interceptor);
-        EasyMock.replay(inboundChain);
+        InboundInvocationChain callbackInboundChain = new InboundInvocationChainImpl(callbackOperation);
+        callbackInboundChain.addInterceptor(new MockInterceptor());
         Map<Operation<?>, InboundInvocationChain> chains = new HashMap<Operation<?>, InboundInvocationChain>();
-        chains.put(operation, inboundChain);
+        chains.put(callbackOperation, callbackInboundChain);
         outboundWire.addTargetCallbackInvocationChains(chains);
 
         connector.connect(outboundWire, inboundWire, true);
-        EasyMock.verify(inboundChain);
-        EasyMock.verify(binding);
+        // test the forward request
+        Message msg = new MessageImpl();
+        msg.setBody("foo");
+        Message ret = outboundChain.getHeadInterceptor().invoke(msg);
+        assertEquals("foo", ret.getBody());
+
+        // test the callback
+        msg = new MessageImpl();
+        msg.setBody("callback");
+        Map<Operation<?>, OutboundInvocationChain> callbackChains =
+            inboundWire.getSourceCallbackInvocationChains("source");
+        OutboundInvocationChain callbackInvocationChain = callbackChains.get(callbackOperation);
+        ret = callbackInvocationChain.getHeadInterceptor().invoke(msg);
+        assertEquals("callback", ret.getBody());
+
+        EasyMock.verify(source);
+        EasyMock.verify(target);
     }
 
     protected void setUp() throws Exception {
@@ -142,10 +216,41 @@
         WireService wireService = new JDKWireService(null, null);
         connector = new ConnectorImpl(wireService, null, null, null);
         operation = new Operation<Type>("bar", null, null, null);
+        callbackOperation = new Operation<Type>("callback", null, null, null);
         contract = new JavaServiceContract();
         Map<String, Operation<Type>> ops = new HashMap<String, Operation<Type>>();
-        ops.put("bar", operation);
+        ops.put("callback", callbackOperation);
         contract.setCallbackOperations(ops);
+    }
+
+    private AtomicComponent createSource() throws Exception {
+        AtomicComponent component = EasyMock.createMock(AtomicComponent.class);
+        EasyMock.expect(component.getName()).andReturn("source").atLeastOnce();
+        EasyMock.expect(component.isSystem()).andReturn(false).anyTimes();
+        EasyMock.expect(component.createTargetInvoker(EasyMock.eq("callback"),
+            EasyMock.isA(Operation.class),
+            (InboundWire) EasyMock.isNull())).andReturn(EasyMock.createNiceMock(TargetInvoker.class));
+        EasyMock.replay(component);
+        return component;
+    }
+
+    private class MockInterceptor implements Interceptor {
+
+        public Message invoke(Message msg) {
+            return msg;
+        }
+
+        public void setNext(Interceptor next) {
+
+        }
+
+        public Interceptor getNext() {
+            return null;
+        }
+
+        public boolean isOptimizable() {
+            return false;
+        }
     }
 
 }

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/SynchronousForwardCallbackConnectionTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



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