package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.TLDNamespace.TLDNamespaceData;

/**
 * A serializable tld namespace. This is distinct from TLDNamespace in that it
 * takes a snapshot of a TLDNamespace at a point in time. Any elements not
 * lazily resolved by the TLDNamespace will not be resolved by this namespace.
 * 
 */
public class SerializableTLDNamespace extends Namespace
{
    private final SerializedNamespaceData _data;

    /**
     * @param namespace
     */
    public SerializableTLDNamespace(final TLDNamespace namespace)
    {
        _data = new SerializedNamespaceData(namespace.getDisplayName(),
                namespace.getCurrentElements(), namespace.getNSUri());
    }

    /**
     * 
     */
    private static final long serialVersionUID = 5364814479459691353L;

    @Override
    public String getDisplayName()
    {
        return _data.getDisplayName();
    }

    @Override
    public String getNSUri()
    {
        return _data.getUri();
    }

    @Override
    public ITagElement getViewElement(String name)
    {
        return _data.getViewElement(name);
    }

    @Override
    public Collection<? extends ITagElement> getViewElements()
    {
        return Collections.unmodifiableCollection(_data.getAllViewElements()
                .values());
    }

    @Override
    public boolean hasViewElements()
    {
        return _data.getNumTags() > 0;
    }

    @Override
    public boolean isInitialized()
    {
        return _data.isInitialized();
    }

    /* package */void put(final String name, final ITagElement tagElement)
    {
        _data._tags.put(name, tagElement);
    }

    private static class SerializedNamespaceData extends TLDNamespaceData
    {
        /**
         * serializable id
         */
        private static final long              serialVersionUID = -6723194339788215607L;
        private final String                   _displayName;
        private final String                   _uri;
        private final Map<String, ITagElement> _tags;

        /**
         * @param displayName
         * @param tags
         * @param uri
         */
        private SerializedNamespaceData(String displayName,
                Map<String, ITagElement> tags, String uri)
        {
            super();
            _displayName = displayName;
            _tags = new HashMap<String, ITagElement>();
            for (final Map.Entry<String, ITagElement> tagEntry : tags.entrySet())
            {
                _tags.put(tagEntry.getKey(), tagEntry.getValue());
            }
            _uri = uri;
        }

        @Override
        public String getDisplayName()
        {
            return _displayName;
        }

        @Override
        public int getNumTags()
        {
            return _tags.size();
        }

        @Override
        public ITagElement getViewElement(String name)
        {
            return _tags.get(name);
        }

        @Override
        public String getUri()
        {
            return _uri;
        }

        @Override
        public Map<String, ITagElement> getAllViewElements()
        {
            return _tags;
        }

        @Override
        public boolean isInitialized()
        {
            return true;
        }

        @Override
        public Map<String, ITagElement> getCurrentElements()
        {
            return _tags;
        }
    }
}
