/*
* 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
* 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.
*
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
* 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.
*
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
* 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.
*
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
* 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.
*
* 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.
*
* 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:
*
* NOT_FOUND_ERR: Raised if the specified node is not an
* attribute of this element.
*
* NOT_FOUND_ERR: Raised if the specified node is not an
* attribute of this element.
*
* NOT_FOUND_ERR: Raised if the specified node is not an
* attribute of this element.
*
*
*
*
* Node type
* Content
*
*
* ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE,
* DOCUMENT_FRAGMENT_NODE
* 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.
*
*
* TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE,
* PROCESSING_INSTRUCTION_NODE
* nodeValue
*
*
* DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE
* null
*
* 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: *
Node type | *Content | *
ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE, * DOCUMENT_FRAGMENT_NODE | *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. | *
TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, * PROCESSING_INSTRUCTION_NODE | *nodeValue | *
DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE | *null | *
* 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. *
* * @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"); } /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** 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. *
* * @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"); } /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** This method checks if the specified namespaceURI is the default namespace * or not. *
* * @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"); } /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** Look up the namespace URI associated to the given prefix, starting from * this node. See for details on the algorithm used by this method. *
* * @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"); } /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** 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: *
*
*
* 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. *
* * @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"); } /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** 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. *
* * @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"); } */ /** * Description copied from interface: org.w3c.dom.Node (DOM Level 3) ** 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. *
* * @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