diff options
author | Jesse Wilson <jessewilson@google.com> | 2010-03-15 16:26:31 -0700 |
---|---|---|
committer | Jesse Wilson <jessewilson@google.com> | 2010-03-15 16:40:52 -0700 |
commit | 503917e646b5ebd3f23dfe0cb41270cfe484693a (patch) | |
tree | d07b6f1e7ac711a56c9ab77f742c5587747ff942 /xml/src/main/java | |
parent | beb7d0e677e705eb78f18e15a9c7d75aabc47d84 (diff) | |
download | libcore-503917e646b5ebd3f23dfe0cb41270cfe484693a.zip libcore-503917e646b5ebd3f23dfe0cb41270cfe484693a.tar.gz libcore-503917e646b5ebd3f23dfe0cb41270cfe484693a.tar.bz2 |
Implementing Document.renameNode() and DOMImplementation.getFeature().
The rename code required moving some behaviour from ElementImpl
and AttrImpl up to their common superclass, NodeImpl.
Change-Id: I30910de146f525a5ecc837895ce5808928b858a0
Diffstat (limited to 'xml/src/main/java')
5 files changed, 75 insertions, 69 deletions
diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java index 56a4817..c601de6 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java @@ -36,49 +36,19 @@ public final class AttrImpl extends NodeImpl implements Attr { // Maintained by ElementImpl. ElementImpl ownerElement; - - private boolean namespaceAware; - boolean isId; - - private String namespaceURI; - private String localName; + boolean namespaceAware; + String namespaceURI; + String prefix; + String localName; - private String prefix; - private String value; AttrImpl(DocumentImpl document, String namespaceURI, String qualifiedName) { super(document); - namespaceAware = true; - this.namespaceURI = namespaceURI; - - if (qualifiedName == null || "".equals(qualifiedName)) { - throw new DOMException(DOMException.NAMESPACE_ERR, qualifiedName); - } - - int prefixSeparator = qualifiedName.lastIndexOf(":"); - if (prefixSeparator != -1) { - setPrefix(qualifiedName.substring(0, prefixSeparator)); - qualifiedName = qualifiedName.substring(prefixSeparator + 1); - } - - localName = qualifiedName; - - if ("".equals(localName)) { - throw new DOMException(DOMException.NAMESPACE_ERR, localName); - } - - if ("xmlns".equals(localName) && !"http://www.w3.org/2000/xmlns/".equals(namespaceURI)) { - throw new DOMException(DOMException.NAMESPACE_ERR, localName); - } - - if (!DocumentImpl.isXMLIdentifier(localName)) { - throw new DOMException(DOMException.INVALID_CHARACTER_ERR, localName); - } - + setNameNS(this, namespaceURI, qualifiedName); value = ""; } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java index b662a13..3106c3f 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java @@ -85,6 +85,6 @@ public final class DOMImplementationImpl implements DOMImplementation { } public Object getFeature(String feature, String version) { - throw new UnsupportedOperationException(); // TODO + return hasFeature(feature, version) ? this : null; } } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java index c677e58..56283a8 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java @@ -299,6 +299,16 @@ public final class DocumentImpl extends InnerNodeImpl implements Document { } } + public Node renameNode(Node node, String namespaceURI, String qualifiedName) { + if (node.getOwnerDocument() != this) { + throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null); + } + + setNameNS((NodeImpl) node, namespaceURI, qualifiedName); + notifyUserDataHandlers(UserDataHandler.NODE_RENAMED, node, null); + return node; + } + public AttrImpl createAttribute(String name) { return new AttrImpl(this, name); } @@ -467,11 +477,6 @@ public final class DocumentImpl extends InnerNodeImpl implements Document { ((DOMConfigurationImpl) getDomConfig()).normalize(root); } - public Node renameNode(Node n, String namespaceURI, String qualifiedName) { - // TODO: callback the UserDataHandler with a NODE_RENAMED event - throw new UnsupportedOperationException(); // TODO - } - /** * Returns a map with the user data objects attached to the specified node. * This map is readable and writable. diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java index c3e5a2e..cbc4570 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java @@ -39,37 +39,16 @@ import java.util.List; */ public class ElementImpl extends InnerNodeImpl implements Element { - private boolean namespaceAware; - - private String namespaceURI; - - private String prefix; - - private String localName; + boolean namespaceAware; + String namespaceURI; + String prefix; + String localName; private List<AttrImpl> attributes = new ArrayList<AttrImpl>(); ElementImpl(DocumentImpl document, String namespaceURI, String qualifiedName) { super(document); - - this.namespaceAware = true; - this.namespaceURI = namespaceURI; - - if (qualifiedName == null || "".equals(qualifiedName)) { - throw new DOMException(DOMException.NAMESPACE_ERR, qualifiedName); - } - - int p = qualifiedName.lastIndexOf(":"); - if (p != -1) { - setPrefix(qualifiedName.substring(0, p)); - qualifiedName = qualifiedName.substring(p + 1); - } - - if (!DocumentImpl.isXMLIdentifier(qualifiedName)) { - throw new DOMException(DOMException.INVALID_CHARACTER_ERR, qualifiedName); - } - - this.localName = qualifiedName; + setNameNS(this, namespaceURI, qualifiedName); } ElementImpl(DocumentImpl document, String name) { @@ -383,7 +362,7 @@ public class ElementImpl extends InnerNodeImpl implements Element { public void setPrefix(String prefix) { this.prefix = validatePrefix(prefix, namespaceAware, namespaceURI); } - + public class ElementAttrNamedNodeMapImpl implements NamedNodeMap { public int getLength() { diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java index 359a042..8beb18c 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java @@ -198,7 +198,7 @@ public abstract class NodeImpl implements Node { * @param namespaceAware whether this node is namespace aware * @param namespaceURI this node's namespace URI */ - protected String validatePrefix(String prefix, boolean namespaceAware, String namespaceURI) { + static String validatePrefix(String prefix, boolean namespaceAware, String namespaceURI) { if (!namespaceAware) { throw new DOMException(DOMException.NAMESPACE_ERR, prefix); } @@ -216,6 +216,58 @@ public abstract class NodeImpl implements Node { } /** + * Sets the element or attribute node to be namespace-aware and assign it + * the specified name and namespace URI. + * + * @param node an AttrImpl or ElementImpl node. + * @param namespaceURI this node's namespace URI. May be null. + * @param qualifiedName a possibly-prefixed name like "img" or "html:img". + */ + static void setNameNS(NodeImpl node, String namespaceURI, String qualifiedName) { + if (qualifiedName == null) { + throw new DOMException(DOMException.NAMESPACE_ERR, qualifiedName); + } + + String prefix = null; + int p = qualifiedName.lastIndexOf(":"); + if (p != -1) { + prefix = validatePrefix(qualifiedName.substring(0, p), true, namespaceURI); + qualifiedName = qualifiedName.substring(p + 1); + } + + if (!DocumentImpl.isXMLIdentifier(qualifiedName)) { + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, qualifiedName); + } + + switch (node.getNodeType()) { + case ATTRIBUTE_NODE: + if ("xmlns".equals(qualifiedName) + && !"http://www.w3.org/2000/xmlns/".equals(namespaceURI)) { + throw new DOMException(DOMException.NAMESPACE_ERR, qualifiedName); + } + + AttrImpl attr = (AttrImpl) node; + attr.namespaceAware = true; + attr.namespaceURI = namespaceURI; + attr.prefix = prefix; + attr.localName = qualifiedName; + break; + + case ELEMENT_NODE: + ElementImpl element = (ElementImpl) node; + element.namespaceAware = true; + element.namespaceURI = namespaceURI; + element.prefix = prefix; + element.localName = qualifiedName; + break; + + default: + throw new DOMException(DOMException.NOT_SUPPORTED_ERR, + "Cannot rename nodes of type " + node.getNodeType()); + } + } + + /** * Checks whether a required string matches an actual string. This utility * method is used for comparing namespaces and such. It takes into account * null arguments and the "*" special case. |