hi

I have hit an issue with using automatic name conflict resolution that I 
wonder if anyone else has found.

Consider the following schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
 
targetNamespace="http://webservices.amazon.com/AWSECommerceService/2008-04-07";
 xmlns:tns="http://webservices.amazon.com/AWSECommerceService/2008-04-07"; 
xmlns:xs="http://www.w3.org/2001/XMLSchema";>

    <xs:element name="ItemAttributes">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" 
name="Creator">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="Role"
                                    type="xs:string" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="MerchantItemAttributes">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" 
name="Creator">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="Role"
                                    type="xs:string" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


</xs:schema>

It's actually part of the schema from an Amazon Web Services WSDL.  Notice 
the duplicate 'Creator' elements - one in each of ItemAttributes and 
MerchantItemAttributes.

When I run codegen with name conflict resolution (set to xpath or type), I 
get

16-Apr-2008 11:17:27 org.exolab.castor.builder.JClassRegistry bind
INFO: Resolving conflict for local element 
/MerchantItemAttributes{http://webservices.amazon.com/AWSECommerceService/2008-04-07}/Creator[/MerchantItemAttributes
{http://webservices.amazon.com/AWSECommerceService/2008-04-07}/Creator] 
against another local element of the same name.
java.lang.IllegalArgumentException: 
'WebservicesAmazonComAWSECommerceService20080407}CreatorDescriptor' is not 
a valid Java identifier.
        at org.exolab.javasource.JStructure.<init>(JStructure.java:121)
        at 
org.exolab.javasource.AbstractJClass.<init>(AbstractJClass.java:54)
        at org.exolab.javasource.JClass.<init>(JClass.java:70)
        at 
org.exolab.castor.builder.descriptors.DescriptorJClass.<init>(DescriptorJClass.java:102)
        at 
org.exolab.castor.builder.descriptors.DescriptorSourceFactory.createSource(DescriptorSourceFactory.java:121)
        etc.etc.

If you then see what files it has generated, you see this :

Creator.java
WebservicesAmazonComAWSECommerceService20080407}Creator.java

It has correctly detected the conflict, but attempted to create a Java 
class with a bad classname. Clearly the logic in 
XPATHClassNameConflictResolver.java is not working quite as intended.

Has this been reported before?  I couldn't see any reference to this 
issue,but I would have thought it not that unusual a situation.

The problem seems to be in XPATHClassNameConflictResolver.java, when it 
tries to 'parse' the Xpath it is presented with.  It fails to handle the 
Xpath of this form:

/MerchantItemAttributes{http://webservices.amazon.com/AWSECommerceService/2008-04-07}/Creator

(I have debugged the code and that's the exact string that is presented). 
Looking at the code logic, I guess this is because of the way the method 
calculateXPathPrefix uses StringTokenizer to split on './' and thus gets 
confused by the / inside the url in the {} section (the namespace 
associated with the Xpath component MerchantItemAttrubutes).

I have 'hacked' this by patching the caclulateXPathPrefix method to first 
strip out {} sections and generating an XPath Prefix on the remaining 
XPath,  So in the above case, I fixup the XPath to look like

/MerchantItemAttributes/Creator

and proceed from there. That fixes up my problem.

Is this the correct solution?  I am happy to provide my fix to 
XPATHClassNameConflictResolver.java if others think this is the correct 
approach. or whether the problem should be resolved by a different 
approach altogether.

thanks

chris

Reply via email to