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 2006/09/09 07:05:11 UTC

svn commit: r441743 [1/2] - in /incubator/tuscany/java/sca: containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/ kernel/core/src/main/java/org/apache/tuscany/core/builder/ kernel/core/src/main/java/org/apache/tuscany/core/comp...

Author: jmarino
Date: Fri Sep  8 22:05:09 2006
New Revision: 441743

URL: http://svn.apache.org/viewvc?view=rev&rev=441743
Log:
[PATCH] commit patch by Ignacio for Tuscany-642

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java   (with props)
Modified:
    incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/AsyncGroovyInvoker.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ModuleScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeBindlessBuilder.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReference.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceTargetInvoker.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeService.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemReferenceImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemServiceImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/AbstractOutboundInvocationHandler.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java
    incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/composite.scdl
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/composite/CompositeBuilderTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDOutboundInvocationHandlerTestCase.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Reference.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Service.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ReferenceExtension.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ServiceExtension.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/MessageId.java
    incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/sca/composite.scdl
    incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/ArtifactFactory.java

Modified: incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/AsyncGroovyInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/AsyncGroovyInvoker.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/AsyncGroovyInvoker.java (original)
+++ incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/AsyncGroovyInvoker.java Fri Sep  8 22:05:09 2006
@@ -86,7 +86,8 @@
                 private Object currentMessageId = messageId;
 
                 public void run() {
-                    workContext.setCurrentMessageId(currentMessageId);
+                    workContext.setCurrentMessageId(null);
+                    workContext.setCurrentCorrelationId(currentMessageId);
                     CompositeContext oldContext = CurrentCompositeContext.getContext();
                     try {
                         BINDER.setContext(currentContext);

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=441743&r1=441742&r2=441743
==============================================================================
--- 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 Fri Sep  8 22:05:09 2006
@@ -22,12 +22,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.tuscany.core.wire.BridgingInterceptor;
-import org.apache.tuscany.core.wire.InvokerInterceptor;
-import org.apache.tuscany.core.wire.MessageChannelImpl;
-import org.apache.tuscany.core.wire.MessageDispatcher;
-import org.apache.tuscany.core.wire.OutboundAutowire;
-import org.apache.tuscany.core.wire.OutboundInvocationChainImpl;
+import org.osoa.sca.annotations.Constructor;
+
 import org.apache.tuscany.spi.QualifiedName;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.builder.BuilderConfigException;
@@ -51,7 +47,15 @@
 import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
-import org.osoa.sca.annotations.Constructor;
+
+import org.apache.tuscany.core.implementation.composite.CompositeReference;
+import org.apache.tuscany.core.implementation.composite.CompositeService;
+import org.apache.tuscany.core.wire.BridgingInterceptor;
+import org.apache.tuscany.core.wire.InvokerInterceptor;
+import org.apache.tuscany.core.wire.MessageChannelImpl;
+import org.apache.tuscany.core.wire.MessageDispatcher;
+import org.apache.tuscany.core.wire.OutboundAutowire;
+import org.apache.tuscany.core.wire.OutboundInvocationChainImpl;
 
 /**
  * The default connector implmentation
@@ -67,8 +71,8 @@
     }
 
     @Constructor({"wireService", "postProcessorRegistry"})
-    public ConnectorImpl(@Autowire WireService wireService, 
-            @Autowire WirePostProcessorRegistry postProcessorRegistry) {
+    public ConnectorImpl(@Autowire WireService wireService,
+                         @Autowire WirePostProcessorRegistry postProcessorRegistry) {
         this.postProcessorRegistry = postProcessorRegistry;
         this.wireService = wireService;
     }
@@ -111,6 +115,12 @@
                 chain.setTargetInvoker(invoker);
                 chain.prepare();
             }
+
+            // Now connect the Reference's outbound wire if it is a composite reference
+            if (source instanceof CompositeReference) {
+                CompositeReference compRef = (CompositeReference) source;
+                connect(compRef, compRef.getOutboundWire());
+            }
         } else if (source instanceof Service) {
             Service<T> service = (Service<T>) source;
             InboundWire<T> inboundWire = service.getInboundWire();
@@ -119,7 +129,16 @@
             connect(service, outboundWire);
             // services have inbound and outbound wires
             // NB: this connect must be done after the outbound service chain is connected to its target above
-            connect(inboundWire, outboundWire, true);
+            if (!(source instanceof CompositeService)) {
+                connect(inboundWire, outboundWire, true);
+            }
+            /*
+        } else {
+            BuilderConfigException e = new BuilderConfigException("Invalid source context type");
+            e.setIdentifier(source.getName());
+            e.addContextName(parent.getName());
+            throw e;
+            */
         }
     }
 
@@ -188,7 +207,6 @@
             if (target instanceof Component) {
                 Component component = (Component) target;
 
-                // FIXME should not relay on annotations
                 boolean isOneWayOperation = operation.isNonBlocking();
                 boolean operationHasCallback = contract.getCallbackName() != null;
                 if (isOneWayOperation && operationHasCallback) {
@@ -203,8 +221,12 @@
             } else if (target instanceof Reference) {
                 Reference reference = (Reference) target;
                 invoker = reference.createTargetInvoker(targetWire.getServiceContract(), inboundChain.getOperation());
+            } else if (target instanceof CompositeService) {
+                CompositeService compServ = (CompositeService) target;
+                invoker = compServ.createTargetInvoker(targetWire.getServiceContract(), inboundChain.getOperation());
             }
-            if (source instanceof Service) {
+
+            if (source instanceof Service && !(source instanceof CompositeService)) {
                 // services are a special case: invoker must go on the inbound chain
                 connect(outboundChain, inboundChain, null);
                 Service<?> service = (Service) source;
@@ -234,45 +256,20 @@
                 TargetInvoker invoker;
                 invoker = component.createTargetInvoker(null, operation);
                 connect(outboundChain, inboundChain, invoker);
-            } else if (target instanceof Service) {
-                throw new UnsupportedOperationException();
-            }
-        }
-
-        /*
-        // connect callback wires if they exist
-        for (OutboundInvocationChain outboundChain : sourceWire.getSourceCallbackInvocationChains().values()) {
-            // match wire chains
-            Map<Operation<?>, InboundInvocationChain> chains = sourceWire.getTargetCallbackInvocationChains();
-            InboundInvocationChain inboundChain = chains.get(outboundChain.getOperation());
-            if (inboundChain == null) {
-                BuilderConfigException e =
-                    new BuilderConfigException("Incompatible source and target interfaces for reference");
-                e.setIdentifier(sourceWire.getReferenceName());
-                throw e;
-            }
-            if (source instanceof Component) {
-                Component component = (Component) source;
-                Operation<?> operation = outboundChain.getOperation();
-                boolean isOneWayOperation = operation.isNonBlocking();
-                boolean operationHasCallback = contract.getCallbackName() != null;
-                if (isOneWayOperation && operationHasCallback) {
-                    throw new ComponentRuntimeException("Operation cannot be marked one-way and have a callback");
-                }
-                TargetInvoker invoker;
-                if (isOneWayOperation || operationHasCallback) {
-                    invoker = component.createAsyncTargetInvoker(operation);
-                } else {
-                    Operation<?> inboundOperation = inboundChain.getOperation();
-                    invoker = component.createTargetInvoker(null, inboundOperation);
-                }
+            } else if (source instanceof CompositeReference) {
+                CompositeReference compRef = (CompositeReference) source;
+                TargetInvoker invoker = compRef.createCallbackTargetInvoker(sourceWire.getServiceContract(), operation);
+                connect(outboundChain, inboundChain, invoker);
+            } else if (source instanceof CompositeService) {
+                CompositeService compServ = (CompositeService) source;
+                TargetInvoker invoker =
+                    compServ.createCallbackTargetInvoker(sourceWire.getServiceContract(), operation);
                 connect(outboundChain, inboundChain, invoker);
             } else if (target instanceof Service) {
                 throw new UnsupportedOperationException();
             }
         }
-        */
-    }
+   }
 
     public void connect(OutboundInvocationChain sourceChain,
                         InboundInvocationChain targetChain,
@@ -337,6 +334,13 @@
         assert sourceWire.getTargetName() != null : "Wire target name was null";
         QualifiedName targetName = sourceWire.getTargetName();
         CompositeComponent<?> parent = source.getParent();
+        assert parent != null : "Parent was null";
+        // For a composite reference only, since its outbound wire comes from its parent composite,
+        // the corresponding target would not lie in its parent but rather in its parent's parent
+        if (source instanceof CompositeReference) {
+            parent = parent.getParent();
+            assert parent != null : "Parent of parent was null";
+        }
         SCAObject<?> target = parent.getChild(targetName.getPartName());
         if (target == null) {
             String refName = sourceWire.getReferenceName();
@@ -363,10 +367,34 @@
             checkIfWireable(sourceWire, targetWire);
             boolean optimizable = isOptimizable(source.getScope(), target.getScope());
             connect(source, target, sourceWire, targetWire, optimizable);
+        } else if (target instanceof CompositeComponent) {
+            CompositeComponent composite = (CompositeComponent) target;
+            InboundWire<T> targetWire = null;
+            for (Object child : composite.getChildren()) {
+                if (child instanceof CompositeService) {
+                    CompositeService compServ = (CompositeService) child;
+                    targetWire = compServ.getInboundWire();
+                    assert targetWire != null;
+                    Class sourceInterface = sourceWire.getServiceContract().getInterfaceClass();
+                    Class targetInterface = targetWire.getServiceContract().getInterfaceClass();
+                    if (sourceInterface.isAssignableFrom(targetInterface)) {
+                        target = compServ;
+                        break;
+                    } else {
+                        targetWire = null;
+                    }
+                }
+            }
+            if (targetWire == null) {
+                throw new BuilderConfigException("No target composite service in composite");
+            }
+            boolean optimizable = isOptimizable(source.getScope(), target.getScope());
+            connect(source, target, sourceWire, targetWire, optimizable);
         } else {
             String name = sourceWire.getReferenceName();
             BuilderConfigException e = new BuilderConfigException("Invalid target type for reference " + name);
             e.setIdentifier(targetName.getQualifiedName());
+            throw e;
         }
     }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java Fri Sep  8 22:05:09 2006
@@ -34,6 +34,7 @@
 
     private static final Object REMOTE_CONTEXT = new Object();
     private static final Object MESSAGE_ID = new Object();
+    private static final Object CORRELATION_ID = new Object();
 
     // TODO implement propagation strategy for creating new threads
 
@@ -60,6 +61,23 @@
             workContext.set(map);
         }
         map.put(MESSAGE_ID, messageId);
+    }
+
+    public Object getCurrentCorrelationId() {
+        Map<Object, Object> map = workContext.get();
+        if (map == null) {
+            return null;
+        }
+        return map.get(CORRELATION_ID);
+    }
+
+    public void setCurrentCorrelationId(Object correlationId) {
+        Map<Object, Object> map = workContext.get();
+        if (map == null) {
+            map = new HashMap<Object, Object>();
+            workContext.set(map);
+        }
+        map.put(CORRELATION_ID, correlationId);
     }
 
     public CompositeComponent getRemoteComponent() {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ModuleScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ModuleScopeContainer.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ModuleScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ModuleScopeContainer.java Fri Sep  8 22:05:09 2006
@@ -26,8 +26,6 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.tuscany.core.component.event.CompositeStart;
-import org.apache.tuscany.core.component.event.CompositeStop;
 import org.apache.tuscany.spi.AbstractLifecycle;
 import org.apache.tuscany.spi.CoreRuntimeException;
 import org.apache.tuscany.spi.component.AtomicComponent;
@@ -36,14 +34,18 @@
 import org.apache.tuscany.spi.event.Event;
 import org.apache.tuscany.spi.model.Scope;
 
+import org.apache.tuscany.core.component.event.CompositeStart;
+import org.apache.tuscany.core.component.event.CompositeStop;
+
 /**
  * A scope context which manages atomic component instances keyed by module
- * 
+ *
  * @version $Rev$ $Date$
  */
 public class ModuleScopeContainer extends AbstractScopeContainer {
 
     private static final InstanceWrapper EMPTY = new EmptyWrapper();
+    private static final ComponentInitComparator COMPARATOR = new ComponentInitComparator();
 
     private final Map<AtomicComponent, InstanceWrapper> instanceWrappers;
 
@@ -127,27 +129,10 @@
         return ctx;
     }
 
-    private static class ComponentInitComparator implements Comparator<AtomicComponent> {
-        final static ComponentInitComparator INSTANCE = new ComponentInitComparator();
-
-        public int compare(AtomicComponent o1, AtomicComponent o2) {
-            if (o1.getInitLevel() > o2.getInitLevel()) {
-                return -1; // The lower level starts first (except nagative)
-            } else if (o1.getInitLevel() < o2.getInitLevel()) {
-                return 1;
-            } else {
-                return 0;
-            }
-        }
-
-    }
-
     private void eagerInitComponents() throws CoreRuntimeException {
-
         List<AtomicComponent> componentList = new ArrayList<AtomicComponent>(instanceWrappers.keySet());
-        Collections.sort(componentList, ComponentInitComparator.INSTANCE);
-
-        // start each group
+        Collections.sort(componentList, COMPARATOR);
+       // start each group
         for (AtomicComponent component : componentList) {
             if (component.getInitLevel() <= 0) {
                 // Don't eagerly init
@@ -160,6 +145,18 @@
                 ctx.start();
                 instanceWrappers.put(component, ctx);
                 destroyQueue.add(ctx);
+            }
+        }
+    }
+
+    static private class ComponentInitComparator implements Comparator<AtomicComponent> {
+        public int compare(AtomicComponent o1, AtomicComponent o2) {
+            if (o1.getInitLevel() > o2.getInitLevel()) {
+                return -1; // The lower level starts first (except nagative)
+            } else if (o1.getInitLevel() < o2.getInitLevel()) {
+                return 1;
+            } else {
+                return 0;
             }
         }
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImpl.java Fri Sep  8 22:05:09 2006
@@ -131,7 +131,8 @@
             }
 
             String dataBinding = "java.lang.Object";
-            DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>("java:parameters", Object[].class, paramDataTypes);
+            DataType<List<DataType<Type>>> inputType =
+                new DataType<List<DataType<Type>>>("java:parameters", Object[].class, paramDataTypes);
             Operation<Type> operation =
                 new Operation<Type>(name, inputType, returnDataType, faultDataTypes, nonBlocking, dataBinding);
             operations.put(name, operation);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java Fri Sep  8 22:05:09 2006
@@ -36,6 +36,7 @@
 import org.apache.tuscany.spi.component.SCAObject;
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.Service;
+import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.event.Event;
 import org.apache.tuscany.spi.extension.CompositeComponentExtension;
 import org.apache.tuscany.spi.model.Operation;
@@ -244,6 +245,14 @@
             connector.connect(child);
             child.prepare();
         }
+    }
+    
+    public T getServiceInstance() throws TargetException {
+        Service<T> service = services.get(0);
+        if (service == null) {
+            throw new TargetException("Component has no services");
+        }
+        return (T)service.getServiceInstance();
     }
 
     protected void registerAutowireExternal(Class<?> interfaze, SystemService context) {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeBindlessBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeBindlessBuilder.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeBindlessBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeBindlessBuilder.java Fri Sep  8 22:05:09 2006
@@ -21,6 +21,7 @@
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.Reference;
 import org.apache.tuscany.spi.component.Service;
+import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.model.BindlessServiceDefinition;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
@@ -33,6 +34,7 @@
 
     protected BuilderRegistry builderRegistry;
     protected WireService wireService;
+    protected WorkContext workContext;
 
     @Autowire
     public void setBuilderRegistry(BuilderRegistry registry) {
@@ -44,6 +46,11 @@
         this.wireService = wireService;
     }
 
+    @Autowire
+    public void setWorkContext(WorkContext workContext) {
+        this.workContext = workContext;
+    }
+
     @Init(eager = true)
     public void init() {
         builderRegistry.register(this);
@@ -55,12 +62,17 @@
         return new CompositeService(definition.getName(),
             definition.getServiceContract().getInterfaceClass(),
             parent,
-            wireService);
+            wireService,
+            workContext);
     }
 
     public Reference<?> build(CompositeComponent parent,
                            ReferenceDefinition definition,
                            DeploymentContext deploymentContext) {
-        return new CompositeReference(definition.getName(), parent, wireService, definition.getServiceContract());
+        return new CompositeReference(definition.getName(),
+                parent,
+                wireService,
+                definition.getServiceContract(),
+                workContext);
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReference.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReference.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReference.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReference.java Fri Sep  8 22:05:09 2006
@@ -18,6 +18,7 @@
 import java.lang.reflect.Method;
 
 import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.extension.ReferenceExtension;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.ServiceContract;
@@ -29,16 +30,25 @@
 
 public class CompositeReference<T> extends ReferenceExtension<T> {
 
+    private WorkContext workContext;
+
     public CompositeReference(String name,
                               CompositeComponent<?> parent,
                               WireService wireService,
-                              ServiceContract contract) {
+                              ServiceContract contract,
+                              WorkContext workContext) {
         super(name, (Class<T>) contract.getInterfaceClass(), parent, wireService);
+        this.workContext = workContext;
     }
 
     public TargetInvoker createTargetInvoker(ServiceContract contract, Operation operation) {
         WireObjectFactory wireFactory = new WireObjectFactory(outboundWire, wireService);
         Method method = JavaIDLUtils.findMethod(operation, contract.getInterfaceClass().getMethods());
-        return new CompositeReferenceTargetInvoker(method, wireFactory);
+        return new CompositeReferenceTargetInvoker(method, inboundWire, wireFactory, workContext);
+    }
+    
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        Method method = JavaIDLUtils.findMethod(operation, contract.getCallbackClass().getMethods());
+        return new CompositeReferenceCallbackTargetInvoker(method, contract, inboundWire, wireService, workContext);
     }
 }

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java?view=auto&rev=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java Fri Sep  8 22:05:09 2006
@@ -0,0 +1,96 @@
+/**
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.implementation.composite;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.tuscany.core.wire.PojoTargetInvoker;
+import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.WireService;
+
+public class CompositeReferenceCallbackTargetInvoker extends PojoTargetInvoker {
+
+    private ServiceContract<?> contract;
+    private InboundWire inboundWire;
+    private WireService wireService;
+    private WorkContext workContext;
+
+    
+    public CompositeReferenceCallbackTargetInvoker(Method operation,
+            ServiceContract contract,
+            InboundWire inboundWire,
+            WireService wireService,
+            WorkContext workContext) {
+        super(operation);
+        this.contract = contract;
+        this.inboundWire = inboundWire;
+        this.wireService = wireService;
+        this.workContext = workContext;
+    }
+
+    public CompositeReferenceCallbackTargetInvoker clone() throws CloneNotSupportedException {
+        CompositeReferenceCallbackTargetInvoker invoker = (CompositeReferenceCallbackTargetInvoker) super.clone();
+        invoker.contract = this.contract;
+        invoker.inboundWire = this.inboundWire;
+        invoker.wireService = this.wireService;
+        invoker.workContext = this.workContext;
+        return invoker;
+    }
+
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        try {
+            workContext.setCurrentMessageId(msg.getMessageId());
+            workContext.setCurrentCorrelationId(msg.getCorrelationId());
+            Object resp = invokeTarget(msg.getBody());
+            msg.setBody(resp);
+        } catch (InvocationTargetException e) {
+            msg.setBody(e.getCause());
+        } catch (Throwable e) {
+            msg.setBody(e);
+        }
+        return msg;
+    }
+
+    /*
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        try {
+            workContext.setCurrentMessageId(msg.getMessageId());
+            workContext.setCurrentCorrelationId(msg.getCorrelationId());
+            Object resp = invokeTarget(msg.getBody());
+            return (Message) resp;
+        } catch (InvocationTargetException e) {
+            // FIXME need to log exceptions
+            e.printStackTrace();
+            return null;
+        } catch (Throwable e) {
+            // FIXME need to log exceptions
+            e.printStackTrace();
+            return null;
+        }
+    }
+    */
+
+    protected Object getInstance() throws TargetException {
+        Object instance = wireService.createCallbackProxy(contract, inboundWire);
+        return instance;
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceCallbackTargetInvoker.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceTargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceTargetInvoker.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceTargetInvoker.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeReferenceTargetInvoker.java Fri Sep  8 22:05:09 2006
@@ -15,25 +15,54 @@
  */
 package org.apache.tuscany.core.implementation.composite;
 
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 import org.apache.tuscany.core.injection.WireObjectFactory;
 import org.apache.tuscany.core.wire.PojoTargetInvoker;
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
 
 public class CompositeReferenceTargetInvoker extends PojoTargetInvoker {
 
+    private InboundWire wire;
     private WireObjectFactory wireFactory;
+    private WorkContext workContext;
+
     
-    public CompositeReferenceTargetInvoker(Method operation, WireObjectFactory wireFactory) {
+    public CompositeReferenceTargetInvoker(Method operation,
+            InboundWire wire,
+            WireObjectFactory wireFactory, WorkContext workContext) {
         super(operation);
+        this.wire = wire;
         this.wireFactory = wireFactory;
+        this.workContext = workContext;
     }
 
     public CompositeReferenceTargetInvoker clone() throws CloneNotSupportedException {
         CompositeReferenceTargetInvoker invoker = (CompositeReferenceTargetInvoker) super.clone();
+        invoker.wire = this.wire;
         invoker.wireFactory = this.wireFactory;
+        invoker.workContext = this.workContext;
         return invoker;
+    }
+
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        try {
+            wire.addMapping(msg.getMessageId(), msg.getFromAddress());
+            workContext.setCurrentMessageId(msg.getMessageId());
+            workContext.setCurrentCorrelationId(msg.getCorrelationId());
+            Object resp = invokeTarget(msg.getBody());
+            msg.setBody(resp);
+        } catch (InvocationTargetException e) {
+            msg.setBody(e.getCause());
+        } catch (Throwable e) {
+            msg.setBody(e);
+        }
+        return msg;
     }
 
     protected Object getInstance() throws TargetException {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeService.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeService.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeService.java Fri Sep  8 22:05:09 2006
@@ -18,17 +18,26 @@
 import org.apache.tuscany.core.injection.WireObjectFactory;
 import org.apache.tuscany.spi.CoreRuntimeException;
 import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.extension.ServiceExtension;
+import org.apache.tuscany.spi.idl.java.JavaIDLUtils;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
 
 public class CompositeService<T> extends ServiceExtension<T> {
+    
+    private WorkContext workContext;
 
     public CompositeService(String name,
                        Class<T> interfaze,
                        CompositeComponent parent,
-                       WireService wireService) throws CoreRuntimeException {
+                       WireService wireService,
+                       WorkContext workContext) throws CoreRuntimeException {
         super(name, interfaze, parent, wireService);
+        this.workContext = workContext;
     }
     
     /**
@@ -38,9 +47,22 @@
      * We just reuse CompositeReferenceTargetInvoker for now since it seems the target
      * invoker we need does the same thing, if this is confirmed we should give it
      * a common name
+     * FIXME !!! Notice that this method is not defined in the SPI !!!
      */
-    public TargetInvoker createTargetInvoker(Method operation) {
+    public TargetInvoker createTargetInvoker(ServiceContract contract, Operation operation) {
         WireObjectFactory wireFactory = new WireObjectFactory(outboundWire, wireService);
-        return new CompositeReferenceTargetInvoker(operation, wireFactory);
+        Method method = JavaIDLUtils.findMethod(operation, contract.getInterfaceClass().getMethods());
+        return new CompositeReferenceTargetInvoker(method, inboundWire, wireFactory, workContext);
+    }
+    
+    /**
+     */
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        Method method = JavaIDLUtils.findMethod(operation, contract.getCallbackClass().getMethods());
+        return new CompositeReferenceCallbackTargetInvoker(method, contract, inboundWire, wireService, workContext);
+    }
+    
+    public T getServiceInstance() throws TargetException {
+        return wireService.createProxy(outboundWire);
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java Fri Sep  8 22:05:09 2006
@@ -90,7 +90,8 @@
             workScheduler.scheduleWork(new Runnable() {
                 private Object currentMessageId = messageId;
                 public void run() {
-                    workContext.setCurrentMessageId(currentMessageId);
+                    workContext.setCurrentMessageId(null);
+                    workContext.setCurrentCorrelationId(currentMessageId);
                     CompositeContext oldContext = CurrentCompositeContext.getContext();
                     try {
                         BINDER.setContext(currentContext);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemReferenceImpl.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemReferenceImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemReferenceImpl.java Fri Sep  8 22:05:09 2006
@@ -93,6 +93,10 @@
         throw new UnsupportedOperationException();
     }
 
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        throw new UnsupportedOperationException();
+    }
+
     public TargetInvoker createAsyncTargetInvoker(OutboundWire wire, Operation operation) {
         throw new UnsupportedOperationException();
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemServiceImpl.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemServiceImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemServiceImpl.java Fri Sep  8 22:05:09 2006
@@ -22,9 +22,12 @@
 import org.apache.tuscany.spi.component.AbstractSCAObject;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceContract;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireInvocationHandler;
 
 import org.apache.tuscany.core.implementation.system.wire.SystemInboundWire;
@@ -80,4 +83,8 @@
         return inboundWire.getTargetService();
     }
 
+
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        throw new UnsupportedOperationException();
+    }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/AbstractOutboundInvocationHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/AbstractOutboundInvocationHandler.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/AbstractOutboundInvocationHandler.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/AbstractOutboundInvocationHandler.java Fri Sep  8 22:05:09 2006
@@ -54,9 +54,13 @@
             Message msg = new MessageImpl();
             msg.setTargetInvoker(invoker);
             msg.setFromAddress(getFromAddress());
-            if (msg.getMessageId() == null) {
-                msg.setMessageId(new MessageId());
+            Object messageId = getMessageId();
+            if (messageId == null) {
+                messageId = new MessageId();
             }
+            msg.setMessageId(messageId);
+            Object corrId = getCorrelationId();
+            msg.setCorrelationId(corrId);
             msg.setBody(args);
             // dispatch the wire down the chain and get the response
             if (chain.getTargetRequestChannel() != null) {
@@ -87,4 +91,8 @@
     }
 
     protected abstract Object getFromAddress();
+    
+    protected abstract Object getMessageId();
+    
+    protected abstract Object getCorrelationId();
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java Fri Sep  8 22:05:09 2006
@@ -45,6 +45,8 @@
 
     private WorkContext context;
     private InboundWire<?> inboundWire;
+    private Object messageId;
+    private Object correlationId;
 
     public JDKCallbackInvocationHandler(WorkContext context, InboundWire inboundWire) {
         this.context = context;
@@ -52,8 +54,10 @@
     }
 
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-        Object correlationId = context.getCurrentMessageId();
+        messageId = context.getCurrentMessageId();
         context.setCurrentMessageId(null);
+        correlationId = context.getCurrentCorrelationId();
+        context.setCurrentCorrelationId(null);
         Object targetAddress = inboundWire.retrieveMapping(correlationId);
         if (targetAddress == null) {
             throw new AssertionError("No from address associated with message id [" + correlationId + "]");
@@ -74,5 +78,13 @@
 
     protected Object getFromAddress() {
         return inboundWire.getContainerName();
+    }
+    
+    protected Object getMessageId() {
+        return messageId;
+    }
+    
+    protected Object getCorrelationId() {
+        return correlationId;
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java Fri Sep  8 22:05:09 2006
@@ -24,6 +24,7 @@
 import java.util.Map;
 
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
 import static org.apache.tuscany.spi.idl.java.JavaIDLUtils.findMethod;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.wire.OutboundInvocationChain;
@@ -50,9 +51,13 @@
      * is not cacheable, the master associated with the wire chains will be used.
      */
     private Map<Method, ChainHolder> chains;
+    private WorkContext context;
     private Object fromAddress;
+    private Object messageId;
+    private Object correlationId;
 
-    public JDKOutboundInvocationHandler(OutboundWire<?> wire) throws NoMethodForOperationException {
+    public JDKOutboundInvocationHandler(OutboundWire<?> wire, WorkContext context)
+        throws NoMethodForOperationException {
         Map<Operation<?>, OutboundInvocationChain> invocationChains = wire.getInvocationChains();
         this.chains = new HashMap<Method, ChainHolder>(invocationChains.size());
         this.fromAddress = wire.getContainerName();
@@ -66,6 +71,8 @@
             }
             this.chains.put(method, new ChainHolder(entry.getValue()));
         }
+
+        this.context = context;
     }
 
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
@@ -107,17 +114,31 @@
             assert chain != null;
             invoker = chain.getTargetInvoker();
         }
+
+        messageId = context.getCurrentMessageId();
+        context.setCurrentMessageId(null);
+        correlationId = context.getCurrentCorrelationId();
+        context.setCurrentCorrelationId(null);
+
         return invoke(chain, invoker, args);
     }
 
     public Object invoke(Method method, Object[] args) throws Throwable {
         return invoke(null, method, args);
     }
-    
+
     protected Object getFromAddress() {
         return fromAddress;
     }
 
+    protected Object getMessageId() {
+        return messageId;
+    }
+
+    protected Object getCorrelationId() {
+        return correlationId;
+    }
+
     /**
      * A holder used to associate an wire chain with a local copy of a target invoker that was previously cloned from
      * the chain master
@@ -132,9 +153,5 @@
         }
 
     }
-
-//    public int hashCode() {
-//        return chains.hashCode();
-//    }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java Fri Sep  8 22:05:09 2006
@@ -56,6 +56,8 @@
 import org.apache.tuscany.spi.wire.WireInvocationHandler;
 import org.apache.tuscany.spi.wire.WireService;
 
+import org.apache.tuscany.core.implementation.composite.CompositeReference;
+import org.apache.tuscany.core.implementation.composite.CompositeService;
 import org.apache.tuscany.core.wire.InboundInvocationChainImpl;
 import org.apache.tuscany.core.wire.InboundWireImpl;
 import org.apache.tuscany.core.wire.InvokerInterceptor;
@@ -114,7 +116,7 @@
             return (T) Proxy.newProxyInstance(cl, new Class[]{interfaze}, handler);
         } else if (wire instanceof OutboundWire) {
             OutboundWire<T> outbound = (OutboundWire<T>) wire;
-            JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(outbound);
+            JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(outbound, context);
             Class<?> interfaze = outbound.getServiceContract().getInterfaceClass();
             ClassLoader cl = interfaze.getClassLoader();
             return (T) Proxy.newProxyInstance(cl, new Class[]{interfaze}, handler);
@@ -142,7 +144,7 @@
             return new JDKInboundInvocationHandler(chains);
         } else if (wire instanceof OutboundWire) {
             OutboundWire<T> outbound = (OutboundWire<T>) wire;
-            return new JDKOutboundInvocationHandler(outbound);
+            return new JDKOutboundInvocationHandler(outbound, context);
         } else {
             ProxyCreationException e = new ProxyCreationException("Invalid wire type");
             e.setIdentifier(wire.getClass().getName());
@@ -169,13 +171,26 @@
         for (ServiceDefinition service : componentType.getServices().values()) {
             InboundWire inboundWire = createWire(service);
             inboundWire.setContainerName(component.getName());
+            if (componentType instanceof CompositeComponentType<?, ?, ?>) {
+                // If this is the case, then it means that component has already been returned
+                // by CompositeBuilder and thus its children, in particular composite services,
+                // have been registered
+                CompositeComponent compositeComponent = (CompositeComponent) component;
+                Service<?> serviceChild = (Service) compositeComponent.getChild(service.getName());
+                assert serviceChild != null;
+                if (serviceChild instanceof CompositeService) {
+                    serviceChild.setInboundWire(inboundWire);
+                    // Notice that now the more immediate container of the wire is the composite service
+                    inboundWire.setContainerName(serviceChild.getName());
+                }
+            }
             component.addInboundWire(inboundWire);
         }
 
-        for (ReferenceTarget reference : definition.getReferenceTargets().values()) {
+        for (ReferenceTarget referenceTarget : definition.getReferenceTargets().values()) {
             Map<String, ? extends ReferenceDefinition> references = componentType.getReferences();
-            ReferenceDefinition mappedReference = references.get(reference.getReferenceName());
-            OutboundWire wire = createWire(reference, mappedReference);
+            ReferenceDefinition mappedReference = references.get(referenceTarget.getReferenceName());
+            OutboundWire wire = createWire(referenceTarget, mappedReference);
             wire.setContainerName(component.getName());
             component.addOutboundWire(wire);
             if (componentType instanceof CompositeComponentType<?, ?, ?>) {
@@ -183,9 +198,13 @@
                 // by CompositeBuilder and thus its children, in particular composite references,
                 // have been registered
                 CompositeComponent compositeComponent = (CompositeComponent) component;
-                Reference<?> bindlessReference = (Reference) compositeComponent.getChild(reference.getReferenceName());
-                assert bindlessReference != null;
-                bindlessReference.setOutboundWire(wire);
+                Reference<?> reference = (Reference) compositeComponent.getChild(referenceTarget.getReferenceName());
+                assert reference != null;
+                if (reference instanceof CompositeReference) {
+                    reference.setOutboundWire(wire);
+                    // Notice that now the more immediate container of the wire is the composite reference
+                    wire.setContainerName(reference.getName());
+                }
             }
         }
     }
@@ -199,6 +218,12 @@
             chain.addInterceptor(new InvokerInterceptor());
             wire.addInvocationChain(operation, chain);
         }
+        // Notice that we skip wire.setCallbackReferenceName
+        // First, an inbound wire's callbackReferenceName is only retrieved by JavaAtomicComponent
+        // to create a callback injector based on the callback reference member; a composite reference
+        // should not need to do that
+        // Second, a reference definition does not have a callback reference name like a service
+        // definition does
         reference.setInboundWire(wire);
     }
 
@@ -275,7 +300,25 @@
             OutboundInvocationChain outboundChain = createOutboundChain(operation);
             outboundWire.addInvocationChain(operation, outboundChain);
         }
-        service.setInboundWire(inboundWire);
+
+        // Add target callback chain to outbound wire, applicable to both bound and bindless services
+        Class<T> callbackInterface = (Class<T>) contract.getCallbackClass();
+        if (callbackInterface != null) {
+            outboundWire.setCallbackInterface(callbackInterface);
+            for (Operation<?> operation : contract.getCallbackOperations().values()) {
+                InboundInvocationChain callbackTargetChain = createInboundChain(operation);
+// TODO handle policy
+//TODO statement below could be cleaner
+                callbackTargetChain.addInterceptor(new InvokerInterceptor());
+                outboundWire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
+            }
+        }
+
+        // Not clear in any case why this is done here and at the parent composite level as well
+        // But for a composite service, make sure that the inbound wire comes from the parent
+        if (!(service instanceof CompositeService)) {
+            service.setInboundWire(inboundWire);
+        }
         service.setOutboundWire(outboundWire);
     }
 
@@ -314,22 +357,20 @@
     }
 
     /**
-     * The following algorithm is defined the SCA spec:
-     * <ol>
+     * Compares two operations for wiring compatibility as defined by the SCA assembly specification, namely: <ol>
      * <li>compatibility for the individual method is defined as compatibility of the signature, that is method name,
-     * input types, and output types MUST BE the same.
-     * <li>the order of the input and output types also MUST BE the same.
-     * <li>the set of Faults and Exceptions expected by the source MUST BE the same or be a superset of those specified
-     * by the service.
-     * </ol>
-     * 
-     * @param operation
-     * @return
+     * input types, and output types MUST BE the same. <li>the order of the input and output types also MUST BE the
+     * same. <li>the set of Faults and Exceptions expected by the source MUST BE the same or be a superset of those
+     * specified by the service. </ol>
+     *
+     * @param source the source operation to compare
+     * @param target the target operation to compare
+     * @return true if the two operations are compatibile
      */
     public boolean isCompatibleWith(Operation<?> source, Operation<?> target) {
         // FIXME:
         return source.equals(target);
     }
-    
+
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/composite.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/composite.scdl?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/composite.scdl (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/composite.scdl Fri Sep  8 22:05:09 2006
@@ -30,6 +30,9 @@
     <component name="composite.loader">
         <system:implementation.system class="org.apache.tuscany.core.implementation.composite.CompositeLoader"/>
     </component>
+    <component name="composite.implementationLoader">
+        <system:implementation.system class="org.apache.tuscany.core.implementation.composite.ImplementationCompositeLoader"/>
+    </component>
     <component name="composite.dependencyLoader">
         <system:implementation.system class="org.apache.tuscany.core.implementation.composite.DependencyLoader"/>
     </component>

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/composite/CompositeBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/composite/CompositeBuilderTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/composite/CompositeBuilderTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/composite/CompositeBuilderTestCase.java Fri Sep  8 22:05:09 2006
@@ -19,6 +19,8 @@
 package org.apache.tuscany.core.implementation.composite;
 
 import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.CompositeComponent;
@@ -44,19 +46,19 @@
 
 import junit.framework.TestCase;
 import org.apache.tuscany.core.builder.BuilderRegistryImpl;
+import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.core.deployer.RootDeploymentContext;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 import org.apache.tuscany.core.implementation.java.JavaComponentBuilder;
 import org.apache.tuscany.core.implementation.java.JavaImplementation;
+import org.apache.tuscany.core.implementation.java.mock.components.OtherTarget;
 import org.apache.tuscany.core.implementation.java.mock.components.Source;
 import org.apache.tuscany.core.implementation.java.mock.components.SourceImpl;
 import org.apache.tuscany.core.implementation.java.mock.components.Target;
 import org.apache.tuscany.core.implementation.java.mock.components.TargetImpl;
 import org.apache.tuscany.core.wire.jdk.JDKWireService;
 import org.easymock.EasyMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.isA;
+import org.easymock.IAnswer;
 
 /**
  * @version $$Rev$$ $$Date$$
@@ -71,7 +73,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    public void testBuild() throws Exception {
+    public void testBuildConnect() throws Exception {
         CompositeComponent parent = new CompositeComponentImpl(null, null, null, null, null);
 
         CompositeBuilder builder = new CompositeBuilder();
@@ -79,7 +81,9 @@
         builder.setWireService(wireService);
         BuilderRegistryImpl builderRegistry = new BuilderRegistryImpl();
         builderRegistry.setWireService(wireService);
-        builderRegistry.register(JavaImplementation.class, new JavaComponentBuilder());
+        JavaComponentBuilder jBuilder = new JavaComponentBuilder();
+        jBuilder.setWireService(wireService);
+        builderRegistry.register(JavaImplementation.class, jBuilder);
         builderRegistry.register(CompositeImplementation.class, builder);
         CompositeBindlessBuilder bindlessBuilder = new CompositeBindlessBuilder();
         bindlessBuilder.setWireService(wireService);
@@ -87,11 +91,18 @@
         builder.setBuilderRegistry(builderRegistry);
         CompositeComponent component =
             (CompositeComponent) builder.build(parent, createTopComponentDef(), deploymentContext);
+
+        ConnectorImpl connector = new ConnectorImpl();
+        connector.connect(component);
+
         deploymentContext.getModuleScope().start();
         component.start();
         CompositeComponent sourceComponent = (CompositeComponent) component.getChild("SourceComponent");
         Source source = (Source) sourceComponent.getServiceInstance("InnerSourceService");
         assertNotNull(source);
+        AtomicComponent innerSourceComponent = (AtomicComponent) sourceComponent.getChild("InnerSourceComponent");
+        Source innerSourceInstance = (Source) deploymentContext.getModuleScope().getInstance(innerSourceComponent);
+        assertNotNull(innerSourceInstance);
         component.stop();
     }
 
@@ -114,7 +125,7 @@
             new CompositeComponentType<ServiceDefinition, ReferenceDefinition, JavaMappedProperty<?>>();
         innerType.add(createInnerSourceComponentDef());
         ReferenceDefinition reference = new ReferenceDefinition();
-        reference.setName("targetComponentRef");
+        reference.setName("TargetComponentRef");
         JavaInterfaceProcessorRegistry registry = new JavaInterfaceProcessorRegistryImpl();
         JavaServiceContract targetContract = registry.introspect(Target.class);
         reference.setServiceContract(targetContract);
@@ -132,7 +143,7 @@
         ComponentDefinition<CompositeImplementation> sourceComponentDefinition =
             new ComponentDefinition<CompositeImplementation>("SourceComponent", innerImpl);
         ReferenceTarget refTarget = new ReferenceTarget();
-        refTarget.setReferenceName("targetComponentRef");
+        refTarget.setReferenceName("TargetComponentRef");
         refTarget.addTarget(new URI("TargetComponent"));
         sourceComponentDefinition.add(refTarget);
 
@@ -148,6 +159,8 @@
         reference.setName("targetReference");
         JavaInterfaceProcessorRegistry registry = new JavaInterfaceProcessorRegistryImpl();
         ServiceContract<?> targetContract = registry.introspect(Target.class);
+        targetContract.setCallbackClass(OtherTarget.class);
+        targetContract.setCallbackName("OtherTarget");
         reference.setServiceContract(targetContract);
         reference.setMember(SourceImpl.class.getMethod("setTarget", Target.class));
         sourceType.add(reference);
@@ -181,10 +194,13 @@
 
         JavaInterfaceProcessorRegistry registry = new JavaInterfaceProcessorRegistryImpl();
         ServiceContract<?> targetContract = registry.introspect(Target.class);
+        targetContract.setCallbackClass(OtherTarget.class);
+        targetContract.setCallbackName("OtherTarget");
 
         JavaMappedService serviceDefinition = new JavaMappedService();
         serviceDefinition.setName("Target");
         serviceDefinition.setServiceContract(targetContract);
+        serviceDefinition.setCallbackReferenceName("otherTarget");
 
         targetType.add(serviceDefinition);
         targetType.setConstructorDefinition(new ConstructorDefinition<TargetImpl>(TargetImpl.class.getConstructor()));
@@ -197,9 +213,22 @@
     private ScopeContainer createMock() {
         ScopeContainer container = EasyMock.createMock(ScopeContainer.class);
         container.start();
-        container.register(isA(AtomicComponent.class));
-        expectLastCall().atLeastOnce();
-        expect(container.getScope()).andReturn(Scope.MODULE).atLeastOnce();
+        container.register(EasyMock.isA(AtomicComponent.class));
+        EasyMock.expectLastCall().anyTimes();
+        EasyMock.expect(container.getScope()).andReturn(Scope.MODULE).anyTimes();
+        EasyMock.expect(container.getInstance(EasyMock.isA(AtomicComponent.class))).andAnswer(new IAnswer() {
+            private Map<AtomicComponent, Object> cache = new HashMap<AtomicComponent, Object>();
+
+            public Object answer() throws Throwable {
+                AtomicComponent component = (AtomicComponent) EasyMock.getCurrentArguments()[0];
+                Object instance = cache.get(component);
+                if (instance == null) {
+                    instance = component.createInstance();
+                    cache.put(component, instance);
+                }
+                return instance;
+            }
+        });
         EasyMock.replay(container);
         return container;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java Fri Sep  8 22:05:09 2006
@@ -68,7 +68,7 @@
  */
 public class OutboundWireToJavaTestCase extends TestCase {
     private WorkContext workContext = new WorkContextImpl();
-    private WireService wireService = new JDKWireService();
+    private WireService wireService = new JDKWireService(new WorkContextImpl(), null);
 
     public void testToStatelessScope() throws Exception {
         StatelessScopeContainer scope = new StatelessScopeContainer(workContext);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/MockFactory.java Fri Sep  8 22:05:09 2006
@@ -43,6 +43,7 @@
 import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireService;
 
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 import org.apache.tuscany.core.implementation.PojoConfiguration;
 import org.apache.tuscany.core.implementation.java.JavaAtomicComponent;
@@ -65,7 +66,7 @@
  */
 public final class MockFactory {
 
-    private static final WireService WIRE_SERVICE = new JDKWireService();
+    private static final WireService WIRE_SERVICE = new JDKWireService(new WorkContextImpl(), null);
     private static final JavaInterfaceProcessorRegistry REGISTRY = new JavaInterfaceProcessorRegistryImpl();
 
     private MockFactory() {

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java Fri Sep  8 22:05:09 2006
@@ -26,6 +26,7 @@
 import org.apache.tuscany.spi.wire.OutboundInvocationChain;
 import org.apache.tuscany.spi.wire.OutboundWire;
 
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 import org.apache.tuscany.core.mock.component.SimpleTarget;
 import org.apache.tuscany.core.mock.component.SimpleTargetImpl;
@@ -61,7 +62,7 @@
         OutboundWire wire = new OutboundWireImpl();
         wire.addInvocationChain(operation, chain);
         wire.setServiceContract(contract);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         assertEquals("foo", handler.invoke(null, echo, new String[]{"foo"}));
         assertEquals(1, interceptor.getCount());
         assertEquals(1, requestHandler.getCount());

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java Fri Sep  8 22:05:09 2006
@@ -28,6 +28,8 @@
 import org.apache.tuscany.spi.wire.OutboundWire;
 
 import junit.framework.TestCase;
+
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 import org.apache.tuscany.core.mock.wire.MockHandler;
 import org.apache.tuscany.core.mock.wire.MockStaticInvoker;
@@ -67,7 +69,7 @@
         wire.setServiceContract(contract);
         Operation operation = contract.getOperations().get("checkedException");
         wire.addInvocationChain(operation, createChain(checkedMethod, operation));
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         try {
             TestBean proxy = (TestBean) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                 new Class[]{TestBean.class}, handler);
@@ -85,7 +87,7 @@
         Operation operation = contract.getOperations().get("runtimeException");
         OutboundInvocationChain chain = createChain(runtimeMethod, operation);
         wire.addInvocationChain(operation, chain);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         try {
             TestBean proxy = (TestBean) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                 new Class[]{TestBean.class}, handler);

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java Fri Sep  8 22:05:09 2006
@@ -35,6 +35,7 @@
 import org.apache.tuscany.core.mock.wire.MockStaticInvoker;
 import org.apache.tuscany.core.mock.wire.MockSyncInterceptor;
 import org.apache.tuscany.core.wire.jdk.JDKOutboundInvocationHandler;
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
 
 public class OutboundInvocationHandlerTestCase extends TestCase {
@@ -62,7 +63,7 @@
         Operation operation = contract.getOperations().get("hello");
         wire.addInvocationChain(operation, createChain(operation));
         wire.setServiceContract(contract);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         assertEquals("foo", handler.invoke(hello, new Object[]{"foo"}));
     }
 
@@ -71,7 +72,7 @@
         Operation operation = contract.getOperations().get("hello");
         wire.addInvocationChain(operation, createChain(operation));
         wire.setServiceContract(contract);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         try {
             handler.invoke(hello, new Object[]{});
             fail("Expected " + IllegalArgumentException.class.getName());
@@ -89,7 +90,7 @@
         OutboundWire wire = new OutboundWireImpl();
         wire.setServiceContract(contract);
         wire.addInvocationChain(operation, source);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         try {
             assertEquals("foo", handler.invoke(hello, new Object[]{}));
             fail("Expected " + IllegalArgumentException.class.getName());
@@ -107,7 +108,7 @@
         OutboundWire wire = new OutboundWireImpl();
         wire.setServiceContract(contract);
         wire.addInvocationChain(operation, source);
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         assertEquals("foo", handler.invoke(hello, new Object[]{"foo"}));
     }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDOutboundInvocationHandlerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDOutboundInvocationHandlerTestCase.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDOutboundInvocationHandlerTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDOutboundInvocationHandlerTestCase.java Fri Sep  8 22:05:09 2006
@@ -5,6 +5,8 @@
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
 
 import junit.framework.TestCase;
+
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.core.wire.OutboundWireImpl;
 
 /**
@@ -15,7 +17,7 @@
     public void testToString() {
         OutboundWireImpl wire = new OutboundWireImpl();
         wire.setServiceContract(new JavaServiceContract(Foo.class));
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         Foo foo = (Foo) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Foo.class}, handler);
         assertNotNull(foo.toString());
     }
@@ -23,7 +25,7 @@
     public void testHashCode() {
         OutboundWireImpl wire = new OutboundWireImpl();
         wire.setServiceContract(new JavaServiceContract(Foo.class));
-        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire);
+        JDKOutboundInvocationHandler handler = new JDKOutboundInvocationHandler(wire, new WorkContextImpl());
         Foo foo = (Foo) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Foo.class}, handler);
         assertNotNull(foo.hashCode());
     }

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Reference.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Reference.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Reference.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Reference.java Fri Sep  8 22:05:09 2006
@@ -74,6 +74,11 @@
     TargetInvoker createTargetInvoker(ServiceContract contract, Operation operation);
 
     /**
+     * Creates a target invoker for callbacks
+     */
+    TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation);
+
+    /**
      * Callback to create a {@link org.apache.tuscany.spi.wire.TargetInvoker} which issues a non-blocking dispatch
      *
      * @param wire      the outbound wire of the invocation source, used for callbacks

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Service.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Service.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Service.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/Service.java Fri Sep  8 22:05:09 2006
@@ -18,8 +18,11 @@
  */
 package org.apache.tuscany.spi.component;
 
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireInvocationHandler;
 
 /**
@@ -49,5 +52,5 @@
 
     void setOutboundWire(OutboundWire<T> wire);
 
-
+    TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation);
 }

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java Fri Sep  8 22:05:09 2006
@@ -29,6 +29,10 @@
 
     void setCurrentMessageId(Object messageId);
 
+    Object getCurrentCorrelationId();
+
+    void setCurrentCorrelationId(Object correlationId);
+
     /**
      * Returns the composite where a remote request came in
      */

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ReferenceExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ReferenceExtension.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ReferenceExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ReferenceExtension.java Fri Sep  8 22:05:09 2006
@@ -24,6 +24,7 @@
 import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceContract;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
@@ -81,6 +82,10 @@
 
     public WireInvocationHandler getHandler() throws TargetException {
         return wireService.createHandler(inboundWire);
+    }
+
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        throw new UnsupportedOperationException();
     }
 
     public TargetInvoker createAsyncTargetInvoker(OutboundWire wire, Operation operation) {

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ServiceExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ServiceExtension.java?view=diff&rev=441743&r1=441742&r2=441743
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ServiceExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/ServiceExtension.java Fri Sep  8 22:05:09 2006
@@ -23,9 +23,12 @@
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.Service;
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.ServiceContract;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.WireInvocationHandler;
 import org.apache.tuscany.spi.wire.WireService;
 
@@ -68,6 +71,10 @@
         this.outboundWire = outboundWire;
     }
 
+    public TargetInvoker createCallbackTargetInvoker(ServiceContract contract, Operation operation) {
+        throw new UnsupportedOperationException();        
+    }
+    
     public T getServiceInstance() throws TargetException {
         return wireService.createProxy(inboundWire);
     }



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