Commented: (XERCESJ-1022) cloneNode forgets IDness of attribute 2007-01-28 - By Jacob Kjome (JIRA)
[ https://issues.apache.org/jira/browse/XERCESJ-1022?page=com.atlassian .jira.plugin.system.issuetabpanels:comment-tabpanel#action_12468098 ]
Jacob Kjome commented on XERCESJ-1022: --------------------------------------
I have a similar problem with importNode()/adoptNode(). I'm not sure about what approach to take on cloneNode(), since cloning an element with an Id will surely create an invalid document; a document with two (or more if deep=true and children have Ids themselves) Ids of the same value. However, importNode() /adopNode(), while they could happen run into the same issue, make more sense because Ids won't necessarily collide where they would necessarily with cloneNode() within the same document. Here's a patch transferring Id'ness from the node (and children) of the source document to the destination document. I think I got the copyAdoptedIdentifiers() method below correct, but it should be scrutinized. Please consider adding this patch even if this functionality is rejected for cloneNode()...
Jake
Index: src/org/apache/xerces/dom/CoreDocumentImpl.java =================================================================== --- src/org/apache/xerces/dom/CoreDocumentImpl.java (revision 500745) +++ src/org/apache/xerces/dom/CoreDocumentImpl.java (working copy) @@ -1490,7 +1490,23 @@ */ public Node importNode(Node source, boolean deep) throws DOMException { - return importNode(source, deep, false, null); + Hashtable reversedImportedIdentifiers = null; + + try { + Hashtable importedIdentifiers = ((CoreDocumentImpl) source .getOwnerDocument()).identifiers; + if (importedIdentifiers != null) { + // Build a reverse mapping from element to identifier. + reversedImportedIdentifiers = new Hashtable(); + for (Enumeration elementIds = importedIdentifiers.keys(); elementIds.hasMoreElements();) { + Object elementId = elementIds.nextElement(); + reversedImportedIdentifiers.put(importedIdentifiers.get (elementId), elementId); + } + } + } catch (ClassCastException e) { + // source node comes from a different DOMImplementation + } + + return importNode(source, deep, false, reversedImportedIdentifiers); } // importNode(Node,boolean):Node /** @@ -1857,6 +1873,26 @@ } case ELEMENT_NODE: { userData = node.getUserDataRecord(); + + try { + Hashtable adoptedIdentifiers = ((CoreDocumentImpl) node .getOwnerDocument()).identifiers; + if (adoptedIdentifiers != null) { + // Build a reverse mapping from element to identifier. + Hashtable reversedAdoptedIdentifiers = new Hashtable(); + for (Enumeration elementIds = adoptedIdentifiers.keys(); elementIds.hasMoreElements();) { + Object elementId = elementIds.nextElement(); + reversedAdoptedIdentifiers.put(adoptedIdentifiers.get (elementId), elementId); + } + if (reversedAdoptedIdentifiers.size() > 0) { + if (identifiers == null) identifiers = new Hashtable(); + // Register adopted element identifiers. + copyAdoptedIdentifiers(node, reversedAdoptedIdentifiers); + } + } + } catch (ClassCastException e) { + // source node comes from a different DOMImplementation + } + // remove node from wherever it is Node parent = node.getParentNode(); if (parent != null) { @@ -1892,6 +1928,18 @@ return node; } + private void copyAdoptedIdentifiers(Node node, Hashtable reversedAdoptedIdentifiers) { + if (node.getNodeType() != Node.ELEMENT_NODE) return; + // Does element have an associated identifier? + Object elementId = reversedAdoptedIdentifiers.get(node); + if (elementId != null) { + identifiers.put(elementId, node); + } + for (Node kid = node.getFirstChild(); kid != null; kid = kid .getNextSibling()) { + copyAdoptedIdentifiers(kid, reversedAdoptedIdentifiers); + } + } + /** * Traverses the DOM Tree and expands deferred nodes and their * children.
> cloneNode forgets IDness of attribute > ------------------------------------- > > Key: XERCESJ-1022 > URL: https://issues.apache.org/jira/browse/XERCESJ-1022 > Project: Xerces2-J > Issue Type: Bug > Components: DOM (Level 3 Core) > Affects Versions: 2.6.2 > Environment: java version "1.4.2_05" > Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-141.3) > Java HotSpot(TM) Client VM (build 1.4.2-38, mixed mode) > Reporter: elharo > Attachments: IDTest.java > > > Cloning a node that contains an ID type attribute forgets that the attribute is an ID. Interestingly importing the element into a new document, even one without a DocType, does not forget that the Attr has ID type. > The attached program generates the following output: > Xerces-J 2.6.2 > Found element with ID > Did not find element with ID
-- 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: j-dev-unsubscribe@(protected) For additional commands, e-mail: j-dev-help@(protected)
|
|