summaryrefslogtreecommitdiffstats
path: root/awt/javax/imageio/metadata/IIOMetadataNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/javax/imageio/metadata/IIOMetadataNode.java')
-rw-r--r--awt/javax/imageio/metadata/IIOMetadataNode.java1070
1 files changed, 1070 insertions, 0 deletions
diff --git a/awt/javax/imageio/metadata/IIOMetadataNode.java b/awt/javax/imageio/metadata/IIOMetadataNode.java
new file mode 100644
index 0000000..adc6d67
--- /dev/null
+++ b/awt/javax/imageio/metadata/IIOMetadataNode.java
@@ -0,0 +1,1070 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package javax.imageio.metadata;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+//???AWT
+//import org.w3c.dom.TypeInfo;
+//import org.w3c.dom.UserDataHandler;
+
+/**
+ * The Class IIOMetadataNode represents a node of the (DOM-style) metadata tree.
+ *
+ * @since Android 1.0
+ */
+public class IIOMetadataNode implements Element, NodeList {
+
+ /**
+ * The node name.
+ */
+ private String nodeName;
+
+ /**
+ * The node value.
+ */
+ private String nodeValue;
+
+ /**
+ * The attributes.
+ */
+ private IIOMetadataNodeList attrs = new IIOMetadataNodeList(new ArrayList<IIOMetadataNode>());
+
+ /**
+ * The parent node.
+ */
+ private IIOMetadataNode parent;
+
+ /**
+ * The first child node.
+ */
+ private IIOMetadataNode firstChild;
+
+ /**
+ * The last child node.
+ */
+ private IIOMetadataNode lastChild;
+
+ /**
+ * The previous sibling.
+ */
+ private IIOMetadataNode previousSibling;
+
+ /**
+ * The next sibling.
+ */
+ private IIOMetadataNode nextSibling;
+
+ /**
+ * The number of children.
+ */
+ private int nChildren;
+
+ /**
+ * The user object associated with this node.
+ */
+ private Object userObject;
+
+ /**
+ * The text content of this node.
+ */
+ private String textContent;
+
+ /**
+ * Instantiates a new empty node.
+ */
+ public IIOMetadataNode() {
+ }
+
+ /**
+ * Instantiates a new empty node with the specified name.
+ *
+ * @param nodeName
+ * the node name.
+ */
+ public IIOMetadataNode(String nodeName) {
+ this.nodeName = nodeName;
+ }
+
+ /**
+ * Instantiates a new IIOMetadataNode with the specified name and value.
+ *
+ * @param nodeName
+ * the node name.
+ * @param nodeValue
+ * the node value.
+ */
+ private IIOMetadataNode(String nodeName, String nodeValue) {
+ this.nodeName = nodeName;
+ this.nodeValue = nodeValue;
+ }
+
+ public String getTagName() {
+ return nodeName;
+ }
+
+ public String getAttribute(String name) {
+ Attr attrNode = (Attr)attrs.getNamedItem(name);
+ return (attrNode == null) ? "" : attrNode.getValue();
+ }
+
+ public void setAttribute(String name, String value) throws DOMException {
+ Attr attr = (Attr)attrs.getNamedItem(name);
+ if (attr != null) {
+ attr.setValue(value);
+ } else {
+ attrs.list.add(new IIOMetadataAttr(name, value, this));
+ }
+ }
+
+ public void removeAttribute(String name) throws DOMException {
+ IIOMetadataAttr attr = (IIOMetadataAttr)attrs.getNamedItem(name);
+ if (attr != null) {
+ attr.setOwnerElement(null);
+ attrs.list.remove(attr);
+ }
+ }
+
+ public Attr getAttributeNode(String name) {
+ return (Attr)attrs.getNamedItem(name);
+ }
+
+ public Attr setAttributeNode(Attr newAttr) throws DOMException {
+ // Check if this attribute is already in use.
+ Element owner = newAttr.getOwnerElement();
+ if (owner != null) {
+ if (owner == this) { // Replacing an attribute node by itself has no
+ // effect
+ return null;
+ } else {
+ throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR,
+ "Attribute is already in use");
+ }
+ }
+
+ String name = newAttr.getName();
+ Attr oldAttr = getAttributeNode(name);
+ if (oldAttr != null) {
+ removeAttributeNode(oldAttr);
+ }
+
+ IIOMetadataAttr iioAttr;
+ if (newAttr instanceof IIOMetadataAttr) {
+ iioAttr = (IIOMetadataAttr)newAttr;
+ iioAttr.setOwnerElement(this);
+ } else {
+ iioAttr = new IIOMetadataAttr(name, newAttr.getValue(), this);
+ }
+
+ attrs.list.add(iioAttr);
+
+ return oldAttr;
+ }
+
+ public Attr removeAttributeNode(Attr oldAttr) throws DOMException {
+ if (!attrs.list.remove(oldAttr)) { // Not found
+ throw new DOMException(DOMException.NOT_FOUND_ERR, "No such attribute!");
+ }
+
+ ((IIOMetadataAttr)oldAttr).setOwnerElement(null);
+
+ return oldAttr;
+ }
+
+ public NodeList getElementsByTagName(String name) {
+ ArrayList<IIOMetadataNode> nodes = new ArrayList<IIOMetadataNode>();
+
+ // Non-recursive tree walk
+ Node pos = this;
+
+ while (pos != null) {
+ if (pos.getNodeName().equals(name)) {
+ nodes.add((IIOMetadataNode)pos);
+ }
+
+ Node nextNode = pos.getFirstChild();
+
+ while (nextNode == null) {
+ if (pos == this) {
+ break;
+ }
+
+ nextNode = pos.getNextSibling();
+
+ if (nextNode == null) {
+ pos = pos.getParentNode();
+
+ if (pos == null || pos == this) {
+ nextNode = null;
+ break;
+ }
+ }
+ }
+ pos = nextNode;
+ }
+
+ return new IIOMetadataNodeList(nodes);
+ }
+
+ public String getAttributeNS(String namespaceURI, String localName) throws DOMException {
+ return getAttribute(localName);
+ }
+
+ public void setAttributeNS(String namespaceURI, String qualifiedName, String value)
+ throws DOMException {
+ setAttribute(qualifiedName, value);
+ }
+
+ public void removeAttributeNS(String namespaceURI, String localName) throws DOMException {
+ removeAttribute(localName);
+ }
+
+ public Attr getAttributeNodeNS(String namespaceURI, String localName) throws DOMException {
+ return getAttributeNode(localName);
+ }
+
+ public Attr setAttributeNodeNS(Attr newAttr) throws DOMException {
+ return setAttributeNode(newAttr);
+ }
+
+ public NodeList getElementsByTagNameNS(String namespaceURI, String localName)
+ throws DOMException {
+ return getElementsByTagName(localName);
+ }
+
+ public boolean hasAttribute(String name) {
+ return attrs.getNamedItem(name) != null;
+ }
+
+ public boolean hasAttributeNS(String namespaceURI, String localName) throws DOMException {
+ return hasAttribute(localName);
+ }
+
+ // ???AWT
+ /*
+ * public TypeInfo getSchemaTypeInfo() { throw new
+ * DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported"); }
+ */
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Element (DOM Level
+ * 3)</i>
+ * <p>
+ * If the parameter isId is true, this method declares the specified
+ * attribute to be a user-determined ID attribute . This affects the value
+ * of Attr.isId and the behavior of Document.getElementById, but does not
+ * change any schema that may be in use, in particular this does not affect
+ * the Attr.schemaTypeInfo of the specified Attr node. Use the value false
+ * for the parameter isId to undeclare an attribute for being a
+ * user-determined ID attribute. To specify an attribute by local name and
+ * namespace URI, use the setIdAttributeNS method.
+ * </p>
+ *
+ * @param name
+ * the name of the attribute.
+ * @param isId
+ * the flag which determines whether this attribute is of type
+ * ID.
+ * @throws DOMException
+ * if a DOM error occurred while setting the attribute type.
+ * <p>
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>
+ * NOT_FOUND_ERR: Raised if the specified node is not an
+ * attribute of this element.
+ * </p>
+ */
+ public void setIdAttribute(String name, boolean isId) throws DOMException {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Element (DOM Level
+ * 3)</i>
+ * <p>
+ * If the parameter isId is true, this method declares the specified
+ * attribute to be a user-determined ID attribute . This affects the value
+ * of Attr.isId and the behavior of Document.getElementById, but does not
+ * change any schema that may be in use, in particular this does not affect
+ * the Attr.schemaTypeInfo of the specified Attr node. Use the value false
+ * for the parameter isId to undeclare an attribute for being a
+ * user-determined ID attribute.
+ * </p>
+ *
+ * @param namespaceURI
+ * the namespace URI of the attribute.
+ * @param localName
+ * the local name of the attribute.
+ * @param isId
+ * the flag which determines whether this attribute is of type
+ * ID.
+ * @throws DOMException
+ * if a DOM error occurred while setting the attribute type.
+ * <p>
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>
+ * NOT_FOUND_ERR: Raised if the specified node is not an
+ * attribute of this element.
+ * </p>
+ */
+ public void setIdAttributeNS(String namespaceURI, String localName, boolean isId)
+ throws DOMException {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Element (DOM Level
+ * 3)</i>
+ * <p>
+ * If the parameter isId is true, this method declares the specified
+ * attribute to be a user-determined ID attribute . This affects the value
+ * of Attr.isId and the behavior of Document.getElementById, but does not
+ * change any schema that may be in use, in particular this does not affect
+ * the Attr.schemaTypeInfo of the specified Attr node. Use the value false
+ * for the parameter isId to undeclare an attribute for being a
+ * user-determined ID attribute.
+ * </p>
+ *
+ * @param idAttr
+ * the attribute node.
+ * @param isId
+ * the flag which determines whether this attribute is of type
+ * ID.
+ * @throws DOMException
+ * if a DOM error occurred while setting the attribute type.
+ * <p>
+ * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+ * <br>
+ * NOT_FOUND_ERR: Raised if the specified node is not an
+ * attribute of this element.
+ * </p>
+ */
+ public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ public String getNodeName() {
+ return nodeName;
+ }
+
+ public String getNodeValue() throws DOMException {
+ return nodeValue;
+ }
+
+ public void setNodeValue(String nodeValue) throws DOMException {
+ this.nodeValue = nodeValue;
+ }
+
+ public short getNodeType() {
+ return ELEMENT_NODE;
+ }
+
+ public Node getParentNode() {
+ return parent;
+ }
+
+ public NodeList getChildNodes() {
+ return this;
+ }
+
+ public Node getFirstChild() {
+ return firstChild;
+ }
+
+ public Node getLastChild() {
+ return lastChild;
+ }
+
+ public Node getPreviousSibling() {
+ return previousSibling;
+ }
+
+ public Node getNextSibling() {
+ return nextSibling;
+ }
+
+ public NamedNodeMap getAttributes() {
+ return attrs;
+ }
+
+ public Document getOwnerDocument() {
+ return null;
+ }
+
+ public Node insertBefore(Node newChild, Node refChild) throws DOMException {
+ if (newChild == null) {
+ throw new IllegalArgumentException("newChild == null!");
+ }
+
+ IIOMetadataNode newIIOChild = (IIOMetadataNode)newChild;
+ IIOMetadataNode refIIOChild = (IIOMetadataNode)refChild;
+
+ newIIOChild.parent = this;
+
+ if (refIIOChild == null) {
+ newIIOChild.nextSibling = null;
+ newIIOChild.previousSibling = lastChild;
+
+ // Fix this node
+ lastChild = newIIOChild;
+ if (firstChild == null) {
+ firstChild = newIIOChild;
+ }
+ } else {
+ newIIOChild.nextSibling = refIIOChild;
+ newIIOChild.previousSibling = refIIOChild.previousSibling;
+
+ // Fix this node
+ if (firstChild == refIIOChild) {
+ firstChild = newIIOChild;
+ }
+
+ // Fix next node
+ if (refIIOChild != null) {
+ refIIOChild.previousSibling = newIIOChild;
+ }
+ }
+
+ // Fix prev node
+ if (newIIOChild.previousSibling != null) {
+ newIIOChild.previousSibling.nextSibling = newIIOChild;
+ }
+
+ nChildren++;
+
+ return newIIOChild;
+ }
+
+ public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
+ if (newChild == null) {
+ throw new IllegalArgumentException("newChild == null!");
+ }
+
+ IIOMetadataNode newIIOChild = (IIOMetadataNode)newChild;
+ IIOMetadataNode oldIIOChild = (IIOMetadataNode)oldChild;
+
+ IIOMetadataNode next = oldIIOChild.nextSibling;
+ IIOMetadataNode previous = oldIIOChild.previousSibling;
+
+ // Fix new node
+ newIIOChild.parent = this;
+ newIIOChild.nextSibling = next;
+ newIIOChild.previousSibling = previous;
+
+ // Fix this node
+ if (lastChild == oldIIOChild) {
+ lastChild = newIIOChild;
+ }
+ if (firstChild == oldIIOChild) {
+ firstChild = newIIOChild;
+ }
+
+ // Fix siblings
+ if (next != null) {
+ next.previousSibling = newIIOChild;
+ }
+ if (previous != null) {
+ previous.nextSibling = newIIOChild;
+ }
+
+ // Fix old child
+ oldIIOChild.parent = null;
+ oldIIOChild.nextSibling = next;
+ oldIIOChild.previousSibling = previous;
+
+ return oldIIOChild;
+ }
+
+ public Node removeChild(Node oldChild) throws DOMException {
+ if (oldChild == null) {
+ throw new IllegalArgumentException("oldChild == null!");
+ }
+
+ IIOMetadataNode oldIIOChild = (IIOMetadataNode)oldChild;
+
+ // Fix next and previous
+ IIOMetadataNode previous = oldIIOChild.previousSibling;
+ IIOMetadataNode next = oldIIOChild.nextSibling;
+
+ if (previous != null) {
+ previous.nextSibling = next;
+ }
+ if (next != null) {
+ next.previousSibling = previous;
+ }
+
+ // Fix this node
+ if (lastChild == oldIIOChild) {
+ lastChild = previous;
+ }
+ if (firstChild == oldIIOChild) {
+ firstChild = next;
+ }
+ nChildren--;
+
+ // Fix old child
+ oldIIOChild.parent = null;
+ oldIIOChild.previousSibling = null;
+ oldIIOChild.nextSibling = null;
+
+ return oldIIOChild;
+ }
+
+ public Node appendChild(Node newChild) throws DOMException {
+ return insertBefore(newChild, null);
+ }
+
+ public boolean hasChildNodes() {
+ return nChildren != 0;
+ }
+
+ public Node cloneNode(boolean deep) {
+ IIOMetadataNode cloned = new IIOMetadataNode(nodeName);
+ cloned.setUserObject(getUserObject());
+
+ if (deep) { // Clone recursively
+ IIOMetadataNode c = firstChild;
+ while (c != null) {
+ cloned.insertBefore(c.cloneNode(true), null);
+ c = c.nextSibling;
+ }
+ }
+
+ return cloned; // To change body of implemented methods use File |
+ // Settings | File Templates.
+ }
+
+ public void normalize() {
+ // Do nothing
+ }
+
+ public boolean isSupported(String feature, String version) {
+ return false;
+ }
+
+ public String getNamespaceURI() {
+ return null;
+ }
+
+ public String getPrefix() {
+ return null;
+ }
+
+ public void setPrefix(String prefix) throws DOMException {
+ // Do nothing
+ }
+
+ public String getLocalName() {
+ return nodeName;
+ }
+
+ public boolean hasAttributes() {
+ return attrs.list.size() > 0;
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * The absolute base URI of this node or null if the implementation wasn't
+ * able to obtain an absolute URI. This value is computed as described in.
+ * However, when the Document supports the feature "HTML" [DOM Level 2
+ * HTML], the base URI is computed using first the value of the href
+ * attribute of the HTML BASE element if any, and the value of the
+ * documentURI attribute from the Document interface otherwise.
+ * </p>
+ *
+ * @return the string representation of the absolute base URI.
+ */
+ public String getBaseURI() {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Compares the reference node, i.e. the node on which this method is being
+ * called, with a node, i.e. the one passed as a parameter, with regard to
+ * their position in the document and according to the document order.
+ * </p>
+ *
+ * @param other
+ * the node to compare against the reference node.
+ * @return Returns how the node is positioned relatively to the reference
+ * node.
+ * @throws DOMException
+ * NOT_SUPPORTED_ERR: when the compared nodes are from different
+ * DOM implementations that do not coordinate to return
+ * consistent implementation-specific results.
+ */
+ public short compareDocumentPosition(Node other) throws DOMException {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * This attribute returns the text content of this node and its descendants.
+ * When it is defined to be null, setting it has no effect. On setting, any
+ * possible children this node may have are removed and, if it the new
+ * string is not empty or null, replaced by a single Text node containing
+ * the string this attribute is set to. On getting, no serialization is
+ * performed, the returned string does not contain any markup. No whitespace
+ * normalization is performed and the returned string does not contain the
+ * white spaces in element content (see the attribute
+ * Text.isElementContentWhitespace). Similarly, on setting, no parsing is
+ * performed either, the input string is taken as pure textual content. The
+ * string returned is made of the text content of this node depending on its
+ * type, as defined below:
+ * <table>
+ * <tr>
+ * <td><strong>Node type</strong></td>
+ * <td><strong>Content</strong></td>
+ * </tr>
+ * <tr>
+ * <td>ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE,
+ * DOCUMENT_FRAGMENT_NODE</td>
+ * <td>concatenation of the textContent attribute value of every child node,
+ * excluding COMMENT_NODE and PROCESSING_INSTRUCTION_NODE nodes. This is the
+ * empty string if the node has no children.</td>
+ * </tr>
+ * <tr>
+ * <td>TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE,
+ * PROCESSING_INSTRUCTION_NODE</td>
+ * <td>nodeValue</td>
+ * </tr>
+ * <tr>
+ * <td>DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE</td>
+ * <td>null</td>
+ * </tr>
+ * </table>
+ * </p>
+ *
+ * @return the text content depending on the type of this node.
+ * @throws DOMException
+ * DOMSTRING_SIZE_ERR: Raised when it would return more
+ * characters than fit in a DOMString variable on the
+ * implementation platform.
+ */
+ public String getTextContent() throws DOMException {
+ return textContent;
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * This attribute returns the text content of this node and its descendants.
+ * When it is defined to be null, setting it has no effect. On setting, any
+ * possible children this node may have are removed and, if it the new
+ * string is not empty or null, replaced by a single Text node containing
+ * the string this attribute is set to. On getting, no serialization is
+ * performed, the returned string does not contain any markup. No whitespace
+ * normalization is performed and the returned string does not contain the
+ * white spaces in element content (see the attribute
+ * Text.isElementContentWhitespace). Similarly, on setting, no parsing is
+ * performed either, the input string is taken as pure textual content. The
+ * string returned is made of the text content of this node depending on its
+ * type, as defined below:
+ * <table>
+ * <tr>
+ * <td><strong>Node type</strong></td>
+ * <td><strong>Content</strong></td>
+ * </tr>
+ * <tr>
+ * <td>ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE,
+ * DOCUMENT_FRAGMENT_NODE</td>
+ * <td>concatenation of the textContent attribute value of every child node,
+ * excluding COMMENT_NODE and PROCESSING_INSTRUCTION_NODE nodes. This is the
+ * empty string if the node has no children.</td>
+ * </tr>
+ * <tr>
+ * <td>TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE,
+ * PROCESSING_INSTRUCTION_NODE</td>
+ * <td>nodeValue</td>
+ * </tr>
+ * <tr>
+ * <td>DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE</td>
+ * <td>null</td>
+ * </tr>
+ * </table>
+ * </p>
+ *
+ * @param textContent
+ * the text content for this node.
+ * @throws DOMException
+ * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is
+ * readonly.
+ */
+ public void setTextContent(String textContent) throws DOMException {
+ this.textContent = textContent;
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Returns whether this node is the same node as the given one. This method
+ * provides a way to determine whether two Node references returned by the
+ * implementation reference the same object. When two Node references are
+ * references to the same object, even if through a proxy, the references
+ * may be used completely interchangeably, such that all attributes have the
+ * same values and calling the same DOM method on either reference always
+ * has exactly the same effect.
+ * </p>
+ *
+ * @param other
+ * the node to test against.
+ * @return true, if the nodes are the same, false otherwise.
+ */
+ public boolean isSameNode(Node other) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Look up the prefix associated to the given namespace URI, starting from
+ * this node. The default namespace declarations are ignored by this method.
+ * See for details on the algorithm used by this method.
+ * </p>
+ *
+ * @param namespaceURI
+ * the namespace URI to look for.
+ * @return the associated namespace prefix if found or null if none is
+ * found. If more than one prefix are associated to the namespace
+ * prefix, the returned namespace prefix is implementation
+ * dependent.
+ */
+ public String lookupPrefix(String namespaceURI) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * This method checks if the specified namespaceURI is the default namespace
+ * or not.
+ * </p>
+ *
+ * @param namespaceURI
+ * the namespace URI to look for.
+ * @return true, if the specified namespaceURI is the default namespace,
+ * false otherwise.
+ */
+ public boolean isDefaultNamespace(String namespaceURI) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Look up the namespace URI associated to the given prefix, starting from
+ * this node. See for details on the algorithm used by this method.
+ * </p>
+ *
+ * @param prefix
+ * the prefix to look for. If this parameter is null, the method
+ * will return the default namespace URI if any.
+ * @return the associated namespace URI or null if none is found.
+ */
+ public String lookupNamespaceURI(String prefix) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Tests whether two nodes are equal. This method tests for equality of
+ * nodes, not sameness (i.e., whether the two nodes are references to the
+ * same object) which can be tested with Node.isSameNode(). All nodes that
+ * are the same will also be equal, though the reverse may not be true. Two
+ * nodes are equal if and only if the following conditions are satisfied:
+ * <p>
+ * <li>The two nodes are of the same type.</li>
+ * <li>The following string attributes are equal: nodeName, localName,
+ * namespaceURI, prefix, nodeValue . This is: they are both null, or they
+ * have the same length and are character for character identical.</li>
+ * <li>The attributes NamedNodeMaps are equal. This is: they are both null,
+ * or they have the same length and for each node that exists in one map
+ * there is a node that exists in the other map and is equal, although not
+ * necessarily at the same index.</li>
+ * <li>The childNodes NodeLists are equal. This is: they are both null, or
+ * they have the same length and contain equal nodes at the same index. Note
+ * that normalization can affect equality; to avoid this, nodes should be
+ * normalized before being compared.</li>
+ * </p>
+ * For two DocumentType nodes to be equal, the following conditions must
+ * also be satisfied:
+ * <p>
+ * <li>The following string attributes are equal: publicId, systemId,
+ * internalSubset.</li>
+ * <li>The entities NamedNodeMaps are equal.</li>
+ * <li>The notations NamedNodeMaps are equal.</li>
+ * </p>
+ * On the other hand, the following do not affect equality: the
+ * ownerDocument, baseURI, and parentNode attributes, the specified
+ * attribute for Attr nodes, the schemaTypeInfo attribute for Attr and
+ * Element nodes, the Text.isElementContentWhitespace attribute for Text
+ * nodes, as well as any user data or event listeners registered on the
+ * nodes. </p>
+ * <p>
+ * Note: As a general rule, anything not mentioned in the description above
+ * is not significant in consideration of equality checking. Note that
+ * future versions of this specification may take into account more
+ * attributes and implementations conform to this specification are expected
+ * to be updated accordingly.
+ * </p>
+ *
+ * @param arg
+ * the node to compare equality with.
+ * @return true, if the nodes are equal, false otherwise.
+ */
+ public boolean isEqualNode(Node arg) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * This method returns a specialized object which implements the specialized
+ * APIs of the specified feature and version, as specified in. The
+ * specialized object may also be obtained by using binding-specific casting
+ * methods but is not necessarily expected to, as discussed in. This method
+ * also allow the implementation to provide specialized objects which do not
+ * support the Node interface.
+ * </p>
+ *
+ * @param feature
+ * the name of the feature requested. Note that any plus sign "+"
+ * prepended to the name of the feature will be ignored since it
+ * is not significant in the context of this method.
+ * @param version
+ * this is the version number of the feature to test.
+ * @return the object which implements the specialized APIs of the specified
+ * feature and version, if any, or null if there is no object which
+ * implements interfaces associated with that feature. If the
+ * DOMObject returned by this method implements the Node interface,
+ * it must delegate to the primary core Node and not return results
+ * inconsistent with the primary core Node such as attributes,
+ * childNodes, etc.
+ */
+ public Object getFeature(String feature, String version) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ // ???AWT
+ /*
+ * public Object setUserData(String key, Object data, UserDataHandler
+ * handler) { throw new DOMException(DOMException.NOT_SUPPORTED_ERR,
+ * "Method not supported"); }
+ */
+
+ /**
+ * <i>Description copied from interface: org.w3c.dom.Node (DOM Level 3)</i>
+ * <p>
+ * Retrieves the object associated to a key on a this node. The object must
+ * first have been set to this node by calling setUserData with the same
+ * key.
+ * </p>
+ *
+ * @param key
+ * the key the object is associated to.
+ * @return the DOMUserData associated to the given key on this node, or null
+ * if there was none.
+ */
+ public Object getUserData(String key) {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ public Node item(int index) {
+ if (index < 0 || index >= nChildren) {
+ return null;
+ }
+
+ Node n;
+ for (n = getFirstChild(); index > 0; index--) {
+ n = n.getNextSibling();
+ }
+
+ return n;
+ }
+
+ public int getLength() {
+ return nChildren;
+ }
+
+ /**
+ * Gets the user object associated with this node.
+ *
+ * @return the user object associated with this node.
+ */
+ public Object getUserObject() {
+ return userObject;
+ }
+
+ /**
+ * Sets the user object associated with this node.
+ *
+ * @param userObject
+ * the new user object associated with this node.
+ */
+ public void setUserObject(Object userObject) {
+ this.userObject = userObject;
+ }
+
+ /**
+ * The Class IIOMetadataAttr.
+ */
+ private class IIOMetadataAttr extends IIOMetadataNode implements Attr {
+
+ /**
+ * The owner element.
+ */
+ private Element ownerElement;
+
+ /**
+ * Instantiates a new iIO metadata attr.
+ *
+ * @param name
+ * the name.
+ * @param value
+ * the value.
+ * @param owner
+ * the owner.
+ */
+ public IIOMetadataAttr(String name, String value, Element owner) {
+ super(name, value);
+ this.ownerElement = owner;
+ }
+
+ public String getName() {
+ return getNodeName();
+ }
+
+ public boolean getSpecified() {
+ return true;
+ }
+
+ public String getValue() {
+ return nodeValue;
+ }
+
+ public void setValue(String value) throws DOMException {
+ nodeValue = value;
+ }
+
+ public Element getOwnerElement() {
+ return ownerElement;
+ }
+
+ /**
+ * Sets the owner element.
+ *
+ * @param ownerElement
+ * the new owner element.
+ */
+ public void setOwnerElement(Element ownerElement) {
+ this.ownerElement = ownerElement;
+ }
+
+ /**
+ * @return
+ */
+ public boolean isId() {
+ throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
+ }
+
+ @Override
+ public short getNodeType() {
+ return ATTRIBUTE_NODE;
+ }
+ }
+
+ /**
+ * The Class IIOMetadataNodeList.
+ */
+ private class IIOMetadataNodeList implements NodeList, NamedNodeMap {
+
+ /**
+ * The list.
+ */
+ private List<IIOMetadataNode> list;
+
+ /**
+ * Instantiates a new iIO metadata node list.
+ *
+ * @param list
+ * the list.
+ */
+ IIOMetadataNodeList(List<IIOMetadataNode> list) {
+ this.list = list;
+ }
+
+ public Node item(int index) {
+ try {
+ return list.get(index);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ }
+
+ public int getLength() {
+ return list.size();
+ }
+
+ public Node getNamedItem(String name) {
+ for (IIOMetadataNode node : list) {
+ if (name.equals(node.getNodeName())) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ public Node setNamedItem(Node arg) throws DOMException {
+ throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
+ "This NamedNodeMap is read-only!");
+ }
+
+ public Node removeNamedItem(String name) throws DOMException {
+ throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
+ "This NamedNodeMap is read-only!");
+ }
+
+ public Node getNamedItemNS(String namespaceURI, String localName) throws DOMException {
+ return getNamedItem(localName);
+ }
+
+ public Node setNamedItemNS(Node arg) throws DOMException {
+ throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
+ "This NamedNodeMap is read-only!");
+ }
+
+ public Node removeNamedItemNS(String namespaceURI, String localName) throws DOMException {
+ throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
+ "This NamedNodeMap is read-only!");
+ }
+ }
+}