package jetbrains.mps.tool.builder.make;
/*Generated by MPS */
import jetbrains.mps.make.service.AbstractMakeService;
import jetbrains.mps.make.IMakeService;
import java.util.concurrent.Future;
import jetbrains.mps.make.script.IResult;
import jetbrains.mps.make.MakeSession;
import jetbrains.mps.make.resources.IResource;
import jetbrains.mps.make.script.IScript;
import jetbrains.mps.make.script.IScriptController;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import jetbrains.mps.progress.EmptyProgressMonitor;
import jetbrains.mps.make.IMakeNotificationListener;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.messages.Message;
import jetbrains.mps.messages.MessageKind;
import jetbrains.mps.internal.make.runtime.util.FutureValue;
import jetbrains.mps.make.dependencies.MakeSequence;
import jetbrains.mps.make.service.CoreMakeTask;
import jetbrains.mps.make.script.ScriptBuilder;
import jetbrains.mps.make.facet.IFacet;
import jetbrains.mps.make.facet.ITarget;
public class BuildMakeService extends AbstractMakeService implements IMakeService {
public BuildMakeService() {
}
@Override
public Future<IResult> make(MakeSession session, Iterable<? extends IResource> resources, IScript script, IScriptController controller, @NotNull ProgressMonitor monitor) {
return doMake(session, resources, script, controller, monitor);
}
@Override
public Future<IResult> make(MakeSession session, Iterable<? extends IResource> resources) {
return make(session, resources, defaultMakeScript(), null, new EmptyProgressMonitor());
}
@Override
public boolean isSessionActive() {
return false;
}
@Override
public boolean openNewSession(MakeSession session) {
return false;
}
@Override
public void closeSession(MakeSession session) {
}
@Override
public void addListener(IMakeNotificationListener listener) {
throw new UnsupportedOperationException();
}
@Override
public void removeListener(IMakeNotificationListener listener) {
throw new UnsupportedOperationException();
}
private Future<IResult> doMake(MakeSession makeSession, Iterable<? extends IResource> inputRes, IScript defaultScript, IScriptController controller, @NotNull ProgressMonitor monitor) {
String scrName = "Build";
if (Sequence.fromIterable(inputRes).isEmpty()) {
String msg = scrName + " aborted: nothing to do";
makeSession.getMessageHandler().handle(new Message(MessageKind.ERROR, msg));
return new FutureValue<IResult>(new IResult.FAILURE(null));
}
MakeSequence makeSeq = new MakeSequence(inputRes, defaultScript, makeSession);
IScriptController ctl = this.completeController(makeSession, controller);
CoreMakeTask task = new CoreMakeTask(scrName, makeSeq, ctl, makeSession.getMessageHandler());
task.run(monitor);
return new FutureValue<IResult>(task.getResult());
}
private IScriptController completeController(MakeSession msess, final IScriptController ctl) {
// Assume if client supplied IScriptController, he knows what he's doing and bears full responsibility
// to supply correct IConfigMonitor and IJobMonitor instances
if (ctl != null) {
return ctl;
}
// Although there's knowledge about default make targets (see #defaultMakeScript(), below),
// I don't want IMakeService to configure any target here explicitly. It's up to caller to configure
// actual targets (yes, they are not necessarily the same as in default script) with desired values, not
// service's to guess defaults. Id rather fail and see which targets were not configured.
return new IScriptController.Stub2(msess);
}
public static IScript defaultMakeScript() {
return new ScriptBuilder().withFacetNames(new IFacet.Name("jetbrains.mps.lang.resources.Binaries"), new IFacet.Name("jetbrains.mps.lang.core.Generate"), new IFacet.Name("jetbrains.mps.lang.core.TextGen"), new IFacet.Name("jetbrains.mps.make.facets.JavaCompile"), new IFacet.Name("jetbrains.mps.make.facets.Make")).withFinalTarget(new ITarget.Name("jetbrains.mps.make.facets.Make.make")).toScript();
}
}