All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.core.resources.IncrementalProjectBuilder Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2011 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
 * Anton Leherbauer (Wind River) - [198591] Allow Builder to specify scheduling rule
 * Anton Leherbauer (Wind River) - [305858] Allow Builder to return null rule
 * James Blackburn (Broadcom) - [306822] Provide Context for Builder getRule()
 * Broadcom Corporation - build configurations and references
 *******************************************************************************/
package org.eclipse.core.resources;

import java.util.Map;
import org.eclipse.core.internal.events.InternalBuilder;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.ISchedulingRule;

/**
 * The abstract base class for all incremental project builders. This class
 * provides the infrastructure for defining a builder and fulfills the contract
 * specified by the org.eclipse.core.resources.builders standard
 * extension point.
 * 

* All builders must subclass this class according to the following guidelines: *

    *
  • must re-implement at least build
  • *
  • may implement other methods
  • *
  • must supply a public, no-argument constructor
  • *
* On creation, the setInitializationData method is called with * any parameter data specified in the declaring plug-in's manifest. */ public abstract class IncrementalProjectBuilder extends InternalBuilder implements IExecutableExtension { /** * Build kind constant (value 6) indicating a full build request. A full * build discards all previously built state and builds all resources again. * Resource deltas are not applicable for this kind of build. *

* Note: If there is no previous delta, a request for {@link #INCREMENTAL_BUILD} * or {@link #AUTO_BUILD} will result in the builder being called with {@link #FULL_BUILD} * build kind. *

* * @see IProject#build(int, IProgressMonitor) * @see IProject#build(int, String, Map, IProgressMonitor) * @see IWorkspace#build(int, IProgressMonitor) */ public static final int FULL_BUILD = 6; /** * Build kind constant (value 9) indicating an automatic build request. When * autobuild is turned on, these builds are triggered automatically whenever * resources change. Apart from the method by which autobuilds are triggered, * they otherwise operate like an incremental build. * * @see IWorkspaceDescription#setAutoBuilding(boolean) * @see IWorkspace#isAutoBuilding() */ public static final int AUTO_BUILD = 9; /** * Build kind constant (value 10) indicating an incremental build request. * Incremental builds use an {@link IResourceDelta} that describes what * resources have changed since the last build. The builder calculates * what resources are affected by the delta, and rebuilds the affected resources. * * @see IProject#build(int, IProgressMonitor) * @see IProject#build(int, String, Map, IProgressMonitor) * @see IWorkspace#build(int, IProgressMonitor) */ public static final int INCREMENTAL_BUILD = 10; /** * Build kind constant (value 15) indicating a clean build request. A clean * build discards any additional state that has been computed as a result of * previous builds, and returns the project to a clean slate. Resource * deltas are not applicable for this kind of build. * * @see IProject#build(int, IProgressMonitor) * @see IProject#build(int, String, Map, IProgressMonitor) * @see IWorkspace#build(int, IProgressMonitor) * @see #clean(IProgressMonitor) * @since 3.0 */ public static final int CLEAN_BUILD = 15; /** * Runs this builder in the specified manner. Subclasses should implement * this method to do the processing they require. *

* If the build kind is {@link #INCREMENTAL_BUILD} or * {@link #AUTO_BUILD}, the getDelta method can be * used during the invocation of this method to obtain information about * what changes have occurred since the last invocation of this method. Any * resource delta acquired is valid only for the duration of the invocation * of this method. A {@link #FULL_BUILD} has no associated build delta. *

*

* After completing a build, this builder may return a list of projects for * which it requires a resource delta the next time it is run. This * builder's project is implicitly included and need not be specified. The * build mechanism will attempt to maintain and compute deltas relative to * the identified projects when asked the next time this builder is run. * Builders must re-specify the list of interesting projects every time they * are run as this is not carried forward beyond the next build. Projects * mentioned in return value but which do not exist will be ignored and no * delta will be made available for them. *

*

* This method is long-running; progress and cancellation are provided by * the given progress monitor. All builders should report their progress and * honor cancel requests in a timely manner. Cancelation requests should be * propagated to the caller by throwing * OperationCanceledException. *

*

* All builders should try to be robust in the face of trouble. In * situations where failing the build by throwing CoreException * is the only option, a builder has a choice of how best to communicate the * problem back to the caller. One option is to use the * {@link IResourceStatus#BUILD_FAILED} status code along with a suitable message; * another is to use a {@link MultiStatus} containing finer-grained problem * diagnoses. *

* * @param kind the kind of build being requested. Valid values are *
    *
  • {@link #FULL_BUILD} - indicates a full build.
  • *
  • {@link #INCREMENTAL_BUILD}- indicates an incremental build.
  • *
  • {@link #AUTO_BUILD} - indicates an automatically triggered * incremental build (autobuilding on).
  • *
* @param args a table of builder-specific arguments keyed by argument name * (key type: String, value type: String); * null is equivalent to an empty map * @param monitor a progress monitor, or null if progress * reporting and cancellation are not desired * @return the list of projects for which this builder would like deltas the * next time it is run or null if none * @exception CoreException if this build fails. * @see IProject#build(int, String, Map, IProgressMonitor) */ protected abstract IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException; /** * Clean is an opportunity for a builder to discard any additional state that has * been computed as a result of previous builds. It is recommended that builders * override this method to delete all derived resources created by previous builds, * and to remove all markers of type {@link IMarker#PROBLEM} that * were created by previous invocations of the builder. The platform will * take care of discarding the builder's last built state (there is no need * to call forgetLastBuiltState). *

*

* This method is called as a result of invocations of * IWorkspace.build or IProject.build where * the build kind is {@link #CLEAN_BUILD}. *

* This default implementation does nothing. Subclasses may override. *

* This method is long-running; progress and cancellation are provided by * the given progress monitor. All builders should report their progress and * honor cancel requests in a timely manner. Cancelation requests should be * propagated to the caller by throwing * OperationCanceledException. *

* * @param monitor a progress monitor, or null if progress * reporting and cancellation are not desired * @exception CoreException if this build fails. * @see IWorkspace#build(int, IProgressMonitor) * @see #CLEAN_BUILD * @since 3.0 */ protected void clean(IProgressMonitor monitor) throws CoreException { //default implementation does nothing //thwart compiler warning } /** * Requests that this builder forget any state it may be retaining regarding * previously built states. Typically this means that the next time the * builder runs, it will have to do a full build since it does not have any * state upon which to base an incremental build. * This supersedes a call to {@link #rememberLastBuiltState()}. */ public final void forgetLastBuiltState() { super.forgetLastBuiltState(); } /** * Requests that this builder remember any build invocation specific state. * This means that the next time the builder runs, it will receive a delta * which includes changes reported in the current {@link #getDelta(IProject)}. *

* This can be used to indicate that a builder didn't run, even though there * are changes, and the builder wishes that the delta be preserved until its * next invocation. *

* This is superseded by a call to {@link #forgetLastBuiltState()}. * @since 3.7 */ public final void rememberLastBuiltState() { super.rememberLastBuiltState(); } /** * Returns the build command associated with this builder. The returned * command may or may not be in the build specification for the project * on which this builder operates. *

* Any changes made to the returned command will only take effect if * the modified command is installed on a project build spec. *

* * @see IProjectDescription#setBuildSpec(ICommand []) * @see IProject#setDescription(IProjectDescription, int, IProgressMonitor) * @since 3.1 */ public final ICommand getCommand() { return super.getCommand(); } /** * Returns the resource delta recording the changes in the given project * since the last time this builder was run. null is returned * if no such delta is available. An empty delta is returned if no changes * have occurred, or if deltas are not applicable for the current build kind. * If null is returned, clients should assume * that unspecified changes have occurred and take the appropriate action. *

* The system reserves the right to trim old state in an effort to conserve * space. As such, callers should be prepared to receive null * even if they previously requested a delta for a particular project by * returning that project from a build call. *

*

* A non- null delta will only be supplied for the given * project if either the result returned from the previous * build included the project or the project is the one * associated with this builder. *

*

* If the given project was mentioned in the previous build * and subsequently deleted, a non- null delta containing the * deletion will be returned. If the given project was mentioned in the * previous build and was subsequently created, the returned * value will be null. *

*

* A valid delta will be returned only when this method is called during a * build. The delta returned will be valid only for the duration of the * enclosing build execution. *

*

* The delta does not include changes made while this builder is running. * If {@link #getRule(int, Map)} is overridden to return a scheduling rule other than * the workspace root, changes performed in other threads during the build * will not appear in the resource delta. *

* * @return the resource delta for the project or null */ public final IResourceDelta getDelta(IProject project) { return super.getDelta(project); } /** * Returns the project for which this builder is defined. * * @return the project */ public final IProject getProject() { return super.getProject(); } /** * Returns the build configuration for which this build was invoked. * @return the build configuration * @since 3.7 */ public final IBuildConfiguration getBuildConfig() { return super.getBuildConfig(); } /** * Returns whether the given project has already been built during this * build iteration. *

* When the entire workspace is being built, the projects are built in * linear sequence. This method can be used to determine if another project * precedes this builder's project in that build sequence. If only a single * project is being built, then there is no build order and this method will * always return false. *

* * @param project the project to check against in the current build order * @return true if the given project has been built in this * iteration, and false otherwise. * @see #needRebuild() * @since 2.1 */ public final boolean hasBeenBuilt(IProject project) { return super.hasBeenBuilt(project); } /** * Returns whether an interrupt request has been made for this build. * Background autobuild is interrupted when another thread tries to modify * the workspace concurrently with the build thread. When this occurs, the * build cycle is flagged as interrupted and the build will be terminated at * the earliest opportunity. This method allows long running builders to * respond to this interruption in a timely manner. Builders are not * required to respond to interruption requests. *

* * @return true if the build cycle has been interrupted, and * false otherwise. * @since 3.0 */ public final boolean isInterrupted() { return super.isInterrupted(); } /** * Indicates that this builder made changes that affect a build configuration that * precedes this build configuration in the currently executing build order, and thus a * rebuild will be necessary. *

* This is an advanced feature that builders should use with caution. This * can cause workspace builds to iterate until no more builders require * rebuilds. *

* * @see #hasBeenBuilt(IProject) * @since 2.1 */ public final void needRebuild() { super.needRebuild(); } /** * Sets initialization data for this builder. *

* This method is part of the {@link IExecutableExtension} interface. *

*

* Subclasses are free to extend this method to pick up initialization * parameters from the plug-in plug-in manifest (plugin.xml) * file, but should be sure to invoke this method on their superclass. *

* For example, the following method looks for a boolean-valued parameter * named "trace": * *

	 * public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) throws CoreException {
	 * 	super.setInitializationData(cfig, propertyName, data);
	 * 	if (data instanceof Hashtable) {
	 * 		Hashtable args = (Hashtable) data;
	 * 		String traceValue = (String) args.get("trace");
	 * 		TRACING = (traceValue != null && traceValue.equals("true"));
	 * 	}
	 * }
	 * 
*

* @throws CoreException if fails. */ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { //default implementation does nothing //thwart compiler warning } /** * Informs this builder that it is being started by the build management * infrastructure. By the time this method is run, the builder's project is * available and setInitializationData has been called. The * default implementation should be called by all overriding methods. * * @see #setInitializationData(IConfigurationElement, String, Object) */ protected void startupOnInitialize() { // reserved for future use } /** * Returns the scheduling rule that is required for building * the project for which this builder is defined. The default * is the workspace root rule. * * @return a scheduling rule which is contained in the workspace root rule or null * @since 3.5 * @see #getRule(int, Map) * @deprecated clients should call and override {@link #getRule(int, Map)} instead. */ public ISchedulingRule getRule() { return ResourcesPlugin.getWorkspace().getRoot(); } /** * Returns the scheduling rule that is required for building * the project build configuration for which this builder is defined. The default * is {@link #getRule()}, which returns the workspace root * rule unless overridden. *

* The scheduling rule determines which resources in the workspace are * protected from being modified by other threads while the builder is running. Up until * Eclipse 3.5, the entire workspace was always locked during a build; * since Eclipse 3.6, builders can allow resources outside their scheduling * rule to be modified. *

* Notes: *

    *
  • * If the builder rule is non-null it must be "contained" in the workspace root rule. * I.e. {@link ISchedulingRule#contains(ISchedulingRule)} must return * true when invoked on the workspace root with the builder rule. *
  • *
  • * The rule returned here may have no effect if the build is invoked within the * scope of another operation that locks the entire workspace. *
  • *
  • * If this method returns any rule other than the workspace root, * resources outside of the rule scope can be modified concurrently with the build. * The delta returned by {@link #getDelta(IProject)} for any project * outside the scope of the builder's rule may not contain changes that occurred * concurrently with the build. *
*

*

* Subclasses may override this method. *

* @noreference This method is not intended to be referenced by clients. * * @param kind the kind of build being requested. Valid values include: *
    *
  • {@link #FULL_BUILD} - indicates a full build.
  • *
  • {@link #INCREMENTAL_BUILD} - indicates an incremental build.
  • *
  • {@link #AUTO_BUILD} - indicates an automatically triggered * incremental build (autobuilding on).
  • *
  • {@link #CLEAN_BUILD} - indicates a clean request.
  • *
* @param args a table of builder-specific arguments keyed by argument name * (key type: String, value type: String); * null is equivalent to an empty map. * @return a scheduling rule which is contained in the workspace root rule * or null to indicate that no protection against resource * modification during the build is needed. * * @since 3.6 */ public ISchedulingRule getRule(int kind, Map args) { return getRule(); } /** * Get the context for this invocation of the builder. This is only valid * in the context of a call to * {@link #build(int, Map, IProgressMonitor)} * *

* This can be used to discover which build configurations are being built before * and after this build configuration. *

* * @return the context for the most recent invocation of the builder * @since 3.7 */ public final IBuildContext getContext() { return super.getContext(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy