/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.elementedit;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
import org.eclipse.jst.pagedesigner.elementedit.html.HTMLElementEditFactory;
import org.eclipse.jst.pagedesigner.elementedit.jsp.JSPElementEditFactory;
import org.w3c.dom.Element;

/**
 * @author mengbo
 * @version 1.5
 */
public class ElementEditFactoryRegistry
{
    List _factories = new ArrayList();

    private static ElementEditFactoryRegistry _instance;

    /**
	 *
	 */
    private ElementEditFactoryRegistry()
    {
        final List<IElementEditFactory> facs = ElementEditFacRegistryReader
                .getAllHandlers();

        if (facs != null)
        {
            for (final IElementEditFactory fac : facs)
            {
                addFactory(fac);
            }
        }
        addFactory(new HTMLElementEditFactory());
        addFactory(new JSPElementEditFactory());
    }

    /**
     * Add a factory to list available.
     *
     * @param fac
     */
    public void addFactory(final IElementEditFactory fac)
    {
        _factories.add(fac);
    }

    /**
     * @param tagIdentifier
     * @return an IElementEdit constructed for the tag uniquely identified by
     *         the ns uri (tag uri for JSP tags) and tagName (element name) or
     *         null if the system can't create one.
     */
    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
    {
        final String uri = tagIdentifier.getUri();

        // first round, match uri
        for (int i = 0, size = _factories.size(); i < size; i++)
        {
            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
            final String facuri = fac.getSupportedURI();
            if (facuri != null && facuri.equals(uri))
            {
                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
                if (elementEdit != null)
                {
                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
                    {
                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: first loop, "+
                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName()));
                    }
                    return elementEdit;
                }
            }
        }
        // second round
        for (int i = 0, size = _factories.size(); i < size; i++)
        {
            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
            final String facuri = fac.getSupportedURI();
            if (facuri == null)
            {
                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
                if (elementEdit != null)
                {
                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
                    {
                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: second loop, "+
                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName()));
                    }
                    return elementEdit;
                }
            }
        }

        if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
        {
            PageDesignerTraceOptions.log("ElementEditFactoryRegistry: no element edit found, returning null for "+
                    String.format("uri=%s, name=%s", tagIdentifier.getUri(), tagIdentifier.getTagName()));
        }

        return null;
    }

    /**
     * Convenience method for createElementEdit(uri, tagName) that takes a tag
     * element.
     *
     * @param ele
     * @return an element edit
     */
    public IElementEdit createElementEdit(final Element ele)
    {
        final TagIdentifier tagIdentifier = TagIdentifierFactory
                .createDocumentTagWrapper(ele);
        return createElementEdit(tagIdentifier);
    }

    /**
     * @return the single instance of the factory registry
     */
    public synchronized static ElementEditFactoryRegistry getInstance()
    {
        if (_instance == null)
        {
            _instance = new ElementEditFactoryRegistry();
        }
        return _instance;
    }
}
