blob: 0e9a9c640e56e5fbef5443cadabdb5cf83e69a42 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 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
* Broadcom Corporation - build configurations and references
*******************************************************************************/
package org.eclipse.core.internal.events;
import java.util.Collection;
import java.util.Map;
import org.eclipse.core.internal.resources.ICoreConstants;
import org.eclipse.core.internal.watson.ElementTree;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
/**
* This class is the internal basis for all builders. Plugin developers should not
* subclass this class.
*
* @see IncrementalProjectBuilder
*/
public abstract class InternalBuilder {
/**
* Hold a direct reference to the build manager as an optimization.
* This will be initialized by BuildManager when it is constructed.
*/
static BuildManager buildManager;
private ICommand command;
private boolean forgetStateRequested = false;
private boolean rememberStateRequested = false;
private IProject[] interestingProjects = ICoreConstants.EMPTY_PROJECT_ARRAY;
/**
* Human readable builder name for progress reporting.
*/
private String label;
private String natureId;
private ElementTree oldState;
/**
* The symbolic name of the plugin that defines this builder
*/
private String pluginId;
/**
* The build configuration that this builder is to build.
*/
private IBuildConfiguration buildConfiguration;
/**
* The context in which the builder was called.
*/
private IBuildContext context = null;
/**
* The value of the callOnEmptyDelta builder extension attribute.
*/
private boolean callOnEmptyDelta = false;
/*
* @see IncrementalProjectBuilder#build
*/
protected abstract IProject[] build(int kind, Map<String,String> args, IProgressMonitor monitor) throws CoreException;
/**
* Returns the value of the callOnEmptyDelta builder extension attribute.
*/
final boolean callOnEmptyDelta() {
return callOnEmptyDelta;
}
/*
* @see IncrementalProjectBuilder
*/
protected abstract void clean(IProgressMonitor monitor) throws CoreException;
/**
* Clears the requests for forgetting or remembering last built states.
*/
final void clearLastBuiltStateRequests() {
forgetStateRequested = false;
rememberStateRequested = false;
}
/*
* @see IncrementalProjectBuilder#forgetLastBuiltState
*/
protected void forgetLastBuiltState() {
oldState = null;
forgetStateRequested = true;
rememberStateRequested = false;
}
/*
* @see IncrementalProjectBuilder#rememberLastBuiltState
*/
protected void rememberLastBuiltState() {
rememberStateRequested = !forgetStateRequested;
}
/*
* @see IncrementalProjectBuilder#getCommand
*/
protected ICommand getCommand() {
return (ICommand)((BuildCommand)command).clone();
}
/**
* @see IncrementalProjectBuilder#forgetLastBuiltState()
* @see IncrementalProjectBuilder#rememberLastBuiltState()
*/
protected IResourceDelta getDelta(IProject aProject) {
return buildManager.getDelta(aProject);
}
/**
* @see IncrementalProjectBuilder#getContext()
*/
protected IBuildContext getContext() {
return context;
}
final IProject[] getInterestingProjects() {
return interestingProjects;
}
final String getLabel() {
return label;
}
final ElementTree getLastBuiltTree() {
return oldState;
}
/**
* Returns the ID of the nature that owns this builder. Returns null if the
* builder does not belong to a nature.
*/
final String getNatureId() {
return natureId;
}
final String getPluginId() {
return pluginId;
}
/**
* Returns the project for this builder
*/
protected IProject getProject() {
return buildConfiguration.getProject();
}
/**
* @see IncrementalProjectBuilder#getBuildConfig()
*/
protected IBuildConfiguration getBuildConfig() {
return buildConfiguration;
}
/*
* @see IncrementalProjectBuilder#hasBeenBuilt
*/
protected boolean hasBeenBuilt(IProject aProject) {
return buildManager.hasBeenBuilt(aProject);
}
/*
* @see IncrementalProjectBuilder#isInterrupted
*/
public boolean isInterrupted() {
return buildManager.autoBuildJob.isInterrupted();
}
/*
* @see IncrementalProjectBuilder#needRebuild
*/
protected void needRebuild() {
buildManager.requestRebuild();
}
/*
* @see IncrementalProjectBuilder#requestProjectRebuild
*/
public void requestProjectRebuild(boolean processOtherBuilders) {
buildManager.requestRebuild(getProject(), processOtherBuilders);
}
/*
* @see IncrementalProjectBuilder#requestProjectsRebuild
*/
public void requestProjectsRebuild(Collection<IProject> projects) {
buildManager.requestRebuild(projects, getProject());
}
final void setCallOnEmptyDelta(boolean value) {
this.callOnEmptyDelta = value;
}
final void setCommand(ICommand value) {
this.command = value;
}
final void setInterestingProjects(IProject[] value) {
interestingProjects = value;
}
final void setLabel(String value) {
this.label = value;
}
final void setLastBuiltTree(ElementTree value) {
oldState = value;
}
final void setNatureId(String id) {
this.natureId = id;
}
final void setPluginId(String value) {
pluginId = value;
}
/**
* Sets the build configuration for which this builder operates.
* @see #getBuildConfig()
*/
final void setBuildConfig(IBuildConfiguration value) {
Assert.isNotNull(value);
buildConfiguration = value;
if (context == null)
context = new BuildContext(buildConfiguration);
}
/**
* Sets the context in which the builder was last called.
* @see #getContext()
*/
final void setContext(IBuildContext context) {
this.context = context;
}
/*
* @see IncrementalProjectBuilder#startupOnInitialize
*/
protected abstract void startupOnInitialize();
/**
* Returns true if the builder requested that its last built state be
* forgotten, and false otherwise.
*/
final boolean wasForgetStateRequested() {
return forgetStateRequested;
}
/**
* Returns true if the builder requested that its last built state be
* remembered, and false otherwise.
*/
final boolean wasRememberStateRequested() {
return rememberStateRequested;
}
}