[prev in list] [next in list] [prev in thread] [next in thread]
List: xmlbeans-dev
Subject: [jira] Created: (XMLBEANS-228) Element order is mixed up on document creation after calling substitu
From: "Andreas Loew (JIRA)" <xmlbeans-dev () xml ! apache ! org>
Date: 2005-11-23 12:49:39
Message-ID: 1234300951.1132750179621.JavaMail.jira () ajax ! apache ! org
[Download RAW message or body]
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
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: dev-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: dev-help@xmlbeans.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic