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 08:33:21 UTC

svn commit: r452761 - in /incubator/tuscany/java: samples/sca/echo.databinding/src/test/java/echo/ samples/sca/echo.databinding/src/test/resources/META-INF/sca/ sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/ sca/kernel/...

Author: rfeng
Date: Tue Oct  3 23:33:20 2006
New Revision: 452761

URL: http://svn.apache.org/viewvc?view=rev&rev=452761
Log:
Upgrade the property to be consistent with the SCA spec
Start to integrate the property handling with databinding framework

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyHelper.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java   (with props)
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/MissingMustOverridePropertyException.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/NotOverridablePropertyException.java   (with props)
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/OverrideOptions.java   (with props)
Modified:
    incubator/tuscany/java/samples/sca/echo.databinding/src/test/java/echo/ComponentAImpl.java
    incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/sca/default.scdl
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.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/HeuristicPojoProcessor.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.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/loader/ComponentLoader.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/PropertyLoader.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StringParserPropertyFactory.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/PropertyProcessorTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/java/builder/JavaBuilderPropertyTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderTestCase.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Property.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/PropertyValue.java
    incubator/tuscany/java/sca/services/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/BusServiceImpl.java
    incubator/tuscany/java/spec/sca/src/main/java/org/osoa/sca/annotations/Property.java

Modified: incubator/tuscany/java/samples/sca/echo.databinding/src/test/java/echo/ComponentAImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/echo.databinding/src/test/java/echo/ComponentAImpl.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/samples/sca/echo.databinding/src/test/java/echo/ComponentAImpl.java (original)
+++ incubator/tuscany/java/samples/sca/echo.databinding/src/test/java/echo/ComponentAImpl.java Tue Oct  3 23:33:20 2006
@@ -30,6 +30,8 @@
     private Interface1 componentBReference;
     
     private String prefix;
+    
+    private String bar;
 
     @Constructor
     public ComponentAImpl(@Reference(name = "componentBReference", required = true)
@@ -59,6 +61,14 @@
     @Property(name="prefix")
     public void setPrefix(String prefix) {
         this.prefix = prefix;
+    }
+
+    /**
+     * @param bar the bar to set
+     */
+    @Property(name="bar")
+    public void setBar(String bar) {
+        this.bar = bar;
     }
 
 }

Modified: incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/sca/default.scdl
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/sca/default.scdl?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/sca/default.scdl (original)
+++ incubator/tuscany/java/samples/sca/echo.databinding/src/test/resources/META-INF/sca/default.scdl Tue Oct  3 23:33:20 2006
@@ -32,6 +32,7 @@
         <implementation.java class="echo.ComponentAImpl" />
         <reference name="componentBReference">ComponentB</reference>
         <property name="prefix">ABC</property>
+        <property name="bar" source="$complexProperty/*[local-name()='foo']/*[local-name()='bar']"></property>
     </component>
 
     <component name="ComponentB">
@@ -52,7 +53,7 @@
     <property name="messagePrefix" type="xsd:string">ABC</property>
     <property name="complexProperty" type="f:FooType">
         <foo>
-            <bar attr="barAttr">BAR</bar>bar>
+            <bar attr="barAttr">BAR</bar>
         </foo>
     </property>
 

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java Tue Oct  3 23:33:20 2006
@@ -18,14 +18,15 @@
  */
 package org.apache.tuscany.core.implementation.composite;
 
-import javax.xml.namespace.QName;
 import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
 import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+
+import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
-
+import org.apache.tuscany.core.property.PropertyHelper;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.CompositeClassLoader;
@@ -71,7 +72,8 @@
         CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> composite =
             new CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>();
         composite.setName(reader.getAttributeValue(null, "name"));
-        while (true) {
+        boolean done = false;
+        while (!done) {
             switch (reader.next()) {
                 case START_ELEMENT:
                     ModelObject o = registry.load(parent, reader, deploymentContext);
@@ -111,9 +113,14 @@
                     break;
                 case END_ELEMENT:
                     if (COMPOSITE.equals(reader.getName())) {
-                        return composite;
+                        done = true;
+                        break;
                     }
             }
         }
+        for (ComponentDefinition<? extends Implementation<?>> c : composite.getComponents().values()) {
+            PropertyHelper.processProperties(composite, c, deploymentContext);
+        }
+        return composite;
     }
 }

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=452761&r1=452760&r2=452761
==============================================================================
--- 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 Tue Oct  3 23:33:20 2006
@@ -32,6 +32,7 @@
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.ComponentBuilderExtension;
 import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.PropertyValue;
 import org.apache.tuscany.spi.model.Scope;
 
 import org.apache.tuscany.spi.implementation.java.ConstructorDefinition;
@@ -115,8 +116,8 @@
             new JavaAtomicComponent(definition.getName(), configuration, monitor);
 
         // handle properties
-        for (JavaMappedProperty<?> property : componentType.getProperties().values()) {
-            ObjectFactory<?> factory = property.getDefaultValueFactory();
+        for (PropertyValue<?> property : definition.getPropertyValues().values()) {
+            ObjectFactory<?> factory = property.getValueFactory();
             if (factory != null) {
                 component.addPropertyFactory(property.getName(), factory);
             }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/HeuristicPojoProcessor.java Tue Oct  3 23:33:20 2006
@@ -18,6 +18,12 @@
  */
 package org.apache.tuscany.core.implementation.processor;
 
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllInterfaces;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllPublicAndProtectedFields;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllUniquePublicProtectedMethods;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getBaseName;
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.toPropertyName;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
@@ -32,27 +38,21 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.osoa.sca.annotations.Remotable;
-import org.osoa.sca.annotations.Service;
-
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.idl.InvalidServiceContractException;
 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.PojoComponentType;
 import org.apache.tuscany.spi.implementation.java.ProcessingException;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
-
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllInterfaces;
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllPublicAndProtectedFields;
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getAllUniquePublicProtectedMethods;
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getBaseName;
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.toPropertyName;
+import org.apache.tuscany.spi.model.OverrideOptions;
+import org.osoa.sca.annotations.Remotable;
+import org.osoa.sca.annotations.Service;
 
 /**
  * Heuristically evaluates an un-annotated Java implementation type to determine services, references, and properties
@@ -412,7 +412,7 @@
         JavaMappedProperty<T> property = new JavaMappedProperty<T>();
         property.setName(name);
         property.setMember(member);
-        property.setRequired(false);
+        property.setOverride(OverrideOptions.MAY);
         property.setJavaType(paramType);
         return property;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/ImplementationProcessorServiceImpl.java Tue Oct  3 23:33:20 2006
@@ -18,31 +18,32 @@
  */
 package org.apache.tuscany.core.implementation.processor;
 
+import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getBaseName;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Member;
 import java.util.List;
 
-import org.osoa.sca.annotations.Callback;
-import org.osoa.sca.annotations.Property;
-import org.osoa.sca.annotations.Reference;
-import org.osoa.sca.annotations.Remotable;
+import javax.xml.namespace.QName;
 
+import org.apache.tuscany.core.idl.java.IllegalCallbackException;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.idl.InvalidServiceContractException;
+import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.implementation.java.DuplicatePropertyException;
+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.PojoComponentType;
 import org.apache.tuscany.spi.implementation.java.ProcessingException;
-import org.apache.tuscany.spi.implementation.java.DuplicatePropertyException;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
+import org.apache.tuscany.spi.model.OverrideOptions;
 import org.apache.tuscany.spi.model.ServiceContract;
-
-import org.apache.tuscany.core.idl.java.IllegalCallbackException;
-import org.apache.tuscany.spi.idl.java.JavaServiceContract;
-import org.apache.tuscany.spi.idl.java.JavaInterfaceProcessorRegistry;
-
-import static org.apache.tuscany.core.util.JavaIntrospectionHelper.getBaseName;
+import org.osoa.sca.annotations.Callback;
+import org.osoa.sca.annotations.Property;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Remotable;
 
 /**
  * The default implementation of an <code>ImplementationProcessorService</code>
@@ -50,7 +51,6 @@
  * @version $Rev$ $Date$
  */
 public class ImplementationProcessorServiceImpl implements ImplementationProcessorService {
-
     private JavaInterfaceProcessorRegistry registry;
 
     public ImplementationProcessorServiceImpl(@Autowire JavaInterfaceProcessorRegistry registry) {
@@ -247,7 +247,9 @@
             throw new DuplicatePropertyException(name);
         }
         property.setName(name);
-        property.setRequired(propAnnot.required());
+        property.setOverride(OverrideOptions.valueOf(propAnnot.override().toUpperCase()));
+        
+        property.setXmlType(QName.valueOf(propAnnot.xmlType()));
         property.setJavaType(param);
         type.getProperties().put(name, property);
         addName(explicitNames, pos, name);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/PropertyProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/PropertyProcessor.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/PropertyProcessor.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/processor/PropertyProcessor.java Tue Oct  3 23:33:20 2006
@@ -20,18 +20,20 @@
 
 import java.lang.reflect.Constructor;
 
-import org.osoa.sca.annotations.Property;
+import javax.xml.namespace.QName;
 
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.implementation.java.AbstractPropertyProcessor;
+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.PojoComponentType;
 import org.apache.tuscany.spi.implementation.java.ProcessingException;
-import org.apache.tuscany.spi.implementation.java.AbstractPropertyProcessor;
-import org.apache.tuscany.spi.implementation.java.ImplementationProcessorService;
+import org.apache.tuscany.spi.model.OverrideOptions;
+import org.osoa.sca.annotations.Property;
 
 /**
  * Processes an {@link @Property} annotation, updating the component type with corresponding {@link JavaMappedProperty}
@@ -52,7 +54,8 @@
                                     Property annotation,
                                     CompositeComponent parent,
                                     DeploymentContext context) {
-        property.setRequired(annotation.required());
+        property.setOverride(OverrideOptions.valueOf(annotation.override().toUpperCase()));
+        property.setXmlType(QName.valueOf(annotation.xmlType()));
     }
 
     public <T> void visitConstructor(CompositeComponent parent, Constructor<T> constructor,

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=452761&r1=452760&r2=452761
==============================================================================
--- 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 Tue Oct  3 23:33:20 2006
@@ -18,40 +18,51 @@
  */
 package org.apache.tuscany.core.loader;
 
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Map;
+
 import javax.xml.namespace.QName;
-import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
-import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
-import org.osoa.sca.annotations.Constructor;
-
-import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
+import org.apache.tuscany.core.property.SimplePropertyObjectFactory;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
 import org.apache.tuscany.spi.deployer.DeploymentContext;
 import org.apache.tuscany.spi.extension.LoaderExtension;
 import org.apache.tuscany.spi.loader.InvalidReferenceException;
 import org.apache.tuscany.spi.loader.InvalidValueException;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.LoaderUtil;
 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.UndefinedPropertyException;
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.ComponentType;
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.model.ModelObject;
+import org.apache.tuscany.spi.model.OverrideOptions;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.PropertyValue;
 import org.apache.tuscany.spi.model.ReferenceTarget;
+import org.osoa.sca.annotations.Constructor;
+import org.w3c.dom.Document;
 
 /**
  * Loads a component definition from an XML-based assembly file
- *
+ * 
  * @version $Rev$ $Date$
  */
 public class ComponentLoader extends LoaderExtension<ComponentDefinition<?>> {
@@ -59,13 +70,40 @@
     private static final QName PROPERTY = new QName(XML_NAMESPACE_1_0, "property");
     private static final QName REFERENCE = new QName(XML_NAMESPACE_1_0, "reference");
 
-    private StAXPropertyFactory defaultPropertyFactory;
+    private static final String PROPERTY_FILE_ATTR = "file";
+    private static final String PROPERTY_NAME_ATTR = "name";
+    private static final String PROPERTY_SOURCE_ATTR = "source";
 
-    @Constructor({"registry", "defaultPropertyFactory"})
-    public ComponentLoader(@Autowire LoaderRegistry registry,
-                           @Autowire StAXPropertyFactory propertyFactory) {
+    @Constructor( {"registry", "defaultPropertyFactory"})
+    public ComponentLoader(@Autowire LoaderRegistry registry, @Autowire StAXPropertyFactory propertyFactory) {
         super(registry);
-        this.defaultPropertyFactory = propertyFactory;
+    }
+
+    @SuppressWarnings("unchecked")
+    private void populatePropertyValues(ComponentDefinition<Implementation<?>> componentDefinition)
+        throws MissingMustOverridePropertyException {
+        ComponentType componentType = componentDefinition.getImplementation().getComponentType();
+        if (componentType != null) {
+            Map<String, Property<?>> properties = componentType.getProperties();
+            Map<String, PropertyValue<?>> propertyValues = componentDefinition.getPropertyValues();
+
+            for (Property<?> aProperty : properties.values()) {
+                if (propertyValues.get(aProperty.getName()) == null) {
+                    if (aProperty.getOverride() == OverrideOptions.MUST) {
+                        throw new MissingMustOverridePropertyException(aProperty.getName());
+                    } else {
+                        PropertyValue propertyValue = new PropertyValue();
+                        propertyValue.setName(aProperty.getName());
+                        propertyValue.setValue(aProperty.getDefaultValue());
+                        // propertyValue.setValueFactory(aProperty.getDefaultValueFactory());
+                        propertyValue.setValueFactory(new SimplePropertyObjectFactory(aProperty,
+                                                                                      propertyValue
+                                                                                          .getValue()));
+                        propertyValues.put(aProperty.getName(), propertyValue);
+                    }
+                }
+            }
+        }
     }
 
     public QName getXMLType() {
@@ -74,8 +112,8 @@
 
     public ComponentDefinition<?> load(CompositeComponent parent,
                                        XMLStreamReader reader,
-                                       DeploymentContext deploymentContext)
-        throws XMLStreamException, LoaderException {
+                                       DeploymentContext deploymentContext) throws XMLStreamException,
+        LoaderException {
         assert COMPONENT.equals(reader.getName());
         String name = reader.getAttributeValue(null, "name");
         String initLevel = reader.getAttributeValue(null, "initLevel");
@@ -84,7 +122,8 @@
             Implementation<?> impl = loadImplementation(parent, reader, deploymentContext);
             registry.loadComponentType(parent, impl, deploymentContext);
 
-            ComponentDefinition<?> componentDefinition = new ComponentDefinition<Implementation<?>>(name, impl);
+            ComponentDefinition<Implementation<?>> componentDefinition =
+                new ComponentDefinition<Implementation<?>>(name, impl);
 
             if (initLevel != null) {
                 if (initLevel.length() == 0) {
@@ -114,6 +153,11 @@
                         break;
                     case END_ELEMENT:
                         if (reader.getName().equals(COMPONENT)) {
+                            // hack to leave alone SystemImplementation
+                            if (!((Implementation)componentDefinition.getImplementation() instanceof SystemImplementation)) {
+                                populatePropertyValues(componentDefinition);
+                            }
+
                             return componentDefinition;
                         }
                         break;
@@ -134,42 +178,45 @@
         if (!(o instanceof Implementation)) {
             throw new MissingImplementationException();
         }
-        return (Implementation<?>) o;
+        return (Implementation<?>)o;
     }
 
     protected void loadProperty(XMLStreamReader reader,
                                 DeploymentContext deploymentContext,
-                                ComponentDefinition<?> componentDefinition)
-        throws XMLStreamException, LoaderException {
-        String name = reader.getAttributeValue(null, "name");
+                                ComponentDefinition<?> componentDefinition) throws XMLStreamException,
+        LoaderException {
+        String name = reader.getAttributeValue(null, PROPERTY_NAME_ATTR);
         Implementation<?> implementation = componentDefinition.getImplementation();
         ComponentType<?, ?, ?> componentType = implementation.getComponentType();
         Property<?> property = componentType.getProperties().get(name);
         if (property == null) {
             throw new UndefinedPropertyException(name);
+        } else if (OverrideOptions.NO.equals(property.getOverride())) {
+            throw new NotOverridablePropertyException(name);
         }
-        PropertyValue<?> propertyValue;
-        String source = reader.getAttributeValue(null, "source");
-        if (source != null) {
-            propertyValue = new PropertyValue(name, source);
+        PropertyValue<?> propertyValue = null;
+        String source = reader.getAttributeValue(null, PROPERTY_SOURCE_ATTR);
+        String file = reader.getAttributeValue(null, PROPERTY_FILE_ATTR);
+        if (source != null || file != null) {
+            propertyValue = new PropertyValue(name, source, file);
+            LoaderUtil.skipToEndElement(reader);
         } else {
-            propertyValue = createPropertyValue(reader, property, name);
+            try {
+                DocumentBuilder documentBuilder = DOMHelper.newDocumentBuilder();
+                Document value = StAXUtil.createPropertyValue(reader, property.getXmlType(), documentBuilder);
+                propertyValue = new PropertyValue(name, value);
+            } catch (ParserConfigurationException e) {
+                throw new LoaderException(e);
+            }
         }
+        propertyValue.setValueFactory(new SimplePropertyObjectFactory(property, propertyValue.getValue()));
         componentDefinition.add(propertyValue);
     }
 
-    private <T> PropertyValue<T> createPropertyValue(XMLStreamReader reader,
-                                                     Property<T> property,
-                                                     String name) throws XMLStreamException, LoaderException {
-        // todo allow property to specify the factory to use
-        ObjectFactory<T> factory = defaultPropertyFactory.createObjectFactory(reader, property);
-        return new PropertyValue<T>(name, factory);
-    }
-
     protected void loadReference(XMLStreamReader reader,
                                  DeploymentContext deploymentContext,
-                                 ComponentDefinition<?> componentDefinition)
-        throws XMLStreamException, LoaderException {
+                                 ComponentDefinition<?> componentDefinition) throws XMLStreamException,
+        LoaderException {
         String name = reader.getAttributeValue(null, "name");
         String text = reader.getElementText();
         String target = text != null ? text.trim() : null;
@@ -191,4 +238,5 @@
         }
         componentDefinition.add(referenceTarget);
     }
+
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/PropertyLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/PropertyLoader.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/PropertyLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/PropertyLoader.java Tue Oct  3 23:33:20 2006
@@ -34,6 +34,7 @@
 import org.apache.tuscany.spi.extension.LoaderExtension;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.OverrideOptions;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.annotation.Autowire;
 
@@ -43,6 +44,11 @@
  * @version $Rev$ $Date$
  */
 public class PropertyLoader extends LoaderExtension<Property> {
+    public static final String PROPERTY_NAME_ATTR = "name";
+    public static final String PROPERTY_TYPE_ATTR = "type";
+    public static final String PROPERTY_MANY_ATTR = "many";
+    public static final String PROPERTY_OVERRIDE_ATTR = "override";
+    
     public static final QName PROPERTY = new QName(XML_NAMESPACE_1_0, "property");
     private final DocumentBuilder documentBuilder;
 
@@ -64,29 +70,31 @@
     public Property<?> load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext ctx)
         throws XMLStreamException, LoaderException {
         assert PROPERTY.equals(reader.getName());
-        String name = reader.getAttributeValue(null, "name");
-        String typeName = reader.getAttributeValue(null, "type");
-        QName xmlType;
-        int index = typeName.indexOf(':');
-        if (index != -1) {
-            // a prefix was specified
-            String prefix = typeName.substring(0, index);
-            String namespaceURI = reader.getNamespaceURI(prefix);
-            xmlType = new QName(namespaceURI, typeName.substring(index + 1));
-        } else {
-            // no prefix was specified, use the default
-            String namespaceURI = reader.getNamespaceURI();
-            xmlType = new QName(namespaceURI, typeName);
+        String name = reader.getAttributeValue(null, PROPERTY_NAME_ATTR);
+        String typeName = reader.getAttributeValue(null, PROPERTY_TYPE_ATTR);
+        QName xmlType = null;
+        if (typeName != null) {
+            int index = typeName.indexOf(':');
+            if (index != -1) {
+                String prefix = typeName.substring(0, index);
+                String localName = typeName.substring(index + 1);
+                String ns = reader.getNamespaceURI(prefix);
+                xmlType = new QName(ns, localName, prefix);
+            }
         }
-        boolean many = Boolean.parseBoolean(reader.getAttributeValue(null, "many"));
-        boolean required = Boolean.parseBoolean(reader.getAttributeValue(null, "required"));
+        boolean many = Boolean.parseBoolean(reader.getAttributeValue(null, PROPERTY_MANY_ATTR));
+        String override = reader.getAttributeValue(null, PROPERTY_OVERRIDE_ATTR);
+        
         Document value = StAXUtil.createPropertyValue(reader, xmlType, documentBuilder);
 
         Property<?> property = new Property();
         property.setName(name);
         property.setXmlType(xmlType);
         property.setMany(many);
-        property.setRequired(required);
+        
+        if (override != null) {
+            property.setOverride(OverrideOptions.valueOf(override.toUpperCase()));
+        }
         property.setDefaultValue(value);
         return property;
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java Tue Oct  3 23:33:20 2006
@@ -26,6 +26,7 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -84,12 +85,29 @@
 
         // root element has no namespace and local name "value"
         Element root = doc.createElementNS(null, "value");
+        if (type != null) {
+            Attr xsi = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xsi");
+            xsi.setValue("http://www.w3.org/2001/XMLSchema-instance");
+            root.setAttributeNodeNS(xsi);
+
+            String prefix = type.getPrefix();
+            if (prefix == null || prefix.length() == 0) {
+                prefix = "ns";
+            }
+            Attr typeXmlns = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + prefix);
+            typeXmlns.setValue(type.getNamespaceURI());
+            root.setAttributeNodeNS(typeXmlns);
+
+            Attr xsiType = doc.createAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "xsi:type");
+            xsiType.setValue(prefix + ":" + type.getLocalPart());
+            root.setAttributeNodeNS(xsiType);
+        }
         doc.appendChild(root);
+        
         loadPropertyValue(reader, root);
-
         return doc;
     }
-
+    
     /**
      * Load a property value specification from an StAX stream into a DOM Document. Only elements, text and attributes
      * are processed; all comments and other whitespace are ignored.

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=452761&r1=452760&r2=452761
==============================================================================
--- 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 Tue Oct  3 23:33:20 2006
@@ -36,16 +36,92 @@
 
 /**
  * Implementation of StAXPropertyFactory that interprets the XML as
- *
+ * 
  * @version $Rev$ $Date$
  */
 @SuppressWarnings("unchecked")
 public class StringParserPropertyFactory implements StAXPropertyFactory {
+
     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 <T> T createInstance(String text, Class<T> type) throws XMLStreamException, LoaderException {
+        // Class<T> type = property.getJavaType();
+        assert type != null : "property type is null";
+
+        // degenerate case where property type is a String
+        if (String.class.equals(type)) {
+            return type.cast(text);
+        }
+
+        // special handler to convert hexBinary to a byte[]
+        if (byte[].class.equals(type)) {
+            byte[] instance = new byte[text.length() >> 1];
+            for (int i = 0; i < instance.length; i++) {
+                instance[i] =
+                    (byte)(Character.digit(text.charAt(i << 1), 16) << 4 | Character.digit(text
+                        .charAt((i << 1) + 1), 16));
+            }
+            return type.cast(instance);
+        }
+
+        // does this type have a static valueOf(String) method?
+        try {
+            Method valueOf = type.getMethod("valueOf", String.class);
+            if (Modifier.isStatic(valueOf.getModifiers())) {
+                try {
+                    return type.cast(valueOf.invoke(null, text));
+                } catch (IllegalAccessException e) {
+                    throw new AssertionError("getMethod returned an inaccessible method");
+                } catch (InvocationTargetException e) {
+                    // FIXME we should throw something better
+                    throw new LoaderException(e.getCause());
+                }
+            }
+        } catch (NoSuchMethodException e) {
+            // try something else
+        }
+
+        // does this type have a constructor that takes a String?
+        try {
+            Constructor<T> ctr = type.getConstructor(String.class);
+            return ctr.newInstance(text);
+        } catch (NoSuchMethodException e) {
+            // try something else
+        } catch (IllegalAccessException e) {
+            throw new AssertionError("getConstructor returned an inaccessible method");
+        } catch (InstantiationException e) {
+            throw new LoaderException("Property type cannot be instantiated: " + type.getName());
+        } catch (InvocationTargetException e) {
+            // FIXME we should throw something better
+            throw new LoaderException(e.getCause());
+        }
+
+        // do we have a property editor for it?
+        PropertyEditor editor = PropertyEditorManager.findEditor(type);
+        if (editor != null) {
+            try {
+                editor.setAsText(text);
+                return (T)editor.getValue();
+            } catch (IllegalArgumentException e) {
+                // FIXME we should throw something better
+                throw new LoaderException(e);
+
+            }
+        }
+
+        // FIXME we should throw something better
+        throw new LoaderException("Do not have a way to parse a String into a " + type.getName());
+
+    }
+
+    public <T> ObjectFactory<T> createObjectFactory(String text, Property<T> property)
+        throws XMLStreamException, LoaderException {
         Class<T> type = property.getJavaType();
         assert type != null : "property type is null";
-        String text = reader.getElementText();
 
         // degenerate case where property type is a String
         if (String.class.equals(type)) {
@@ -56,8 +132,9 @@
         if (byte[].class.equals(type)) {
             byte[] instance = new byte[text.length() >> 1];
             for (int i = 0; i < instance.length; i++) {
-                instance[i] = (byte) (Character.digit(text.charAt(i << 1), 16) << 4
-                    | Character.digit(text.charAt((i << 1) + 1), 16));
+                instance[i] =
+                    (byte)(Character.digit(text.charAt(i << 1), 16) << 4 | Character.digit(text
+                        .charAt((i << 1) + 1), 16));
             }
             return new SingletonObjectFactory<T>(type.cast(instance));
         }
@@ -99,7 +176,7 @@
         if (editor != null) {
             try {
                 editor.setAsText(text);
-                return new SingletonObjectFactory<T>((T) editor.getValue());
+                return new SingletonObjectFactory<T>((T)editor.getValue());
             } catch (IllegalArgumentException e) {
                 // FIXME we should throw something better
                 throw new LoaderException(e);

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyHelper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyHelper.java?view=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyHelper.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyHelper.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,149 @@
+/*
+ * 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.property;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.tuscany.core.databinding.xml.InputStream2Node;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.loader.InvalidValueException;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.CompositeComponentType;
+import org.apache.tuscany.spi.model.Implementation;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.PropertyValue;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * The property factory backed by the DataBindingframework
+ */
+public class PropertyHelper {
+
+    private static final XPathFactory FACTORY = XPathFactory.newInstance();
+    
+    private PropertyHelper() {
+    }
+
+    public static Document evaluate(NamespaceContext nsContext, Node node, String xPathExpression)
+        throws XPathExpressionException, ParserConfigurationException {
+        XPath path = FACTORY.newXPath();
+        if (nsContext != null) {
+            path.setNamespaceContext(nsContext);
+        }
+        XPathExpression expression = path.compile(xPathExpression);
+        Node result = (Node)expression.evaluate(node, XPathConstants.NODE);
+
+        // TODO: How to wrap the result into a Document?
+        Document document = DOMHelper.newDocument();
+        document.appendChild(document.importNode(result, true));
+        return document;
+    }
+
+    public static Document loadFromFile(String file, DeploymentContext deploymentContext)
+        throws LoaderException {
+        try {
+            URI uri = URI.create(file);
+            URL url = null;
+            if (!uri.isAbsolute()) {
+                url = deploymentContext.getClassLoader().getResource(file);
+            } else {
+                url = uri.toURL();
+            }
+            InputStream is = url.openStream();
+            try {
+                InputStream2Node transformer = new InputStream2Node();
+                return (Document)transformer.transform(is, null);
+            } finally {
+                is.close();
+            }
+        } catch (Exception e) {
+            throw new LoaderException(e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public static void processProperties(CompositeComponentType<?, ?, Property<?>> parent,
+                                         ComponentDefinition<? extends Implementation<?>> componentDefinition,
+                                         DeploymentContext deploymentContext) throws LoaderException {
+        Map<String, PropertyValue<?>> propertyValues = componentDefinition.getPropertyValues();
+        for (PropertyValue propValue : propertyValues.values()) {
+            Document node = propValue.getValue();
+            String source = propValue.getSource();
+            String file = propValue.getFile();
+            if (source != null) {
+                try {
+                    // $<name>/...
+                    int index = source.indexOf('/');
+                    if (index != -1 && source.charAt(0) == '$') {
+                        String name = source.substring(1, index);
+                        Property<?> compositeProp = parent.getProperties().get(name);
+                        if (compositeProp == null) {
+                            InvalidValueException ex =
+                                new InvalidValueException("The 'source' cannot be resolved to a composite property");
+                            ex.addContextName(source);
+                            throw ex;
+                        }
+                        Document document = compositeProp.getDefaultValue();
+                        // Adding /value because the document root is "value"
+                        String xpath = "/value" + source.substring(index);
+
+                        // FIXME: How to deal with namespaces?
+                        node = evaluate(null, document, xpath);
+                        propValue.setValue(node);
+                        Property<?> prop =
+                            (Property<?>)componentDefinition.getImplementation().getComponentType()
+                                .getProperties().get(propValue.getName());
+                        propValue
+                            .setValueFactory(new SimplePropertyObjectFactory(prop, propValue.getValue()));
+                    } else {
+                        InvalidValueException ex =
+                            new InvalidValueException("The 'source' has an invalid value");
+                        ex.addContextName(source);
+                        throw ex;
+                    }
+                } catch (Exception e) {
+                    throw new LoaderException(e);
+                }
+            } else if (file != null) {
+                node = loadFromFile(propValue.getFile(), deploymentContext);
+                propValue.setValue(node);
+                Property<?> prop =
+                    (Property<?>)componentDefinition.getImplementation().getComponentType().getProperties()
+                        .get(propValue.getName());
+                propValue.setValueFactory(new SimplePropertyObjectFactory(prop, propValue.getValue()));
+            }
+        }
+    }
+
+}

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

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

Added: 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/PropertyObjectFactory.java?view=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/PropertyObjectFactory.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,75 @@
+/*
+ * 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.property;
+
+import javax.xml.namespace.QName;
+
+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.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.model.DataType;
+import org.apache.tuscany.spi.model.Property;
+import org.w3c.dom.Node;
+
+public class PropertyObjectFactory<P> implements ObjectFactory<P> {
+    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) {
+        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);
+    }
+
+}

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

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

Added: 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=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/property/SimplePropertyObjectFactory.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,54 @@
+/*
+ * 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.property;
+
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
+import org.apache.tuscany.spi.idl.TypeInfo;
+import org.apache.tuscany.spi.model.Property;
+import org.w3c.dom.Document;
+
+public class SimplePropertyObjectFactory<P> implements ObjectFactory<P> {
+    private SimpleTypeMapperExtension typeMapper;
+    private Property<P> property;
+    private Document value;
+
+    public SimplePropertyObjectFactory(Property<P> property, Document value) {
+        super();
+        this.property = property;
+        this.value = (value == null) ? property.getDefaultValue() : value;
+        this.typeMapper = new SimpleTypeMapperExtension();
+    }
+
+    @SuppressWarnings("unchecked")
+    public P getInstance() throws ObjectCreationException {
+        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.");
+        }
+        return (P)typeMapper.toJavaObject(xmlType, text, null);
+    }
+
+}

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

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

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorPropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorPropertyTestCase.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorPropertyTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/ConstructorPropertyTestCase.java Tue Oct  3 23:33:20 2006
@@ -28,6 +28,7 @@
 import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
 import org.apache.tuscany.spi.implementation.java.JavaMappedService;
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.model.OverrideOptions;
 
 import junit.framework.TestCase;
 import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
@@ -46,7 +47,8 @@
         Constructor<Foo> ctor = Foo.class.getConstructor(String.class);
         processor.visitConstructor(null, ctor, type, null);
         JavaMappedProperty<?> property = type.getProperties().get("myProp");
-        assertTrue(property.isRequired());
+        //assertTrue(property.isRequired());
+        assertEquals(property.getOverride(), OverrideOptions.MAY);
         assertEquals("myProp", property.getName());
     }
 
@@ -122,7 +124,7 @@
     private static class Foo {
 
         @org.osoa.sca.annotations.Constructor()
-        public Foo(@Property(name = "myProp", required = true) String prop) {
+        public Foo(@Property(name = "myProp", override = "may") String prop) {
 
         }
 

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/PropertyProcessorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/PropertyProcessorTestCase.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/PropertyProcessorTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/processor/PropertyProcessorTestCase.java Tue Oct  3 23:33:20 2006
@@ -18,17 +18,18 @@
  */
 package org.apache.tuscany.core.implementation.processor;
 
-import org.osoa.sca.annotations.Property;
+import static org.apache.tuscany.spi.model.OverrideOptions.MUST;
+import junit.framework.TestCase;
 
+import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
+import org.apache.tuscany.spi.implementation.java.DuplicatePropertyException;
+import org.apache.tuscany.spi.implementation.java.IllegalPropertyException;
 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.PojoComponentType;
-import org.apache.tuscany.spi.implementation.java.IllegalPropertyException;
-import org.apache.tuscany.spi.implementation.java.DuplicatePropertyException;
-
-import junit.framework.TestCase;
-import org.apache.tuscany.core.idl.java.JavaInterfaceProcessorRegistryImpl;
+import org.apache.tuscany.spi.model.OverrideOptions;
+import org.osoa.sca.annotations.Property;
 
 /**
  * @version $Rev$ $Date$
@@ -47,7 +48,7 @@
         processor.visitMethod(null, Foo.class.getMethod("setFooRequired", String.class), type, null);
         JavaMappedProperty prop = type.getProperties().get("fooRequired");
         assertNotNull(prop);
-        assertTrue(prop.isRequired());
+        assertEquals(prop.getOverride(), MUST);
     }
 
     public void testMethodName() throws Exception {
@@ -64,7 +65,7 @@
         processor.visitField(null, Foo.class.getDeclaredField("bazRequired"), type, null);
         JavaMappedProperty prop = type.getProperties().get("bazRequired");
         assertNotNull(prop);
-        assertTrue(prop.isRequired());
+        assertEquals(prop.getOverride(), OverrideOptions.MUST);
     }
 
     public void testFieldName() throws Exception {
@@ -78,7 +79,7 @@
             processor.visitField(null, Bar.class.getDeclaredField("baz"), type, null);
             fail();
         } catch (DuplicatePropertyException e) {
-            //expected
+            // expected
         }
     }
 
@@ -88,7 +89,7 @@
             processor.visitMethod(null, Bar.class.getMethod("dupSomeMethod", String.class), type, null);
             fail();
         } catch (DuplicatePropertyException e) {
-            //expected
+            // expected
         }
     }
 
@@ -97,7 +98,7 @@
             processor.visitMethod(null, Bar.class.getMethod("badMethod"), type, null);
             fail();
         } catch (IllegalPropertyException e) {
-            //expected
+            // expected
         }
     }
 
@@ -112,17 +113,16 @@
 
         @Property
         protected String baz;
-        @Property(required = true)
+        @Property(override = "must")
         protected String bazRequired;
         @Property(name = "theBaz")
         protected String bazField;
 
-
         @Property
         public void setFoo(String string) {
         }
 
-        @Property(required = true)
+        @Property(override = "must")
         public void setFooRequired(String string) {
         }
 
@@ -132,7 +132,6 @@
 
     }
 
-
     private class Bar {
 
         @Property
@@ -152,7 +151,6 @@
         @Property
         public void badMethod() {
         }
-
 
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/java/builder/JavaBuilderPropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/java/builder/JavaBuilderPropertyTestCase.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/java/builder/JavaBuilderPropertyTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/integration/implementation/java/builder/JavaBuilderPropertyTestCase.java Tue Oct  3 23:33:20 2006
@@ -26,6 +26,7 @@
 import org.apache.tuscany.spi.implementation.java.JavaMappedProperty;
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
 import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.PropertyValue;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.Scope;
 import org.apache.tuscany.spi.model.ServiceDefinition;
@@ -67,6 +68,8 @@
         impl.setComponentType(type);
         impl.setImplementationClass(Foo.class);
         ComponentDefinition<JavaImplementation> definition = new ComponentDefinition<JavaImplementation>(impl);
+        PropertyValue propertyValue = new PropertyValue(property.getName(), property.getDefaultValueFactory());
+        definition.getPropertyValues().put(property.getName(), propertyValue);
         AtomicComponent component = builder.build(parent, definition, deploymentContext);
         JavaBuilderPropertyTestCase.Foo foo = (JavaBuilderPropertyTestCase.Foo) component.createInstance();
         assertEquals("foo", foo.getTest());

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=452761&r1=452760&r2=452761
==============================================================================
--- 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 Tue Oct  3 23:33:20 2006
@@ -119,6 +119,8 @@
         XMLStreamReader reader = createMock(XMLStreamReader.class);
         expect(reader.getAttributeValue(null, "name")).andReturn("name");
         expect(reader.getAttributeValue(null, "source")).andReturn("$source");
+        expect(reader.getAttributeValue(null, "file")).andReturn(null);
+        expect(reader.next()).andReturn(XMLStreamConstants.END_ELEMENT);
         replay(reader);
         loader.loadProperty(reader, null, defn);
         assertEquals("$source", defn.getPropertyValues().get("name").getSource());

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/MissingMustOverridePropertyException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/MissingMustOverridePropertyException.java?view=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/MissingMustOverridePropertyException.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/MissingMustOverridePropertyException.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MissingMustOverridePropertyException extends LoaderException {
+    public MissingMustOverridePropertyException(String name) {
+        super(name);
+    }
+}

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

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

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/NotOverridablePropertyException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/NotOverridablePropertyException.java?view=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/NotOverridablePropertyException.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/loader/NotOverridablePropertyException.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class NotOverridablePropertyException extends LoaderException {
+    private static final long serialVersionUID = 1483304023970967982L;
+
+    public NotOverridablePropertyException(String name) {
+        super(name);
+    }
+}

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

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

Added: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/OverrideOptions.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/OverrideOptions.java?view=auto&rev=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/OverrideOptions.java (added)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/OverrideOptions.java Tue Oct  3 23:33:20 2006
@@ -0,0 +1,34 @@
+/*
+ * 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.model;
+
+/**
+ * <ul>
+ * <li>no – the value may not be overridden by the higher composite. In this
+ * case, a value must be provided for the reference or property as part of its
+ * declaration.
+ * <li>may – the value may be overridden by the composite. This is the default
+ * for references.
+ * <li>must – no value is specified and the using composite must specify one.
+ * </ul>
+ */
+public enum OverrideOptions {
+    NO, MAY, MUST
+}

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

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

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Property.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Property.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Property.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Property.java Tue Oct  3 23:33:20 2006
@@ -35,7 +35,7 @@
     private QName xmlType;
     private Class<T> javaType;
     private boolean many;
-    private boolean required;
+    private OverrideOptions override;
     private Document defaultValue;
 
     public Property() {
@@ -87,12 +87,12 @@
         this.many = many;
     }
 
-    public boolean isRequired() {
-        return required;
+    public OverrideOptions getOverride() {
+        return override;
     }
 
-    public void setRequired(boolean required) {
-        this.required = required;
+    public void setOverride(OverrideOptions override) {
+        this.override = override;
     }
 
     public Document getDefaultValue() {

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/PropertyValue.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/PropertyValue.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/PropertyValue.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/PropertyValue.java Tue Oct  3 23:33:20 2006
@@ -19,6 +19,7 @@
 package org.apache.tuscany.spi.model;
 
 import org.apache.tuscany.spi.ObjectFactory;
+import org.w3c.dom.Document;
 
 /**
  * Represents a configured component property
@@ -28,6 +29,8 @@
 public class PropertyValue<T> extends ModelObject {
     private String name;
     private String source;
+    private String file;
+    private Document value;
     private ObjectFactory<T> valueFactory;
 
     public PropertyValue() {
@@ -38,12 +41,23 @@
      *
      * @param name the name of the property which this value is for
      * @param source an XPath expression whose result will be the actual value
+     * @param file A URI that the property value can be loaded from
      */
-    public PropertyValue(String name, String source) {
+    public PropertyValue(String name, String source, String file) {
         this.name = name;
         this.source = source;
+        this.file = file;
     }
 
+    /**
+     * @param name
+     * @param value
+     */
+    public PropertyValue(String name, Document value) {
+        this.name = name;
+        this.value = value;
+    }
+    
     public PropertyValue(String name, ObjectFactory<T> valueFactory) {
         this.name = name;
         this.valueFactory = valueFactory;
@@ -88,5 +102,27 @@
 
     public void setValueFactory(ObjectFactory<T> valueFactory) {
         this.valueFactory = valueFactory;
+    }
+
+    public Document getValue() {
+        return value;
+    }
+
+    public void setValue(Document value) {
+        this.value = value;
+    }
+
+    /**
+     * @return the file
+     */
+    public String getFile() {
+        return file;
+    }
+
+    /**
+     * @param file the file to set
+     */
+    public void setFile(String file) {
+        this.file = file;
     }
 }

Modified: incubator/tuscany/java/sca/services/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/BusServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/BusServiceImpl.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/sca/services/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/BusServiceImpl.java (original)
+++ incubator/tuscany/java/sca/services/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/BusServiceImpl.java Tue Oct  3 23:33:20 2006
@@ -49,7 +49,7 @@
      * FIXME the annotation processing framework must inject this
      * @param wsdlReg
      */
-    @Property (required = true)
+    @Property (override = "must")
     public void setWsdlRegistry(WSDLDefinitionRegistry wsdlReg) {
         wsdlRegistry = wsdlReg;
     }

Modified: incubator/tuscany/java/spec/sca/src/main/java/org/osoa/sca/annotations/Property.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/spec/sca/src/main/java/org/osoa/sca/annotations/Property.java?view=diff&rev=452761&r1=452760&r2=452761
==============================================================================
--- incubator/tuscany/java/spec/sca/src/main/java/org/osoa/sca/annotations/Property.java (original)
+++ incubator/tuscany/java/spec/sca/src/main/java/org/osoa/sca/annotations/Property.java Tue Oct  3 23:33:20 2006
@@ -21,27 +21,34 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
-import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
- * Annotation used to indicate a constructor parameter, field or method that is used to inject a configuration property
- * value.
- *
+ * Annotation used to indicate a constructor parameter, field or method that is
+ * used to inject a configuration property value.
+ * 
  * @version $Rev$ $Date$
  */
-@Target({METHOD, FIELD, PARAMETER})
+@Target( {METHOD, FIELD, PARAMETER})
 @Retention(RUNTIME)
 public @interface Property {
     /**
-     * The name of the property. If not specified then the name will be derived from the annotated field.
+     * The name of the property. If not specified then the name will be derived
+     * from the annotated field.
      */
     public String name() default "";
 
     /**
      * Indicates if a value must be specified.
      */
-    public boolean required() default false;
-}
+    public String override() default "may";
 
+    /**
+     * The XML Type in a QName format
+     */
+    public String xmlType() default "{http://www.w3.org/2001/XMLSchema}string";
+
+}



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