/*******************************************************************************
 * 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
/**
 * 
 */
package org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.core.internal.JSFCoreTraceOptions;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.MasterIndex.ProjectIndex;
import org.eclipse.jst.jsf.designtime.internal.view.model.jsp.persistence.MasterIndex.SerializableVersion;

class TagRepository
{
    private final static Object       GLOBAL_MASTER_INDEX_LOCK = new Object();
    private static MasterIndex        GLOBAL_MASTER_INDEX;
    private final static String       PATH_TO_REPOSITORY       = "/.jsptagregistry"; //$NON-NLS-1$
    private final static String       MASTER_INDEX_FILE_NAME   = "tagRegistryMasterIndex.idx"; //$NON-NLS-1$

    private final IProject            _project;
    //private Map<String, SerializableTLDNamespace> _namespaces;

    public TagRepository(final IProject project)
    {
        _project = project;
    }

    public Map<String, SerializableTLDNamespace> load() throws IOException,
            ClassNotFoundException
    {
        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
        {
            JSFCoreTraceOptions.log("Loading tag repository for: " //$NON-NLS-1$
                    + _project.toString());
        }

        final MasterIndex index = getOrCreateMasterIndex();

        final ProjectIndex projIndex = index.getProjectIndex(_project);
        final Map<String, SerializableTLDNamespace> namespaces = projIndex.getNamespaces();

        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
        {
            JSFCoreTraceOptions.log("Contents of repo for: " //$NON-NLS-1$
                    + _project.toString());
            
            for (final Map.Entry<String, SerializableTLDNamespace> nsEntry : namespaces.entrySet())
            {
                JSFCoreTraceOptions.log("\tNamespace: "+nsEntry.getKey()); //$NON-NLS-1$
                
                SerializableTLDNamespace ns = nsEntry.getValue();
                for (final ITagElement element : ns.getViewElements())
                {
                    JSFCoreTraceOptions.log("\t\tTag: "+element.toString()); //$NON-NLS-1$
                }
            }
        }

        return namespaces;
    }

    public void save(Map<String, SerializableTLDNamespace> namespaces) throws IOException,
            ClassNotFoundException
    {
        final MasterIndex index = getOrCreateMasterIndex();
        final ProjectIndex projectIndex = index.getProjectIndex(_project);
        projectIndex.save(namespaces);
    }

    public void clearAll() throws IOException, ClassNotFoundException
    {
        final MasterIndex index = getOrCreateMasterIndex();
        index.removeProjectIndex(_project);
    }

    private MasterIndex getOrCreateMasterIndex() throws IOException,
            ClassNotFoundException
    {
        final IPath wkspacePath = JSFCorePlugin.getDefault().getStateLocation();
        final IPath repoPath = wkspacePath.append(PATH_TO_REPOSITORY);
        final File repoDir = new File(repoPath.toOSString());

        synchronized (GLOBAL_MASTER_INDEX_LOCK)
        {
            if (GLOBAL_MASTER_INDEX != null)
            {
                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
                {
                    JSFCoreTraceOptions
                            .log("GLOBAL_MASTER_INDEX already exists for: " //$NON-NLS-1$
                                    + _project.toString());
                }
                return GLOBAL_MASTER_INDEX;
            }

            if (!repoDir.exists())
            {
                createNewRepo(repoDir);
            }

            final File masterIndexFile = new File(new Path(repoDir
                    .getAbsolutePath()).append(MASTER_INDEX_FILE_NAME)
                    .toOSString());
            final MasterIndex index = new MasterIndex(masterIndexFile, repoDir.getAbsolutePath());

            if (!masterIndexFile.exists())
            {
                if (!masterIndexFile.createNewFile())
                {
                    throw new IOException(
                            "Could not create new master index file: " //$NON-NLS-1$
                                    + masterIndexFile.toString());
                }
                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
                {
                    JSFCoreTraceOptions.log("Creating master index file for " //$NON-NLS-1$
                            + _project.toString());
                }
                index.create(new SerializableVersion(1, 0, 0));
            }
            else
            {
                if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
                {
                    JSFCoreTraceOptions.log("Loading master index file for " //$NON-NLS-1$
                            + _project.toString());
                }
                index.load(new SerializableVersion(1, 0, 0));
            }

            GLOBAL_MASTER_INDEX = index;
            return index;
        }
    }

    private static void createNewRepo(final File repoDir) throws IOException
    {
        if (JSFCoreTraceOptions.TRACE_JSPTAGPERSISTENCE)
        {
            JSFCoreTraceOptions.log("Creating repo directory: " //$NON-NLS-1$
                    + repoDir.getAbsolutePath());
        }

        if (!repoDir.mkdir())
        {
            throw new IOException("Failed to create repo directory: " //$NON-NLS-1$
                    + repoDir.getAbsolutePath());
        }
    }
}