package org.jetbrains.plugins.cucumber.java.run;
import com.intellij.diagnostic.logging.LogConfigurationPanel;
import com.intellij.execution.*;
import com.intellij.execution.application.ApplicationConfiguration;
import com.intellij.execution.configurations.*;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil;
import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.util.JavaParametersUtil;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.options.SettingsEditorGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.cucumber.CucumberBundle;
import org.jetbrains.plugins.cucumber.java.CucumberJavaBundle;
import java.io.File;
public class CucumberJavaRunConfiguration extends ApplicationConfiguration {
private NullableComputable<String> glueInitializer = null;
public String myFilePath;
public String GLUE;
public String myNameFilter;
public String myGeneratedName;
protected CucumberJavaRunConfiguration(String name, Project project, ConfigurationFactory factory) {
super(name, project, factory);
}
@NotNull
@Override
public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() {
SettingsEditorGroup<CucumberJavaRunConfiguration> group = new SettingsEditorGroup<>();
group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), new CucumberJavaApplicationConfigurable(getProject()));
JavaRunConfigurationExtensionManager.getInstance().appendEditors(this, group);
group.addEditor(ExecutionBundle.message("logs.tab.title"), new LogConfigurationPanel<>());
return group;
}
@Override
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException {
return new JavaApplicationCommandLineState<CucumberJavaRunConfiguration>(CucumberJavaRunConfiguration.this, env) {
protected JavaParameters createJavaParameters() throws ExecutionException {
final JavaParameters params = new JavaParameters();
final JavaRunConfigurationModule module = getConfigurationModule();
final int classPathType = JavaParameters.JDK_AND_CLASSES_AND_TESTS;
final String jreHome = CucumberJavaRunConfiguration.this.ALTERNATIVE_JRE_PATH_ENABLED ? ALTERNATIVE_JRE_PATH : null;
JavaParametersUtil.configureModule(module, params, classPathType, jreHome);
JavaParametersUtil.configureConfiguration(params, CucumberJavaRunConfiguration.this);
String path = getSMRunnerPath();
params.getClassPath().add(path);
params.setMainClass(MAIN_CLASS_NAME);
for (RunConfigurationExtension ext : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) {
ext.updateJavaParameters(CucumberJavaRunConfiguration.this, params, getRunnerSettings());
}
final String glueValue = getGlue();
if (glueValue != null && !StringUtil.isEmpty(glueValue)) {
final String[] glues = glueValue.split(" ");
for (String glue : glues) {
if (!StringUtil.isEmpty(glue)) {
params.getProgramParametersList().addParametersString(" --glue " + glue);
}
}
}
File f = new File(myFilePath);
if (!f.isDirectory()) {
f = f.getParentFile();
}
params.getVMParametersList().addParametersString("-Dorg.jetbrains.run.directory=\"" + f.getAbsolutePath() + "\"");
params.getProgramParametersList().addParametersString("\"" + myFilePath + "\"");
return params;
}
@Nullable
private ConsoleView createConsole(@NotNull final Executor executor, ProcessHandler processHandler) throws ExecutionException {
// console view
final String testFrameworkName = "cucumber";
final CucumberJavaRunConfiguration runConfiguration = CucumberJavaRunConfiguration.this;
final SMTRunnerConsoleProperties consoleProperties = new SMTRunnerConsoleProperties(runConfiguration, testFrameworkName, executor);
return SMTestRunnerConnectionUtil.createAndAttachConsole(testFrameworkName, processHandler, consoleProperties);
}
@NotNull
@Override
public ExecutionResult execute(@NotNull Executor executor, @NotNull ProgramRunner runner) throws ExecutionException {
final ProcessHandler processHandler = startProcess();
final ConsoleView console = createConsole(executor, processHandler);
return new DefaultExecutionResult(console, processHandler, createActions(console, processHandler, executor));
}
};
}
private static String getSMRunnerPath() {
return PathUtil.getJarPathForClass(CucumberJvmSMFormatter.class);
}
@Override
public void checkConfiguration() throws RuntimeConfigurationException {
if (myFilePath == null) {
throw new RuntimeConfigurationException(CucumberBundle.message("cucumber.run.error.specify.file"));
} else if (!(new File(myFilePath)).exists()) {
throw new RuntimeConfigurationException(CucumberBundle.message("cucumber.run.error.file.doesnt.exist"));
}
else if (StringUtil.isEmpty(getGlue())) {
throw new RuntimeConfigurationException(CucumberJavaBundle.message("cucumber.java.run.configuration.glue.mustnt.be.empty"));
}
String programParameters = getProgramParameters();
if (programParameters != null && programParameters.contains("--glue")) {
throw new RuntimeConfigurationException(CucumberJavaBundle.message("cucumber.java.run.configuration.glue.in.program.parameters"));
}
super.checkConfiguration();
}
@Nullable
public String getGlue() {
if (glueInitializer != null) {
GLUE = glueInitializer.compute();
glueInitializer = null;
}
return GLUE;
}
public void setGlue(String value) {
GLUE = value;
glueInitializer = null;
}
public void setGlue(NullableComputable<String> value) {
glueInitializer = value;
}
public String getFilePath() {
return myFilePath;
}
public void setFilePath(String filePath) {
myFilePath = filePath;
}
public String getNameFilter() {
return myNameFilter;
}
public void setNameFilter(String nameFilter) {
myNameFilter = nameFilter;
}
@Nullable
@Override
public String suggestedName() {
return myGeneratedName;
}
@Override
public String getActionName() {
return getName();
}
}