You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2009/12/14 20:49:45 UTC
svn commit: r890458 - in
/xerces/java/branches/xml-schema-1.1-dev/src/org/apache:
html/dom/HTMLDocumentImpl.java wml/dom/WMLDocumentImpl.java
xerces/dom/CoreDocumentImpl.java xerces/dom/ElementImpl.java
Author: mrglavas
Date: Mon Dec 14 19:49:34 2009
New Revision: 890458
URL: http://svn.apache.org/viewvc?rev=890458&view=rev
Log:
Fixing JIRA Issue #1407: http://issues.apache.org/jira/browse/XERCESJ-1407. In several cases Document.renameNode() was creating the wrong Node implementations for the PSVI, HTML and WML DOMs. Patch thanks to Ludger Bünger.
Modified:
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/html/dom/HTMLDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -23,6 +23,7 @@
import java.util.Locale;
import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xerces.dom.ElementImpl;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
@@ -514,7 +515,7 @@
return super.createAttribute( name.toLowerCase(Locale.ENGLISH) );
}
-
+
public String getReferrer()
{
// Information not available on server side.
@@ -636,8 +637,25 @@
cloneNode(newdoc, deep);
return newdoc;
}
+
+
+ /* (non-Javadoc)
+ * @see CoreDocumentImpl#canRenameElements()
+ */
+ protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+ if (el.getNamespaceURI() != null) {
+ // element is not HTML:
+ // can be renamed if not changed to HTML
+ return newNamespaceURI != null;
+ }
+
+ // check whether a class change is required
+ Class newClass = (Class) _elementTypesHTML.get(newNodeName.toUpperCase(Locale.ENGLISH));
+ Class oldClass = (Class) _elementTypesHTML.get(el.getTagName());
+ return newClass == oldClass;
+ }
-
+
/**
* Recursive method retreives an element by its <code>id</code> attribute.
* Called by {@link #getElementById(String)}.
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/wml/dom/WMLDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -21,6 +21,7 @@
import org.apache.wml.WMLDocument;
import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xerces.dom.ElementImpl;
import org.w3c.dom.DOMException;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
@@ -65,6 +66,14 @@
return new WMLElementImpl( this, tagName );
}
+ /* (non-Javadoc)
+ * @see CoreDocumentImpl#canRenameElements()
+ */
+ protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+ // check whether a class change is required
+ return _elementTypesWML.get(newNodeName) == _elementTypesWML.get(el.getTagName());
+ }
+
static {
_elementTypesWML = new Hashtable();
_elementTypesWML.put("b", WMLBElementImpl.class);
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java Mon Dec 14 19:49:34 2009
@@ -959,6 +959,19 @@
}
+ /* NON-DOM
+ * Used by DOM Level 3 WD remameNode.
+ *
+ * Some DOM implementations do not allow nodes to be renamed and require
+ * creating new elements.
+ * In this case this method should be overwritten.
+ *
+ * @return true if the given element can be renamed, false, if it must be replaced.
+ */
+ protected boolean canRenameElements(String newNamespaceURI, String newNodeName, ElementImpl el) {
+ return true;
+ }
+
/**
* DOM Level 3 WD - Experimental.
* Renaming node
@@ -975,76 +988,23 @@
case ELEMENT_NODE: {
ElementImpl el = (ElementImpl) n;
if (el instanceof ElementNSImpl) {
- ((ElementNSImpl) el).rename(namespaceURI, name);
-
- // fire user data NODE_RENAMED event
- callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
+ if (canRenameElements(namespaceURI, name, el)) {
+ ((ElementNSImpl) el).rename(namespaceURI, name);
+ // fire user data NODE_RENAMED event
+ callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
+ }
+ else {
+ el = replaceRenameElement(el, namespaceURI, name);
+ }
}
else {
- if (namespaceURI == null) {
- if (errorChecking) {
- int colon1 = name.indexOf(':');
- if(colon1 != -1){
- String msg =
- DOMMessageFormatter.formatMessage(
- DOMMessageFormatter.DOM_DOMAIN,
- "NAMESPACE_ERR",
- null);
- throw new DOMException(DOMException.NAMESPACE_ERR, msg);
- }
- if (!isXMLName(name,xml11Version)) {
- String msg = DOMMessageFormatter.formatMessage(
- DOMMessageFormatter.DOM_DOMAIN,
- "INVALID_CHARACTER_ERR", null);
- throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
- msg);
- }
- }
+ if (namespaceURI == null && canRenameElements(null, name, el)) {
el.rename(name);
-
// fire user data NODE_RENAMED event
- callUserDataHandlers(el, null,
- UserDataHandler.NODE_RENAMED);
+ callUserDataHandlers(el, null, UserDataHandler.NODE_RENAMED);
}
else {
- // we need to create a new object
- ElementNSImpl nel =
- new ElementNSImpl(this, namespaceURI, name);
-
- // register event listeners on new node
- copyEventListeners(el, nel);
-
- // remove user data from old node
- Hashtable data = removeUserDataTable(el);
-
- // remove old node from parent if any
- Node parent = el.getParentNode();
- Node nextSib = el.getNextSibling();
- if (parent != null) {
- parent.removeChild(el);
- }
- // move children to new node
- Node child = el.getFirstChild();
- while (child != null) {
- el.removeChild(child);
- nel.appendChild(child);
- child = el.getFirstChild();
- }
- // move specified attributes to new node
- nel.moveSpecifiedAttributes(el);
-
- // attach user data to new node
- setUserDataTable(nel, data);
-
- // and fire user data NODE_RENAMED event
- callUserDataHandlers(el, nel,
- UserDataHandler.NODE_RENAMED);
-
- // insert new node where old one was
- if (parent != null) {
- parent.insertBefore(nel, nextSib);
- }
- el = nel;
+ el = replaceRenameElement(el, namespaceURI, name);
}
}
// fire ElementNameChanged event
@@ -1054,7 +1014,7 @@
case ATTRIBUTE_NODE: {
AttrImpl at = (AttrImpl) n;
- // dettach attr from element
+ // detach attr from element
Element el = at.getOwnerElement();
if (el != null) {
el.removeAttributeNode(at);
@@ -1082,7 +1042,7 @@
}
else {
// we need to create a new object
- AttrNSImpl nat = new AttrNSImpl(this, namespaceURI, name);
+ AttrNSImpl nat = (AttrNSImpl) createAttributeNS(namespaceURI, name);
// register event listeners on new node
copyEventListeners(at, nat);
@@ -1123,6 +1083,47 @@
}
}
+
+ private ElementImpl replaceRenameElement(ElementImpl el, String namespaceURI, String name) {
+
+ // we need to create a new object
+ ElementNSImpl nel = (ElementNSImpl)createElementNS(namespaceURI, name);
+
+ // register event listeners on new node
+ copyEventListeners(el, nel);
+
+ // remove user data from old node
+ Hashtable data = removeUserDataTable(el);
+
+ // remove old node from parent if any
+ Node parent = el.getParentNode();
+ Node nextSib = el.getNextSibling();
+ if (parent != null) {
+ parent.removeChild(el);
+ }
+ // move children to new node
+ Node child = el.getFirstChild();
+ while (child != null) {
+ el.removeChild(child);
+ nel.appendChild(child);
+ child = el.getFirstChild();
+ }
+ // move specified attributes to new node
+ nel.moveSpecifiedAttributes(el);
+
+ // attach user data to new node
+ setUserDataTable(nel, data);
+
+ // and fire user data NODE_RENAMED event
+ callUserDataHandlers(el, nel,
+ UserDataHandler.NODE_RENAMED);
+
+ // insert new node where old one was
+ if (parent != null) {
+ parent.insertBefore(nel, nextSib);
+ }
+ return nel;
+ }
/**
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java?rev=890458&r1=890457&r2=890458&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/ElementImpl.java Mon Dec 14 19:49:34 2009
@@ -97,7 +97,25 @@
if (needsSyncData()) {
synchronizeData();
}
- this.name = name;
+ if (ownerDocument.errorChecking) {
+ int colon1 = name.indexOf(':');
+ if(colon1 != -1){
+ String msg =
+ DOMMessageFormatter.formatMessage(
+ DOMMessageFormatter.DOM_DOMAIN,
+ "NAMESPACE_ERR",
+ null);
+ throw new DOMException(DOMException.NAMESPACE_ERR, msg);
+ }
+ if (!CoreDocumentImpl.isXMLName(name, ownerDocument.isXML11Version())) {
+ String msg = DOMMessageFormatter.formatMessage(
+ DOMMessageFormatter.DOM_DOMAIN,
+ "INVALID_CHARACTER_ERR", null);
+ throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
+ msg);
+ }
+ }
+ this.name = name;
reconcileDefaultAttributes();
}
@@ -689,7 +707,7 @@
// This case is not defined by the DOM spec, we choose
// to create a new attribute in this case and remove an old one from the tree
// note this might cause events to be propagated or user data to be lost
- newAttr = new AttrNSImpl((CoreDocumentImpl)getOwnerDocument(), namespaceURI, qualifiedName, localName);
+ newAttr = ((CoreDocumentImpl)getOwnerDocument()).createAttributeNS(namespaceURI, qualifiedName, localName);
attributes.setNamedItemNS(newAttr);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org