package com.mobilesorcery.sdk.core.build;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import com.mobilesorcery.sdk.core.IBuildResult;
import com.mobilesorcery.sdk.core.IBuildSession;
import com.mobilesorcery.sdk.core.IBuildState;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.IFileTreeDiff;
import com.mobilesorcery.sdk.core.IFilter;
import com.mobilesorcery.sdk.core.IProcessConsole;
import com.mobilesorcery.sdk.core.IPropertyOwner;
import com.mobilesorcery.sdk.core.LineReader.ILineHandler;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.ParameterResolver;
import com.mobilesorcery.sdk.internal.PipeTool;
import com.mobilesorcery.sdk.internal.dependencies.IDependencyProvider;
/**
* <p>An interface representing a 'generic' buildstep, such as 'compile', 'link' or 'package'.</p>
* @author Mattias Bybro, mattias@bybro.com
*
*/
public interface IBuildStep {
/**
* A hint to continue building after this build step.
*/
public int CONTINUE = 0;
/**
* A hint to skip the remaining build steps and accept
* this build step as the final one.
*/
public int SKIP = 1;
/**
* Performs this build step. Objects that are may be changed
* by performing the build are passed into this method, the other
* properties are passed via the various <code>init*</code> methods
* @param project
* @param session
* @param variant
* @param diff
* @param result
* @param resourceFilter
* @param monitor
* @throws Exception
* @return Either {@link #CONTINUE} or {@link #SKIP}. (The latter
* will only be used under very special circumstances.)
*/
int incrementalBuild(MoSyncProject project,
IBuildSession session, IBuildVariant variant,
IFileTreeDiff diff,
IBuildResult result,
IProgressMonitor monitor) throws Exception;
/**
* Returns the id of this build step
* @return
*/
String getId();
/**
* Returns the user-friendly name of this build step
* @return
*/
String getName();
/**
* Returns whether to build this step. This method will be
* called after all build steps prior to this one has been
* executed and before {@link IBuildStep#incrementalBuild(MoSyncProject, IBuildSession, IBuildState, IBuildVariant, IFileTreeDiff, IBuildResult, IFilter, IProgressMonitor)}
* is called.
* @param project
* @param session
* @param buildResult
* @return
*/
boolean shouldBuild(MoSyncProject project, IBuildSession session, IBuildResult buildResult);
/**
* Returns whether to add this build step at all for a certain session.
* @param session
* @return
*/
boolean shouldAdd(IBuildSession session);
/**
* Returns the set of build steps that this build step depends
* on.
* @return An array of <code>String</code>s containing
* the ids of the build steps that must be executed BEFORE this.
* This method may return <code>null</code>.
*/
String[] getDependees();
void initConsole(IProcessConsole console);
void initBuildProperties(IPropertyOwner buildProperties);
void initBuildState(IBuildState buildState);
void initPipeTool(PipeTool pipeTool);
void initDefaultLineHandler(ILineHandler linehandler);
void initDependencyProvider(IDependencyProvider<IResource> dependencyProvider);
void initResourceFilter(IFilter<IResource> resourceFilter);
void initParameterResolver(ParameterResolver resolver);
}