/***************************************************************************************************
 * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
 **************************************************************************************************/
package org.eclipse.jst.j2ee.internal.web.operations;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.project.IWebNatureConstants;
import org.eclipse.wst.web.internal.operation.IBaseWebNature;


public class J2EEWebNatureRuntimeUtilities {
	/**
	 * WebNatureRuntimeHelper constructor comment.
	 */
	public J2EEWebNatureRuntimeUtilities() {
		super();
	}

	/**
	 * Adds a nauture to a project
	 */
	protected static void addNatureToProject(IProject proj, String natureId) throws CoreException {
		ProjectUtilities.addNatureToProject(proj, natureId);
	}

	/**
	 * Create a new nature runtime from the project info
	 */
	public static IBaseWebNature createRuntime(WebProjectInfo info) throws CoreException {
		IProject project = info.getProject();

		// refresh WebProjectInfo for existing runtime
		if (hasRuntime(project)) {
			// this is for when the web nature is being changed, such
			// as from converting from static to j2ee
			IBaseWebNature runtime = getRuntime(project);
			if (J2EEWebNatureRuntime.hasRuntime(project))
				((J2EEWebNatureRuntime) runtime).initializeFromInfo(info);

			return runtime;
		}
		if (info.getWebProjectType() == IWebNatureConstants.J2EE_WEB_PROJECT)
			addNatureToProject(project, IWebNatureConstants.J2EE_NATURE_ID);
		IBaseWebNature runtime = getRuntime(project);
		if (info.getWebProjectType() == IWebNatureConstants.J2EE_WEB_PROJECT)
			((J2EEWebNatureRuntime) runtime).initializeFromInfo(info);
		return runtime;

	}

	/**
	 * Creation date: (10/22/2001 2:17:25 PM)
	 * 
	 * @return org.eclipse.jst.j2ee.internal.internal.internal.web.operations.IBaseWebNature
	 */
	public static IBaseWebNature getRuntime(IProject project) {
		if (project == null)
			return null;
		try {
			IBaseWebNature nature = null;
			if (project.hasNature(IWebNatureConstants.J2EE_NATURE_ID))
				nature = (IBaseWebNature) project.getNature(IWebNatureConstants.J2EE_NATURE_ID);
			return nature;
		} catch (CoreException e) {
			return null;
		}
	}


	/**
	 * Return the J2EE Web Nature for the given project. If the the project does not have a J2EE Web
	 * Nature, then return null.
	 * 
	 * @param project
	 *            The project to get the nature from
	 * @return IJ2EEWebNature The J2EE Web Nature
	 */
	public static J2EEWebNatureRuntime getJ2EERuntime(IProject project) {
		IBaseWebNature nature = getRuntime(project);
		if (nature != null) {
			if (nature.isJ2EE())
				return (J2EEWebNatureRuntime) nature;
		}
		return null;
	}

	/**
	 * Return whether or not the project has a runtime created on it.
	 * 
	 * @return boolean
	 * @param project
	 *            com.ibm.itp.core.api.resources.IProject
	 * @deprecated
	 */
	public static boolean hasRuntime(IProject project) {
		try {
			return project.hasNature(IWebNatureConstants.J2EE_NATURE_ID);
		} catch (CoreException e) {
			return false;
		}
	}

	/**
	 * Return whether or not the project has a runtime created on it.
	 * 
	 * @return boolean
	 * @param project
	 *            com.ibm.itp.core.api.resources.IProject
	 */
	public static boolean hasJ2EERuntime(IProject project) {
		if (project == null || !project.exists()) {
			return false;
		}
		try {
			return project.hasNature(IWebNatureConstants.J2EE_NATURE_ID);
		} catch (CoreException e) {
			return false;
		}
	}

	public static String getDefaultJ2EEWebContentName() {
		return J2EEPlugin.getDefault().getJ2EEPreferences().getJ2EEWebContentFolderName();
	}

	public static String getDefaultStaticWebContentName() {
		return J2EEPlugin.getDefault().getJ2EEPreferences().getStaticWebContentFolderName();
	}

	public static IPath getDefaultJ2EEWebContentPath() {
		return new Path(getDefaultJ2EEWebContentName());
	}

	public static String getContextRootFromWebProject(IProject project) {

		// get uri from web app display name, and get context root from web nature
		IBaseWebNature nature = J2EEWebNatureRuntimeUtilities.getRuntime(project);
		String contextRoot = ""; //$NON-NLS-1$
		contextRoot = nature.getContextRoot();

		//	WebEditModel webEditModel = null;
		//	try {
		//		webEditModel = (nature.isStatic())
		//						? null
		//						:
		// ((J2EEWebNatureRuntime)nature).getWebAppEditModelForRead(WebNatureRuntimeUtilities.this);
		//		contextRoot = nature.getContextRoot();
		//	} catch (Exception e) {
		//		e.printStackTrace();
		//	}
		//	finally {
		//		if (webEditModel != null)
		//			webEditModel.releaseAccess(WebNatureRuntimeUtilities.this);
		//	}
		return contextRoot;
	}

	public static IPath getDefaultWEBINFPath() {
		return getDefaultJ2EEWebContentPath().append(IWebNatureConstants.INFO_DIRECTORY);
	}

	public static IPath getDefaultWebOutputFolderPath() {
		return getDefaultWEBINFPath().append(IWebNatureConstants.CLASSES_DIRECTORY);
	}

	public static IPath getWebOutputFolderPath(String webContentName) {
		return new Path(webContentName).append(IWebNatureConstants.INFO_DIRECTORY).append(IWebNatureConstants.CLASSES_DIRECTORY);
	}

	public static String getDefaultJavaSourceName() {
		return J2EEPlugin.getDefault().getJ2EEPreferences().getJavaSourceFolderName();
	}

}