package org.eclipse.jst.jsf.facelet.core.internal.registry;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
import org.eclipse.jst.jsf.core.JSFVersion;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;
import org.eclipse.jst.jsf.facelet.core.internal.FaceletCoreTraceOptions;

/**
 * A per-resource singleton manager for TLDTagRegistry's.
 * 
 * @author cbateman
 * 
 */
public final class FaceletRegistryManager extends
                        ResourceSingletonObjectManager<FaceletTagRegistry, IProject>
{
    // STATIC
    private static FaceletRegistryManager                  INSTANCE;

    /**
     * @return the singleton instance
     */
    private static FaceletRegistryManager getGlobalManager(final IWorkspace workspace)
    {
        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
        {
            FaceletCoreTraceOptions
                    .log("FaceletRegistryManager: Initializing FaceletRegistryManager singleton"); //$NON-NLS-1$
        }

        synchronized(FaceletRegistryManager.class)
        {
            if (INSTANCE == null)
            {
                INSTANCE = new FaceletRegistryManager(workspace);
            }
            
            return INSTANCE;
        }
    }

    private FaceletRegistryManager(final IWorkspace workspace)
    {
        super(workspace);
    }

    @Override
    protected FaceletTagRegistry createNewInstance(final IProject project)
    {
        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
        {
            FaceletCoreTraceOptions.log("FaceletRegistryManager: creating new instance for " //$NON-NLS-1$
                    + project.toString());
        }

        return new FaceletTagRegistry(project);
    }

    @Override
    protected void runAfterGetInstance(final IProject resource)
    {
        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
        {
            FaceletCoreTraceOptions.log("FaceletRegistryManager: Acquired instance for " //$NON-NLS-1$
                    + resource.toString());
        }
    }

    @Override
    protected void runBeforeGetInstance(final IProject resource)
    {
        if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER)
        {
            FaceletCoreTraceOptions.log("FaceletRegistryManager: Getting registry for " //$NON-NLS-1$
                    + resource.toString());
        }
    }
    
    /**
     * Adapter used to allow creation by extension point.
     * 
     * @author cbateman
     *
     */
    public static class MyRegistryFactory extends TagRegistryFactory
    {
        @Override
        public ITagRegistry createTagRegistry(IProject project) throws TagRegistryFactoryException
        {
            try
            {
                return getGlobalManager(project.getWorkspace()).getInstance(project);
            }
            catch (ManagedObjectException e)
            {
                throw new TagRegistryFactoryException(e);
            }
        }

        @Override
        public boolean isInstance(IProject project)
        {
            return getGlobalManager(project.getWorkspace()).isInstance(project);
        }

        public String getDisplayName()
        {
            return Messages.FaceletRegistryManager_REGISTRY_FACTORY_DISPLAYNAME;
        }

        @Override
        public boolean projectIsValid(IProject project) {
            if (project == null)
            {
                return false;
            }

            final JSFVersion jsfVersion = JSFVersion.valueOfProject(project);
            if (jsfVersion != null && jsfVersion.compareTo(JSFVersion.V2_0) >= 0)
            {
                return true;
            }

            return false;
        }
    }
}
