package org.erlide.core.internal.builder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.erlide.core.ErlangCore;
import org.erlide.core.builder.BuildNotifier;
import org.erlide.core.builder.BuilderHelper;
import org.erlide.core.executor.ProgressCallback;
import org.erlide.core.executor.ToolExecutor;
import org.erlide.core.executor.ToolExecutor.ToolResults;
import org.erlide.engine.MarkerUtils;
import org.erlide.engine.model.builder.BuilderTool;
import org.erlide.engine.model.root.IErlProject;
import org.erlide.util.ErlLogger;
public abstract class ExternalBuilder extends ErlangBuilder {
protected static final boolean DEBUG = false;
protected final ToolExecutor ex;
protected final BuilderHelper helper = new BuilderHelper();
protected final BuilderTool info;
public ExternalBuilder(final BuilderTool info) {
this.info = info;
ex = new ToolExecutor();
}
public String getOsCommand(final IErlProject erlProject) {
return info.getOsCommand();
}
@Override
public IProject[] build(final BuildKind kind, final IErlProject erlProject,
final BuildNotifier notifier) throws CoreException {
final IProject project = erlProject.getWorkspaceProject();
ErlLogger.trace("build", "Start " + kind + " for " + project.getName() + ": "
+ getOsCommand(erlProject));
try {
MarkerUtils.removeProblemMarkersFor(project);
notifier.worked(1);
// TODO use project config!
// XXX how do we know what make uses?
final IResource ebin = project.findMember("ebin");
if (ebin == null) {
project.getFolder("ebin").create(true, true, null);
}
final ProgressCallback callback = new ProgressCallback() {
@Override
public void stdout(final String line) {
if (DEBUG) {
System.out.println("!!! " + line);
}
final IMessageParser parser = getMessageParser(erlProject);
parser.createMarkers(line);
}
@Override
public void stderr(final String line) {
if (DEBUG) {
System.out.println("??? " + line);
}
}
};
final ToolResults result = ex.run(getOsCommand(erlProject),
getCompileTarget(), project.getLocation().toPortableString(),
callback, notifier);
if (result == null || result.isCommandNotFound()) {
MarkerUtils.createProblemMarker(project, null,
"Builder command not found: " + getOsCommand(erlProject), 0,
IMarker.SEVERITY_ERROR);
} else {
final boolean noMarkersOnProject = project.findMarkers(IMarker.PROBLEM,
true, IResource.DEPTH_INFINITE).length == 0;
if (noMarkersOnProject && result.exit > 0) {
MarkerUtils.createProblemMarker(project, null,
"Builder error: " + getOsCommand(erlProject), 0,
IMarker.SEVERITY_ERROR);
}
}
notifier.worked(9);
ErlLogger.trace("build", "Done " + project.getName());
} catch (final Error e) {
e.printStackTrace();
throw new CoreException(
new Status(IStatus.ERROR, ErlangCore.PLUGIN_ID, "builder error", e));
}
notifier.done();
return null;
}
@Override
public void clean(final IErlProject erlProject, final BuildNotifier notifier) {
final IProject project = erlProject.getWorkspaceProject();
MarkerUtils.removeProblemMarkersFor(project);
notifier.worked(1);
if (getCleanTarget() == null) {
return;
}
final ProgressCallback callback = new ProgressCallback() {
@Override
public void stdout(final String line) {
final IMessageParser parser = getMessageParser(erlProject);
parser.createMarkers(line);
}
@Override
public void stderr(final String line) {
}
};
ex.run(getOsCommand(erlProject), getCleanTarget(),
project.getLocation().toPortableString(), callback, notifier);
notifier.worked(9);
}
protected IMessageParser getMessageParser(final IErlProject erlProject) {
return new ErlcMessageParser(erlProject.getWorkspaceProject());
}
protected String getCompileTarget() {
return "compile";
}
protected String getCleanTarget() {
return "clean";
}
}