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