The property compatibility check we have in Tuscany seems to be too restrictive. In your case, the componentType property is declared in java and no XSD element can be inferred.

The SCA assembly spec says:

1109 Two property types are compatible if they have the same XSD type (where declared as XSD types) or the 1110 same XSD global element (where declared as XSD global elements). For cases where the type of a 1111 property is declared using a different type system (eg Java), then the type of the property is mapped to 1112 XSD using the mapping rules defined by the appropriate implementation type specification

If the mapped XSD type for the java property (componentType property) is the same as the one behind the XSD global element for the component property, we should take them as compatible.

Thanks,
Raymond
--------------------------------------------------
From: "keinmensch" <[email protected]>
Sent: Thursday, December 17, 2009 6:46 AM
To: <[email protected]>
Subject: Re: Non-Simple Property Injected with XML Fails with NPE

Hi again!
So, I have become desperate :-) and started poking around in the Tuscany
source code.
The NullPointerException that I experienced earlier is caused by a
component type property having a null XSD element. I modified the code,
as below, to avoid the NullPointerException.
[code]
...
           // check that the types specified in the component type and
component property match
           if (componentProperty.getXSDElement() != null
               && !componentProperty.getXSDElement().equals(
                   componentTypeProperty.getXSDElement()))
           {
               // MY MODIFICATION HERE.
               String theCompTypePropXSDElem = "[not available]";
               if (componentTypeProperty
                       .getXSDElement() != null)
               {
                   theCompTypePropXSDElem =
componentTypeProperty.getXSDElement().toString();
               }
               Monitor.error(monitor, this, Messages.ASSEMBLY_VALIDATION,
                   "PropertXSDElementsDontMatch", component.getName(),
                   componentProperty.getName(), componentProperty
                       .getXSDElement().toString(),
theCompTypePropXSDElem);
           }
...
[/code]

With this modification in place, I now receive the following messages in
the log:

Dec 17, 2009 10:28:54 PM
org.apache.tuscany.sca.builder.impl.ComponentBuilderImpl [Composite:
{http://docs.oasis-open.org/ns/opencsa/sca/200
903}, Component: ServiceComponent1] (PropertXSDElementsDontMatch)
SEVERE: [ASM_5036] The property component ServiceComponent1 property
myComplexProp has XSD element {http://foo.com}fooElement while its comp
onent type property has the XSD element [not available]
java.lang.IllegalStateException:
org.oasisopen.sca.ServiceRuntimeException: [Composite:
{http://docs.oasis-open.org/ns/opencsa/sca/200903},
Component: ServiceComponent1] - [ASM_5036] The property component
ServiceComponent1 property myComplexProp has XSD element {http://foo.com}f
ooElement while its component type property has the XSD element [not
available]
   at org.apache.tuscany.sca.node.impl.NodeImpl.start(NodeImpl.java:176)
   at
com.ivan.SmallPropertyTestMain.doStuffTuscany2(SmallPropertyTestMain.java:58)
   at com.ivan.SmallPropertyTestMain.main(SmallPropertyTestMain.java:29)
Caused by: org.oasisopen.sca.ServiceRuntimeException: [Composite:
{http://docs.oasis-open.org/ns/opencsa/sca/200903}, Component: ServiceComp
onent1] - [ASM_5036] The property component ServiceComponent1 property
myComplexProp has XSD element {http://foo.com}fooElement while its co
mponent type property has the XSD element [not available]
   at
org.apache.tuscany.sca.node.impl.NodeFactoryImpl.analyzeProblems(NodeFactoryImpl.java:174)
   at
org.apache.tuscany.sca.node.impl.NodeFactoryImpl.configureNode(NodeFactoryImpl.java:275)
   at org.apache.tuscany.sca.node.impl.NodeImpl.start(NodeImpl.java:135)
   ... 2 more
Exception in thread "main" java.lang.NullPointerException
   at com.ivan.SmallPropertyTestMain.main(SmallPropertyTestMain.java:31)

The question is: Why is the component type property null?
Isn't the property type supposed to be inferred from the field annotated
by the @Property annotation or have I misunderstood?
Best wishes,
Ivan

Reply via email to