XML:
<multiRef id="id15" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns27:FlightBean" xmlns:ns27="http://flightsraw" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
NSStack:
{http://flightsraw}=ns27
{http://schemas.xmlsoap.org/soap/encoding/}=soapenc
null
XML:
</multiRef>
NSStack:
{http://flightsraw}=ns27
{http://schemas.xmlsoap.org/soap/encoding/}=soapenc
clearFrame() only goes until it sees a null - which it does immediately. The null is then removed by the top--.
I'll verify that the problem still occurs in tonight's drop, and prepare a SAX demo program using a patched version of NSStack to show the stack depth if necessary.
- Dennis
Glen Daniels wrote:
Hi Dennis:
A quick scan of the logic in NSStack looks OK to me...
When we get to a new element (while serializing or deserializing) the appropriate context will push() manually, to ensure a null on the stack. Then each time we add() a mapping, push() gets called simply as a convenience to move the pointer forward and auto-grow the array. Hence, calling clearFrame() first when we pop will back the stack up to the null at the beginning of the current frame. Then the top-- after that backs the top up beyond the null (to the end of the last frame). In general, I think the nulls-as-markers pattern is fine. The only thing keeping another stack of frame indices around would buy us would be a quicker pop() when there are a lot of mappings on a given frame - not a huge deal.
There was an extraneous clearFrame() call in SerializationContextImpl, which I removed - don't know if that might have contributed to your issues.
If you still think there's a problem, the best thing to do is write up a small test case which demonstrates it (i.e. call NSStack APIs in the same order that we do while (de)serializing, and then check the size/top of the stack to make sure things look reasonable) and we can go from there.
Thanks for your attention to this stuff, btw. I hope you get your build working and continue to find Axis a valuable place for your energies!
--Glen
-----Original Message-----
From: Dennis Sosnoski [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, December 11, 2002 4:43 PM
To: [EMAIL PROTECTED]
Subject: Re: cvs commit: xml-axis/java/src/org/apache/axis/utils
NSStack.java
Hi Glen,
Looks like you've put the namespace stack problem back in by restoring the original order of operations (call to clearFrame() before decrementing top). Am I missing something here? The problem I saw was that namespaces were pushed on the stack before the null value, so the null value had to be removed before calling clearFrame(). If you can tell me what went wrong when the order was changed perhaps I can suggest an alternative fix. Sorry I didn't try this out with the whole test suite myself, I'm hoping to get set up for full build this next weekend.
This whole business of pushing nulls on the stack as markers leaves me uncomfortable. I'd prefer using two stacks, one for the actual namespaces and one for the frames (as top of stack values for the namespace stack). It's a substantial change to make without a good reason, though.
- Dennis
[EMAIL PROTECTED] wrote:
gdaniels 2002/12/11 08:12:30RPCProvider.java
Modified: java/src/org/apache/axis/providers/java
java/src/org/apache/axis/utils NSStack.javadeserializing
Log:
Tweak NSStack fix, and throw the unwrapped exception if
from within RPCProvider.xml-axis/java/src/org/apache/axis/utils/NSStack.java
1.35 +3 -6
/home/cvs/xml-axis/java/src/org/apache/axis/utils/NSStack.java,v
Index: NSStack.java
===================================================================
RCS file:
retrieving revision 1.34stack of variable
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- NSStack.java 10 Dec 2002 17:22:03 -0000 1.34
+++ NSStack.java 11 Dec 2002 16:12:30 -0000 1.35
@@ -58,9 +58,6 @@
import org.apache.commons.logging.Log;
import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Stack;
-import java.util.Iterator;
/**
* The abstraction this class provides is a push down
@@ -79,7 +76,7 @@array, will null
* Accordingly, this stack is implemented as a single
* values used to indicate frame boundaries.
*
- * @author: James Snell
+ * @author James Snell
* @author Glen Daniels ([EMAIL PROTECTED])
* @author Sam Ruby ([EMAIL PROTECTED])
*/
@@ -118,9 +115,9 @@
* Remove the top frame from the stack.
*/
public void pop() {
- top--;
-
clearFrame();
+
+ top--;
if (top == 0) {
if (log.isTraceEnabled())