package org.erlide.builder;
import com.google.common.base.Objects;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.erlide.builder.BuilderHandler;
import org.erlide.builder.ILineParser;
import org.erlide.common.process.StreamListener;
import org.erlide.common.util.ErlLogger;
@SuppressWarnings("all")
public class BuilderExecutor {
private List<BuilderHandler<?>> handlers;
public BuilderExecutor() {
ArrayList<BuilderHandler<?>> _newArrayList = CollectionLiterals.<BuilderHandler<?>>newArrayList();
this.handlers = _newArrayList;
}
public void executeProcess(final List<String> cmdLine, final String workingDirectory, final IProgressMonitor monitor) {
boolean _or = false;
boolean _equals = Objects.equal(cmdLine, null);
if (_equals) {
_or = true;
} else {
boolean _equals_1 = Objects.equal(workingDirectory, null);
_or = _equals_1;
}
if (_or) {
return;
}
final ProcessBuilder builder = new ProcessBuilder(cmdLine);
File _file = new File(workingDirectory);
builder.directory(_file);
try {
final Process process = builder.start();
InputStream _inputStream = process.getInputStream();
final Procedure1<String> _function = new Procedure1<String>() {
@Override
public void apply(final String it) {
boolean _isCanceled = monitor.isCanceled();
if (_isCanceled) {
process.destroy();
throw new OperationCanceledException();
}
for (final BuilderHandler<?> handler : BuilderExecutor.this.handlers) {
handler.eval(it);
}
}
};
final StreamListener listener = new StreamListener(_inputStream, _function);
while (listener.isAlive()) {
try {
listener.join();
} catch (final Throwable _t) {
if (_t instanceof InterruptedException) {
final InterruptedException e = (InterruptedException)_t;
} else {
throw Exceptions.sneakyThrow(_t);
}
}
}
return;
} catch (final Throwable _t) {
if (_t instanceof IOException) {
final IOException e = (IOException)_t;
ErlLogger _instance = ErlLogger.getInstance();
_instance.error(e);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
}
private <T extends Object> BuilderHandler<T> registerHandler(final ILineParser<T> lineParser, final Procedure1<? super T> callback) {
final BuilderHandler<T> handler = new BuilderHandler<T>(lineParser, callback);
this.handlers.add(handler);
return handler;
}
private <T extends Object> boolean unregisterHandler(final BuilderHandler<T> handler) {
return this.handlers.remove(handler);
}
public <T extends Object> void withHandler(final ILineParser<T> lineParser, final Procedure1<? super T> callback, final Procedure1<? super BuilderExecutor> handlerCallback) {
final BuilderHandler<T> handler = this.<T>registerHandler(lineParser, callback);
try {
handlerCallback.apply(this);
} finally {
this.<T>unregisterHandler(handler);
}
}
}