/*******************************************************************************
 *  Copyright (c) 2004, 2009 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.core.resources;

import org.eclipse.core.runtime.jobs.ISchedulingRule;

/**
 * A resource rule factory returns scheduling rules for API methods
 * that modify the workspace. These rules can be used when creating jobs
 * or other operations that perform a series of modifications on the workspace.
 * This allows clients to implement two phase commit semantics, where all
 * necessary rules are obtained prior to executing a long running operation.
 * <p>
 * Note that simple use of the workspace APIs does not require use of scheduling
 * rules.  All workspace API methods that modify the workspace will automatically
 * obtain any scheduling rules needed to perform the modification.  However, if you
 * are aggregating a set of changes to the workspace using <code>WorkspaceJob</code>
 * or <code>IWorkspaceRunnable</code> you can use scheduling rules to lock a 
 * portion of the workspace for the duration of the job or runnable.  If you
 * provide a non-null scheduling rule, a runtime exception will occur if you try to 
 * modify a portion of the workspace that is not covered by the rule for the runnable or job.
 * <p>
 * If more than one rule is needed, they can be aggregated using the
 * <code>MultiRule.combine</code> method.  Simplifying a group of rules does not change
 * the set of resources that are covered, but can improve job scheduling performance.
 * <p>
 * Note that <code>null</code> is a valid scheduling rule (indicating that no
 * resources need to be locked), and thus all methods in this class may 
 * return <code>null</code>.
 * 
 * @see WorkspaceJob
 * @see IWorkspace#run(IWorkspaceRunnable, ISchedulingRule, int, org.eclipse.core.runtime.IProgressMonitor)
 * @see org.eclipse.core.runtime.jobs.MultiRule#combine(ISchedulingRule, ISchedulingRule)
 * @since 3.0
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface IResourceRuleFactory {
	/**
	 * Returns the scheduling rule that is required for creating a project, folder,
	 * or file.
	 * 
	 * @param resource the resource being created
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule createRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for building a project or the
	 * entire workspace.
	 * 
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule buildRule();
	
	/**
	 * Returns the scheduling rule that is required for changing the charset 
	 * setting for a file or the default charset setting for a container.
	 *
	 * @param resource the resource for which the charset will be changed
	 * @return a scheduling rule, or <code>null</code>
	 * @since 3.1
	 */
	public ISchedulingRule charsetRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for changing the derived flag
	 * on a resource.
	 *
	 * @param resource the resource for which the derived flag will be changed
	 * @return a scheduling rule, or <code>null</code>
	 * @since 3.6
	 */
	public ISchedulingRule derivedRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for copying a resource.
	 * 
	 * @param source the source of the copy
	 * @param destination the destination of the copy
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule copyRule(IResource source, IResource destination);

	/**
	 * Returns the scheduling rule that is required for deleting a resource.
	 * 
	 * @param resource the resource to be deleted
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule deleteRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for creating, modifying, or
	 * deleting markers on a resource.
	 * 
	 * @param resource the resource owning the marker to be modified
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule markerRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for modifying a resource.
	 * For files, modification includes setting and appending contents. For
	 * projects, modification includes opening or closing the project, or
	 * setting the project description using the 
	 * {@link IResource#AVOID_NATURE_CONFIG} flag. For all resources 
	 * <code>touch</code> is considered to be a modification.
	 * 
	 * @param resource the resource being modified
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule modifyRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for moving a resource.
	 * 
	 * @param source the source of the move
	 * @param destination the destination of the move
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule moveRule(IResource source, IResource destination);

	/**
	 * Returns the scheduling rule that is required for performing 
	 * <code>refreshLocal</code> on a resource.
	 * 
	 * @param resource the resource to refresh
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule refreshRule(IResource resource);

	/**
	 * Returns the scheduling rule that is required for a <code>validateEdit</code>
	 * 
	 * @param resources the resources to be validated
	 * @return a scheduling rule, or <code>null</code>
	 */
	public ISchedulingRule validateEditRule(IResource[] resources);
}
