[ 
https://issues.apache.org/jira/browse/WSCOMMONS-66?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andreas Veithen updated WSCOMMONS-66:
-------------------------------------

    Component/s: AXIOM

> OMSerializerUtil is not calling XMLStreamWriter in the correct order
> --------------------------------------------------------------------
>
>                 Key: WSCOMMONS-66
>                 URL: https://issues.apache.org/jira/browse/WSCOMMONS-66
>             Project: WS-Commons
>          Issue Type: Bug
>          Components: AXIOM
>            Reporter: Rich Scheuerle
>            Assignee: Rich Scheuerle
>            Priority: Critical
>         Attachments: finalpatch0725.txt
>
>
> 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.
-
You can reply to this email to add a comment to the issue online.

Reply via email to