/* IIOMetadataNode.java --
   Copyright (C) 2004  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.imageio.metadata;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
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;
import org.w3c.dom.TypeInfo;
import org.w3c.dom.UserDataHandler;
import javax.imageio.metadata.IIOMetadataFormatImpl.IIOMetadataNodeAttr;

public class IIOMetadataNode
  implements Element, NodeList
{
  private String name;
  private HashMap attrs = new HashMap();
  private List children = new ArrayList();
  private IIOMetadataNode parent;
  private Object obj;

  /**
   * Simple NamedNodeMap class for IIOMetadataNode.
   *
   * @author jlquinn
   */
  private class IIONamedNodeMap implements NamedNodeMap
  {
    HashMap attrs;

    /**
     * @param attrs
     * @param node
     */
    public IIONamedNodeMap(HashMap attrs)
    {
      this.attrs = attrs;
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#getNamedItem(java.lang.String)
     */
    public Node getNamedItem(String name)
    {
      return (Node)attrs.get(name);
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#setNamedItem(org.w3c.dom.Node)
     */
    public Node setNamedItem(Node arg) throws DOMException
    {
      if (arg instanceof IIOMetadataNodeAttr)
        {
          IIOMetadataNodeAttr attr = (IIOMetadataNodeAttr) arg;
          // The only code that can successfully do this is in this package.
          if (attr.owner != null)
            throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, "");
          return (Node)attrs.put(attr.name, attr);
        }
      // Anything else gets treated as an invalid op.
      throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, "");
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#removeNamedItem(java.lang.String)
     */
    public Node removeNamedItem(String name) throws DOMException
    {
      return (Node)attrs.remove(name);
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#item(int)
     */
    public Node item(int index)
    {
      return (Node)attrs.values().toArray()[index];
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#getLength()
     */
    public int getLength()
    {
      return attrs.size();
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#getNamedItemNS(java.lang.String, java.lang.String)
     */
    public Node getNamedItemNS(String namespaceURI, String localName)
    {
      return getNamedItem(localName);
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#setNamedItemNS(org.w3c.dom.Node)
     */
    public Node setNamedItemNS(Node arg) throws DOMException
    {
      return setNamedItem(arg);
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NamedNodeMap#removeNamedItemNS(java.lang.String, java.lang.String)
     */
    public Node removeNamedItemNS(String namespaceURI, String localName)
      throws DOMException
    {
      return removeNamedItem(localName);
    }
  }

  /**
   * Simple NodeList implementation for IIOMetadataNode.
   *
   * @author jlquinn
   *
   */
  private class IIONodeList implements NodeList
  {
    List children = new ArrayList();
  
    /* (non-Javadoc)
     * @see org.w3c.dom.NodeList#item(int)
     */
    public Node item(int index)
    {
      return (index < children.size()) ? (Node)children.get(index) : null;
    }

    /* (non-Javadoc)
     * @see org.w3c.dom.NodeList#getLength()
     */
    public int getLength()
    {
      return children.size();
    }
  }

  public IIOMetadataNode()
  {
    // Do nothing here.
  }
  
  public IIOMetadataNode(String nodename)
  {
    name = nodename;
  }

  public Object getUserObject()
  {
    return obj;
  }

  public void setUserObject(Object o)
  {
    obj = o;
  }
  
  public short compareDocumentPosition(Node other)
    throws DOMException
  {
    return Element.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getAttribute(java.lang.String)
   */
  public String getAttribute(String name)
  {
    Attr anode = (Attr) attrs.get(name);
    return anode != null ? anode.getValue() : null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getAttributeNode(java.lang.String)
   */
  public Attr getAttributeNode(String name)
  {
    String val = getAttribute(name);
    if (val != null)
      return new IIOMetadataNodeAttr(this, name, val);
    return null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getAttributeNodeNS(java.lang.String, java.lang.String)
   */
  public Attr getAttributeNodeNS(String namespaceURI, String localName)
  {
    return getAttributeNode(localName);
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getAttributeNS(java.lang.String, java.lang.String)
   */
  public String getAttributeNS(String namespaceURI, String localName)
  {
    return getAttribute(localName);
  }

  public String getBaseURI()
  {
    return null;
  }

  // Recursive function for assembling a node list.
  private void getElementsRecurse(IIONodeList list, String name)
  {
    for (int i=0; i < children.size(); i++)
    {
      if (((Node)children.get(i)).getNodeName().equals(name))
        list.children.add(children.get(i));
      getElementsRecurse(list, name);
    }
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getElementsByTagName(java.lang.String)
   */
  public NodeList getElementsByTagName(String name)
  {
    IIONodeList list = new IIONodeList();
    getElementsRecurse(list, name);
    return list;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getElementsByTagNameNS(java.lang.String, java.lang.String)
   */
  public NodeList getElementsByTagNameNS(String namespaceURI, String localName)
  {
    IIONodeList list = new IIONodeList();
    getElementsRecurse(list, name);
    return list;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#getTagName()
   */
  public String getTagName()
  {
    return name;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#hasAttribute(java.lang.String)
   */
  public boolean hasAttribute(String name)
  {
    return attrs.containsKey(name);
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#hasAttributeNS(java.lang.String, java.lang.String)
   */
  public boolean hasAttributeNS(String namespaceURI, String localName)
  {
    return attrs.containsKey(localName);
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#removeAttribute(java.lang.String)
   */
  public void removeAttribute(String name)
  {
    attrs.remove(name);
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Element#removeAttributeNode(org.w3c.dom.Attr)
   */
  public Attr removeAttributeNode(Attr oldAttr)
  {
    return (Attr)attrs.remove(oldAttr.getName());
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#removeAttributeNS(java.lang.String, java.lang.String)
   */
  public void removeAttributeNS(String namespaceURI, String localName)
  {
    removeAttribute(localName);
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#setAttribute(java.lang.String, java.lang.String)
   */
  public void setAttribute(String name, String value)
  {
    Attr attr = getAttributeNode(name);
    if (attr != null)
      attr.setValue(value);
    else
      attrs.put(name, new IIOMetadataNodeAttr(this, name, value));
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#setAttributeNode(org.w3c.dom.Attr)
   */
  public Attr setAttributeNode(Attr newAttr)
  {
    return (Attr)attrs.put(newAttr.getName(), newAttr);
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#setAttributeNodeNS(org.w3c.dom.Attr)
   */
  public Attr setAttributeNodeNS(Attr newAttr)
  {
    return (Attr)attrs.put(newAttr.getName(), newAttr);
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Element#setAttributeNS(java.lang.String, java.lang.String, java.lang.String)
   */
  public void setAttributeNS(String namespaceURI, String qualifiedName, String value)
  {
    setAttribute(qualifiedName, value);    
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.NodeList#getLength()
   */
  public int getLength()
  {
    return children.size();
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.NodeList#item(int)
   */
  public Node item(int index)
  {
    if (index < children.size())
      return (Node)children.get(index);
    else
      return null;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#appendChild(org.w3c.dom.Node)
   */
  public Node appendChild(Node newChild)
  {
    if (newChild == null)
      throw new IllegalArgumentException("Child node is null");
    
    IIOMetadataNode child = (IIOMetadataNode) newChild;
    
    children.add(child);
    child.parent = this;
    return this;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#cloneNode(boolean)
   */
  public Node cloneNode(boolean deep)
  {
    IIOMetadataNode newnode = new IIOMetadataNode(name);
    newnode.parent = null;
    newnode.obj = obj;
    if (deep)
    {
      for (int i=0; i < children.size(); i++)
        newnode.children.add(((Node)children.get(i)).cloneNode(deep));
    }
    
    // clone attrs
    for (Iterator it = attrs.values().iterator(); it.hasNext();)
    {
      IIOMetadataNodeAttr attr = (IIOMetadataNodeAttr)it.next();
      newnode.attrs.put(attr.name, attr.cloneNode(deep));
      attr.owner = newnode;
    }

    return newnode;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getAttributes()
   */
  public NamedNodeMap getAttributes()
  {
    return new IIONamedNodeMap(attrs);
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getChildNodes()
   */
  public NodeList getChildNodes()
  {
    return this;
  }

  public Object getFeature(String feature, String version)
  {
    return null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getFirstChild()
   */
  public Node getFirstChild()
  {
    return (children.size() > 0) ? (Node)children.get(0) : null;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getLastChild()
   */
  public Node getLastChild()
  {
    return (children.size() > 0) ? (Node)children.get(children.size() - 1)
           : null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getLocalName()
   */
  public String getLocalName()
  {
    return name;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getNamespaceURI()
   */
  public String getNamespaceURI()
  {
    return null;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getNextSibling()
   */
  public Node getNextSibling()
  {
    // If this op needs to be faster, add links to prev and next nodes.
    if (parent == null) return null;
    int idx = parent.children.indexOf(this);
    return (idx == parent.children.size() - 1) ? null
        : (Node)parent.children.get(idx + 1);
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getNodeName()
   */
  public String getNodeName()
  {
    return name;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getNodeType()
   */
  public short getNodeType()
  {
    return ELEMENT_NODE;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getNodeValue()
   */
  public String getNodeValue()
  {
    return null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getOwnerDocument()
   */
  public Document getOwnerDocument()
  {
    // IOMetadataNodes have no owner
    return null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getParentNode()
   */
  public Node getParentNode()
  {
    return parent;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getPrefix()
   */
  public String getPrefix()
  {
    return null;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#getPreviousSibling()
   */
  public Node getPreviousSibling()
  {
    // If this op needs to be faster, add links to prev and next nodes.
    if (parent == null) return null;
    int idx = parent.children.indexOf(this);
    return (idx == 0) ? null
        : (Node)parent.children.get(idx - 1);
  }

  public TypeInfo getSchemaTypeInfo()
  {
    return null;
  }

  public String getTextContent()
    throws DOMException
  {
    return null;
  }

  public Object getUserData(String key)
  {
    return null;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#hasAttributes()
   */
  public boolean hasAttributes()
  {
    return !attrs.isEmpty();
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#hasChildNodes()
   */
  public boolean hasChildNodes()
  {
    return !children.isEmpty();
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#insertBefore(org.w3c.dom.Node, org.w3c.dom.Node)
   */
  public Node insertBefore(Node newChild, Node refChild)
  {
    if (newChild == null)
      throw new IllegalArgumentException();
    
    int idx = children.indexOf(refChild);
    if (idx == -1)
      children.add(newChild);
    else
      children.add(idx, newChild);
    ((IIOMetadataNode)newChild).parent = this;
    
    return newChild;
  }

  public boolean isDefaultNamespace(String namespaceURI)
  {
    return true;
  }

  public boolean isEqualNode(Node arg)
  {
    return true;
  }
  
  public boolean isSameNode(Node other)
  {
    return this == other;
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#isSupported(java.lang.String, java.lang.String)
   */
  public boolean isSupported(String feature, String version)
  {
    // No DOM features are supported
    return false;
  }
  
  public String lookupNamespaceURI(String prefix)
  {
    return null;
  }
  
  public String lookupPrefix(String namespaceURI)
  {
    return null;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#normalize()
   */
  public void normalize()
  {
    // No text nodes so no action
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#removeChild(org.w3c.dom.Node)
   */
  public Node removeChild(Node oldChild)
  {
    if (oldChild == null)
      throw new IllegalArgumentException();
    children.remove(oldChild);
    ((IIOMetadataNode)oldChild).parent = null;

    return oldChild;
  }

  /* (non-Javadoc)
   * @see org.w3c.dom.Node#replaceChild(org.w3c.dom.Node, org.w3c.dom.Node)
   */
  public Node replaceChild(Node newChild, Node oldChild)
  {
    if (newChild == null)
      throw new IllegalArgumentException();
    children.set(children.indexOf(oldChild), newChild);
    ((IIOMetadataNode)oldChild).parent = null;
    return oldChild;
  }
  
  public void setIdAttribute(String name, boolean isId)
    throws DOMException
  {
  }

  public void setIdAttributeNode(Attr idAttr, boolean isId)
    throws DOMException
  {
  }

  public void setIdAttributeNS(String namespaceURI, String localName, boolean isId)
    throws DOMException
  {
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#setNodeValue(java.lang.String)
   */
  public void setNodeValue(String nodeValue) throws DOMException
  {
  }
  
  /* (non-Javadoc)
   * @see org.w3c.dom.Node#setPrefix(java.lang.String)
   */
  public void setPrefix(String prefix)
  {
  }

  public void setTextContent(String textContent)
    throws DOMException
  {
  }
  
  public Object setUserData(String key, Object data, UserDataHandler handler)
  {
    return null;
  }
}
