/*******************************************************************************
 * Copyright (c) 2008 Oracle Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Cameron Bateman - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib;

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

import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib;
import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag;

/**
 * A tag record based on an xml tag defined Facelet taglib.xml
 * @author cbateman
 *
 */
public class XMLBasedTagRecord_Facelet10 extends FaceletTagRecord
{
    /**
     * 
     */
    private static final long serialVersionUID = 1411551451386954263L;
    private final FaceletTaglib _taglibDefn;
    private Map<String, FaceletTaglibTag>       _tagIndexByName;

    /**
     * @param taglibDefn
     */
    public XMLBasedTagRecord_Facelet10(final FaceletTaglib taglibDefn)
    {
        _taglibDefn = taglibDefn;
    }

    @Override
    public String getURI()
    {
        return _taglibDefn.getNamespaceUri();
    }


    @Override
    public FaceletTaglibTag getTag(final String name)
    {
        return getAndIndexElementDeclaration(name);
    }

    private synchronized FaceletTaglibTag getAndIndexElementDeclaration(final String name)
    {
        FaceletTaglibTag tagDefn = null;

        if (_tagIndexByName == null)
        {
            _tagIndexByName = new HashMap<String, FaceletTaglibTag>();
        }
        else
        {
            tagDefn = _tagIndexByName.get(name);
        }

        if (tagDefn == null && _tagIndexByName.size() < _taglibDefn.getTag().size())
        {
            tagDefn = findTag(name);
        }

        return tagDefn;
    }

    private FaceletTaglibTag findTag(final String name)
    {
        for (final FaceletTaglibTag tag : _taglibDefn.getTag())
        {
            if (name.equals(tag.getTagName()))
            {
                return tag;
            }
        }
        return null;
    }

    @Override
    public List<FaceletTaglibTag> getTags()
    {
        return Collections.unmodifiableList(_taglibDefn.getTag());
    }

    public int getNumTags()
    {
        return _taglibDefn.getTag().size();
    }
}
