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