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/08/04 21:16:22 UTC

svn commit: r428847 [1/3] - in /incubator/tuscany/java/sca: commands/launcher/src/main/resources/META-INF/tuscany/ containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/ containers/container.javascript/src/main/java/org/apache/t...

Author: jmarino
Date: Fri Aug  4 12:16:20 2006
New Revision: 428847

URL: http://svn.apache.org/viewvc?rev=428847&view=rev
Log:
apply patch from Ignacio for TUSCANY-585 providing initial support for component-to-component callbacks; I refactored it a bit and will explain in a mail to the list the specifics; cleanup still needs to be done and not all cases are implemented, e.g. remote callbacks through references, conversations

Added:
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedCallback.java   (with props)
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java   (with props)
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/CallbackWireObjectFactory.java   (with props)
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/AbstractJDKOutboundInvocationHandler.java   (with props)
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKCallbackInvocationHandler.java   (with props)
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/CallbackInvocationTestCase.java   (with props)
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/processor/ServiceCallbackTestCase.java   (with props)
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/injection/CallbackWireObjectFactoryTestCase.java   (with props)
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/injection/WireObjectFactoryTestCase.java   (with props)
Removed:
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/mock/JavaAtomicComponentAsyncTestCase.java
Modified:
    incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl
    incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicComponent.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/PropertyTestCase.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/ScriptInvokeTestCase.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/WireTestCase.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedService.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ProcessorUtils.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemInboundWireImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundAutowire.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundWireImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/injection/WireObjectFactory.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/PojoTargetInvoker.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKOutboundInvocationHandler.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvokerTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/GetServiceByNameTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OneWayWireInvocationTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/component/OutboundWireToJavaTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/implementation/processor/ProcessorUtilsServiceTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/integration/implementation/system/builder/SystemBuilderWireTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/mock/wire/MockHandler.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/mock/wire/MockSyncInterceptor.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/wire/BasicReferenceInvocationHandlerTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationErrorTestCase.java
    incubator/tuscany/java/sca/core/src/test/java/org/apache/tuscany/core/wire/OutboundInvocationHandlerTestCase.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/builder/Connector.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/component/Component.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/component/WorkContext.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/extension/ComponentBuilderExtension.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/extension/CompositeComponentExtension.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InboundWire.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OutboundWire.java
    incubator/tuscany/java/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java
    incubator/tuscany/java/sca/spi/src/test/java/org/apache/tuscany/spi/extension/AtomicComponentExtensionTestCase.java
    incubator/tuscany/java/sca/spi/src/test/java/org/apache/tuscany/spi/extension/CompositeComponentExtensionTestCase.java

Modified: incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl (original)
+++ incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl Fri Aug  4 12:16:20 2006
@@ -38,6 +38,11 @@
         <system:implementation.system class="org.apache.tuscany.core.wire.jdk.JDKWireService"/>
     </component>
 
+    <!-- Wire callback service -->
+    <component name="wireCallbackService">
+        <system:implementation.system class="org.apache.tuscany.core.wire.jdk.JDKWireCallbackService"/>
+    </component>
+
     <!-- Scope infrastructure -->
     <component name="scopeRegistry">
         <system:implementation.system class="org.apache.tuscany.core.component.scope.ScopeRegistryImpl"/>

Modified: incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicComponent.java Fri Aug  4 12:16:20 2006
@@ -47,7 +47,7 @@
                                  CompositeComponent parent,
                                  ScopeContainer scopeContainer,
                                  WireService wireService) {
-        super(name, parent, scopeContainer, wireService, 0);
+        super(name, parent, scopeContainer, wireService, null, 0);
         this.scope = scopeContainer.getScope();
 
         assert groovyClass != null;

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java Fri Aug  4 12:16:20 2006
@@ -29,6 +29,7 @@
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.extension.AtomicComponentExtension;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
@@ -47,8 +48,8 @@
     private RhinoScript rhinoScript;
 
     public JavaScriptComponent(String name, RhinoScript rhinoScript, List<Class<?>> services, Map<String, Object> properties,
-            CompositeComponent parent, ScopeContainer scopeContainer, WireService wireService) {
-        super(name, parent, scopeContainer, wireService, 0);
+            CompositeComponent parent, ScopeContainer scopeContainer, WireService wireService, WorkContext workContext) {
+        super(name, parent, scopeContainer, wireService, workContext, 0);
 
         this.rhinoScript = rhinoScript;
         this.services = services;

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java Fri Aug  4 12:16:20 2006
@@ -50,7 +50,7 @@
         // ScopeContainer scopeContainer = scopeRegistry.getScopeContainer(componentType.getLifecycleScope());
         ScopeContainer scopeContainer = deploymentContext.getModuleScope();
 
-        return new JavaScriptComponent(name, rhinoScript, services, properties, parent, scopeContainer, wireService);
+        return new JavaScriptComponent(name, rhinoScript, services, properties, parent, scopeContainer, wireService, workContext);
     }
 
 }

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/PropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/PropertyTestCase.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/PropertyTestCase.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/PropertyTestCase.java Fri Aug  4 12:16:20 2006
@@ -33,7 +33,7 @@
         Map<String, Object> properties = new HashMap<String, Object>();
         properties.put("property", "bar");
         WireService wireService = ArtifactFactory.createWireService();
-        JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", implClass, services, properties, null, scope, wireService);
+        JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", implClass, services, properties, null, scope, wireService, null);
         scope.register(context);
         Greeting greeting = context.getServiceInstance();
         assertEquals("bar", greeting.greet("foo"));

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/ScriptInvokeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/ScriptInvokeTestCase.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/ScriptInvokeTestCase.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/ScriptInvokeTestCase.java Fri Aug  4 12:16:20 2006
@@ -29,7 +29,7 @@
         List<Class<?>> services = new ArrayList<Class<?>>();
         services.add(Greeting.class);
         JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", rhinoScript, services, new HashMap<String, Object>(),
-                null, scope, ArtifactFactory.createWireService());
+                null, scope, ArtifactFactory.createWireService(), null);
         scope.register(context);
         Greeting object = (Greeting) context.getServiceInstance();
         assertEquals("foo", object.greet("foo"));

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/WireTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/WireTestCase.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/WireTestCase.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/WireTestCase.java Fri Aug  4 12:16:20 2006
@@ -59,7 +59,7 @@
         List<Class<?>> services = new ArrayList<Class<?>>();
         services.add(Greeting.class);
         JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", implClass1, services, properties, null, scope,
-                ArtifactFactory.createWireService());
+                ArtifactFactory.createWireService(), null);
         OutboundWire<?> wire = ArtifactFactory.createOutboundWire("wire", Greeting.class);
         ArtifactFactory.terminateWire(wire);
 
@@ -109,7 +109,7 @@
         List<Class<?>> services = new ArrayList<Class<?>>();
         services.add(Greeting.class);
         JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", implClass2, services, properties, null, scope,
-                ArtifactFactory.createWireService());
+                ArtifactFactory.createWireService(), null);
         scope.register(context);
         TargetInvoker invoker = context.createTargetInvoker("greeting", Greeting.class.getMethod("greet", String.class));
         assertEquals("foo", invoker.invokeTarget(new String[] { "foo" }));
@@ -125,7 +125,7 @@
         List<Class<?>> services = new ArrayList<Class<?>>();
         services.add(Greeting.class);
         JavaScriptComponent<Greeting> context = new JavaScriptComponent<Greeting>("source", implClass2, services, properties, null, scope,
-                ArtifactFactory.createWireService());
+                ArtifactFactory.createWireService(), null);
         scope.register(context);
 
         InboundWire<?> wire = ArtifactFactory.createInboundWire("Greeting", Greeting.class);

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java Fri Aug  4 12:16:20 2006
@@ -42,6 +42,7 @@
 import org.apache.tuscany.core.implementation.Introspector;
 import org.apache.tuscany.core.implementation.composite.CompositeComponentImpl;
 import org.apache.tuscany.core.implementation.composite.CompositeLoader;
+import org.apache.tuscany.core.implementation.processor.ConstructorProcessor;
 import org.apache.tuscany.core.implementation.processor.DestroyProcessor;
 import org.apache.tuscany.core.implementation.processor.HeuristicPojoProcessor;
 import org.apache.tuscany.core.implementation.processor.InitProcessor;
@@ -50,7 +51,6 @@
 import org.apache.tuscany.core.implementation.processor.ReferenceProcessor;
 import org.apache.tuscany.core.implementation.processor.ScopeProcessor;
 import org.apache.tuscany.core.implementation.processor.ServiceProcessor;
-import org.apache.tuscany.core.implementation.processor.ConstructorProcessor;
 import org.apache.tuscany.core.implementation.system.builder.SystemBindingBuilder;
 import org.apache.tuscany.core.implementation.system.builder.SystemComponentBuilder;
 import org.apache.tuscany.core.implementation.system.builder.SystemCompositeBuilder;
@@ -65,13 +65,13 @@
 import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
 import org.apache.tuscany.core.loader.ComponentLoader;
 import org.apache.tuscany.core.loader.ComponentTypeElementLoader;
+import org.apache.tuscany.core.loader.IncludeLoader;
 import org.apache.tuscany.core.loader.InterfaceJavaLoader;
 import org.apache.tuscany.core.loader.LoaderRegistryImpl;
 import org.apache.tuscany.core.loader.PropertyLoader;
 import org.apache.tuscany.core.loader.ReferenceLoader;
 import org.apache.tuscany.core.loader.ServiceLoader;
 import org.apache.tuscany.core.loader.StringParserPropertyFactory;
-import org.apache.tuscany.core.loader.IncludeLoader;
 
 /**
  * A default implementation of a Bootstrapper. Please see the documentation on the individual methods for how the
@@ -180,9 +180,9 @@
 
         // register component type loaders
         loaderRegistry.registerLoader(SystemImplementation.class,
-                                      new SystemComponentTypeLoader(introspector));
+            new SystemComponentTypeLoader(introspector));
         loaderRegistry.registerLoader(SystemCompositeImplementation.class,
-                                      new SystemCompositeComponentTypeLoader(loaderRegistry));
+            new SystemCompositeComponentTypeLoader(loaderRegistry));
 
         // register element loaders
         registerLoader(loaderRegistry, new ComponentLoader(loaderRegistry, propertyFactory));

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Fri Aug  4 12:16:20 2006
@@ -5,16 +5,15 @@
 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.osoa.sca.annotations.Callback;
+import org.osoa.sca.annotations.OneWay;
+
 import org.apache.tuscany.spi.QualifiedName;
 import org.apache.tuscany.spi.builder.BuilderConfigException;
 import org.apache.tuscany.spi.builder.Connector;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.component.ComponentRuntimeException;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.Reference;
 import org.apache.tuscany.spi.component.SCAObject;
@@ -28,6 +27,12 @@
 import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 
+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;
+
 /**
  * The default connector implmentation
  *
@@ -46,7 +51,7 @@
                         continue;
                     }
                     try {
-                        connect(outboundWire, parent, scope);
+                        connect(sourceComponent, outboundWire, parent, scope);
                     } catch (BuilderConfigException e) {
                         e.addContextName(source.getName());
                         e.addContextName(parent.getName());
@@ -55,8 +60,8 @@
                 }
             }
         } else if (source instanceof CompositeComponent) {
-            CompositeComponent composite = (CompositeComponent) source;
-            for (SCAObject<?> child : (List<SCAObject<?>>) composite.getChildren()) {
+            CompositeComponent<?> composite = (CompositeComponent) source;
+            for (SCAObject<?> child : composite.getChildren()) {
                 connect(child);
             }
         } else if (source instanceof Service) {
@@ -79,7 +84,8 @@
      * @throws BuilderConfigException
      */
     @SuppressWarnings("unchecked")
-    public <T> void connect(OutboundWire<T> sourceWire,
+    public <T> void connect(AtomicComponent<?> source,
+                            OutboundWire<T> sourceWire,
                             CompositeComponent<?> parent,
                             Scope sourceScope) throws BuilderConfigException {
         assert sourceScope != null : "Source scope was null";
@@ -105,17 +111,18 @@
             if (!sourceWire.getBusinessInterface().isAssignableFrom(targetWire.getBusinessInterface())) {
                 throw new BuilderConfigException("Incompatible source and target interfaces");
             }
-            connect(sourceWire, targetWire, target, isOptimizable(sourceScope, target.getScope()));
+            boolean optimizable = isOptimizable(sourceScope, target.getScope());
+            connect(sourceWire, targetWire, source, target, optimizable);
         } else if (target instanceof Reference) {
             InboundWire<T> targetWire = ((Reference) target).getInboundWire();
             assert targetWire != null;
             if (!sourceWire.getBusinessInterface().isAssignableFrom(targetWire.getBusinessInterface())) {
                 throw new BuilderConfigException("Incompatible source and target interfaces");
             }
-            connect(sourceWire, targetWire, target, isOptimizable(sourceScope, target.getScope()));
+            connect(sourceWire, targetWire, source, target, isOptimizable(sourceScope, target.getScope()));
         } else {
-            BuilderConfigException e = new BuilderConfigException("Invalid wire target type for reference "
-                + sourceWire.getReferenceName());
+            String name = sourceWire.getReferenceName();
+            BuilderConfigException e = new BuilderConfigException("Invalid wire target type for reference " + name);
             e.setIdentifier(targetName.getQualifiedName());
         }
     }
@@ -144,7 +151,8 @@
 
     public <T> void connect(OutboundWire<T> sourceWire,
                             InboundWire<T> targetWire,
-                            SCAObject<?> context,
+                            AtomicComponent<?> source,
+                            SCAObject<?> scaObject,
                             boolean optimizable) {
         Map<Method, InboundInvocationChain> targetChains = targetWire.getInvocationChains();
         // perform optimization, if possible
@@ -163,13 +171,59 @@
                 e.setIdentifier(sourceWire.getReferenceName());
                 throw e;
             }
-            if (context instanceof Component) {
-                connect(outboundChain,
-                    inboundChain,
-                    ((Component) context).createTargetInvoker(targetWire.getServiceName(),
-                        inboundChain.getMethod()));
-            } else if (context instanceof Reference) {
-                Reference reference = (Reference) context;
+            if (scaObject instanceof Component) {
+                Component component = (Component) scaObject;
+                Method operation = outboundChain.getMethod();
+
+                // FIXME should not relay on annotations
+                boolean isOneWayOperation = operation.getAnnotation(OneWay.class) != null;
+                boolean operationHasCallback = operation.getDeclaringClass().getAnnotation(Callback.class) != null;
+                if (isOneWayOperation && operationHasCallback) {
+                    throw new ComponentRuntimeException("Operation can't both be one-way and have a callback");
+                }
+                TargetInvoker invoker;
+                if (isOneWayOperation || operationHasCallback) {
+                    invoker = component.createAsyncTargetInvoker(targetWire.getServiceName(), operation, sourceWire);
+                } else {
+                    invoker = component.createTargetInvoker(targetWire.getServiceName(), inboundChain.getMethod());
+                }
+                connect(outboundChain, inboundChain, invoker);
+            } else if (scaObject instanceof Reference) {
+                Reference reference = (Reference) scaObject;
+                TargetInvoker invoker = reference.createTargetInvoker(targetWire.getServiceName(),
+                    inboundChain.getMethod());
+                connect(outboundChain, inboundChain, invoker);
+            }
+        }
+
+        // connect callback wires if they exist
+        for (OutboundInvocationChain outboundChain : sourceWire.getSourceCallbackInvocationChains().values()) {
+            // match wire chains
+            Map<Method, InboundInvocationChain> chains = sourceWire.getTargetCallbackInvocationChains();
+            InboundInvocationChain inboundChain = chains.get(outboundChain.getMethod());
+            if (inboundChain == null) {
+                BuilderConfigException e =
+                    new BuilderConfigException("Incompatible source and target chain interfaces for reference");
+                e.setIdentifier(sourceWire.getReferenceName());
+                throw e;
+            }
+            if (scaObject instanceof Component) {
+                Method operation = outboundChain.getMethod();
+                // FIXME should not relay on annotations
+                boolean isOneWayOperation = operation.getAnnotation(OneWay.class) != null;
+                boolean operationHasCallback = operation.getDeclaringClass().getAnnotation(Callback.class) != null;
+                if (isOneWayOperation && operationHasCallback) {
+                    throw new ComponentRuntimeException("Operation can't both be one-way and have a callback");
+                }
+                TargetInvoker invoker;
+                if (isOneWayOperation || operationHasCallback) {
+                    invoker = source.createAsyncTargetInvoker(targetWire.getServiceName(), operation, sourceWire);
+                } else {
+                    invoker = source.createTargetInvoker(targetWire.getServiceName(), inboundChain.getMethod());
+                }
+                connect(outboundChain, inboundChain, invoker);
+            } else if (scaObject instanceof Reference) {
+                Reference reference = (Reference) scaObject;
                 TargetInvoker invoker = reference.createTargetInvoker(targetWire.getServiceName(),
                     inboundChain.getMethod());
                 connect(outboundChain, inboundChain, invoker);

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java Fri Aug  4 12:16:20 2006
@@ -5,6 +5,7 @@
 
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.wire.OutboundWire;
 
 /**
  * An implementation of an {@link org.apache.tuscany.spi.component.WorkContext} that handles event-to-thread
@@ -15,6 +16,7 @@
 public class WorkContextImpl implements WorkContext {
 
     private static final Object REMOTE_CONTEXT = new Object();
+    private static final Object OUTBOUND_WIRE = new Object();
 
     // TODO implement propagation strategy for creating new threads
 
@@ -24,6 +26,23 @@
 
     public WorkContextImpl() {
         super();
+    }
+
+    public OutboundWire getCurrentInvocationWire() {
+        Map<Object, Object> map = workContext.get();
+        if (map == null) {
+            return null;
+        }
+        return (OutboundWire) map.get(OUTBOUND_WIRE);
+    }
+
+    public void setCurrentInvocationWire(OutboundWire wire) {
+        Map<Object, Object> map = workContext.get();
+        if (map == null) {
+            map = new HashMap<Object, Object>();
+            workContext.set(map);
+        }
+        map.put(OUTBOUND_WIRE, wire);
     }
 
     public CompositeComponent getRemoteComponent() {

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java Fri Aug  4 12:16:20 2006
@@ -70,19 +70,6 @@
             }
         }
 
-//        Constructor componentConstructor = null;
-//        Constructor[] constructors = clazz.getConstructors();
-//        for (Constructor constructor : constructors) {
-//            if (componentConstructor == null) {
-//                componentConstructor = constructor;
-//            }else{
-//                if componentConstructor.getAnnotation()
-//            }
-//            for (ImplementationProcessor processor : cache) {
-//                processor.visitConstructor(constructor, type, null);
-//            }
-//        }
-
         Set<Method> methods = JavaIntrospectionHelper.getAllUniquePublicProtectedMethods(clazz);
         for (Method method : methods) {
             for (ImplementationProcessor processor : cache) {

Added: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedCallback.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedCallback.java?rev=428847&view=auto
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedCallback.java (added)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedCallback.java Fri Aug  4 12:16:20 2006
@@ -0,0 +1,43 @@
+package org.apache.tuscany.core.implementation;
+
+import java.lang.reflect.Member;
+
+/**
+ * A Callback definition that is mapped to a specific location in the implementation class. This location will typically
+ * be used to inject callback values.
+ *
+ * @version $Rev: 416931 $ $Date: 2006-06-24 11:26:09 -0400 (Sat, 24 Jun 2006) $
+ */
+public class JavaMappedCallback {
+
+    private String name;
+    private Member member;
+    private Class  callbackInterface;
+
+    public JavaMappedCallback(String name, Member member, Class callbackInterface) {
+        this.name = name;
+        this.member = member;
+        this.callbackInterface = callbackInterface;
+    }
+
+    /**
+     * Returns the callback name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Returns the Member that this reference is mapped to.
+     */
+    public Member getMember() {
+        return member;
+    }
+
+    /**
+     * Returns the callback interface
+     */
+    public Class getCallbackInterface() {
+        return callbackInterface;
+    }
+}

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

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

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedService.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedService.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/JavaMappedService.java Fri Aug  4 12:16:20 2006
@@ -29,6 +29,7 @@
  */
 public class JavaMappedService extends ServiceDefinition {
     private Class<?> serviceInterface;
+    private JavaMappedCallback callbackReference;
 
     public JavaMappedService() {
     }
@@ -64,5 +65,23 @@
      */
     public void setServiceInterface(Class<?> serviceInterface) {
         this.serviceInterface = serviceInterface;
+    }
+
+    /**
+     * Returns the Callback Reference for this service.
+     *
+     * @return the Callback Reference for this service
+     */
+    public JavaMappedCallback getCallbackReference() {
+        return callbackReference;
+    }
+
+    /**
+     * Sets the Callback Reference for this service.
+     *
+     * @param callbackReference the Callback Reference for this service
+     */
+    public void setCallbackReference(JavaMappedCallback callbackReference) {
+        this.callbackReference = callbackReference;
     }
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java Fri Aug  4 12:16:20 2006
@@ -26,6 +26,7 @@
 import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.extension.AtomicComponentExtension;
 import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.RuntimeWire;
 
 import org.apache.tuscany.core.injection.ArrayMultiplicityObjectFactory;
 import org.apache.tuscany.core.injection.EventInvoker;
@@ -52,14 +53,16 @@
     protected List<Class<?>> serviceInterfaces;
     protected Map<String, Member> referenceSites;
     protected Map<String, Member> propertySites;
+    protected Map<String, Member> callbackSites;
     protected List<Injector> injectors;
 
     public PojoAtomicComponent(String name, PojoConfiguration configuration) {
         super(name,
-              configuration.getParent(),
-              configuration.getScopeContainer(),
-              configuration.getWireService(),
-              configuration.getInitLevel());
+            configuration.getParent(),
+            configuration.getScopeContainer(),
+            configuration.getWireService(),
+            configuration.getWorkContext(),
+            configuration.getInitLevel());
         assert configuration.getInstanceFactory() != null : "Object factory was null";
         initInvoker = configuration.getInitInvoker();
         destroyInvoker = configuration.getDestroyInvoker();
@@ -71,6 +74,8 @@
             : new HashMap<String, Member>();
         propertySites = configuration.getPropertySites() != null ? configuration.getPropertySites()
             : new HashMap<String, Member>();
+        callbackSites = configuration.getCallbackSite() != null ? configuration.getCallbackSite()
+            : new HashMap<String, Member>();
     }
 
     public List<Class<?>> getServiceInterfaces() {
@@ -132,7 +137,7 @@
         //FIXME throw an error if no injection site found
     }
 
-    public void onReferenceWire(OutboundWire wire) {
+    protected void onReferenceWire(OutboundWire wire) {
         String name = wire.getReferenceName();
         Member member = referenceSites.get(name);
         if (member != null) {
@@ -165,7 +170,7 @@
         //TODO multiplicity for constructor injection
     }
 
-    protected Injector createInjector(Member member, OutboundWire wire) {
+    protected Injector createInjector(Member member, RuntimeWire wire) {
         ObjectFactory<?> factory = createWireFactory(wire);
         if (member instanceof Field) {
             return new FieldInjector((Field) member, factory);
@@ -206,6 +211,6 @@
         }
     }
 
-    protected abstract ObjectFactory<?> createWireFactory(OutboundWire wire);
+    protected abstract ObjectFactory<?> createWireFactory(RuntimeWire wire);
 
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/PojoConfiguration.java Fri Aug  4 12:16:20 2006
@@ -21,6 +21,7 @@
 
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.wire.WireService;
 
 import org.apache.tuscany.core.injection.EventInvoker;
@@ -44,8 +45,10 @@
     private List<Injector> propertyInjectors = new ArrayList<Injector>();
     private Map<String, Member> referenceSites = new HashMap<String, Member>();
     private Map<String, Member> propertySites = new HashMap<String, Member>();
+    private Map<String, Member> callbackSites = new HashMap<String, Member>();
     private List<Class<?>> serviceInterfaces = new ArrayList<Class<?>>();
     private WireService wireService;
+    private WorkContext workContext;
 
     public CompositeComponent<?> getParent() {
         return parent;
@@ -131,6 +134,14 @@
         referenceSites.put(name, member);
     }
 
+    public Map<String, Member> getCallbackSite() {
+        return callbackSites;
+    }
+
+    public void addCallbackSite(String name, Member member) {
+        callbackSites.put(name, member);
+    }
+
     public Map<String, Member> getPropertySites() {
         return propertySites;
     }
@@ -146,4 +157,13 @@
     public void setWireService(WireService wireService) {
         this.wireService = wireService;
     }
+
+    public WorkContext getWorkContext() {
+        return workContext;
+    }
+
+    public void setWorkContext(WorkContext workContext) {
+        this.workContext = workContext;
+    }
+
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/composite/AbstractCompositeComponent.java Fri Aug  4 12:16:20 2006
@@ -9,12 +9,6 @@
 
 import org.w3c.dom.Document;
 
-import org.apache.tuscany.core.component.AutowireComponent;
-import org.apache.tuscany.core.component.AutowireResolutionException;
-import org.apache.tuscany.core.component.ComponentInitException;
-import org.apache.tuscany.core.component.event.CompositeStart;
-import org.apache.tuscany.core.component.event.CompositeStop;
-import org.apache.tuscany.core.implementation.system.component.SystemService;
 import org.apache.tuscany.spi.CoreRuntimeException;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.CompositeComponent;
@@ -26,8 +20,16 @@
 import org.apache.tuscany.spi.component.Service;
 import org.apache.tuscany.spi.event.Event;
 import org.apache.tuscany.spi.extension.CompositeComponentExtension;
+import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 
+import org.apache.tuscany.core.component.AutowireComponent;
+import org.apache.tuscany.core.component.AutowireResolutionException;
+import org.apache.tuscany.core.component.ComponentInitException;
+import org.apache.tuscany.core.component.event.CompositeStart;
+import org.apache.tuscany.core.component.event.CompositeStop;
+import org.apache.tuscany.core.implementation.system.component.SystemService;
+
 /**
  * The base implementation of a composite context
  *
@@ -59,10 +61,10 @@
     protected ScopeContainer scopeContainer;
 
     /**
-     * @param name          the name of the SCA composite
-     * @param parent        the SCA composite parent
+     * @param name            the name of the SCA composite
+     * @param parent          the SCA composite parent
      * @param autowireContext the component that should be to resolve autowires
-     * @param propertyValues the values of this composite's Properties
+     * @param propertyValues  the values of this composite's Properties
      */
     public AbstractCompositeComponent(String name,
                                       CompositeComponent parent,
@@ -209,6 +211,11 @@
     public TargetInvoker createTargetInvoker(String serviceName, Method operation) {
         return null;
     }
+
+    public TargetInvoker createAsyncTargetInvoker(String serviceName, Method operation, OutboundWire wire) {
+        return null;
+    }
+
 
     protected void registerAutowireExternal(Class<?> interfaze, SystemService context) {
         assert interfaze != null;

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/AsyncJavaTargetInvoker.java Fri Aug  4 12:16:20 2006
@@ -26,37 +26,52 @@
 import org.apache.tuscany.spi.wire.Message;
 import org.apache.tuscany.spi.wire.MessageChannel;
 import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.component.TargetException;
 
 import org.apache.tuscany.core.policy.async.AsyncMonitor;
+import org.apache.tuscany.core.wire.PojoTargetInvoker;
 
 /**
  * Responsible for performing a non-blocking dispatch on a Java component implementation instance
  *
  * @version $Rev$ $Date$
  */
-public class AsyncJavaTargetInvoker extends JavaTargetInvoker {
+public class AsyncJavaTargetInvoker extends PojoTargetInvoker {
 
     private static final ContextBinder BINDER = new ContextBinder();
     private static final Message RESPONSE = new ImmutableMessage();
 
+    private JavaAtomicComponent component;
+    private OutboundWire wire;
     private WorkScheduler workScheduler;
     private AsyncMonitor monitor;
+    private WorkContext workContext;
+    private Object target;
 
     /**
      * Creates a new invoker
      *
      * @param operation     the operation the invoker is associated with
+     * @param wire
      * @param component     the target component
      * @param workScheduler the work scheduler to run the invocation
      * @param monitor       the monitor to pass events to
+     * @param workContext
      */
     public AsyncJavaTargetInvoker(Method operation,
+                                  OutboundWire wire,
                                   JavaAtomicComponent component,
                                   WorkScheduler workScheduler,
-                                  AsyncMonitor monitor) {
-        super(operation, component);
+                                  AsyncMonitor monitor,
+                                  WorkContext workContext) {
+        super(operation);
+        this.wire = wire;
+        this.component = component;
         this.workScheduler = workScheduler;
         this.monitor = monitor;
+        this.workContext = workContext;
     }
 
     // Override invocation methods to defer invocation to work item
@@ -69,9 +84,10 @@
         try {
             workScheduler.scheduleWork(new Runnable() {
                 public void run() {
+                    workContext.setCurrentInvocationWire(wire);
                     CompositeContext oldContext = CurrentCompositeContext.getContext();
                     try {
-                        AsyncJavaTargetInvoker.BINDER.setContext(currentContext);
+                        BINDER.setContext(currentContext);
                         // REVIEW response must be null for one-way and non-null for callback
                         AsyncJavaTargetInvoker.super.invokeTarget(payload);
                     } catch (Exception e) {
@@ -79,7 +95,7 @@
                         // monitor.executionError(e);
                         e.printStackTrace();
                     } finally {
-                        AsyncJavaTargetInvoker.BINDER.setContext(oldContext);
+                        BINDER.setContext(oldContext);
                     }
                 }
             });
@@ -111,6 +127,20 @@
         invoker.monitor = this.monitor;
 
         return invoker;
+    }
+
+    /**
+     * Resolves the target service instance or returns a cached one
+     */
+    protected Object getInstance() throws TargetException {
+        if (!cacheable) {
+            return component.getTargetInstance();
+        } else {
+            if (target == null) {
+                target = component.getTargetInstance();
+            }
+            return target;
+        }
     }
 
     private static class ContextBinder extends SCA {

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaAtomicComponent.java Fri Aug  4 12:16:20 2006
@@ -16,21 +16,26 @@
  */
 package org.apache.tuscany.core.implementation.java;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 
-import org.osoa.sca.annotations.OneWay;
-
 import org.apache.tuscany.spi.ObjectFactory;
-import org.apache.tuscany.spi.component.ComponentRuntimeException;
 import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.component.TargetNotFoundException;
 import org.apache.tuscany.spi.services.work.WorkScheduler;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.RuntimeWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 
 import org.apache.tuscany.core.implementation.PojoAtomicComponent;
 import org.apache.tuscany.core.implementation.PojoConfiguration;
+import org.apache.tuscany.core.injection.CallbackWireObjectFactory;
+import org.apache.tuscany.core.injection.FieldInjector;
+import org.apache.tuscany.core.injection.Injector;
+import org.apache.tuscany.core.injection.InvalidAccessorException;
+import org.apache.tuscany.core.injection.MethodInjector;
 import org.apache.tuscany.core.injection.WireObjectFactory;
 import org.apache.tuscany.core.policy.async.AsyncMonitor;
 
@@ -49,6 +54,7 @@
         super(name, configuration);
         this.scope = configuration.getScopeContainer().getScope();
         this.workScheduler = scheduler;
+        this.monitor = monitor;
     }
 
     public Object getServiceInstance(String name) throws TargetException {
@@ -72,27 +78,42 @@
     }
 
     public TargetInvoker createTargetInvoker(String serviceName, Method operation) {
-        TargetInvoker targetInvoker;
-        if (operation.getAnnotation(OneWay.class) != null) {
-            if (workScheduler == null) {
-                // TODO Make sure appropriate exception is thrown
-                throw new ComponentRuntimeException("Need an instance of workScheduler");
-            }
-            //REVIEW we should set required as an autowire attribute and have the runtime perform this check
-            if (monitor == null) {
-                // TODO Make sure appropriate exception is thrown
-                // throw new ComponentRuntimeException("Need an instance of monitor");
-            }
-            targetInvoker = new AsyncJavaTargetInvoker(operation, this, workScheduler, monitor);
-        } else {
-            targetInvoker = new JavaTargetInvoker(operation, this);
-        }
-        return targetInvoker;
+        return new JavaTargetInvoker(operation, this);
+    }
+
+    public TargetInvoker createAsyncTargetInvoker(String serviceName, Method operation, OutboundWire wire) {
+        return new AsyncJavaTargetInvoker(operation, wire, this, workScheduler, monitor, workContext);
+    }
 
+    protected void onServiceWire(InboundWire wire) {
+        String name = wire.getCallbackReferenceName();
+        if (name == null) {
+            // It's ok not to have one, we just do nothing
+            return;
+        }
+        Member member = callbackSites.get(name);
+        if (member != null) {
+            injectors.add(createCallbackInjector(member));
+        }
+    }
 
+    protected Injector createCallbackInjector(Member member) {
+        if (member instanceof Field) {
+            Field field = (Field) member;
+            ObjectFactory<?> factory = new CallbackWireObjectFactory(field.getType(), wireService);
+            return new FieldInjector(field, factory);
+        } else if (member instanceof Method) {
+            Method method = (Method) member;
+            ObjectFactory<?> factory = new CallbackWireObjectFactory(method.getParameterTypes()[0], wireService);
+            return new MethodInjector(method, factory);
+        } else {
+            InvalidAccessorException e = new InvalidAccessorException("Member must be a field or method");
+            e.setIdentifier(member.getName());
+            throw e;
+        }
     }
 
-    protected ObjectFactory<?> createWireFactory(OutboundWire wire) {
+    protected ObjectFactory<?> createWireFactory(RuntimeWire wire) {
         return new WireObjectFactory(wire, wireService);
     }
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java Fri Aug  4 12:16:20 2006
@@ -27,18 +27,19 @@
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.ComponentBuilderExtension;
 import org.apache.tuscany.spi.model.ComponentDefinition;
-import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.ReferenceTarget;
 import org.apache.tuscany.spi.model.Scope;
-import org.apache.tuscany.spi.model.ServiceDefinition;
 import org.apache.tuscany.spi.wire.InboundInvocationChain;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundInvocationChain;
 import org.apache.tuscany.spi.wire.OutboundWire;
 
 import org.apache.tuscany.core.implementation.ConstructorDefinition;
+import org.apache.tuscany.core.implementation.JavaMappedCallback;
 import org.apache.tuscany.core.implementation.JavaMappedProperty;
 import org.apache.tuscany.core.implementation.JavaMappedReference;
+import org.apache.tuscany.core.implementation.JavaMappedService;
+import org.apache.tuscany.core.implementation.JavaServiceContract;
 import org.apache.tuscany.core.implementation.PojoComponentType;
 import org.apache.tuscany.core.implementation.PojoConfiguration;
 import org.apache.tuscany.core.injection.MethodEventInvoker;
@@ -69,7 +70,7 @@
                                     ComponentDefinition<JavaImplementation> definition,
                                     DeploymentContext deployment)
         throws BuilderConfigException {
-        PojoComponentType<ServiceDefinition, JavaMappedReference, JavaMappedProperty<?>> componentType =
+        PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> componentType =
             definition.getImplementation().getComponentType();
 
         PojoConfiguration configuration = new PojoConfiguration();
@@ -95,7 +96,7 @@
         }
 
         configuration.setWireService(wireService);
-
+        configuration.setWorkContext(workContext);
         // setup property injection sites
         for (JavaMappedProperty<?> property : componentType.getProperties().values()) {
             configuration.addPropertySite(property.getName(), property.getMember());
@@ -127,12 +128,20 @@
             }
         }
 
-        for (ServiceDefinition service : componentType.getServices().values()) {
+        for (JavaMappedService service : componentType.getServices().values()) {
+            // setup callback injection sites
+            JavaMappedCallback callback = service.getCallbackReference();
+            if (callback != null) {
+                // Only if there is a callback reference in the service
+                configuration.addCallbackSite(callback.getName(), callback.getMember());
+            }
             component.addInboundWire(createWire(service));
         }
+        
         for (ReferenceTarget reference : definition.getReferenceTargets().values()) {
             Map<String, JavaMappedReference> references = componentType.getReferences();
-            OutboundWire wire = createWire(reference, references.get(reference.getReferenceName()));
+            JavaMappedReference mappedReference = references.get(reference.getReferenceName());
+            OutboundWire wire = createWire(reference, mappedReference);
             component.addOutboundWire(wire);
         }
         return component;
@@ -140,7 +149,7 @@
 
 
     @SuppressWarnings("unchecked")
-    private OutboundWire createWire(ReferenceTarget reference, ReferenceDefinition def) {
+    private OutboundWire createWire(ReferenceTarget reference, JavaMappedReference def) {
         //TODO multiplicity
         if (reference.getTargets().size() != 1) {
             throw new UnsupportedOperationException();
@@ -155,11 +164,27 @@
             OutboundInvocationChain chain = new OutboundInvocationChainImpl(method);
             wire.addInvocationChain(method, chain);
         }
+        // FIXME Using JavaServiceContract for now; this may be ok, but if it's not, then getCallbackClass
+        //       will need to be promoted to ServiceContract
+        JavaServiceContract jsc = (JavaServiceContract) def.getServiceContract();
+        Class<?> callbackInterface = jsc.getCallbackClass();
+        if (callbackInterface != null) {
+            wire.setCallbackInterface(callbackInterface);
+            for (Method callbackMethod : callbackInterface.getMethods()) {
+                InboundInvocationChain callbackTargetChain = new InboundInvocationChainImpl(callbackMethod);
+                OutboundInvocationChain callbackSourceChain = new OutboundInvocationChainImpl(callbackMethod);
+                // TODO handle policy
+                //TODO statement below could be cleaner
+                callbackTargetChain.addInterceptor(new InvokerInterceptor());
+                wire.addTargetCallbackInvocationChain(callbackMethod, callbackTargetChain);
+                wire.addSourceCallbackInvocationChain(callbackMethod, callbackSourceChain);
+            }
+        }
         return wire;
     }
 
     @SuppressWarnings("unchecked")
-    private InboundWire createWire(ServiceDefinition service) {
+    private InboundWire createWire(JavaMappedService service) {
         Class<?> interfaze = service.getServiceContract().getInterfaceClass();
         InboundWire wire = new InboundWireImpl();
         wire.setBusinessInterface(interfaze);
@@ -170,6 +195,13 @@
             //TODO statement below could be cleaner
             chain.addInterceptor(new InvokerInterceptor());
             wire.addInvocationChain(method, chain);
+        }
+        // FIXME Using JavaServiceContract for now; this may be ok, but if it's not, then getCallbackClass
+        //       will need to be promoted to ServiceContract
+        JavaServiceContract jsc = (JavaServiceContract) service.getServiceContract();
+        Class<?> callbackInterface = jsc.getCallbackClass();
+        if (callbackInterface != null) {
+            wire.setCallbackReferenceName(service.getCallbackReference().getName());
         }
         return wire;
     }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java Fri Aug  4 12:16:20 2006
@@ -41,9 +41,10 @@
 import org.apache.tuscany.core.implementation.JavaServiceContract;
 import org.apache.tuscany.core.implementation.PojoComponentType;
 import org.apache.tuscany.core.implementation.ProcessingException;
-import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.annotationsDefined;
 import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.areUnique;
 import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.createService;
+import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.injectionAnnotationsPresent;
+import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.processCallback;
 import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.processParam;
 import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllInterfaces;
 import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllPublicAndProtectedFields;
@@ -210,7 +211,7 @@
         if (!explict) {
             // the constructor wasn't defined by an annotation, so check to see if any of the params have an annotation
             // which we can impute as explicitly defining the constructor, e.g. @Property, @Reference, or @Autowire
-            explict = annotationsDefined(annotations);
+            explict = injectionAnnotationsPresent(annotations);
         }
         if (explict) {
             for (int i = 0; i < params.length; i++) {
@@ -253,7 +254,6 @@
         }
     }
 
-
     /**
      * Returns true if the union of the given collections of properties and references have unique Java types
      */
@@ -377,7 +377,8 @@
      * @param member    the injection site the reference maps to
      * @param paramType the service interface of the reference
      */
-    private JavaMappedReference createReference(String name, Member member, Class<?> paramType) {
+    private JavaMappedReference createReference(String name, Member member, Class<?> paramType)
+        throws IllegalCallbackException {
         JavaMappedReference reference = new JavaMappedReference();
         reference.setName(name);
         reference.setMember(member);
@@ -386,6 +387,7 @@
         String interfaceName = getBaseName(paramType);
         contract.setInterfaceName(interfaceName);
         contract.setInterfaceClass(paramType);
+        processCallback(paramType, contract);
         reference.setServiceContract(contract);
         return reference;
     }
@@ -418,7 +420,7 @@
     private void calculateServiceInterface(
         Class<?> clazz,
         PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
-        Set<Method> methods) {
+        Set<Method> methods) throws IllegalCallbackException {
         List<Method> nonPropRefMethods = new ArrayList<Method>();
         //Map<String, JavaMappedService> services = type.getServices();
         Map<String, JavaMappedReference> references = type.getReferences();

Added: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java?rev=428847&view=auto
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java (added)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java Fri Aug  4 12:16:20 2006
@@ -0,0 +1,24 @@
+package org.apache.tuscany.core.implementation.processor;
+
+/**
+ * Denotes an illegal callback definition
+ *
+ * @version $Rev$ $Date$
+ */
+
+public class IllegalCallbackException extends IllegalServiceDefinitionException {
+    public IllegalCallbackException() {
+    }
+
+    public IllegalCallbackException(String message) {
+        super(message);
+    }
+
+    public IllegalCallbackException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public IllegalCallbackException(Throwable cause) {
+        super(cause);
+    }
+}

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

Propchange: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/IllegalCallbackException.java
------------------------------------------------------------------------------
    svn:keywords = Rev,Date

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ProcessorUtils.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ProcessorUtils.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ProcessorUtils.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ProcessorUtils.java Fri Aug  4 12:16:20 2006
@@ -46,7 +46,7 @@
     /**
      * Convenience method for creating a mapped service from the given interface
      */
-    public static JavaMappedService createService(Class<?> interfaze) {
+    public static JavaMappedService createService(Class<?> interfaze) throws IllegalCallbackException {
         JavaMappedService service = new JavaMappedService();
         service.setName(JavaIntrospectionHelper.getBaseName(interfaze));
         service.setRemotable(interfaze.getAnnotation(Remotable.class) != null);
@@ -63,14 +63,31 @@
                 contract.setInteractionScope(InteractionScope.NONCONVERSATIONAL);
             }
         }
+        processCallback(interfaze, contract);
+        service.setServiceContract(contract);
+        return service;
+    }
+
+    /**
+     * Processes the callback contract for a given interface type
+     *
+     * @param interfaze the interface type to examine
+     * @param contract  the service contract the callback is associated wth
+     * @throws IllegalCallbackException
+     */
+    public static void processCallback(Class<?> interfaze, JavaServiceContract contract)
+        throws IllegalCallbackException {
         Callback callback = interfaze.getAnnotation(Callback.class);
         if (callback != null && !Void.class.equals(callback.value())) {
             Class<?> callbackClass = callback.value();
             contract.setCallbackClass(callbackClass);
             contract.setCallbackName(JavaIntrospectionHelper.getBaseName(callbackClass));
+        } else if (callback != null && Void.class.equals(callback.value())) {
+            IllegalCallbackException e =
+                new IllegalCallbackException("Callback annotation must specify an interface on service type");
+            e.setIdentifier(interfaze.getName());
+            throw e;
         }
-        service.setServiceContract(contract);
-        return service;
     }
 
     /**
@@ -160,7 +177,10 @@
         }
     }
 
-    public static boolean annotationsDefined(Annotation[][] annots) {
+    /**
+     * Returns true if {@link @Autowire}, {@link @Property}, or {@link @Reference} are present in the given array
+     */
+    public static boolean injectionAnnotationsPresent(Annotation[][] annots) {
         for (Annotation[] annotations : annots) {
             for (Annotation annotation : annotations) {
                 Class<? extends Annotation> annotType = annotation.annotationType();
@@ -174,6 +194,19 @@
         return false;
     }
 
+    /**
+     * Processes autowire metadata for a constructor parameter
+     *
+     * @param annot            the autowire annotation
+     * @param constructorNames the parameter names as specified in an {@link org.osoa.sca.annotations.Constructor}
+     *                         annotation
+     * @param pos              the position of the parameter in the constructor's parameter list
+     * @param param            the parameter type
+     * @param type             the component type associated with the implementation being processed
+     * @param injectionNames   the collection of injection names to update
+     * @throws InvalidAutowireException
+     * @throws InvalidConstructorException
+     */
     private static void processAutowire(Annotation annot, String[] constructorNames,
                                         int pos,
                                         Class<?> param,
@@ -210,6 +243,18 @@
         addName(injectionNames, pos, name);
     }
 
+    /**
+     * Processes parameter metadata for a constructor parameter
+     *
+     * @param annot            the parameter annotation
+     * @param constructorNames the parameter names as specified in an {@link org.osoa.sca.annotations.Constructor}
+     *                         annotation
+     * @param pos              the position of the parameter in the constructor's parameter list
+     * @param type             the component type associated with the implementation being processed
+     * @param param            the parameter type
+     * @param explicitNames    the collection of injection names to update
+     * @throws ProcessingException
+     */
     private static void processProperty(Annotation annot,
                                         String[] constructorNames,
                                         int pos,
@@ -246,6 +291,18 @@
         addName(explicitNames, pos, name);
     }
 
+    /**
+     * Processes reference metadata for a constructor parameter
+     *
+     * @param annot            the parameter annotation
+     * @param constructorNames the parameter names as specified in an {@link org.osoa.sca.annotations.Constructor}
+     *                         annotation
+     * @param pos              the position of the parameter in the constructor's parameter list
+     * @param type             the component type associated with the implementation being processed
+     * @param param            the parameter type
+     * @param explicitNames    the collection of injection names to update
+     * @throws ProcessingException
+     */
     private static void processReference(Annotation annot, String[] constructorNames,
                                          int pos,
                                          PojoComponentType<JavaMappedService, JavaMappedReference,

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java Fri Aug  4 12:16:20 2006
@@ -1,5 +1,7 @@
 package org.apache.tuscany.core.implementation.processor;
 
+import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.processCallback;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Constructor;
@@ -15,6 +17,7 @@
 import org.apache.tuscany.core.implementation.ProcessingException;
 import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getBaseName;
 import static org.apache.tuscany.core.util.JavaIntrospectionHelper.toPropertyName;
+
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
@@ -70,6 +73,7 @@
         contract.setInterfaceClass(interfaceType);
         reference.setServiceContract(contract);
         type.getReferences().put(name, reference);
+        processCallback(interfaceType, contract);
     }
 
     public void visitField(CompositeComponent<?> parent, Field field,
@@ -106,6 +110,8 @@
         contract.setInterfaceClass(interfaceType);
         reference.setServiceContract(contract);
         type.getReferences().put(name, reference);
+        processCallback(interfaceType, contract);
+
     }
 
     public void visitConstructor(CompositeComponent<?> parent, Constructor<?> constructor,
@@ -113,5 +119,7 @@
                                  DeploymentContext context) throws ProcessingException {
         
     }
+
+
 
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java Fri Aug  4 12:16:20 2006
@@ -13,37 +13,43 @@
  */
 package org.apache.tuscany.core.implementation.processor;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.Set;
 
+import org.osoa.sca.annotations.Callback;
 import org.osoa.sca.annotations.Remotable;
 
+import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+
 import org.apache.tuscany.core.implementation.ImplementationProcessorSupport;
+import org.apache.tuscany.core.implementation.JavaMappedCallback;
 import org.apache.tuscany.core.implementation.JavaMappedProperty;
 import org.apache.tuscany.core.implementation.JavaMappedReference;
 import org.apache.tuscany.core.implementation.JavaMappedService;
+import org.apache.tuscany.core.implementation.JavaServiceContract;
 import org.apache.tuscany.core.implementation.PojoComponentType;
 import org.apache.tuscany.core.implementation.ProcessingException;
 import static org.apache.tuscany.core.implementation.processor.ProcessorUtils.createService;
-import org.apache.tuscany.core.util.JavaIntrospectionHelper;
-import org.apache.tuscany.spi.component.CompositeComponent;
-import org.apache.tuscany.spi.deployer.DeploymentContext;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllInterfaces;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.toPropertyName;
 
 /**
  * Processes an {@link org.osoa.sca.annotations.Service} annotation and updates the component type with corresponding
- * {@link JavaMappedService}s
+ * {@link JavaMappedService}s. Also processes related {@link org.osoa.sca.annotations.Callback} annotations.
  *
  * @version $Rev$ $Date$
  */
 public class ServiceProcessor extends ImplementationProcessorSupport {
+
     public void visitClass(CompositeComponent<?> parent, Class<?> clazz,
                            PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
-                           DeploymentContext context)
-        throws ProcessingException {
+                           DeploymentContext context) throws ProcessingException {
         org.osoa.sca.annotations.Service annotation = clazz.getAnnotation(org.osoa.sca.annotations.Service.class);
         if (annotation == null) {
             // scan intefaces for remotable
-            //TODO also service?
-            Set<Class> interfaces = JavaIntrospectionHelper.getAllInterfaces(clazz);
+            Set<Class> interfaces = getAllInterfaces(clazz);
             for (Class<?> interfaze : interfaces) {
                 if (interfaze.getAnnotation(Remotable.class) != null) {
                     JavaMappedService service = createService(interfaze);
@@ -72,5 +78,61 @@
             type.getServices().put(service.getName(), service);
         }
     }
+
+
+    public void visitMethod(CompositeComponent<?> parent,
+                            Method method,
+                            PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+                            DeploymentContext context) throws ProcessingException {
+
+        Callback annotation = method.getAnnotation(Callback.class);
+        if (annotation == null) {
+            return;
+        }
+        if (method.getParameterTypes().length != 1) {
+            IllegalCallbackException e = new IllegalCallbackException("Setter must have one parameter");
+            e.setIdentifier(method.toString());
+            throw e;
+        }
+        String name = toPropertyName(method.getName());
+        JavaMappedService callbackService = null;
+        Class<?> callbackClass = method.getParameterTypes()[0];
+        for (JavaMappedService service : type.getServices().values()) {
+            JavaServiceContract serviceContract = (JavaServiceContract) service.getServiceContract();
+            if (serviceContract.getCallbackClass().equals(callbackClass)) {
+                callbackService = service;
+            }
+        }
+        if (callbackService == null) {
+            throw new IllegalCallbackException("Callback type does not match a service callback interface");
+        }
+        JavaMappedCallback callback = new JavaMappedCallback(name, method, callbackClass);
+        callbackService.setCallbackReference(callback);
+    }
+
+    public void visitField(CompositeComponent<?> parent, Field field,
+                           PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+                           DeploymentContext context) throws ProcessingException {
+
+        Callback annotation = field.getAnnotation(Callback.class);
+        if (annotation == null) {
+            return;
+        }
+        String name = field.getName();
+        JavaMappedService callbacksService = null;
+        Class<?> callbackClass = field.getType();
+        for (JavaMappedService service : type.getServices().values()) {
+            JavaServiceContract serviceContract = (JavaServiceContract) service.getServiceContract();
+            if (serviceContract.getCallbackClass().equals(callbackClass)) {
+                callbacksService = service;
+            }
+        }
+        if (callbacksService == null) {
+            throw new IllegalCallbackException("Callback type does not match a service callback interface");
+        }
+        JavaMappedCallback callback = new JavaMappedCallback(name, field, callbackClass);
+        callbacksService.setCallbackReference(callback);
+    }
+
 
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentImpl.java Fri Aug  4 12:16:20 2006
@@ -5,7 +5,7 @@
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.component.TargetException;
 import org.apache.tuscany.spi.model.Scope;
-import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.RuntimeWire;
 import org.apache.tuscany.spi.wire.TargetInvoker;
 
 import org.apache.tuscany.core.implementation.PojoAtomicComponent;
@@ -36,7 +36,7 @@
         throw new UnsupportedOperationException();
     }
 
-    protected ObjectFactory<?> createWireFactory(OutboundWire wire) {
+    protected ObjectFactory<?> createWireFactory(RuntimeWire wire) {
         assert wire instanceof SystemOutboundWire : "wire must be an instance of " + SystemOutboundWire.class.getName();
         SystemOutboundWire systemWire = (SystemOutboundWire) wire;
         return new SystemWireObjectFactory(systemWire);

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java Fri Aug  4 12:16:20 2006
@@ -99,4 +99,8 @@
     public TargetInvoker createTargetInvoker(String serviceName, Method operation) {
         throw new UnsupportedOperationException();
     }
+
+    public TargetInvoker createAsyncTargetInvoker(String serviceName, Method operation, OutboundWire wire) {
+        throw new UnsupportedOperationException();
+    }
 }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemInboundWireImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemInboundWireImpl.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemInboundWireImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemInboundWireImpl.java Fri Aug  4 12:16:20 2006
@@ -82,6 +82,14 @@
         throw new UnsupportedOperationException();
     }
 
+    public String getCallbackReferenceName() {
+        return null;
+    }
+
+    public void setCallbackReferenceName(String callbackReferenceName) {
+        throw new UnsupportedOperationException();
+    }
+
     public boolean isOptimizable() {
         return true;  // system wires are always optimizable
     }

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundAutowire.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundAutowire.java?rev=428847&r1=428846&r2=428847&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundAutowire.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/implementation/system/wire/SystemOutboundAutowire.java Fri Aug  4 12:16:20 2006
@@ -6,6 +6,7 @@
 
 import org.apache.tuscany.spi.QualifiedName;
 import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.wire.InboundInvocationChain;
 import org.apache.tuscany.spi.wire.InboundWire;
 import org.apache.tuscany.spi.wire.OutboundInvocationChain;
 
@@ -59,6 +60,23 @@
         return new Class[0];
     }
 
+    @SuppressWarnings("unchecked")
+    public void setCallbackInterface(Class<T> interfaze) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Class<T> getCallbackInterface() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void addCallbackInterface(Class<?> claz) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Class[] getImplementedCallbackInterfaces() {
+        throw new UnsupportedOperationException();
+    }
+
     public void setTargetWire(InboundWire<T> wire) {
         throw new UnsupportedOperationException();
     }
@@ -73,6 +91,30 @@
 
     public void addInvocationChains(Map chains) {
         throw new UnsupportedOperationException();
+    }
+
+    public Map<Method, InboundInvocationChain> getTargetCallbackInvocationChains() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void addTargetCallbackInvocationChains(Map<Method, InboundInvocationChain> chains) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void addTargetCallbackInvocationChain(Method method, InboundInvocationChain chain) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Map<Method, OutboundInvocationChain> getSourceCallbackInvocationChains() {
+        return null;
+    }
+
+    public void addSourceCallbackInvocationChains(Map<Method, OutboundInvocationChain> chains) {
+
+    }
+
+    public void addSourceCallbackInvocationChain(Method method, OutboundInvocationChain chain) {
+
     }
 
     public void addInterface(Class claz) {



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