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 2006/10/04 19:45:03 UTC

svn commit: r452952 - in /incubator/tuscany/java: samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/ sca/commands/launcher/src/main/resources/META-INF/tuscany/ sca/kernel/core/src/main/java/org/apache/tuscany/core/bootstrap/ sca/kernel/core/src...

Author: rfeng
Date: Wed Oct  4 10:45:02 2006
New Revision: 452952

URL: http://svn.apache.org/viewvc?view=rev&rev=452952
Log:
Further improve the property loading so that the PropertyObjectFactoryImpl will provide databinding-aware ObjectFactory

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java
      - copied, changed from r452761, incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java   (with props)
Removed:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/StAXPropertyFactory.java
Modified:
    incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/webapp.scdl
    incubator/tuscany/java/sca/commands/launcher/src/main/resources/META-INF/tuscany/system.scdl
    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/loader/ComponentLoader.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/resources/org/apache/tuscany/core/deployer/boot2.scdl
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java
    incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl
    incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/system.scdl

Modified: incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/webapp.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/webapp.scdl?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/webapp.scdl (original)
+++ incubator/tuscany/java/samples/sca/helloworldws/src/main/webapp/META-INF/tuscany/webapp.scdl Wed Oct  4 10:45:02 2006
@@ -120,7 +120,7 @@
     </component>
 
     <component name="propertyFactory">
-        <system:implementation.system class="org.apache.tuscany.core.loader.StringParserPropertyFactory"/>
+        <system:implementation.system class="org.apache.tuscany.core.property.PropertyObjectFactoryImpl"/>
     </component>
 
     <component name="artifactRepository">

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?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- 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 Wed Oct  4 10:45:02 2006
@@ -118,7 +118,7 @@
     </component>
 
     <component name="propertyFactory">
-        <system:implementation.system class="org.apache.tuscany.core.loader.StringParserPropertyFactory"/>
+        <system:implementation.system class="org.apache.tuscany.core.property.PropertyObjectFactoryImpl"/>
     </component>
 
     <!-- component that scans the extension directory -->

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=452952&r1=452951&r2=452952
==============================================================================
--- 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 Oct  4 10:45:02 2006
@@ -18,6 +18,7 @@
  */
 package org.apache.tuscany.core.bootstrap;
 
+import org.apache.tuscany.host.MonitorFactory;
 import org.apache.tuscany.spi.bootstrap.RuntimeComponent;
 import org.apache.tuscany.spi.builder.Connector;
 import org.apache.tuscany.spi.component.ScopeRegistry;
@@ -25,9 +26,7 @@
 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.StAXPropertyFactory;
-
-import org.apache.tuscany.host.MonitorFactory;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 
 /**
  * Interface that abstracts the process used to create a running Tuscany system. Implementation of this may provide
@@ -70,7 +69,7 @@
      * @param introspector    the introspector to be used to extract component type information from a Java class
      * @return a new prmordial Loader
      */
-    Loader createLoader(StAXPropertyFactory propertyFactory, Introspector introspector);
+    Loader createLoader(PropertyObjectFactory propertyFactory, Introspector introspector);
 
     /**
      * Create a ScopeRegistry that supports the Scopes supported for primordial components

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=452952&r1=452951&r2=452952
==============================================================================
--- 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 Oct  4 10:45:02 2006
@@ -20,22 +20,6 @@
 
 import javax.xml.stream.XMLInputFactory;
 
-import org.apache.tuscany.spi.bootstrap.ComponentNames;
-import org.apache.tuscany.spi.bootstrap.RuntimeComponent;
-import org.apache.tuscany.spi.builder.Builder;
-import org.apache.tuscany.spi.builder.BuilderRegistry;
-import org.apache.tuscany.spi.builder.Connector;
-import org.apache.tuscany.spi.component.CompositeComponent;
-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.extension.LoaderExtension;
-import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
-import org.apache.tuscany.spi.implementation.java.Introspector;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
-import org.apache.tuscany.spi.loader.LoaderRegistry;
-import org.apache.tuscany.spi.loader.StAXPropertyFactory;
-
 import org.apache.tuscany.core.builder.BuilderRegistryImpl;
 import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.core.component.WorkContextImpl;
@@ -74,8 +58,23 @@
 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.property.PropertyObjectFactoryImpl;
 import org.apache.tuscany.host.MonitorFactory;
+import org.apache.tuscany.spi.bootstrap.ComponentNames;
+import org.apache.tuscany.spi.bootstrap.RuntimeComponent;
+import org.apache.tuscany.spi.builder.Builder;
+import org.apache.tuscany.spi.builder.BuilderRegistry;
+import org.apache.tuscany.spi.builder.Connector;
+import org.apache.tuscany.spi.component.CompositeComponent;
+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.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;
 
 /**
  * A default implementation of a Bootstrapper. Please see the documentation on the individual methods for how the
@@ -134,7 +133,7 @@
         Builder builder = createBuilder(scopeRegistry);
         JavaInterfaceProcessorRegistry interfaceIntrospector = new JavaInterfaceProcessorRegistryImpl();
         Introspector introspector = createIntrospector(interfaceIntrospector);
-        LoaderRegistry loader = createLoader(new StringParserPropertyFactory(), introspector);
+        LoaderRegistry loader = createLoader(new PropertyObjectFactoryImpl(), introspector);
         return new DeployerImpl(xmlFactory, loader, builder);
     }
 
@@ -163,7 +162,7 @@
      * @param introspector    the Introspector to be used to inspect component implementations
      * @return a new StAX XML loader
      */
-    public LoaderRegistry createLoader(StAXPropertyFactory propertyFactory, Introspector introspector) {
+    public LoaderRegistry createLoader(PropertyObjectFactory propertyFactory, Introspector introspector) {
         LoaderRegistryImpl loaderRegistry =
             new LoaderRegistryImpl(monitorFactory.getMonitor(LoaderRegistryImpl.Monitor.class));
 

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java Wed Oct  4 10:45:02 2006
@@ -34,6 +34,7 @@
 
 import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
 import org.apache.tuscany.core.property.SimplePropertyObjectFactory;
+import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.databinding.extension.DOMHelper;
@@ -47,7 +48,7 @@
 import org.apache.tuscany.spi.loader.MissingImplementationException;
 import org.apache.tuscany.spi.loader.MissingMustOverridePropertyException;
 import org.apache.tuscany.spi.loader.NotOverridablePropertyException;
-import org.apache.tuscany.spi.loader.StAXPropertyFactory;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.loader.UndefinedPropertyException;
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.ComponentType;
@@ -73,10 +74,13 @@
     private static final String PROPERTY_FILE_ATTR = "file";
     private static final String PROPERTY_NAME_ATTR = "name";
     private static final String PROPERTY_SOURCE_ATTR = "source";
+    
+    private PropertyObjectFactory propertyFactory;
 
-    @Constructor( {"registry", "defaultPropertyFactory"})
-    public ComponentLoader(@Autowire LoaderRegistry registry, @Autowire StAXPropertyFactory propertyFactory) {
+    @Constructor( {"registry", "propertyFactory"})
+    public ComponentLoader(@Autowire LoaderRegistry registry, @Autowire PropertyObjectFactory propertyFactory) {
         super(registry);
+        this.propertyFactory = propertyFactory;
     }
 
     @SuppressWarnings("unchecked")
@@ -209,7 +213,9 @@
                 throw new LoaderException(e);
             }
         }
-        propertyValue.setValueFactory(new SimplePropertyObjectFactory(property, propertyValue.getValue()));
+        ObjectFactory objectFactory = propertyFactory.createObjectFactory(property, propertyValue);
+        // propertyValue.setValueFactory(new SimplePropertyObjectFactory(property, propertyValue.getValue()));
+        propertyValue.setValueFactory(objectFactory);
         componentDefinition.add(propertyValue);
     }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java Wed Oct  4 10:45:02 2006
@@ -21,34 +21,30 @@
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
 
 import org.apache.tuscany.core.injection.JNDIObjectFactory;
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.loader.LoaderException;
-import org.apache.tuscany.spi.loader.StAXPropertyFactory;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.PropertyValue;
 
 /**
- * A StAXPropertyFactory that creates property values by looking them up in the default JNDI InitialContext.
- * <p/>
- * This can be used to locate resources in a J2EE environment and inject them as configuration properties. For example,
- * to access a database a component could write: <code> &at;Property DataSource myDB; </code> and configure with <code>
+ * A StAXPropertyFactory that creates property values by looking them up in the
+ * default JNDI InitialContext. <p/> This can be used to locate resources in a
+ * J2EE environment and inject them as configuration properties. For example, to
+ * access a database a component could write:
+ * <code> &at;Property DataSource myDB; </code> and configure with <code>
  * &lt;properties&gt; &lt;v:myDb&gt;java:comp/env/jdbc/MyDatabase&lt;/v:myDB&gt; &lt;/properties&gt; </code>
- *
+ * 
  * @version $Rev$ $Date$
  */
-public class JNDIPropertyFactory implements StAXPropertyFactory {
-    public <T> ObjectFactory<T> createObjectFactory(XMLStreamReader reader,
-                                                    Property<T> property)
-        throws XMLStreamException, LoaderException {
-        Class<T> type = property.getJavaType();
-        assert type != null : "property type is null";
-        String text = reader.getElementText();
+public class JNDIPropertyFactory implements PropertyObjectFactory {
+    public ObjectFactory createObjectFactory(Property property, PropertyValue value) throws LoaderException {
+        String text = value.getValue().getDocumentElement().getTextContent();
         try {
             Context context = new InitialContext();
-            return new JNDIObjectFactory<T>(context, text);
+            return new JNDIObjectFactory(context, text);
         } catch (NamingException e) {
             throw new LoaderException(e);
         }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.java Wed Oct  4 10:45:02 2006
@@ -24,15 +24,15 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+
 import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
 
+import org.apache.tuscany.core.injection.SingletonObjectFactory;
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.loader.LoaderException;
-import org.apache.tuscany.spi.loader.StAXPropertyFactory;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.model.Property;
-
-import org.apache.tuscany.core.injection.SingletonObjectFactory;
+import org.apache.tuscany.spi.model.PropertyValue;
 
 /**
  * Implementation of StAXPropertyFactory that interprets the XML as
@@ -40,15 +40,14 @@
  * @version $Rev$ $Date$
  */
 @SuppressWarnings("unchecked")
-public class StringParserPropertyFactory implements StAXPropertyFactory {
+public class StringParserPropertyFactory implements PropertyObjectFactory {
 
-    public <T> ObjectFactory<T> createObjectFactory(XMLStreamReader reader, Property<T> property)
-        throws XMLStreamException, LoaderException {
-        String text = reader.getElementText();
-        return new SingletonObjectFactory<T>(createInstance(text, property.getJavaType()));
+    public ObjectFactory createObjectFactory(Property property, PropertyValue value) throws LoaderException {
+        String text = value.getValue().getDocumentElement().getTextContent();
+        return new SingletonObjectFactory(createInstance(text, property.getJavaType()));
     }
 
-    public <T> T createInstance(String text, Class<T> type) throws XMLStreamException, LoaderException {
+    public <T> T createInstance(String text, Class<T> type) throws LoaderException {
         // Class<T> type = property.getJavaType();
         assert type != null : "property type is null";
 

Copied: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java (from r452761, incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java?view=diff&rev=452952&p1=incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java&r1=452761&p2=incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactoryImpl.java Wed Oct  4 10:45:02 2006
@@ -24,52 +24,74 @@
 import org.apache.tuscany.core.databinding.xml.DOMDataBinding;
 import org.apache.tuscany.spi.ObjectCreationException;
 import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.databinding.DataBinding;
 import org.apache.tuscany.spi.databinding.DataBindingRegistry;
 import org.apache.tuscany.spi.databinding.Mediator;
 import org.apache.tuscany.spi.idl.ElementInfo;
 import org.apache.tuscany.spi.idl.TypeInfo;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.model.DataType;
 import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.PropertyValue;
+import org.osoa.sca.annotations.Constructor;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
 import org.w3c.dom.Node;
 
-public class PropertyObjectFactory<P> implements ObjectFactory<P> {
+@Service(PropertyObjectFactory.class)
+@Scope("MODULE")
+public class PropertyObjectFactoryImpl implements PropertyObjectFactory {
     private DataBindingRegistry registry;
     private Mediator mediator;
 
-    private Property<P> property;
-    private Node value;
-    private DataType<QName> sourceDataType;
-    private DataType<?> targetDataType;
-
-    public PropertyObjectFactory(DataBindingRegistry registry,
-                                 Mediator mediator,
-                                 Property<P> property,
-                                 Node value) {
+    public PropertyObjectFactoryImpl() {
+    }
+
+    @Constructor({"registry", "mediator"})
+    public PropertyObjectFactoryImpl(@Autowire DataBindingRegistry registry, @Autowire Mediator mediator) {
         super();
         this.registry = registry;
         this.mediator = mediator;
-        this.property = property;
-        this.value = value;
-        sourceDataType = new DataType<QName>(DOMDataBinding.NAME, Node.class, this.property.getXmlType());
-        TypeInfo typeInfo = new TypeInfo(property.getXmlType(), true, null);
-        ElementInfo elementInfo = new ElementInfo(null, typeInfo);
-        sourceDataType.setMetadata(ElementInfo.class.getName(), elementInfo);
-        Class javaType = this.property.getJavaType();
-        String dataBinding = (String)property.getExtensions().get(DataBinding.class.getName());
-        if (dataBinding != null) {
-            targetDataType = new DataType<Class>(dataBinding, javaType, javaType);
-        } else {
-            targetDataType = this.registry.introspectType(javaType);
-            if (targetDataType == null) {
-                targetDataType = new DataType<Class>("java.lang.Object", javaType, javaType);
-            }
-        }
     }
 
     @SuppressWarnings("unchecked")
-    public P getInstance() throws ObjectCreationException {
-        return (P)mediator.mediate(value, sourceDataType, targetDataType, null);
+    public ObjectFactory createObjectFactory(Property property, PropertyValue value) {
+        if (mediator == null) {
+            return new SimplePropertyObjectFactory(property, value.getValue());
+        }
+        return new ObjectFactoryImpl(property, value);
+    }
+
+    public class ObjectFactoryImpl<P> implements ObjectFactory<P> {
+        private Property<P> property;
+        private PropertyValue<P> propertyValue;
+        private DataType<QName> sourceDataType;
+        private DataType<?> targetDataType;
+
+        public ObjectFactoryImpl(Property<P> property, PropertyValue<P> propertyValue) {
+            this.property = property;
+            this.propertyValue = propertyValue;
+            sourceDataType = new DataType<QName>(DOMDataBinding.NAME, Node.class, this.property.getXmlType());
+            TypeInfo typeInfo = new TypeInfo(property.getXmlType(), true, null);
+            ElementInfo elementInfo = new ElementInfo(null, typeInfo);
+            sourceDataType.setMetadata(ElementInfo.class.getName(), elementInfo);
+            Class javaType = this.property.getJavaType();
+            String dataBinding = (String)property.getExtensions().get(DataBinding.class.getName());
+            if (dataBinding != null) {
+                targetDataType = new DataType<Class>(dataBinding, javaType, javaType);
+            } else {
+                targetDataType = registry.introspectType(javaType);
+                if (targetDataType == null) {
+                    targetDataType = new DataType<Class>("java.lang.Object", javaType, javaType);
+                }
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        public P getInstance() throws ObjectCreationException {
+            return (P)mediator.mediate(propertyValue.getValue(), sourceDataType, targetDataType, null);
+        }
     }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java Wed Oct  4 10:45:02 2006
@@ -30,6 +30,7 @@
     private SimpleTypeMapperExtension typeMapper;
     private Property<P> property;
     private Document value;
+    private P instance;
 
     public SimplePropertyObjectFactory(Property<P> property, Document value) {
         super();
@@ -43,12 +44,15 @@
         if (value == null) {
             return null;
         }
-        String text = value.getDocumentElement().getTextContent();
-        TypeInfo xmlType = typeMapper.getXMLType(property.getJavaType());
-        if (xmlType == null) {
-            throw new IllegalArgumentException("Complex property is not supported.");
+        if (instance == null) {
+            String text = value.getDocumentElement().getTextContent();
+            TypeInfo xmlType = typeMapper.getXMLType(property.getJavaType());
+            if (xmlType == null) {
+                throw new IllegalArgumentException("Complex property is not supported.");
+            }
+            instance = (P)typeMapper.toJavaObject(xmlType, text, null);
         }
-        return (P)typeMapper.toJavaObject(xmlType, text, null);
+        return instance;
     }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java Wed Oct  4 10:45:02 2006
@@ -18,31 +18,31 @@
  */
 package org.apache.tuscany.core.loader;
 
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+import junit.framework.TestCase;
 
+import org.apache.tuscany.core.implementation.java.JavaImplementation;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
-import org.apache.tuscany.spi.loader.StAXPropertyFactory;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.ServiceDefinition;
-
-import junit.framework.TestCase;
-import org.apache.tuscany.core.implementation.java.JavaImplementation;
 import org.easymock.EasyMock;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
 
 /**
  * @version $Rev$ $Date$
@@ -54,7 +54,7 @@
 
     private XMLStreamReader mockReader;
     private LoaderRegistry mockRegistry;
-    private StAXPropertyFactory mockPropertyFactory;
+    private PropertyObjectFactory mockPropertyFactory;
     private ComponentLoader loader;
 
     public void testEmptyComponent() throws LoaderException, XMLStreamException {
@@ -131,7 +131,7 @@
         super.setUp();
         mockReader = EasyMock.createMock(XMLStreamReader.class);
         mockRegistry = EasyMock.createMock(LoaderRegistry.class);
-        mockPropertyFactory = EasyMock.createMock(StAXPropertyFactory.class);
+        mockPropertyFactory = EasyMock.createMock(PropertyObjectFactory.class);
         loader = new ComponentLoader(mockRegistry, mockPropertyFactory);
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java Wed Oct  4 10:45:02 2006
@@ -22,60 +22,61 @@
 
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.PropertyValue;
 
 import junit.framework.TestCase;
 import org.easymock.EasyMock;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 /**
  * @version $Rev$ $Date$
  */
 public class StringParserPropertyFactoryTestCase extends TestCase {
 
+    private <T> PropertyValue<T> mock(Class<T> cls, String value) {
+        Document document = EasyMock.createMock(Document.class);
+        Element element = EasyMock.createMock(Element.class);
+        EasyMock.expect(document.getDocumentElement()).andReturn(element);
+        EasyMock.expect(element.getTextContent()).andReturn(value);
+        EasyMock.replay(document, element);
+        return new PropertyValue<T>(null, document);
+    }
 
     public void testInteger() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("1");
-        EasyMock.replay(reader);
+
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<Integer> property = new Property<Integer>();
         property.setJavaType(Integer.class);
-        ObjectFactory<Integer> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<Integer> propertyValue = mock(Integer.class, "1");
+        ObjectFactory<Integer> oFactory = factory.createObjectFactory(property, propertyValue);
         assertEquals(1, oFactory.getInstance().intValue());
-        EasyMock.verify(reader);
     }
 
     public void testPrimitiveInt() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("1");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<Integer> property = new Property<Integer>();
         property.setJavaType(Integer.TYPE);
-        ObjectFactory<Integer> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<Integer> propertyValue = mock(Integer.TYPE, "1");
+        ObjectFactory<Integer> oFactory = factory.createObjectFactory(property, propertyValue);
         assertEquals(1, oFactory.getInstance().intValue());
-        EasyMock.verify(reader);
     }
 
     public void testString() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("1");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<String> property = new Property<String>();
         property.setJavaType(String.class);
-        ObjectFactory<String> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<String> propertyValue = mock(String.class, "1");
+        ObjectFactory<String> oFactory = factory.createObjectFactory(property, propertyValue);
         assertEquals("1", oFactory.getInstance());
-        EasyMock.verify(reader);
     }
 
     public void testByteArray() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("1");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<byte[]> property = new Property<byte[]>();
         property.setJavaType(byte[].class);
-        ObjectFactory<byte[]> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<byte[]> propertyValue = mock(byte[].class, "1");
+        ObjectFactory<byte[]> oFactory = factory.createObjectFactory(property, propertyValue);
         byte[] result = oFactory.getInstance();
         byte[] expected = "1".getBytes();
         for (int i = 0; i < result.length; i++) {
@@ -84,43 +85,33 @@
                 fail();
             }
         }
-        EasyMock.verify(reader);
     }
 
     public void testBoolean() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("true");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<Boolean> property = new Property<Boolean>();
         property.setJavaType(Boolean.class);
-        ObjectFactory<Boolean> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<Boolean> propertyValue = mock(Boolean.class, "true");
+        ObjectFactory<Boolean> oFactory = factory.createObjectFactory(property, propertyValue);
         assertTrue(oFactory.getInstance());
-        EasyMock.verify(reader);
     }
 
     public void testPrimitiveBoolean() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("true");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<Boolean> property = new Property<Boolean>();
         property.setJavaType(Boolean.TYPE);
-        ObjectFactory<Boolean> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<Boolean> propertyValue = mock(Boolean.TYPE, "true");
+        ObjectFactory<Boolean> oFactory = factory.createObjectFactory(property, propertyValue);
         assertTrue(oFactory.getInstance());
-        EasyMock.verify(reader);
     }
 
     public void testStringConstructor() throws Exception {
-        XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class);
-        EasyMock.expect(reader.getElementText()).andReturn("test");
-        EasyMock.replay(reader);
         StringParserPropertyFactory factory = new StringParserPropertyFactory();
         Property<Foo> property = new Property<Foo>();
         property.setJavaType(Foo.class);
-        ObjectFactory<Foo> oFactory = factory.createObjectFactory(reader, property);
+        PropertyValue<Foo> propertyValue = mock(Foo.class, "test");
+        ObjectFactory<Foo> oFactory = factory.createObjectFactory(property, propertyValue);
         assertEquals("test", oFactory.getInstance().getFoo());
-        EasyMock.verify(reader);
     }
 
     private static class Foo {
@@ -134,6 +125,5 @@
             return foo;
         }
     }
-
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/resources/org/apache/tuscany/core/deployer/boot2.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/resources/org/apache/tuscany/core/deployer/boot2.scdl?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/resources/org/apache/tuscany/core/deployer/boot2.scdl (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/resources/org/apache/tuscany/core/deployer/boot2.scdl Wed Oct  4 10:45:02 2006
@@ -105,8 +105,23 @@
         <property name="repository">.m2/repository</property>
     </component>
 
+    <!-- DataBinding registry -->
+    <component name="databinding.registry">
+        <system:implementation.system class="org.apache.tuscany.core.databinding.impl.DataBindingRegistryImpl" />
+    </component>
+
+    <!-- DataBinding registry -->
+    <component name="databinding.mediator">
+        <system:implementation.system class="org.apache.tuscany.core.databinding.impl.MediatorImpl" />
+    </component>    
+
+    <!-- Transformer registry -->
+    <component name="databinding.transformerRegistry" initLevel="90">
+        <system:implementation.system class="org.apache.tuscany.core.databinding.impl.TransformerRegistryImpl" />
+    </component>
+
     <component name="propertyFactory">
-        <system:implementation.system class="org.apache.tuscany.core.loader.StringParserPropertyFactory"/>
+        <system:implementation.system class="org.apache.tuscany.core.property.PropertyObjectFactoryImpl"/>
     </component>
 
     <component name="policyBuilderRegistry">

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/databinding/extension/SimpleType2JavaTransformer.java Wed Oct  4 10:45:02 2006
@@ -25,25 +25,29 @@
 import org.apache.tuscany.spi.idl.TypeInfo;
 
 /**
- * Transformer to convert data from a databinding's representation of simple types to Java Objects
+ * Transformer to convert data from a databinding's representation of simple
+ * types to Java Objects
  */
 public abstract class SimpleType2JavaTransformer<T> extends TransformerExtension<T, Object> implements
-        PullTransformer<T, Object> {
+    PullTransformer<T, Object> {
 
     protected SimpleTypeMapper mapper;
 
     public SimpleType2JavaTransformer() {
         this.mapper = new SimpleTypeMapperExtension();
     }
-    
+
     public SimpleType2JavaTransformer(SimpleTypeMapper mapper) {
         this.mapper = (mapper != null) ? mapper : new SimpleTypeMapperExtension();
     }
 
     public Object transform(T source, TransformationContext context) {
-        ElementInfo element =
-                (ElementInfo) context.getSourceDataType().getMetadata(ElementInfo.class.getName());
-        TypeInfo simpleType = (TypeInfo) element.getType();
+        TypeInfo simpleType = (TypeInfo)context.getSourceDataType().getMetadata(TypeInfo.class.getName());
+        if (simpleType == null) {
+            ElementInfo element =
+                (ElementInfo)context.getSourceDataType().getMetadata(ElementInfo.class.getName());
+            simpleType = (TypeInfo)element.getType();
+        }
         return mapper.toJavaObject(simpleType, getText(source), context);
     }
 
@@ -52,9 +56,14 @@
     }
 
     public int getWeight() {
-        // Cannot be used for imtermediate 
+        // Cannot be used for imtermediate
         return 10000;
     }
-    
+
+    /**
+     * Get the string value from the source
+     * @param source
+     * @return A string
+     */
     protected abstract String getText(T source);
 }

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java?view=auto&rev=452952
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java Wed Oct  4 10:45:02 2006
@@ -0,0 +1,47 @@
+/*
+ * 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.spi.loader;
+
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.PropertyValue;
+
+/**
+ * A factory that will create an ObjectFactory for a property
+ * 
+ * @version $Rev$ $Date$
+ */
+public interface PropertyObjectFactory {
+    /**
+     * Return an ObjectFactory for instances of a property defined in an XML.
+     * The ObjectFactory must return instances that can safely be supplied to
+     * component implementations. If the instance is mutable and isolation
+     * between components is required, then the factory must clone or otherwise
+     * protect the implementation from unexpected modifications by other
+     * implementation instances.
+     * 
+     * @param property the Property definition that the resulting ObjectFactory
+     *            must be able to assign to
+     * @param propertyValue The component configuration of the property
+     * @return an ObjectFactory that can produce instances that can be assigned
+     *         to the supplied Property
+     * @throws LoaderException if there is a problem creating the ObjectFactory
+     */
+    ObjectFactory createObjectFactory(Property property, PropertyValue propertyValue) throws LoaderException;
+}

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/PropertyObjectFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl (original)
+++ incubator/tuscany/java/sca/runtime/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl Wed Oct  4 10:45:02 2006
@@ -124,7 +124,7 @@
     </component>
 
     <component name="propertyFactory">
-        <system:implementation.system class="org.apache.tuscany.core.loader.StringParserPropertyFactory"/>
+        <system:implementation.system class="org.apache.tuscany.core.property.PropertyObjectFactoryImpl"/>
     </component>
 
     <component name="artifactRepository">

Modified: incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/system.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/system.scdl?view=diff&rev=452952&r1=452951&r2=452952
==============================================================================
--- incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/system.scdl (original)
+++ incubator/tuscany/java/sca/test/src/main/resources/META-INF/tuscany/system.scdl Wed Oct  4 10:45:02 2006
@@ -124,7 +124,7 @@
     </component>
 
     <component name="propertyFactory">
-        <system:implementation.system class="org.apache.tuscany.core.loader.StringParserPropertyFactory"/>
+        <system:implementation.system class="org.apache.tuscany.core.property.PropertyObjectFactoryImpl"/>
     </component>
 
 </composite>



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