package com.github.guikeller.jettyrunner.model;
import com.github.guikeller.jettyrunner.ui.JettyRunnerEditor;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configuration.EnvironmentVariablesComponent;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.LocatableConfigurationBase;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.configurations.RunProfileWithCompileBeforeLaunchOption;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizerUtil;
import com.intellij.openapi.util.WriteExternalException;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
/**
* Jetty Runner Configuration - UI Model
* @see com.intellij.execution.configurations.LocatableConfigurationBase
* @author Gui Keller
*/
public class JettyRunnerConfiguration extends LocatableConfigurationBase implements RunProfileWithCompileBeforeLaunchOption {
public static final String PREFIX = "JettyRunnerV112-";
public static final String WEBAPP_PATH_FIELD = PREFIX + "WebAppPath";
public static final String WEBAPP_FOLDER_FIELD = PREFIX + "WebAppFolder";
public static final String CLASSES_DIRECTORY_FIELD = PREFIX + "ClassesDirectory";
public static final String RUN_PORT_FIELD = PREFIX + "RunOnPort";
public static final String JETTY_XML_FIELD = PREFIX + "JettyXML";
public static final String VM_ARGS_FIELD = PREFIX + "VmArgs";
public static final String PASS_PARENT_ENV_VARS_FIELD = PREFIX + "PassParentEnvVars";
private String webappPaths;
private String webappFolders;
private String classesDirectories;
private String runningOnPort;
private String jettyXml;
private String vmArgs;
private Map<String, String> environmentVariables = new HashMap<String,String>(0);
private boolean passParentEnvironmentVariables = false;
private Project project;
public JettyRunnerConfiguration(Project project, ConfigurationFactory factory, String name) {
super(project, factory, name);
this.project = project;
}
@Override
@NotNull
public SettingsEditor<JettyRunnerConfiguration> getConfigurationEditor() {
// Instantiates a new UI (Conf Window)
return new JettyRunnerEditor(this);
}
@Override
@Nullable
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment executionEnvironment) throws ExecutionException {
// Runner Model
return new JettyRunnerCommandLine(executionEnvironment, this);
}
// Persistence of values in disk
@Override
public void readExternal(Element element) throws InvalidDataException {
super.readExternal(element);
// Reads the conf file into this class
this.webappPaths = JDOMExternalizerUtil.readField(element, WEBAPP_PATH_FIELD);
this.webappFolders = JDOMExternalizerUtil.readField(element, WEBAPP_FOLDER_FIELD);
this.classesDirectories = JDOMExternalizerUtil.readField(element, CLASSES_DIRECTORY_FIELD);
this.runningOnPort = JDOMExternalizerUtil.readField(element, RUN_PORT_FIELD);
this.jettyXml = JDOMExternalizerUtil.readField(element, JETTY_XML_FIELD);
this.vmArgs = JDOMExternalizerUtil.readField(element, VM_ARGS_FIELD);
String passParentEnvironmentVariablesValue = JDOMExternalizerUtil.readField(element, PASS_PARENT_ENV_VARS_FIELD);
this.passParentEnvironmentVariables = Boolean.valueOf(passParentEnvironmentVariablesValue);
EnvironmentVariablesComponent.readExternal(element, this.environmentVariables);
}
@Override
public void writeExternal(Element element) throws WriteExternalException {
super.writeExternal(element);
// Stores the values of this class into the parent
JDOMExternalizerUtil.writeField(element, WEBAPP_PATH_FIELD, this.getWebappPaths());
JDOMExternalizerUtil.writeField(element, WEBAPP_FOLDER_FIELD, this.getWebappFolders());
JDOMExternalizerUtil.writeField(element, CLASSES_DIRECTORY_FIELD, this.getClassesDirectories());
JDOMExternalizerUtil.writeField(element, RUN_PORT_FIELD, this.getRunningOnPort());
JDOMExternalizerUtil.writeField(element, JETTY_XML_FIELD, this.getJettyXml());
JDOMExternalizerUtil.writeField(element, VM_ARGS_FIELD, this.getVmArgs());
JDOMExternalizerUtil.writeField(element, PASS_PARENT_ENV_VARS_FIELD, ""+this.isPassParentEnvironmentVariables());
if(this.environmentVariables != null && !this.environmentVariables.isEmpty()){
EnvironmentVariablesComponent.writeExternal(element, this.getEnvironmentVariables());
}
}
@Override
@NotNull
public Module[] getModules() {
ModuleManager moduleManager = ModuleManager.getInstance(this.project);
return moduleManager.getModules();
}
// Getters and Setters
public String getWebappPaths() {
return webappPaths;
}
public void setWebappPaths(String webappPaths) {
this.webappPaths = webappPaths;
}
public String getWebappFolders() {
return webappFolders;
}
public void setWebappFolders(String webappFolders) {
this.webappFolders = webappFolders;
}
public String getClassesDirectories() {
return classesDirectories;
}
public void setClassesDirectories(String classesDirectories) {
this.classesDirectories = classesDirectories;
}
public String getRunningOnPort() {
return runningOnPort;
}
public void setRunningOnPort(String runningOnPort) {
this.runningOnPort = runningOnPort;
}
public String getJettyXml() {
return jettyXml;
}
public void setJettyXml(String jettyXml) {
this.jettyXml = jettyXml;
}
public String getVmArgs() {
return vmArgs;
}
public void setVmArgs(String vmArgs) {
this.vmArgs = vmArgs;
}
public Map<String, String> getEnvironmentVariables() {
return environmentVariables;
}
public void setEnvironmentVariables(Map<String, String> environmentVariables) {
this.environmentVariables = environmentVariables;
}
public boolean isPassParentEnvironmentVariables() {
return passParentEnvironmentVariables;
}
public void setPassParentEnvironmentVariables(boolean passParentEnvironmentVariables) {
this.passParentEnvironmentVariables = passParentEnvironmentVariables;
}
}