/*******************************************************************************
 * Copyright (c) 2001, 2007 Oracle Corporation 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.itemcreation.internal;

import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;

/**
 * Creates instances of {@link ITagCreator}s for a the given {@link TagToolPaletteEntry}
 * (Eventually) Will use TagCreavtorFactories registered using org.eclipse.jst.jsf.pagedesigner.tagcreationfactories ext-pt.  
 * Currently only using DefaultTagCreator.
 */
public class TagCreationFactory {
	private static TagCreationFactory INSTANCE = null;
	
	/**
	 * @return singleton instance
	 */
	public synchronized static TagCreationFactory getInstance(){
		if (INSTANCE == null){
			INSTANCE = new TagCreationFactory();
		}
		return INSTANCE;
	}

	/**
	 * Using the TagToolPaletteEntry, locate the factory to use for tag creation
	 * @param tagId 
	 * 
	 * @return ITagCreator
	 */
	public ITagCreator createTagCreator(final TagIdentifier tagId) 
	{
	    
	    IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance().createElementEdit(tagId);

	    if (elementEdit != null)
	    {
//    	    for (ITagCreatorFactory factory : factories)
//    	    {
    	        ITagCreator tagCreator = null;
    	        try
    	        {
    	            tagCreator = elementEdit.getTagCreator(tagId);
    	        }
    	        catch (Exception e)
    	        {
    	            PDPlugin.getLogger(getClass()).error
    	                ("Error.ProblemLoadingTagCreatorFactory"
    	                 ,elementEdit.getClass().toString(), e);  
    	        }
    	        
    	        if (tagCreator != null)
    	        {
    	            if (tagCreator instanceof AbstractTagCreator)
    	            {
    	                return tagCreator;
    	            }
    	            // if non-null, skipped, log the issue
	                PDPlugin.getLogger(getClass()).error
	                   ("Error.ProblemLoadingTagCreatorFactory",
	                   "Tag creator must extend AbstractTagCreator", new Throwable());
	        }
	    }
	    
	    // all else fails, use the internal default
		return new DefaultTagCreator();	
	}

}
