package ee.edio.garmin.runconfig; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.intellij.diagnostic.logging.LogConfigurationPanel; import com.intellij.execution.*; import com.intellij.execution.configuration.EnvironmentVariablesComponent; import com.intellij.execution.configurations.*; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.util.ProgramParametersUtil; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.SettingsEditorGroup; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; import com.intellij.util.xmlb.XmlSerializer; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class MonkeyModuleBasedConfiguration extends ModuleBasedConfiguration<MonkeyRunConfigurationModule> implements CommonProgramRunConfigurationParameters { private static final SkipDefaultValuesSerializationFilters SERIALIZATION_FILTERS = new SkipDefaultValuesSerializationFilters(); private MCModuleBasedConfigurationBean bean = new MCModuleBasedConfigurationBean(); private final Map<String, String> envs = new LinkedHashMap<>(); public MonkeyModuleBasedConfiguration(String name, @NotNull MonkeyRunConfigurationModule configurationModule, @NotNull ConfigurationFactory factory) { super(name, configurationModule, factory); } @Override public Collection<Module> getValidModules() { List<Module> allModules = Lists.newArrayList(ModuleManager.getInstance(getProject()).getModules()); return Collections2.filter(allModules, new Predicate<Module>() { @Override public boolean apply(@Nullable Module module) { return module != null && !module.isDisposed(); } }); } @NotNull @Override public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() { SettingsEditorGroup<MonkeyModuleBasedConfiguration> group = new SettingsEditorGroup<>(); group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), new MonkeySettingsEditor(getProject())); group.addEditor(ExecutionBundle.message("logs.tab.title"), new LogConfigurationPanel<MonkeyModuleBasedConfiguration>()); return group; } @Nullable @Override public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment environment) throws ExecutionException { return new MonkeyRunningState(environment); } @Override public void setProgramParameters(@Nullable String value) { bean.PROGRAM_PARAMETERS = value; } @Nullable @Override public String getProgramParameters() { return bean.PROGRAM_PARAMETERS; } @Override public void setWorkingDirectory(@Nullable String value) { bean.WORKING_DIRECTORY = ExternalizablePath.urlValue(value); } @Nullable @Override public String getWorkingDirectory() { return ExternalizablePath.localPathValue(bean.WORKING_DIRECTORY); } @Override public void setEnvs(@NotNull final Map<String, String> envs) { this.envs.clear(); this.envs.putAll(envs); } @NotNull @Override public Map<String, String> getEnvs() { return this.envs; } @Override public void setPassParentEnvs(boolean passParentEnvs) { bean.PASS_PARENT_ENVS = passParentEnvs; } @Override public boolean isPassParentEnvs() { return bean.PASS_PARENT_ENVS; } @Override public void checkConfiguration() throws RuntimeConfigurationException { final MonkeyRunConfigurationModule configurationModule = getConfigurationModule(); ProgramParametersUtil.checkWorkingDirectoryExist(this, getProject(), configurationModule.getModule()); } @Override public void readExternal(Element element) throws InvalidDataException { PathMacroManager.getInstance(getProject()).expandPaths(element); super.readExternal(element); XmlSerializer.deserializeInto(this.bean, element); EnvironmentVariablesComponent.readExternal(element, getEnvs()); readModule(element); } @Override public void writeExternal(Element element) throws WriteExternalException { super.writeExternal(element); XmlSerializer.serializeInto(this.bean, element, SERIALIZATION_FILTERS); EnvironmentVariablesComponent.writeExternal(element, getEnvs()); writeModule(element); } public String getTargetDeviceId() { return bean.TARGET_DEVICE_ID; } public void setTargetDeviceId(String targetDeviceId) { bean.TARGET_DEVICE_ID = targetDeviceId; } private static class MCModuleBasedConfigurationBean { public String PROGRAM_PARAMETERS = ""; public String WORKING_DIRECTORY = ""; public boolean PASS_PARENT_ENVS = true; public String TARGET_DEVICE_ID = ""; } }