OMSerializerUtil is not calling XMLStreamWriter in the correct order
--------------------------------------------------------------------
Key: WSCOMMONS-66
URL: http://issues.apache.org/jira/browse/WSCOMMONS-66
Project: WS-Commons
Issue Type: Bug
Reporter: Rich Scheuerle
Assigned To: Rich Scheuerle
Priority: Critical
OMSerializerUtil is not invoking the XMLStreamWriter in the correct order.
This causes problems when a different StAX implementation (non-Woodstox) is
used.
The suggestion is to change the algorithm to use the same algorithm as
WSCOMMONS-64. (Actually the best approach is to try and fold the code
together).
I think this would also fix several of the other AXION serializer issues.
Here is the WSCOMMONS-64 algorithm (reccently introduced):
// The algorithm is:
// ... generate setPrefix/setDefaultNamespace for each namespace
declaration if the prefix is unassociated.
// ... generate setPrefix/setDefaultNamespace if the prefix of the
element is unassociated
// ... generate setPrefix/setDefaultNamespace for each unassociated
prefix of the attributes.
//
// ... generate writeStartElement
//
// ... generate writeNamespace/writerDefaultNamespace for each
namespace declaration on the element
// ... generate writeNamespace/writeDefaultNamespace for any new
"autogen" namespace/prefixes
// ... generate writeAttribute for each attribute
Here is the guidance from the JSR173 StAX specification (note that prefixes are
first "set", then then writeStartElement, then the namespace
declarations are generated). This is not being followed in OMSerializerUtil
----------------
writer.setPrefix("c","http://c");
writer.setDefaultNamespace("http://c");
writer.writeStartElement("http://c","a");
writer.writeAttribute("b","blah");
writer.writeNamespace("c","http://c");
writer.writeDefaultNamespace("http://c");
writer.setPrefix("d","http://c");
writer.writeEmptyElement("http://c","d");
writer.writeAttribute("http://c","chris","fry");
writer.writeNamespace("d","http://c");
writer.writeCharacters("foo bar foo");
writer.writeEndElement();
writer.flush();
This will result in the following XML (new lines are non-normative)
<?xml version='1.0' encoding='utf-8'?>
<a b="blah" xmlns:c="http://c" xmlns="http://c">
<d:d d:chris="fry" xmlns:d="http://c"/>foo bar foo</a>
---------------------
Here is the specific exception that I get when I plug in a different StAX
implementation:
java.lang.IllegalStateException: writeNamespace() can only be called following
writeStartElement() or writeEmptyElement().
at .....
at
org.apache.axiom.om.impl.MTOMXMLStreamWriter.writeNamespace(MTOMXMLStreamWriter.java:150)
at
org.apache.axiom.om.impl.util.OMSerializerUtil.serializeNamespace(OMSerializerUtil.java:116)
at
org.apache.axiom.om.impl.util.OMSerializerUtil.serializeNamespaces(OMSerializerUtil.java:264)
at
org.apache.axiom.om.impl.util.OMSerializerUtil.serializeStartpart(OMSerializerUtil.java)
at
org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:767)
at
org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:756)
at
org.apache.axiom.om.impl.llom.OMNodeImpl.serialize(OMNodeImpl.java:310)
at
org.apache.axiom.om.impl.llom.OMNodeImpl.serialize(OMNodeImpl.java:348)
at
org.apache.axiom.om.impl.llom.OMElementImpl.toString(OMElementImpl.java:899)
at
org.apache.axiom.om.impl.serializer.PreserveEnvelopeTest.testOMNS(PreserveEnvelopeTest.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:615)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
--------------------------
I have assigned this issue to myself and will submit a patch for the fix.
As with WSCOMMONS-64, I would like a peer review of the idea and change.
(Note: I worked extensively on the SAX model in Axis and within other
webservice projects...so I am familiar with this problem domain).
Thanks for your help.
scheu
--
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]