[ http://issues.apache.org/jira/browse/XMLBEANS-228?page=all ]

Andreas Loew updated XMLBEANS-228:
----------------------------------

    Attachment: substitutionGroupInSequence.xsd

Sample XSD file as needed for the JUnit test case

> Element order is mixed up on document creation after calling substitute()
> -------------------------------------------------------------------------
>
>          Key: XMLBEANS-228
>          URL: http://issues.apache.org/jira/browse/XMLBEANS-228
>      Project: XMLBeans
>         Type: Bug
>   Components: XmlObject
>     Versions: Version 2.1, Version 2
>  Environment: N/A
>     Reporter: Andreas Loew
>      Fix For: Version 2.1, Version 2
>  Attachments: SubstitutionGroupTest.java, substitutionGroupFix.patch, 
> substitutionGroupInSequence.xsd
>
> When trying to create XML documents with XMLBeans 2.x using xmlText() or 
> save() that use substitution groups, usage of the substitute() method will 
> mix up the order of the XML document (the order will remain correct when 
> substitute() will not be called).
> We have attached a test case (schema XSD, JUnit test) that demonstrates the 
> failure and also attached a patch against plain XMLBeans 2.0.0 that shows 
> where the problem is and what is needed to fix problem (although currently at 
> the cost of a quite severe perfomance penalty, as I am not an expert in 
> XMLBeans internals):
> For the test case, XMLBeans 2.0.0 as well as the current SVN snapshot both 
> fail as they return
> <?xml version="1.0" encoding="UTF-8"?>
> <Person 
> xmlns="urn:www-apache-org:SubstitutionGroup/substitutionGroupInSequence">
>   <FirstCommentElement>ThirdElement</FirstCommentElement>
>   <FirstName>FirstElement</FirstName>
>   <LastName>SecondElement</LastName>
> </Person>
> instead of
> <?xml version="1.0" encoding="UTF-8"?>
> <Person 
> xmlns="urn:www-apache-org:SubstitutionGroup/substitutionGroupInSequence">
>   <FirstName>FirstElement</FirstName>
>   <LastName>SecondElement</LastName>
>   <FirstCommentElement>ThirdElement</FirstCommentElement>
> </Person>
> as would be correct (and will be returned after applying the patches 
> provided).
> Basically, the main problem is that  
> XmlObjectBase#getElementEndingDelimiters() after having called 
> SchemaProperty#getJavaSetterDelimiter(), does not take into account that the 
> QNameSet returned by getJavaSetterDelimiter() does not yet include the "alias 
> names" - i.e. possible substitutions - of those elements that happen to be 
> heads of substitution groups.
> The patch for XmlObjectBase adds the missing substitutions to this QNameSet. 
> This will fix the base problem, but so far at the cost of performance: In 
> order to simulate a (non-existing) QNameSet iterator on the set of 
> JavaSetterDelimiters, we have not been able to find a more intelligent 
> solution than to iterate over the complete array of SchemaGlobalElements and 
> check each head of a substitution group for inclusion in the QNameSet (using 
> QNameSet#contains()). This definitely is suboptimal and should be replaced by 
> an optimized implementation done by somebody who is familiar with the 
> internals of XMLBeans. (Sorry!)
> Unfortunately, while creating the first fix, we ran into a second (small) 
> issue:
> The static method QNameSet#forArray() does mistakenly pass null instead of 
> new HashSet() to the private constructor, which results in a 
> NullPointerException. The second fix (also included in the patch) will fix 
> this problem.
> Please get back to me in case you need any additional details.
> Thanks & best regards,
> Andreas Loew & Patrik Streicher

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to