package jetbrains.mps.execution.configurations.implementation.plugin.plugin;
/*Generated by MPS */
import com.intellij.openapi.project.Project;
import jetbrains.mps.baseLanguage.unitTest.execution.settings.JUnitSettings_Configuration;
import jetbrains.mps.debug.api.IDebuggerSettings;
import jetbrains.mps.baseLanguage.execution.api.JavaRunParameters1_Configuration;
import java.util.List;
import jetbrains.mps.baseLanguage.unitTest.execution.client.ITestNodeWrapper;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ExecutionException;
import jetbrains.mps.baseLanguage.unitTest.execution.client.RunCachesManager;
import jetbrains.mps.baseLanguage.unitTest.execution.client.JUnit_Command;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import jetbrains.mps.baseLanguage.execution.api.JavaRunParameters;
import jetbrains.mps.util.test.CachesUtil;
import com.intellij.util.ui.UIUtil;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.ui.MessageType;
public class JUnitExecutor implements Executor {
private final Project myProject;
private final com.intellij.execution.Executor myExecutor;
private final JUnitSettings_Configuration myJUnitSettings;
private final IDebuggerSettings myDebuggerSettings;
private final JavaRunParameters1_Configuration myJavaRunParameters;
private final List<ITestNodeWrapper> myTestNodes;
public JUnitExecutor(Project project, com.intellij.execution.Executor executor, JUnitSettings_Configuration jUnitSettings, IDebuggerSettings debuggerSettings, JavaRunParameters1_Configuration javaRunParameters, List<ITestNodeWrapper> testNodes) {
myProject = project;
myExecutor = executor;
myJUnitSettings = jUnitSettings;
myDebuggerSettings = debuggerSettings;
myJavaRunParameters = javaRunParameters;
myTestNodes = testNodes;
}
@Override
public ProcessHandler execute() throws ExecutionException {
final String dirCachesPath = myJUnitSettings.getCachesPath();
final boolean dirLock = RunCachesManager.acquireLock(dirCachesPath);
ProcessHandler commandProcess = new JUnit_Command().setDebuggerSettings_String(myDebuggerSettings.getCommandLine(true)).createProcess(myTestNodes, this.prepareJavaParamsForTests(dirLock, dirCachesPath));
commandProcess.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(ProcessEvent p0) {
if (dirLock) {
RunCachesManager.releaseLock(dirCachesPath);
}
}
});
return commandProcess;
}
public JavaRunParameters prepareJavaParamsForTests(boolean dirLock, String cachesDir) {
JavaRunParameters1_Configuration javaRunParams = myJavaRunParameters;
JavaRunParameters parameters = javaRunParams.getJavaRunParameters().clone();
String vmFromJava = javaRunParams.getJavaRunParameters().getVmOptions();
if (vmFromJava == null) {
vmFromJava = "";
}
String runIdString;
boolean cachesReused = myJUnitSettings.getReuseCaches();
if (cachesReused) {
if (dirLock) {
runIdString = "-D" + CachesUtil.REUSE_CACHES_DIR + "=\"" + cachesDir + "\"";
} else {
// could not acquire the lock, but user wants to reuse caches
runIdString = "";
showWarning();
}
} else {
if (dirLock) {
runIdString = "-D" + CachesUtil.SAVE_CACHES_DIR + "=\"" + cachesDir + "\"";
} else {
// could not acquire the lock
runIdString = "";
}
}
parameters.setVmOptions(vmFromJava + " " + runIdString);
return parameters;
}
private void showWarning() {
UIUtil.invokeLaterIfNeeded(new Runnable() {
public void run() {
ToolWindowManager.getInstance(myProject).notifyByBalloon(myExecutor.getId(), MessageType.WARNING, "Cannot reuse caches, because the chosen directory is locked by another run.\nThe option will be turned off.");
}
});
}
}