/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.utils.resources;

import java.text.MessageFormat;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.utils.exception.MissingResourceException;
import org.eclipse.jst.ws.jaxws.utils.facets.FacetUtils;
import org.eclipse.jst.ws.jaxws.utils.facets.IFacetUtils;
import org.eclipse.jst.ws.jaxws.utils.internal.text.JaxWsUtilMessages;
import org.eclipse.jst.ws.jaxws.utils.logging.ILogger;
import org.eclipse.jst.ws.jaxws.utils.logging.Logger;


/**
 * Utility that provides useful project management services
 * 
 * @author Joerg Dehmel
 * @author Danail Branekov
 */
public final class ProjectManagementUtils
{
	private static final ILogger logger = new Logger();
	
	/**
	 * Provides the meta-inf folder of a EJB project.
	 * 
	 * @param pProjectName
	 *            project name
	 * @return the resource of the meta-inf folder
	 * @throws IllegalArgumentException
	 *             when project name specified is <code>null</code>, empty string, the project does not exist or is not accessible, or the project
	 *             is not an ejb project
	 * @throws MissingResourceException
	 *             either the project doesn't exist in the workspace or it doesn't contain a meta-inf folder
	 * @throws RuntimeException
	 *             when error occured while accessing java model
	 */
	public static IFolder findMetaInfFolder(final String pProjectName) throws MissingResourceException
	{
		final String metaInfName = "META-INF"; //$NON-NLS-1$
		final String ejbModuleName = "ejbModule"; //$NON-NLS-1$

		if (!isEjb3Project(pProjectName))
		{
			throw new IllegalArgumentException("Project " + pProjectName + " is not an EJB project"); //$NON-NLS-1$ //$NON-NLS-2$
		}

		IProject project = getProjectByName(pProjectName);
		IJavaProject javaProject = getJavaProject(project);
		IPackageFragment ejbModulePkgFragment = null;

		try
		{
			for (IPackageFragmentRoot fragmentRoot : javaProject.getPackageFragmentRoots())
			{
				if (fragmentRoot.getKind() == IPackageFragmentRoot.K_SOURCE && fragmentRoot.getElementName().equals(ejbModuleName))
				{
					ejbModulePkgFragment = fragmentRoot.getPackageFragment(metaInfName);
				}
			}

			verifyMetaInfFolder(ejbModulePkgFragment, pProjectName);
			return (IFolder) ejbModulePkgFragment.getCorrespondingResource();
		} catch (JavaModelException e)
		{
			logger.logError(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	private static void verifyMetaInfFolder(IPackageFragment fragment, String projectName) throws MissingResourceException
	{
		if (fragment == null)
		{
			final String msg = MessageFormat.format("project {0} does not have a META-INF folder", new Object[] { projectName }); //$NON-NLS-1$
			final String localizedMsg = MessageFormat.format(JaxWsUtilMessages.ProjectManagementUtils_ProjectHasNoMetaInfFolderMsg, new Object[] { projectName });
			throw new MissingResourceException(msg, localizedMsg);
		}

		try
		{
			IResource resource = fragment.getCorrespondingResource();
			// should not happen!
			if (!(resource instanceof IFolder))
			{
				throw new RuntimeException("Resource " + resource.getName() + " is not a folder"); //$NON-NLS-1$ //$NON-NLS-2$
			}
		} catch (JavaModelException e)
		{
			logger.logError(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * Check whether a project is an ejb 3 project
	 * 
	 * @param projectName
	 *            the name of the project; cannot be <code>null</code> or empty string
	 * @return true in case the project specified is a ejb 3 project; false otherwise
	 * @throws IllegalArgumentException
	 *             when the project name specified is <code>null</code>, empty string
	 * @throws IllegalStateException
	 *             when the project does not exist or is not accessible
	 * @throws RuntimeException
	 *             when an error occurred while accessing the project metadata
	 */
	public static boolean isEjb3Project(final String projectName)
	{
		IProject project = getProjectByName(projectName);

		try
		{
			return facetUtils().hasFacetWithVersion(project, IFacetUtils.EJB_30_FACET_VERSION, IFacetUtils.EJB_30_FACET_ID, true);
		} catch (CoreException e)
		{
			logger.logError(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * Check whether a project is an web 2.5 project
	 * 
	 * @param projectName
	 *            the name of the project; cannot be <code>null</code> or empty string
	 * @return true in case the project specified is a web 2.5 project; false otherwise
	 * @throws IllegalArgumentException
	 *             when the project name specified is <code>null</code>, empty string
	 * @throws IllegalStateException
	 *             when the project does not exist or is not accessible
	 * @throws RuntimeException
	 *             when an error occurred while accessing the project metadata
	 */
	public static boolean isWeb25Project(final String projectName)
	{
		IProject project = getProjectByName(projectName);

		try
		{
			return facetUtils().hasFacetWithVersion(project, IFacetUtils.WEB_25_FACET_VERSION, IFacetUtils.WEB_25_FACET_ID, true);
		} catch (CoreException e)
		{
			logger.logError(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * Retrieve the project instance by project name
	 * 
	 * @param projectName
	 *            the project name
	 * @return the project instance
	 * @throws IllegalArgumentException
	 *             when the project name specified is null or empty string
	 * @throws IllegalStateException
	 *             when the project does not exist or is not accessible
	 * 
	 */
	public static IProject getProjectByName(String projectName)
	{
		if (projectName == null || projectName.length() == 0)
		{
			throw new IllegalArgumentException("Illegal project name: " + projectName); //$NON-NLS-1$
		}

		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
		if (project == null || !project.isAccessible())
		{
			throw new IllegalStateException("Project is not accessible"); //$NON-NLS-1$
		}

		return project;
	}

	/**
	 * Get the java project instance
	 * 
	 * @param project
	 *            the project as eclipse resource
	 * @return the java project instance
	 * @throws IllegalArgumentException
	 *             when <code>project</code> null or the project is not accessible
	 */
	public static IJavaProject getJavaProject(IProject project)
	{
		if (project == null || !project.isAccessible())
		{
			throw new IllegalArgumentException("Project is not accessible"); //$NON-NLS-1$
		}
		return JavaCore.create(project);
	}
	
	/**
	 * Refresh the resource specified. Refresh depth used is zero
	 * @param resource the resource to be refreshed
	 * @throws CoreException 
	 * @see IResource#DEPTH_ZERO
	 */
	public static void refreshResource(IResource resource) throws CoreException
	{
		if(resource == null)
		{
			throw new NullPointerException("resource"); //$NON-NLS-1$
		}
		
		resource.refreshLocal(IResource.DEPTH_ZERO, null);
	}

	/**
	 * Refreshes the project the resource specified belongs to. Refresh depth used is infinite.
	 * @param the resource which project is to be refreshed
	 * @throws CoreException 
	 * @throws IllegalArgumentException when the resource specified is a workspace root
	 * @see IResource#DEPTH_INFINITE
	 */
	public static void refreshProjectByResource(IResource resource) throws CoreException
	{
		if(resource == null)
		{
			throw new NullPointerException("resource"); //$NON-NLS-1$
		}
		
		if(resource instanceof IWorkspaceRoot)
		{
			throw new IllegalArgumentException("Operation is not defined for workspace roots"); //$NON-NLS-1$
		}
		
		resource.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
	}
	
	private static IFacetUtils facetUtils()
	{
		return new FacetUtils();
	}
}
