[ 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]