package org.erlide.core.internal.builder; import java.util.Map; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.erlide.core.builder.BuildNotifier; import org.erlide.engine.ErlangEngine; import org.erlide.engine.MarkerUtils; import org.erlide.engine.model.builder.BuilderTool; import org.erlide.engine.model.root.IErlProject; import org.erlide.engine.model.root.ProjectConfigType; import org.erlide.util.ErlLogger; public class ErlangEclipseBuilder extends IncrementalProjectBuilder { @Override public IProject[] build(final int kind, final Map<String, String> args, final IProgressMonitor monitor) throws CoreException { final IProject project = getProject(); if (project == null || !project.isAccessible()) { return null; } final IErlProject erlProject = ErlangEngine.getInstance().getModel() .getErlangProject(project); final ProjectConfigType config = erlProject.getConfigType(); final BuilderTool tool = erlProject.getBuilderProperties().getBuilderTool(); if (!validateBuildConfiguration(erlProject)) { ErlLogger.warn("Builder tool and config mismatch: " + tool + " " + config); monitor.setCanceled(true); } final ErlangBuilder builder = ErlangBuilderFactory.get(tool); if (builder != null) { final BuildNotifier notifier = new BuildNotifier(monitor, project); if (builder instanceof InternalBuilder) { // temporary hack; rebar builder will not need this ((InternalBuilder) builder).setDelta(getDelta(project)); } builder.build(ErlangBuilder.BuildKind.get(kind), erlProject, notifier); } return null; } private boolean validateBuildConfiguration(final IErlProject erlProject) { final ProjectConfigType config = erlProject.getConfigType(); final BuilderTool tool = erlProject.getBuilderProperties().getBuilderTool(); if (!config.matchesTool(tool)) { final String msg = String.format( "Project's builder tool %s and configuration %s don't match", tool, config); MarkerUtils.createProblemMarker(erlProject.getWorkspaceProject(), null, msg, 0, IMarker.SEVERITY_WARNING); return false; } return true; } }