/**
 * 
 */
package org.eclipse.jst.jsf.facelet.core.internal.cm;

import java.util.Iterator;

import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDataTypeImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;

class ElementCMAdapter implements CMElementDeclaration, CMNamedNodeMap
{
    private final ITagElement  _tagElement;
    private final TagInfo _tLDTagInfo;

    ElementCMAdapter(final ITagElement tagElement, final TagInfo tldTagInfo)
    {
        _tagElement = tagElement;
        _tLDTagInfo = tldTagInfo;
    }

    public CMNamedNodeMap getAttributes()
    {
        return this;
    }

    public CMContent getContent()
    {
        return null;
    }

    public int getContentType()
    {
        return ELEMENT;
    }

    public CMDataType getDataType()
    {
        return new CMDataTypeImpl(CMDataType.CDATA);
    }

    public String getElementName()
    {
        return _tagElement.getName();
    }

    public CMNamedNodeMap getLocalElements()
    {
        // TODO Auto-generated method stub
        return null;
    }

    public int getMaxOccur()
    {
        // unbounded
        return -1;
    }

    public int getMinOccur()
    {
        // optional
        return 0;
    }

    public String getNodeName()
    {
        return _tagElement.getName();
    }

    public int getNodeType()
    {
        return CMNode.ELEMENT_DECLARATION;
    }

    public Object getProperty(final String propertyName)
    {
        return _tLDTagInfo.getTagProperty(_tagElement.getName(), propertyName);
    }

    public boolean supports(final String propertyName)
    {
        return false;
    }

    @Override
    public boolean equals(final Object obj)
    {
        if (obj instanceof ElementCMAdapter)
        {
            return ((ElementCMAdapter) obj)._tagElement.equals(_tagElement);
        }

        return false;
    }

    @Override
    public int hashCode()
    {
        return _tagElement.hashCode();
    }

    public int getLength()
    {
        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());

        if (map != null)
        {
            return map.getLength();
        }

        return 0;
    }

    public CMNode getNamedItem(final String name)
    {
        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());

        if (map != null)
        {
            return map.getNamedItem(name);
        }
        return null;
    }

    public CMNode item(final int index)
    {
        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());

        if (map != null)
        {
            return map.item(index);
        }
        return null;
    }

    public Iterator<?> iterator()
    {
        final CMNamedNodeMap map = _tLDTagInfo.getAttributes(_tagElement.getName());
        return map.iterator();
    }

}