/*******************************************************************************
 *  Copyright (c) 2000, 2009 IBM Corporation and others.
 *
 *  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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.resources;

import org.eclipse.core.runtime.CoreException;

/**
 * Interface for project nature runtime classes.
 * It can configure a project with the project nature, or de-configure it.
 * When a project is configured with a project nature, this is
 * recorded in the list of project natures on the project.
 * Individual project natures may expose a more specific runtime type,
 * with additional API for manipulating the project in a
 * nature-specific way.
 * <p>
 * Clients may implement this interface.
 * </p>
 *
 * @see IProject#getNature(String)
 * @see IProject#hasNature(String)
 * @see IProjectDescription#getNatureIds()
 * @see IProjectDescription#hasNature(String)
 * @see IProjectDescription#setNatureIds(String[])
 */
public interface IProjectNature {
	/**
	 * Configures this nature for its project. This is called by the workspace
	 * when natures are added to the project using <code>IProject.setDescription</code>
	 * and should not be called directly by clients.  The nature extension
	 * id is added to the list of natures before this method is called,
	 * and need not be added here.
	 *
	 * Exceptions thrown by this method will be propagated back to the caller
	 * of <code>IProject.setDescription</code>, but the nature will remain in
	 * the project description.
	 *
	 * @exception CoreException if this method fails.
	 */
	void configure() throws CoreException;

	/**
	 * De-configures this nature for its project.  This is called by the workspace
	 * when natures are removed from the project using
	 * <code>IProject.setDescription</code> and should not be called directly by
	 * clients.  The nature extension id is removed from the list of natures before
	 * this method is called, and need not be removed here.
	 *
	 * Exceptions thrown by this method will be propagated back to the caller
	 * of <code>IProject.setDescription</code>, but the nature will still be
	 * removed from the project description.
	 * *
	 * @exception CoreException if this method fails.
	 */
	void deconfigure() throws CoreException;

	/**
	 * Returns the project to which this project nature applies.
	 *
	 * @return the project handle
	 */
	IProject getProject();

	/**
	 * Sets the project to which this nature applies.
	 * Used when instantiating this project nature runtime.
	 * This is called by <code>IProject.create()</code> or
	 * <code>IProject.setDescription()</code>
	 * and should not be called directly by clients.
	 *
	 * @param project the project to which this nature applies
	 */
	void setProject(IProject project);
}
