[ 
http://issues.apache.org/jira/browse/AXIS-2347?page=comments#action_12360891 ] 

Jayachandra Sekhara Rao Sunkara commented on AXIS-2347:
-------------------------------------------------------

When I delved inside the source, I realized that the problem is cropping up 
because of logic inside NodeImpl.setParent(...) method. Here is the explanation 
and a suggested patch.

*******
The current NodeImpl.setParent() code looks like follows...

ln 1     /**
ln 2     * Set the parent node and invoke appendChild(this) to 
ln 3     * add this node to the parent's list of children.
ln 4     * @param parent
ln 5     * @throws SOAPException
ln 6     */ 
ln 7    protected void setParent(NodeImpl parent) throws SOAPException {
ln 8        if (this.parent == parent) {
ln 9            return;
ln 10        }
ln 11       if (this.parent != null) {
ln 12           this.parent.removeChild(this);
ln 13       }
ln 14       if (parent != null) {
ln 15           parent.appendChild(this);
ln 16       }
ln 17       this.setDirty();
ln 18       this.parent = parent;
ln 19   }

There is a sly bug in this code. At line 12 <code>this</code> (lets denote it 
as NODE_C) node is removed as a child from its existing parent (lets call this 
parent as NODE_P) but the link of NODE_C.parent still points to NODE_P. Because 
of this later when <code>appendChild</code> method is called at ln15 with 
NODE_C sent as the parameter, within the code of appendChild since there is 
going to be a detachNode call on NODE_C that call is going to fail as NODE_C 
claims it has a non-null parent (NODE_P) but NODE_P list of children list 
doesn't contain NODE_C.
So I'm suggesting the following patch

ln 11       if (this.parent != null) {
ln 12           this.parent.removeChild(this);
ln 12a          this.parent = null; //remove all old lineage traces from both 
sides
ln 12b                             //so that future appendChild()/detachNode() 
doesn't crib 

ln 13       }

*********

I've tested the patch and found that it doesn't break any existing scenarios. 
I'll check this in EOD today unless someone has any objection.

> setBody results in a DOMException
> ---------------------------------
>
>          Key: AXIS-2347
>          URL: http://issues.apache.org/jira/browse/AXIS-2347
>      Project: Apache Axis
>         Type: Bug
>   Components: SAAJ
>     Versions: 1.3
>     Reporter: Jayachandra Sekhara Rao Sunkara
>     Assignee: Jayachandra Sekhara Rao Sunkara
>  Attachments: TestSOAPEnvelope.java
>
> The act of detaching the body of a soap envelope and trying to set its body 
> with a new soap body results in following Exception
> javax.xml.soap.SOAPException: javax.xml.soap.SOAPException: 
> org.w3c.dom.DOMExcep
> tion: NodeImpl Not found
>         at org.apache.axis.message.SOAPBody.setParentElement(SOAPBody.java 
> :91)
>         at org.apache.axis.message.SOAPEnvelope.setBody(SOAPEnvelope.java:309)
>         at 
> mytest.soapenvelope.TestSOAPEnvelope.setBody(TestSOAPEnvelope.java:16
> )
>         at mytest.soapenvelope.TestSOAPEnvelope.main 
> (TestSOAPEnvelope.java:40)
> Caused by: javax.xml.soap.SOAPException: org.w3c.dom.DOMException: NodeImpl 
> Not
> found
>         at 
> org.apache.axis.message.NodeImpl.setParentElement(NodeImpl.java:634)
>         at org.apache.axis.message.SOAPBody.setParentElement 
> (SOAPBody.java:88)
>         ... 3 more
> Caused by: org.w3c.dom.DOMException: NodeImpl Not found
>         at org.apache.axis.message.NodeImpl.removeChild(NodeImpl.java:515)
>         at org.apache.axis.message.SOAPEnvelope.removeChild 
> (SOAPEnvelope.java:61
> 7)
>         at org.apache.axis.message.NodeImpl.detachNode(NodeImpl.java:661)
>         at org.apache.axis.message.NodeImpl.appendChild(NodeImpl.java:493)
>         at org.apache.axis.message.NodeImpl.setParent (NodeImpl.java:792)
>         at 
> org.apache.axis.message.NodeImpl.setParentElement(NodeImpl.java:632)
>         ... 4 more
> Attached test case (TestSOAPEnvelope.java) describes the scenario.

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

Reply via email to