package krasa.actions;
import krasa.model.*;
import com.intellij.execution.*;
import com.intellij.execution.application.*;
import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.execution.runners.*;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.*;
import com.intellij.openapi.project.*;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.*;
/**
* @author Vojtech Krasa
*/
public class RunAutotestInIntelliJ extends DumbAwareAction {
private static final Logger log = Logger.getInstance(RunAutotestInIntelliJ.class);
public void actionPerformed(AnActionEvent e) {
TestFile element = getTestFile(e);
AutotestState.getInstance().addTestFile(element);
execute(e, element);
}
protected void execute(AnActionEvent e, TestFile element) {
runInIDEA(e.getProject(), element);
}
private String getEnvironment() {
return AutotestState.getInstance().getLast();
}
protected TestFile getTestFile(AnActionEvent e) {
String name = PlatformDataKeys.VIRTUAL_FILE.getData(e.getDataContext()).getName();
return new TestFile(getEnvironment(), name, getTestFilePath(e), getTestFileFullPath(e));
}
public void runInIDEA(Project project, TestFile element) {
ApplicationConfiguration applicationConfiguration = getApplicationConfiguration(project, element);
try {
Executor runExecutorInstance = DefaultRunExecutor.getRunExecutorInstance();
final ProgramRunner runner = RunnerRegistry.getInstance().getRunner(DefaultRunExecutor.EXECUTOR_ID,
applicationConfiguration);
ExecutionEnvironmentBuilder executionEnvironmentBuilder = new ExecutionEnvironmentBuilder(project,
runExecutorInstance).runner(runner).runProfile(applicationConfiguration);
ExecutionEnvironment build = executionEnvironmentBuilder.build();
runner.execute(build);
// RunManagerEx.getInstanceEx(project).addConfiguration((RunnerAndConfigurationSettings)
// build.getConfigurationSettings(), true);
} catch (ExecutionException ex) {
Messages.showMessageDialog(project, "error", "error", Messages.getErrorIcon());
}
}
protected ApplicationConfiguration getApplicationConfiguration(Project project, TestFile testFile) {
ApplicationConfiguration ac = new ApplicationConfiguration(String.valueOf(testFile.getName()), project,
ApplicationConfigurationType.getInstance());
ac.setMainClassName("com.tmobile.utils.autotesting.control.MainIntellij");
ac.setWorkingDirectory(getWorkingDirectory(project, testFile));
ac.setVMParameters("-Dsystem.code=" + testFile.getEnviroment() + " -Dfile=" + testFile.getPath());
ac.setModule(getModule(project, testFile));
return ac;
}
protected String getWorkingDirectory(Project project, TestFile testFile) {
final String testFileFullPath = testFile.getFullPath();
if (testFileFullPath == null) {
// backward compatibility
VirtualFile baseDir = project.getBaseDir();
return baseDir.getPath() + "/tool/xmlbasedtests";
}
String workingDirectory = null;
if (testFileFullPath.contains("tool/xmlbasedtests")) {
workingDirectory = testFileFullPath.substring(0, testFileFullPath.indexOf("tool/xmlbasedtests")
+ "tool/xmlbasedtests".length());
}
return workingDirectory;
}
private Module getModule(Project project, TestFile element) {
final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
String fullPath = element.getFullPath();
if (fullPath == null) {
// backward compatibility
return ModuleManager.getInstance(project).getModules()[0];
}
VirtualFile fileByUrl = VirtualFileManager.getInstance().findFileByUrl("file://" + fullPath);
return projectFileIndex.getModuleForFile(fileByUrl);
}
private String getTestFilePath(AnActionEvent e) {
VirtualFile virtualFile = PlatformDataKeys.VIRTUAL_FILE.getData(e.getDataContext());
return AutotestUtils.getTestFileRelativePath(virtualFile);
}
private String getTestFileFullPath(AnActionEvent e) {
VirtualFile virtualFile = PlatformDataKeys.VIRTUAL_FILE.getData(e.getDataContext());
return AutotestUtils.getTestFileFullPath(virtualFile);
}
@Override
public void update(AnActionEvent e) {
super.update(e);
DataContext dataContext = e.getDataContext();
VirtualFile virtualFile = PlatformDataKeys.VIRTUAL_FILE.getData(dataContext);
boolean visible = false;
if (isTestScript(virtualFile)) {
visible = true;
}
e.getPresentation().setEnabled(visible);
e.getPresentation().setVisible(visible);
}
private boolean isTestScript(VirtualFile file) {
return isXml(file) && file.getPath().contains("tool/xmlbasedtests/testscripts");
}
private boolean isXml(VirtualFile file) {
if (file == null) {
return false;
}
return XmlFileType.INSTANCE.equals(file.getFileType());
}
}