You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/03/28 18:03:04 UTC
svn commit: r523381 [1/4] - in /incubator/tuscany/java/sca/kernel:
core/src/main/java/org/apache/tuscany/core/bootstrap/
core/src/main/java/org/apache/tuscany/core/builder/
core/src/main/java/org/apache/tuscany/core/deployer/
core/src/main/java/org/apa...
Author: rfeng
Date: Wed Mar 28 09:03:01 2007
New Revision: 523381
URL: http://svn.apache.org/viewvc?view=rev&rev=523381
Log:
Improve the java introspection by consolidating the constructor parameter processing and fix a few inconsistencies against the spec
Added:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java (with props)
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/AbstractConstructorProcessorTest.java (with props)
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessorTestCase.java (with props)
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/JavaElement.java (with props)
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/Parameter.java (with props)
Removed:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessorExtensibilityTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceUniqueTestCase.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/AbstractPropertyProcessor.java
incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/implementation/java/AbstractPropertyProcessorTestCase.java
Modified:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/MonitorProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/PropertyProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ResourceProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ServiceProcessor.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/builder/SystemComponentBuilder.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/util/JavaIntrospectionHelper.java
incubator/tuscany/java/sca/kernel/core/src/main/resources/org/apache/tuscany/core/implementation.scdl
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/AllowsPassByReferenceProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorPropertyTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorReferenceTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorResourceTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/HeuristicAndPropertyTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/HeuristicConstructorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/HeutisticExtensibleConstructorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/MonitorProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/PropertyProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ReferenceProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ServiceCallbackTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ServiceProcessorTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/loader/SystemComponentTypeLoaderTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/IntrospectionRegistryIntegrationTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/services/deployment/contribution/JavaContributionProcessorTestCase.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/ConstructorDefinition.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/ImplementationProcessor.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/ImplementationProcessorExtension.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/ImplementationProcessorService.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/JavaMappedComponentType.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/implementation/java/PojoComponentType.java
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java Wed Mar 28 09:03:01 2007
@@ -18,16 +18,14 @@
*/
package org.apache.tuscany.core.bootstrap;
+import org.apache.tuscany.core.resolver.AutowireResolver;
+import org.apache.tuscany.host.MonitorFactory;
import org.apache.tuscany.spi.builder.Connector;
import org.apache.tuscany.spi.component.ScopeRegistry;
-import org.apache.tuscany.spi.component.WorkContext;
import org.apache.tuscany.spi.deployer.Deployer;
import org.apache.tuscany.spi.implementation.java.Introspector;
import org.apache.tuscany.spi.loader.Loader;
import org.apache.tuscany.spi.loader.PropertyObjectFactory;
-
-import org.apache.tuscany.core.resolver.AutowireResolver;
-import org.apache.tuscany.host.MonitorFactory;
/**
* Interface that abstracts the process used to create a running Tuscany system. Implementation of this may provide
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java Wed Mar 28 09:03:01 2007
@@ -20,25 +20,12 @@
import javax.xml.stream.XMLInputFactory;
-import org.apache.tuscany.spi.builder.Builder;
-import org.apache.tuscany.spi.builder.Connector;
-import org.apache.tuscany.spi.component.ComponentManager;
-import org.apache.tuscany.spi.component.ScopeContainerMonitor;
-import org.apache.tuscany.spi.component.ScopeRegistry;
-import org.apache.tuscany.spi.deployer.Deployer;
-import org.apache.tuscany.spi.extension.LoaderExtension;
-import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
-import org.apache.tuscany.spi.implementation.java.Introspector;
-import org.apache.tuscany.spi.loader.LoaderRegistry;
-import org.apache.tuscany.spi.loader.PropertyObjectFactory;
-
import org.apache.tuscany.core.binding.local.LocalBindingBuilder;
import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
import org.apache.tuscany.core.binding.local.LocalBindingLoader;
import org.apache.tuscany.core.builder.BuilderRegistryImpl;
-import org.apache.tuscany.core.component.scope.ScopeRegistryImpl;
import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
+import org.apache.tuscany.core.component.scope.ScopeRegistryImpl;
import org.apache.tuscany.core.deployer.DeployerImpl;
import org.apache.tuscany.core.idl.java.InterfaceJavaLoader;
import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
@@ -49,7 +36,6 @@
import org.apache.tuscany.core.implementation.processor.DestroyProcessor;
import org.apache.tuscany.core.implementation.processor.EagerInitProcessor;
import org.apache.tuscany.core.implementation.processor.HeuristicPojoProcessor;
-import org.apache.tuscany.core.implementation.processor.ImplementationProcessorServiceImpl;
import org.apache.tuscany.core.implementation.processor.InitProcessor;
import org.apache.tuscany.core.implementation.processor.MonitorProcessor;
import org.apache.tuscany.core.implementation.processor.PropertyProcessor;
@@ -73,6 +59,18 @@
import org.apache.tuscany.core.property.PropertyObjectFactoryImpl;
import org.apache.tuscany.core.resolver.AutowireResolver;
import org.apache.tuscany.host.MonitorFactory;
+import org.apache.tuscany.spi.builder.Builder;
+import org.apache.tuscany.spi.builder.Connector;
+import org.apache.tuscany.spi.component.ComponentManager;
+import org.apache.tuscany.spi.component.ScopeContainerMonitor;
+import org.apache.tuscany.spi.component.ScopeRegistry;
+import org.apache.tuscany.spi.deployer.Deployer;
+import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
+import org.apache.tuscany.spi.implementation.java.ImplementationProcessorExtension;
+import org.apache.tuscany.spi.implementation.java.Introspector;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
/**
* A default implementation of a Bootstrapper. Please see the documentation on the individual methods for how the
@@ -195,20 +193,28 @@
* @return a new Introspector
*/
public Introspector createIntrospector(JavaInterfaceProcessorRegistry registry) {
- ImplementationProcessorService service = new ImplementationProcessorServiceImpl(registry);
IntrospectionRegistryImpl.Monitor monitor = monitorFactory.getMonitor(IntrospectionRegistryImpl.Monitor.class);
IntrospectionRegistryImpl introspectionRegistry = new IntrospectionRegistryImpl(monitor);
- introspectionRegistry.registerProcessor(new ConstructorProcessor(service));
+ introspectionRegistry.registerProcessor(new ConstructorProcessor());
introspectionRegistry.registerProcessor(new DestroyProcessor());
introspectionRegistry.registerProcessor(new InitProcessor());
introspectionRegistry.registerProcessor(new EagerInitProcessor());
introspectionRegistry.registerProcessor(new ScopeProcessor());
- introspectionRegistry.registerProcessor(new PropertyProcessor(service));
- introspectionRegistry.registerProcessor(new ReferenceProcessor(registry));
+ introspectionRegistry.registerProcessor(new PropertyProcessor());
+ ImplementationProcessorExtension processor = new ReferenceProcessor();
+ processor.setInterfaceProcessorRegistry(registry);
+ processor.setRegistry(introspectionRegistry);
+ introspectionRegistry.registerProcessor(processor);
introspectionRegistry.registerProcessor(new ResourceProcessor());
- introspectionRegistry.registerProcessor(new ServiceProcessor(service));
- introspectionRegistry.registerProcessor(new HeuristicPojoProcessor(service));
- introspectionRegistry.registerProcessor(new MonitorProcessor(monitorFactory, service));
+ processor = new ServiceProcessor();
+ processor.setInterfaceProcessorRegistry(registry);
+ processor.setRegistry(introspectionRegistry);
+ introspectionRegistry.registerProcessor(processor);
+ processor = new HeuristicPojoProcessor();
+ processor.setInterfaceProcessorRegistry(registry);
+ processor.setRegistry(introspectionRegistry);
+ introspectionRegistry.registerProcessor(processor);
+ introspectionRegistry.registerProcessor(new MonitorProcessor(monitorFactory));
return introspectionRegistry;
}
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Wed Mar 28 09:03:01 2007
@@ -301,6 +301,7 @@
protected Wire createWire(URI sourceURI, URI targetUri, ServiceContract<?> contract, QName bindingType) {
Wire wire = new WireImpl(bindingType);
wire.setSourceContract(contract);
+ wire.setTargetContract(contract);
wire.setSourceUri(sourceURI);
wire.setTargetUri(targetUri);
for (Operation<?> operation : contract.getOperations().values()) {
@@ -381,4 +382,4 @@
return pReferrer == Scope.COMPOSITE && pReferee == Scope.SYSTEM;
}
}
-}
\ No newline at end of file
+}
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java Wed Mar 28 09:03:01 2007
@@ -22,6 +22,7 @@
import java.util.Collection;
import javax.xml.stream.XMLInputFactory;
+import org.osoa.sca.annotations.Constructor;
import org.osoa.sca.annotations.Reference;
import org.apache.tuscany.api.annotation.Monitor;
@@ -77,6 +78,7 @@
this.connector = connector;
}
+ @Constructor
public DeployerImpl() {
xmlFactory = XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory", getClass().getClassLoader());
}
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/IntrospectionRegistryImpl.java Wed Mar 28 09:03:01 2007
@@ -18,6 +18,9 @@
*/
package org.apache.tuscany.core.implementation;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllPublicAndProtectedFields;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllUniquePublicProtectedMethods;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -26,11 +29,13 @@
import java.util.Set;
import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.implementation.java.ConstructorDefinition;
import org.apache.tuscany.spi.implementation.java.ImplementationProcessor;
import org.apache.tuscany.spi.implementation.java.IntrospectionRegistry;
import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.Parameter;
import org.apache.tuscany.spi.implementation.java.PojoComponentType;
import org.apache.tuscany.spi.implementation.java.ProcessingException;
@@ -38,13 +43,13 @@
/**
* Default implementation of the <code>IntrospectionRegistry</code>
- *
+ *
* @version $Rev$ $Date$
*/
public class IntrospectionRegistryImpl implements IntrospectionRegistry {
private Monitor monitor;
- private List<ImplementationProcessor> cache = new ArrayList<ImplementationProcessor>();
+ private List<ImplementationProcessor> processors = new ArrayList<ImplementationProcessor>();
public IntrospectionRegistryImpl() {
}
@@ -60,39 +65,44 @@
public void registerProcessor(ImplementationProcessor processor) {
monitor.register(processor);
- cache.add(processor);
+ processors.add(processor);
}
public void unregisterProcessor(ImplementationProcessor processor) {
monitor.unregister(processor);
- cache.remove(processor);
+ processors.remove(processor);
}
public PojoComponentType introspect(Class<?> clazz,
- PojoComponentType<JavaMappedService, JavaMappedReference,
- JavaMappedProperty<?>> type,
- DeploymentContext context)
- throws ProcessingException {
- for (ImplementationProcessor processor : cache) {
+ PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+ DeploymentContext context) throws ProcessingException {
+ for (ImplementationProcessor processor : processors) {
processor.visitClass(clazz, type, context);
}
for (Constructor<?> constructor : clazz.getConstructors()) {
- for (ImplementationProcessor processor : cache) {
+ for (ImplementationProcessor processor : processors) {
processor.visitConstructor(constructor, type, context);
+ // Assuming the visitClass or visitConstructor will populate the type.getConstructors
+ ConstructorDefinition<?> definition = type.getConstructors().get(constructor);
+ if (definition != null) {
+ for (Parameter p : definition.getParameters()) {
+ processor.visitConstructorParameter(p, type, context);
+ }
+ }
}
}
- Set<Method> methods = JavaIntrospectionHelper.getAllUniquePublicProtectedMethods(clazz);
+ Set<Method> methods = getAllUniquePublicProtectedMethods(clazz);
for (Method method : methods) {
- for (ImplementationProcessor processor : cache) {
+ for (ImplementationProcessor processor : processors) {
processor.visitMethod(method, type, context);
}
}
- Set<Field> fields = JavaIntrospectionHelper.getAllPublicAndProtectedFields(clazz);
+ Set<Field> fields = getAllPublicAndProtectedFields(clazz);
for (Field field : fields) {
- for (ImplementationProcessor processor : cache) {
+ for (ImplementationProcessor processor : processors) {
processor.visitField(field, type, context);
}
}
@@ -102,7 +112,7 @@
visitSuperClass(superClass, type, context);
}
- for (ImplementationProcessor processor : cache) {
+ for (ImplementationProcessor processor : processors) {
processor.visitEnd(clazz, type, context);
}
return type;
@@ -110,10 +120,9 @@
private void visitSuperClass(Class<?> clazz,
PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
- DeploymentContext context)
- throws ProcessingException {
+ DeploymentContext context) throws ProcessingException {
if (!Object.class.equals(clazz)) {
- for (ImplementationProcessor processor : cache) {
+ for (ImplementationProcessor processor : processors) {
processor.visitSuperClass(clazz, type, context);
}
clazz = clazz.getSuperclass();
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java Wed Mar 28 09:03:01 2007
@@ -18,6 +18,7 @@
*/
package org.apache.tuscany.core.implementation;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
@@ -61,9 +62,12 @@
import org.apache.tuscany.core.injection.PojoObjectFactory;
/**
- * Base implementation of an {@link org.apache.tuscany.spi.component.AtomicComponent} whose type is a Java class
- *
- * @version $$Rev$$ $$Date$$
+ * Base implementation of an
+ * {@link org.apache.tuscany.spi.component.AtomicComponent} whose type is a Java
+ * class
+ *
+ * @version $$Rev$$ $$Date: 2007-03-19 22:08:36 -0700 (Mon, 19 Mar
+ * 2007) $$
*/
public abstract class PojoAtomicComponent extends AtomicComponentExtension implements ComponentContextProvider {
protected EventInvoker<Object> initInvoker;
@@ -85,13 +89,8 @@
private List<Class<?>> constructorParamTypes = new ArrayList<Class<?>>();
public PojoAtomicComponent(PojoConfiguration configuration) {
- super(configuration.getName(),
- configuration.getProxyService(),
- configuration.getWorkContext(),
- configuration.getGroupId(),
- configuration.getInitLevel(),
- configuration.getMaxIdleTime(),
- configuration.getMaxAge());
+ super(configuration.getName(), configuration.getProxyService(), configuration.getWorkContext(), configuration
+ .getGroupId(), configuration.getInitLevel(), configuration.getMaxIdleTime(), configuration.getMaxAge());
assert configuration.getInstanceFactory() != null : "Object factory was null";
initInvoker = configuration.getInitInvoker();
destroyInvoker = configuration.getDestroyInvoker();
@@ -101,13 +100,13 @@
constructorParamTypes = configuration.getConstructorParamTypes();
injectors = new ArrayList<Injector<Object>>();
referenceSites = configuration.getReferenceSite() != null ? configuration.getReferenceSite()
- : new HashMap<String, Member>();
+ : new HashMap<String, Member>();
propertySites = configuration.getPropertySites() != null ? configuration.getPropertySites()
- : new HashMap<String, Member>();
+ : new HashMap<String, Member>();
resourceSites = configuration.getResourceSites() != null ? configuration.getResourceSites()
- : new HashMap<String, Member>();
+ : new HashMap<String, Member>();
callbackSites = configuration.getCallbackSites() != null ? configuration.getCallbackSites()
- : new HashMap<String, Member>();
+ : new HashMap<String, Member>();
implementationClass = configuration.getImplementationClass();
componentContext = new ComponentContextImpl(this);
@@ -124,7 +123,8 @@
}
public boolean isOptimizable() {
- // stateless implementations that require a destroy callback cannot be optimized since the callback is
+ // stateless implementations that require a destroy callback cannot be
+ // optimized since the callback is
// performed by the JavaTargetInvoker
return !(getScope() == Scope.STATELESS && destroyInvoker != null);
}
@@ -147,9 +147,9 @@
}
public InstanceWrapper<?> createInstanceWrapper() throws ObjectCreationException {
-/* FIXME make this work
- return instanceFactory2.newInstance();
-*/
+ /*
+ * FIXME make this work return instanceFactory2.newInstance();
+ */
Object instance = createInstance();
return new ReflectiveInstanceWrapper<Object>(instance, initInvoker, destroyInvoker);
}
@@ -168,7 +168,7 @@
}
wireList.add(wire);
Member member = referenceSites.get(referenceName);
- if (member != null) {
+ if (member != null && !(member instanceof Constructor)) {
injectors.add(createInjector(member, wire));
}
// cycle through constructor param names as well
@@ -179,7 +179,7 @@
break;
}
}
- //TODO error if ref not set on constructor or ref site
+ // TODO error if ref not set on constructor or ref site
}
@@ -228,16 +228,17 @@
for (Map.Entry<String, Member> entry : callbackSites.entrySet()) {
List<Wire> wires = callBackwires.get(entry.getKey());
if (wires == null) {
- // this can happen when there are no client wires to a component that has a callback
+ // this can happen when there are no client wires to a
+ // component that has a callback
continue;
}
Member member = entry.getValue();
if (member instanceof Field) {
- Field field = (Field) member;
+ Field field = (Field)member;
ObjectFactory<?> factory = new CallbackWireObjectFactory(field.getType(), proxyService, wires);
injectors.add(new FieldInjector<Object>(field, factory));
} else if (member instanceof Method) {
- Method method = (Method) member;
+ Method method = (Method)member;
Class<?> type = method.getParameterTypes()[0];
ObjectFactory<?> factory = new CallbackWireObjectFactory(type, proxyService, wires);
injectors.add(new MethodInjector<Object>(method, factory));
@@ -253,9 +254,9 @@
public void addPropertyFactory(String name, ObjectFactory<?> factory) {
Member member = propertySites.get(name);
if (member instanceof Field) {
- injectors.add(new FieldInjector<Object>((Field) member, factory));
+ injectors.add(new FieldInjector<Object>((Field)member, factory));
} else if (member instanceof Method) {
- injectors.add(new MethodInjector<Object>((Method) member, factory));
+ injectors.add(new MethodInjector<Object>((Method)member, factory));
}
// cycle through constructor param names as well
for (int i = 0; i < constructorParamNames.size(); i++) {
@@ -265,7 +266,7 @@
break;
}
}
- //FIXME throw an error if no injection site found
+ // FIXME throw an error if no injection site found
propertyFactories.put(name, factory);
}
@@ -273,9 +274,9 @@
public void addResourceFactory(String name, ObjectFactory<?> factory) {
Member member = resourceSites.get(name);
if (member instanceof Field) {
- injectors.add(new FieldInjector<Object>((Field) member, factory));
+ injectors.add(new FieldInjector<Object>((Field)member, factory));
} else if (member instanceof Method) {
- injectors.add(new MethodInjector<Object>((Method) member, factory));
+ injectors.add(new MethodInjector<Object>((Method)member, factory));
}
// cycle through constructor param names as well
for (int i = 0; i < constructorParamNames.size(); i++) {
@@ -285,15 +286,15 @@
break;
}
}
- //FIXME throw an error if no injection site found
+ // FIXME throw an error if no injection site found
}
public void addConversationIDFactory(Member member) {
ObjectFactory<String> convIDObjectFactory = new ConversationIDObjectFactory(workContext);
if (member instanceof Field) {
- injectors.add(new FieldInjector<Object>((Field) member, convIDObjectFactory));
+ injectors.add(new FieldInjector<Object>((Field)member, convIDObjectFactory));
} else if (member instanceof Method) {
- injectors.add(new MethodInjector<Object>((Method) member, convIDObjectFactory));
+ injectors.add(new MethodInjector<Object>((Method)member, convIDObjectFactory));
} else {
throw new InvalidAccessorException("Member must be a field or method", member.getName());
}
@@ -312,13 +313,15 @@
protected Injector<Object> createInjector(Member member, Wire wire) {
if (member instanceof Field) {
- Class<?> type = ((Field) member).getType();
+ Class<?> type = ((Field)member).getType();
ObjectFactory<?> factory = createWireFactory(type, wire);
- return new FieldInjector<Object>((Field) member, factory);
+ return new FieldInjector<Object>((Field)member, factory);
} else if (member instanceof Method) {
- Class<?> type = ((Method) member).getParameterTypes()[0];
+ Class<?> type = ((Method)member).getParameterTypes()[0];
ObjectFactory<?> factory = createWireFactory(type, wire);
- return new MethodInjector<Object>((Method) member, factory);
+ return new MethodInjector<Object>((Method)member, factory);
+ } else if (member instanceof Constructor) {
+ return null;
} else {
throw new InvalidAccessorException("Member must be a field or method", member.getName());
}
@@ -332,14 +335,14 @@
factories.add(createWireFactory(interfaceType, wire));
}
if (member instanceof Field) {
- Field field = (Field) member;
+ Field field = (Field)member;
if (field.getType().isArray()) {
return new FieldInjector<Object>(field, new ArrayMultiplicityObjectFactory(interfaceType, factories));
} else {
return new FieldInjector<Object>(field, new ListMultiplicityObjectFactory(factories));
}
} else if (member instanceof Method) {
- Method method = (Method) member;
+ Method method = (Method)member;
if (method.getParameterTypes()[0].isArray()) {
return new MethodInjector<Object>(method, new ArrayMultiplicityObjectFactory(interfaceType, factories));
} else {
@@ -389,7 +392,7 @@
}
public <B, R extends CallableReference<B>> R cast(B target) {
- return (R) proxyService.cast(target);
+ return (R)proxyService.cast(target);
}
protected abstract <B> ObjectFactory<B> createWireFactory(Class<B> interfaze, Wire wire);
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilder.java Wed Mar 28 09:03:01 2007
@@ -35,6 +35,7 @@
import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.Parameter;
import org.apache.tuscany.spi.implementation.java.PojoComponentType;
import org.apache.tuscany.spi.implementation.java.Resource;
import org.apache.tuscany.spi.model.ComponentDefinition;
@@ -118,10 +119,11 @@
Constructor<?> constr = ctorDef.getConstructor();
PojoObjectFactory<?> instanceFactory = new PojoObjectFactory(constr);
configuration.setInstanceFactory(instanceFactory);
- configuration.getConstructorParamNames().addAll(ctorDef.getInjectionNames());
- for (Class<?> clazz : constr.getParameterTypes()) {
- configuration.addConstructorParamType(clazz);
+ for (Parameter param : ctorDef.getParameters()) {
+ configuration.getConstructorParamNames().add(param.getName());
+ configuration.addConstructorParamType(param.getType());
}
+
configuration.setName(definition.getUri());
handleCallbackSites(componentType, configuration);
Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java?view=auto&rev=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java Wed Mar 28 09:03:01 2007
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.implementation.processor;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.tuscany.api.annotation.DataType;
+import org.apache.tuscany.core.util.JavaIntrospectionHelper;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.implementation.java.DuplicatePropertyException;
+import org.apache.tuscany.spi.implementation.java.IllegalPropertyException;
+import org.apache.tuscany.spi.implementation.java.ImplementationProcessorExtension;
+import org.apache.tuscany.spi.implementation.java.JavaElement;
+import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
+import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
+import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.Parameter;
+import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.implementation.java.ProcessingException;
+
+/**
+ * Base class for ImplementationProcessors that handle annotations that add
+ * Properties.
+ *
+ * @version $Rev$ $Date$
+ */
+public abstract class AbstractPropertyProcessor<A extends Annotation> extends ImplementationProcessorExtension {
+ private final Class<A> annotationClass;
+
+ protected AbstractPropertyProcessor(Class<A> annotationClass) {
+ this.annotationClass = annotationClass;
+ }
+
+ public void visitMethod(Method method,
+ PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+ DeploymentContext context) throws ProcessingException {
+ A annotation = method.getAnnotation(annotationClass);
+ if (annotation == null) {
+ return;
+ }
+
+ if (!Void.TYPE.equals(method.getReturnType())) {
+ throw new IllegalPropertyException("Method does not have void return type", method.toString());
+ }
+ Class[] paramTypes = method.getParameterTypes();
+ if (paramTypes.length != 1) {
+ throw new IllegalPropertyException("Method must have a single parameter", method.toString());
+ }
+
+ String name = getName(annotation);
+ if (name == null || "".equals(name)) {
+ name = method.getName();
+ if (name.startsWith("set")) {
+ name = JavaIntrospectionHelper.toPropertyName(method.getName());
+ }
+ }
+
+ Map<String, JavaMappedProperty<?>> properties = type.getProperties();
+ if (properties.containsKey(name)) {
+ throw new DuplicatePropertyException(name);
+ }
+
+ JavaElement element = new JavaElement(method, 0);
+ JavaMappedProperty<?> property = createProperty(name, element);
+
+ // add databinding available as annotations, as extensions
+ DataType propertyDataBinding = method.getAnnotation(DataType.class);
+ if (propertyDataBinding != null) {
+ property.getExtensions().put("databinding", propertyDataBinding.name());
+ }
+ initProperty(property, annotation, context);
+ properties.put(name, property);
+ }
+
+ public void visitField(Field field,
+ PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+ DeploymentContext context) throws ProcessingException {
+
+ A annotation = field.getAnnotation(annotationClass);
+ if (annotation == null) {
+ return;
+ }
+
+ String name = getName(annotation);
+ if (name == null) {
+ name = "";
+ }
+ if ("".equals(name) || name.equals(field.getType().getName())) {
+ name = field.getName();
+ }
+
+ Map<String, JavaMappedProperty<?>> properties = type.getProperties();
+ if (properties.containsKey(name)) {
+ throw new DuplicatePropertyException(name);
+ }
+
+ JavaElement element = new JavaElement(field);
+ JavaMappedProperty<?> property = createProperty(name, element);
+
+ // add databinding available as annotations, as extensions
+ DataType propertyDataBinding = field.getAnnotation(DataType.class);
+ if (propertyDataBinding != null) {
+ property.getExtensions().put("databinding", propertyDataBinding.name());
+ }
+
+ initProperty(property, annotation, context);
+ properties.put(name, property);
+ }
+
+ public void visitConstructorParameter(Parameter parameter,
+ PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
+ DeploymentContext context) throws ProcessingException {
+
+ Map<String, JavaMappedProperty<?>> properties = type.getProperties();
+ A annotation = parameter.getAnnotation(annotationClass);
+ if (annotation != null) {
+ String name = getName(annotation);
+ if (name == null) {
+ name = parameter.getType().getName();
+ }
+ if (!"".equals(name) && !"".equals(parameter.getName()) && !name.equals(parameter.getName())) {
+ throw new InvalidConstructorException("Mismatched property name: " + parameter);
+ }
+ if ("".equals(name) && "".equals(parameter.getName())) {
+ throw new InvalidPropertyException("Missing property name: " + parameter);
+ }
+ if ("".equals(name)) {
+ name = parameter.getName();
+ }
+
+ if (properties.containsKey(name)) {
+ throw new DuplicatePropertyException("Duplication property: " + name);
+ }
+ parameter.setName(name);
+ JavaMappedProperty<?> property = createProperty(name, parameter);
+ initProperty(property, annotation, context);
+ properties.put(name, property);
+ }
+ }
+
+ protected abstract String getName(A annotation);
+
+ protected <T> void initProperty(JavaMappedProperty<T> property, A annotation, DeploymentContext context)
+ throws ProcessingException {
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <T> JavaMappedProperty<T> createProperty(String name, JavaElement element) throws ProcessingException {
+
+ Class<?> baseType = getBaseType(element.getType(), element.getGenericType());
+ JavaMappedProperty<T> property = new JavaMappedProperty<T>(name, null, (Class<T>)baseType, (Member)element
+ .getAnchor());
+ Class<?> javaType = element.getType();
+ if (javaType.isArray() || Collection.class.isAssignableFrom(javaType)) {
+ property.setMany(true);
+ }
+ return property;
+
+ }
+
+}
Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/AbstractPropertyProcessor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessor.java?view=diff&rev=523381&r1=523380&r2=523381
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessor.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ConstructorProcessor.java Wed Mar 28 09:03:01 2007
@@ -18,35 +18,35 @@
*/
package org.apache.tuscany.core.implementation.processor;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
+import java.util.ArrayList;
import java.util.List;
-import org.osoa.sca.annotations.Reference;
-
import org.apache.tuscany.spi.deployer.DeploymentContext;
import org.apache.tuscany.spi.implementation.java.ConstructorDefinition;
import org.apache.tuscany.spi.implementation.java.ImplementationProcessorExtension;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.Parameter;
import org.apache.tuscany.spi.implementation.java.PojoComponentType;
import org.apache.tuscany.spi.implementation.java.ProcessingException;
-
/**
- * Handles processing of a constructor decorated with {@link org.osoa.sca.annotations.Constructor}
- *
+ * Handles processing of a constructor decorated with
+ * {@link org.osoa.sca.annotations.Constructor}
+ *
* @version $Rev$ $Date$
*/
@SuppressWarnings("unchecked")
public class ConstructorProcessor extends ImplementationProcessorExtension {
+ // private List<ImplementationProcessorExtension> paramProcessors = new
+ // ArrayList<ImplementationProcessorExtension>();
- private ImplementationProcessorService service;
-
- public ConstructorProcessor(@Reference ImplementationProcessorService service) {
- this.service = service;
+ public ConstructorProcessor() {
+ // paramProcessors.add(new ReferenceProcessor());
+ // paramProcessors.add(new PropertyProcessor());
+ // paramProcessors.add(new ResourceProcessor());
}
public <T> void visitClass(Class<T> clazz,
@@ -55,58 +55,46 @@
Constructor[] ctors = clazz.getConstructors();
boolean found = false;
for (Constructor constructor : ctors) {
+ ConstructorDefinition<?> definition = new ConstructorDefinition(constructor);
+ type.getConstructors().put(constructor, definition);
if (constructor.getAnnotation(org.osoa.sca.annotations.Constructor.class) != null) {
if (found) {
String name = constructor.getDeclaringClass().getName();
throw new DuplicateConstructorException("Multiple constructors marked with @Constructor", name);
}
found = true;
+ type.setConstructorDefinition(definition);
}
}
}
public <T> void visitConstructor(Constructor<T> constructor,
- PojoComponentType<JavaMappedService, JavaMappedReference,
- JavaMappedProperty<?>> type,
+ PojoComponentType<JavaMappedService, JavaMappedReference, JavaMappedProperty<?>> type,
DeploymentContext context) throws ProcessingException {
- org.osoa.sca.annotations.Constructor annotation =
- constructor.getAnnotation(org.osoa.sca.annotations.Constructor.class);
+ org.osoa.sca.annotations.Constructor annotation = constructor
+ .getAnnotation(org.osoa.sca.annotations.Constructor.class);
if (annotation == null) {
return;
}
ConstructorDefinition<?> definition = type.getConstructorDefinition();
- if (definition != null && !definition.getConstructor().equals(constructor)) {
- String name = constructor.getDeclaringClass().getName();
- throw new DuplicateConstructorException("Multiple constructor definitions found", name);
- } else if (definition == null) {
+ if (definition == null) {
definition = new ConstructorDefinition(constructor);
+ type.setConstructorDefinition(definition);
}
- Class<?>[] params = constructor.getParameterTypes();
- String[] names = annotation.value();
- Annotation[][] annotations = constructor.getParameterAnnotations();
- List<String> injectionNames = definition.getInjectionNames();
- for (int i = 0; i < params.length; i++) {
- Class<?> param = params[i];
- Annotation[] paramAnnotations = annotations[i];
- try {
- if (!service.processParam(param,
- constructor.getGenericParameterTypes()[i],
- paramAnnotations,
- names,
- i,
- type,
- injectionNames)) {
- String name = (i < names.length) ? names[i] : "";
- service.addName(injectionNames, i, name);
- }
- } catch (ProcessingException e) {
- e.setMember(constructor);
- throw e;
- }
+ Parameter[] parameters = definition.getParameters();
+ String[] value = annotation.value();
+ boolean isDefault = value.length == 0 || (value.length == 1 && "".equals(value[0]));
+ if (!isDefault && value.length != parameters.length) {
+ throw new InvalidConstructorException("Nubmer of names in @Constructor doesn't match the actual parameters");
}
- if (names.length != 0 && names[0].length() != 0 && names.length != params.length) {
- throw new InvalidConstructorException("Names in @Constructor do not match number of parameters");
+ for (int i = 0; i < parameters.length; i++) {
+ parameters[i].setName(i < value.length ? value[i] : "");
}
type.setConstructorDefinition(definition);
+ // for (ImplementationProcessorExtension processor : paramProcessors) {
+ // processor.setInterfaceProcessorRegistry(interfaceProcessorRegistry);
+ // processor.setRegistry(registry);
+ // processor.visitConstructor(constructor, type, context);
+ // }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org