/***************************************************************************************************
 * 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.project;



import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jst.j2ee.applicationclient.creation.IApplicationClientNatureConstants;
import org.eclipse.jst.j2ee.common.XMLResource;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
import org.eclipse.jst.j2ee.internal.J2EEEditModel;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.common.impl.J2EEResourceFactoryRegistry;
import org.eclipse.jst.j2ee.internal.earcreation.IEARNatureConstants;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature;
import org.eclipse.wst.server.core.IModule;

import com.ibm.wtp.common.logger.proxy.Logger;
import com.ibm.wtp.emf.workbench.EMFWorkbenchContextBase;
import com.ibm.wtp.emf.workbench.ISynchronizerExtender;
import com.ibm.wtp.emf.workbench.ProjectResourceSet;
import com.ibm.wtp.emf.workbench.ProjectUtilities;
import com.ibm.wtp.emf.workbench.ResourceSetWorkbenchSynchronizer;
import com.ibm.wtp.emf.workbench.WorkbenchURIConverter;


public abstract class J2EENature extends EditModelNature implements ISynchronizerExtender {

	/** Used to keep documents loaded */
	private EditModel cacheEditModel;

	protected IModule module;
	protected int moduleVersion;
	protected J2EESettings j2eeSettings;

	private static final String[] J2EE_NATURE_IDS = {IEJBNatureConstants.NATURE_ID, IEARNatureConstants.NATURE_ID, IWebNatureConstants.J2EE_NATURE_ID, IApplicationClientNatureConstants.NATURE_ID, IConnectorNatureConstants.NATURE_ID};

	/**
	 * J2EENature constructor comment.
	 */
	public J2EENature() {
	}

	public abstract String getOverlayIconName();

	/**
	 * Create the folders for the project we have just created.
	 * 
	 * @exception com.ibm.itp.core.api.resources.CoreException
	 *                The exception description.
	 */
	protected abstract void createFolders() throws CoreException;

	protected J2EEWorkbenchURIConverterImpl getJ2EEWorkbenchURIConverter() {
		WorkbenchURIConverter conv = getWorkbenchURIConverter();
		if (conv instanceof J2EEWorkbenchURIConverterImpl)
			return (J2EEWorkbenchURIConverterImpl) conv;
		return null;
	}

	/**
	 * Return the folder where the meta data documents are stored
	 */
	public IFolder getMetaFolder() {
		if (getMetaPath() != null)
			return getProject().getFolder(getMetaPath());
		return null;
	}

	/**
	 * Return the path to the folder in which meta-data is stored; subclasses should override
	 * getMofRoot() and getMetaPathKey()
	 */
	protected IPath getMetaPath() {
		IContainer mofRoot = getEMFRoot();
		if (mofRoot == null)
			return null;
		return mofRoot.getProjectRelativePath().append(getMetaPathKey());
	}

	protected String getMetaPathKey() {
		return ArchiveConstants.META_INF;
	}

	public static J2EENature getRuntime(IProject project, String natureId) {
		if (project == null)
			return null;
		try {
			return (J2EENature) project.getNature(natureId);
		} catch (CoreException e) {
			return null;
		}
	}

	public static J2EENature getRuntime(IProject project, String[] possibleNatureIds) {
		if (project != null && project.isAccessible()) {
			for (int i = 0; i < possibleNatureIds.length; i++) {
				J2EENature nature = getRuntime(project, possibleNatureIds[i]);
				if (nature != null)
					return nature;
			}
		}
		return null;
	}


	/**
	 * Answer the root container for the j2ee module, under which the relative path of all resources
	 * are equivalent to the uris within a j2ee module JAR file; used for the server to run from
	 * 
	 * The default is to return the IProject itself
	 */
	public IContainer getModuleServerRoot() {
		return getProject();
	}

	protected J2EESettings getJ2EESettings() {
		if (j2eeSettings == null) {
			j2eeSettings = new J2EESettings(getProject());
		}
		return j2eeSettings;
	}

	protected J2EEWorkbenchURIConverterImpl initializeWorbenchURIConverter(ProjectResourceSet set) {
		return new J2EEWorkbenchURIConverterImpl(this, set.getSynchronizer());
	}

	/*
	 * @deprecated - Use getJ2EEVersion() with J2EEVersionConstants
	 * @see IJ2EENature#isJ2EEVersionN() Subclasses should override when they have a nature that can
	 *      support this specification level.
	 */
	public boolean isJ2EE1_3() {
		return getJ2EEVersion() >= J2EEVersionConstants.J2EE_1_3_ID;
	}

	/**
	 * Primary Contribute to nature
	 */
	public void primaryContributeToContext(EMFWorkbenchContextBase aNature) {
		if (emfContext == aNature)
			return;
		emfContext = aNature;
		getEmfContext().setDefaultToMOF5Compatibility(true);
		//Overriding superclass to use our own URI converter, which knows about binary projects
		ProjectResourceSet set = aNature.getResourceSet();
		set.setResourceFactoryRegistry(new J2EEResourceFactoryRegistry());
		WorkbenchURIConverter conv = initializeWorbenchURIConverter(set);
		set.setURIConverter(conv);
		initializeCacheEditModel();
		addAdapterFactories(set);
		set.getSynchronizer().addExtender(this); //added so we can be informed of closes to the
		// project.
		new J2EEResourceDependencyRegister(set); //This must be done after the URIConverter is
		// created.
	}

	/**
	 * Secondary Contribute to nature
	 */
	public void secondaryContributeToContext(EMFWorkbenchContextBase aNature) {
		primaryContributeToContext(aNature);
	}

	/**
	 * Add Adaptor factories to aContext which is now being used for this nature.
	 */
	protected void addAdapterFactories(ResourceSet aSet) {
		// module natures will override
	}

	/**
	 * Gets the module.
	 * 
	 * @return Returns an IModule
	 */
	public IModule getModule() {
		return module;
	}

	/**
	 * Sets the module.
	 * 
	 * @param module
	 *            The module to set
	 */
	public void setModule(IModule module) {
		this.module = module;
	}

	/**
	 * This method is used by migration to set the properties of this nature on the on
	 * <code>anotherNature</code>. TODO - See if this can be deleted
	 */
	public void replaceWith(J2EENature anotherNature) {
		if (anotherNature != null && anotherNature.getDeploymentDescriptorType() == getDeploymentDescriptorType()) {
			//Move EMFNature
			if (emfContext != null) {
				anotherNature.emfContext = emfContext;
				ResourceSetWorkbenchSynchronizer synchronizer = emfContext.getResourceSet().getSynchronizer();
				if (synchronizer != null) {
					synchronizer.removeExtender(this);
					synchronizer.addExtender(anotherNature);
				}

			}
			anotherNature.setCacheEditModel(cacheEditModel);
		}
	}

	public int getJ2EEVersion() {
		return J2EEVersionConstants.J2EE_1_4_ID;
	}

	public String getJ2EEVersionText() {
		switch (getJ2EEVersion()) {
			case J2EEVersionConstants.J2EE_1_2_ID :
				return J2EEVersionConstants.VERSION_1_2_TEXT;
			case J2EEVersionConstants.J2EE_1_3_ID :
				return J2EEVersionConstants.VERSION_1_3_TEXT;
			case J2EEVersionConstants.J2EE_1_4_ID :
			default :
				return J2EEVersionConstants.VERSION_1_4_TEXT;
		}
	}


	/**
	 * @see org.eclipse.jem.internal.java.plugin.AbstractJavaMOFNatureRuntime#primConfigure()
	 */
	protected void primConfigure() throws CoreException {
		super.primConfigure();
		// The two builders below are common to all J2EE project types
		// add Validation Builder to Web Projects' builder list
		ProjectUtilities.addToBuildSpec(J2EEPlugin.VALIDATION_BUILDER_ID, project);
		// add LibCopy Builder to Projects' builder list
		// Note: since this is the last nature added, we are assuming it will
		// be after the Java builder. May need to be more explicit about this.

	}

	/**
	 * @return The uri of the dd resource for the J2EE project
	 */
	public String getDeploymentDescriptorURI() {
		switch (getDeploymentDescriptorType()) {
			case XMLResource.APPLICATION_TYPE :
				return ArchiveConstants.APPLICATION_DD_URI;
			case XMLResource.APP_CLIENT_TYPE :
				return ArchiveConstants.APP_CLIENT_DD_URI;
			case XMLResource.EJB_TYPE :
				return ArchiveConstants.EJBJAR_DD_URI;
			case XMLResource.RAR_TYPE :
				return ArchiveConstants.RAR_DD_URI;
			case XMLResource.WEB_APP_TYPE :
				return ArchiveConstants.WEBAPP_DD_URI;
			default :
				return null;
		}
	}

	/**
	 * Return a EMFNature based on the natures that have been configured.
	 * 
	 * @return EMFNature
	 * @param project
	 *            com.ibm.itp.core.api.resources.IProject
	 */
	public static J2EENature getRegisteredRuntime(IProject project) {
		return getRuntime(project, J2EE_NATURE_IDS);
	}

	/**
	 * Return a EMFFNatureID based on the natures that have been configured.
	 * 
	 * @return String
	 * @param project
	 *            com.ibm.itp.core.api.resources.IProject
	 */
	public static String getRegisteredRuntimeID(IProject project) {
		String natureID = null;
		J2EENature nature = getRegisteredRuntime(project);
		if (nature != null)
			natureID = nature.getNatureID();
		return natureID;
	}

	/**
	 * Return a "virtual" archive on this nature's project; used for export
	 */
	public abstract Archive asArchive() throws OpenFailureException;

	/**
	 * Return a "virtual" archive on this nature's project; used for export
	 */
	public abstract Archive asArchive(boolean shouldExportSource) throws OpenFailureException;

	/**
	 * This will be the type of the deployment descriptor docuemnt. Subclasses should override if
	 * they have a deployment descriptor.
	 * 
	 * @see XMLResource#APP_CLIENT_TYPE
	 * @see XMLResource#APPLICATION_TYPE
	 * @see XMLResource#EJB_TYPE
	 * @see XMLResource#WEB_APP_TYPE
	 * @see XMLResource#RAR_TYPE
	 */
	public abstract int getDeploymentDescriptorType();

	public abstract EObject getDeploymentDescriptorRoot();

	/**
	 * @param i
	 */
	public void setModuleVersion(int aModuleVersion) throws CoreException {
		if (aModuleVersion == moduleVersion)
			return;
		J2EESettings settings = getJ2EESettings();
		settings.setModuleVersion(aModuleVersion);
		settings.write();
		moduleVersion = aModuleVersion;
	}

	/**
	 * Compare with J2EEVersionConstants
	 */
	public int getModuleVersion() {
		if (moduleVersion == 0) {
			if (getJ2EESettings().getModuleVersion() == 0)
				try {
					setModuleVersion(getVersionFromModuleFile());
				} catch (CoreException e) {
					Logger.getLogger().logError(e);
				}
		}
		moduleVersion = getJ2EESettings().getModuleVersion();
		return moduleVersion;
	}

	/**
	 * Compare with J2EEVersionConstants
	 */
	public String getModuleVersionText() {
		switch (getModuleVersion()) {
			case J2EEVersionConstants.VERSION_1_0 :
				return J2EEVersionConstants.VERSION_1_0_TEXT;
			case J2EEVersionConstants.VERSION_1_1 :
				return J2EEVersionConstants.VERSION_1_1_TEXT;
			case J2EEVersionConstants.VERSION_1_2 :
				return J2EEVersionConstants.VERSION_1_2_TEXT;
			case J2EEVersionConstants.VERSION_1_3 :
				return J2EEVersionConstants.VERSION_1_3_TEXT;
			case J2EEVersionConstants.VERSION_1_4 :
				return J2EEVersionConstants.VERSION_1_4_TEXT;
			case J2EEVersionConstants.VERSION_1_5 :
				return J2EEVersionConstants.VERSION_1_5_TEXT;
			case J2EEVersionConstants.VERSION_2_0 :
				return J2EEVersionConstants.VERSION_2_0_TEXT;
			case J2EEVersionConstants.VERSION_2_1 :
				return J2EEVersionConstants.VERSION_2_1_TEXT;
			case J2EEVersionConstants.VERSION_2_2 :
				return J2EEVersionConstants.VERSION_2_2_TEXT;
			case J2EEVersionConstants.VERSION_2_3 :
				return J2EEVersionConstants.VERSION_2_3_TEXT;
			case J2EEVersionConstants.VERSION_2_4 :
				return J2EEVersionConstants.VERSION_2_4_TEXT;
			case J2EEVersionConstants.VERSION_2_5 :
				return J2EEVersionConstants.VERSION_2_5_TEXT;
			default :
				return "0.0"; //$NON-NLS-1$
		}
	}

	/**
	 * @return the version from he archive
	 */
	protected abstract int getVersionFromModuleFile();

	protected void initializeCacheEditModel() {
		setCacheEditModel(createCacheEditModel());
	}

	/**
	 * Factory method to create a subtype specific edit model; subclasses that wish to keep
	 * resources from being removed except when rolling back changes should override this method.
	 */
	protected abstract EditModel createCacheEditModel();

	/**
	 * Insert the method's description here. Creation date: (9/18/2001 11:54:45 AM)
	 * 
	 * @param newCacheEditModel
	 *            org.eclipse.jst.j2ee.internal.internal.workbench.J2EEEditModel
	 */
	protected void setCacheEditModel(EditModel newCacheEditModel) {
		cacheEditModel = newCacheEditModel;
	}

	/**
	 * Insert the method's description here. Creation date: (9/18/2001 11:54:45 AM)
	 * 
	 * @param newCacheEditModel
	 *            org.eclipse.jst.j2ee.internal.internal.workbench.J2EEEditModel
	 */
	protected EditModel getCacheEditModel() {
		if (emfContext == null)
			// Lazy initialize of the EMF context that will force the cache edit model
			getEmfContext();
		return cacheEditModel;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectChanged(org.eclipse.core.resources.IResourceDelta)
	 */
	public void projectChanged(IResourceDelta delta) {

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectClosed()
	 */
	public void projectClosed() {
		this.emfContext = null;
	}

	/**
	 * Returns a default edit model for the nature
	 * 
	 * @param accessorKey
	 * @return
	 */
	public abstract J2EEEditModel getJ2EEEditModelForRead(Object accessorKey);

	/**
	 * Returns a default edit model for the nature
	 * 
	 * @param accessorKey
	 * @return
	 */
	public abstract J2EEEditModel getJ2EEEditModelForWrite(Object accessorKey);

	/**
	 * Return the default EditModel id for the specific J2EENature.
	 * 
	 * @return
	 */
	public abstract String getEditModelKey();


	public static J2EEEditModel getEditModelForProject(IProject project, Object accessorKey) {
		if (project == null || !project.isAccessible())
			return null;
		J2EEEditModel editModel = null;
		J2EENature nature = J2EENature.getRegisteredRuntime(project);
		if (nature != null) {
			editModel = nature.getJ2EEEditModelForRead(accessorKey);
		}
		return editModel;
	}
}