/*******************************************************************************
 * Copyright (c) 2001, 2008 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.jsf.designtime.internal.view.model.jsp.registry;

import java.util.Collection;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ISaveContext;
import org.eclipse.core.resources.ISaveParticipant;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
import org.eclipse.jst.jsf.designtime.internal.Messages;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory;

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

    /**
     * @return the singleton instance
     */
    private static TLDRegistryManager getGlobalManager()
    {
        synchronized (TLDRegistryManager.class)
        {
            if (INSTANCE == null)
            {
                if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
                {
                    JSFCoreTraceOptions
                            .log("TLDRegistryManager: Initializing TLDRegistryManager singleton"); //$NON-NLS-1$
                }
                INSTANCE = new TLDRegistryManager();
            }

            return INSTANCE;
        }
    }

    private TLDRegistryManager()
    {
        super(ResourcesPlugin.getWorkspace());
        final ISaveParticipant participant = new MyWorkspaceSaveParticipant();
        
        try
        {
            ResourcesPlugin.getWorkspace().addSaveParticipant(JSFCorePlugin.getDefault().getPluginID()
                    , participant);
        }
        catch (CoreException e)
        {
            JSFCorePlugin.log(e, "TLDRegistryManager failed to install save participant"); //$NON-NLS-1$
        }
    }

    @Override
    protected TLDTagRegistry createNewInstance(final IProject project)
    {
        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
        {
            JSFCoreTraceOptions
                    .log("TLDRegistryManager: creating new instance for " //$NON-NLS-1$
                            + project.toString());
        }

        return new TLDTagRegistry(project);
    }

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

    @Override
    protected void runBeforeGetInstance(final IProject resource)
    {
        if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
        {
            JSFCoreTraceOptions.log("TLDRegistryManager: 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().getInstance(project);
            }
            catch (ManagedObjectException e)
            {
                throw new TagRegistryFactoryException(e);
            }
        }

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

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

    private class MyWorkspaceSaveParticipant implements ISaveParticipant
    {
        public void saving(ISaveContext context) throws CoreException
        {
            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
            {
                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saving: Kind="+context.getKind()); //$NON-NLS-1$
            }
            try
            {
                if (context.getKind() == ISaveContext.FULL_SAVE)
                {
                    final Collection<IProject> projects = TLDRegistryManager.this
                            .getManagedResources();

                    for (final IProject project : projects)
                    {
                        saveProject(project);
                    }
                }
                else if (context.getKind() == ISaveContext.PROJECT_SAVE)
                {
                    saveProject(context.getProject());
                }

            }
            catch (ManagedObjectException moe)
            {
                throw new CoreException(new Status(IStatus.ERROR,
                        JSFCorePlugin.PLUGIN_ID, "Couldn't commit workspace", //$NON-NLS-1$
                        moe));
            }
        }

        private void saveProject(final IProject project)
                throws ManagedObjectException
        {
            if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
            {
                JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saveProject: Project="+project.toString()); //$NON-NLS-1$
            }

            // check that there is already instance -- don't do anything if there
            // isn't already an instance for project.
            if (TLDRegistryManager.this.isInstance(project))
            {
                final TLDTagRegistry registry = TLDRegistryManager.this
                        .getInstance(project);
                if (JSFCoreTraceOptions.TRACE_TLDREGISTRYMANAGER)
                {
                    JSFCoreTraceOptions.log("MyWorkspaceSaveParticipant.saveProject: calling checkpoint on registry: "+registry.toString()); //$NON-NLS-1$
                }

                registry.checkpoint();
            }
        }

        public void doneSaving(ISaveContext context)
        {
            // nothing to do
        }

        public void prepareToSave(ISaveContext context) throws CoreException
        {
            // nothing to do
        }

        public void rollback(ISaveContext context)
        {
            // nothing to do
        }
    }
}
