/*******************************************************************************
 * Copyright (c) 2001, 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.builder;

import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * Participants in the Structured building process. Participants may be
 * contributed using the org.eclipse.wst.sse.core.builderparticipant extension point.
 * For resources and resource deltas with matching content types, the builder
 * will first call the build() method and then the cleanup() method in
 * sequence. Participant instances will be reused across projects but are not
 * shared per content type. Participants should not hold on to references to
 * models or resources after cleanup().
 * 
 * @deprecated
 */
public interface IBuilderParticipant {


	/**
	 * Perform a build for the given resources within this project. May be
	 * called multiple times between startup and shutdown.
	 * 
	 * @param resources -
	 *            an IResource list of resources in this project with the
	 *            correct content type
	 * @param project -
	 *            the project on which this participant is operating
	 * @param provider -
	 *            a model provider for this project
	 * @param monitor
	 * @return
	 */
	boolean build(IResource[] resources, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor);

	/**
	 * Perform an incremental build. May be called multiple times between
	 * startup and shutdown.
	 * 
	 * @param delta -
	 *            the IResourceDelta to examine for building
	 * @param project -
	 *            the project on which this participant is operating
	 * @param provider -
	 *            a model provider for this delta's resource
	 * @param monitor
	 * @return
	 */
	boolean build(IResourceDelta delta, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor);

	/**
	 * Do any post-build cleanup from a full build for a project. Called once
	 * for every matching build() call.
	 * 
	 * @param resources -
	 *            the IResource list of resources in this project with the
	 *            correct content type
	 * @param project -
	 *            the project on which this participant is operating
	 * @param provider -
	 *            a model provider for this delta's resource
	 * @param monitor
	 * @return
	 */
	boolean cleanup(IResource[] resources, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor);

	/**
	 * Do any post-build cleanup from building a resource delta. Called once
	 * for every matching build() call.
	 * 
	 * @param delta -
	 *            the IResourceDelta to examine for building
	 * @param project -
	 *            the project on which this participant is operating
	 * @param provider -
	 *            a model provider for this delta's resource
	 * @param monitor
	 * @return
	 */
	boolean cleanup(IResourceDelta delta, IProject project, IBuilderModelProvider provider, IProgressMonitor monitor);

	/**
	 * Notifies the participant that building is done for now. Resources held
	 * from startup should now be released.
	 */
	void shutdown(IProject project);

	/**
	 * Notifies the participant that a sequence of builds is about to be
	 * called. Ideally the time to load preferences and perform any expensive
	 * configuration for the given project.
	 * 
	 * @param project -
	 *            the project that's about to be built
	 * @param kind -
	 *            the kind of build being done; possible values are
	 *            IncrementalProjectBuilder.AUTO_BUILD,
	 *            IncrementalProjectBuilder.FULL_BUILD, or
	 *            IncrementalProjectBuilder.INCREMENTAL_BUILD
	 * @param args
	 *            the table of builder-specific arguments sent to the
	 *            Structured Document Builder, keyed by argument name (key
	 *            type: <code>String</code>, value type:
	 *            <code>String</code>);<code>null</code> is equivalent
	 *            to an empty map
	 */
	void startup(IProject project, int kind, Map args);
}
