renameNode creates wrong Node Implementation with PSVI, HTML and WML DOM
------------------------------------------------------------------------

                 Key: XERCESJ-1407
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1407
             Project: Xerces2-J
          Issue Type: Bug
          Components: DOM (Level 3 Core)
    Affects Versions: 2.9.1
            Reporter: Ludger Bünger
         Attachments: renameNodePatch.txt

I stumbled across an issue when using the DOM Level 3 renameNode method but 
this issue is actually more than only related to renameNode:


Depending on parameters the DOM Level 3 renameNode method analyses whether 
renaming a node would cause a change of node implementation type, i.e. whether 
an instance of ElementImpl or AttributeImpl will be renamed such that it 
aquires a Namespace and thus needs to be converted to their respective NS 
counterparts (ElementNSImpl, AttrNSImpl).

Depending on the ourcome of this, there are two issues:

Issue 1:
If the to-be-renamed node not an NS aware type (i.e. ElementImpl or AttrImpl) 
and a namespace shall be set, xerces instantiates a new ElementNSImpl/AttNSImpl 
by calling the class constructor for these hardcoded.
However, when using the PSVI-aware DOM, this is the wrong class type! It should 
be PSVIElementNSImpl instead!

Xerces should call document.createElement instead so the correct class will be 
instanciated.

Actually I think it is a general problem that xerces sometimes call node 
constructors hard coded instead of using the document.create methods and 
suggest changing this.

Issue 2:
If the to-be-renamed node is of an NS-implementation-type or the namespace is 
null, an internal rename method will be called upon the element/attribute 
implementation and the same node object will be returned.
This is fine for the standard implementation, however in sometimes wrong for 
the HTML and WML DOM.
The HTML and WML-DOM use specific element implementation classes i.e. 
HTMLHeadingElementImpl or HTMLParagraphElementImpl.
In these cases, instead of calling the internal rename method, the element 
should be re-created using the createElement method of it's document 
implementation.

The solution here is the same as for issue 1:
use the document.create methods for renaming an element.
However we need to query whether the used DOM implementation allows element 
instances to be renamed (general XML) or not (HTML, WML).


Please find attached a patch that:

1) replaces every call to Node imlementation constructors (except instances of 
DocumentImpls) by calling the respective document.create method
2) queries whether a DOM implementation permits node renaming and if not, 
re-created elements upon calling rename.
I attached a patch that fixes these two issues.
I'd be pleased if someone could review whether the proposed solution is ok.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to