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."); } }); } }