/* * Copyright 2013-2017 Grzegorz Ligas <ligasgr@gmail.com> and other contributors * (see the CONTRIBUTORS file). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.intellij.xquery.runner.state.run; import com.intellij.diagnostic.logging.LogConfigurationPanel; import com.intellij.execution.CommonProgramRunConfigurationParameters; import com.intellij.execution.ExecutionException; import com.intellij.execution.Executor; import com.intellij.execution.ExternalizablePath; import com.intellij.execution.configuration.EnvironmentVariablesComponent; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.RunConfigurationWithSuppressedDefaultDebugAction; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.runners.ExecutionEnvironment; 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 org.intellij.xquery.runner.XQueryRunConfigurationType; import org.intellij.xquery.runner.XQueryRunProfileState; import org.intellij.xquery.runner.rt.XQueryDataSourceType; import org.intellij.xquery.runner.state.datasources.XQueryDataSourceConfiguration; import org.intellij.xquery.runner.state.datasources.XQueryDataSourcesSettings; import org.intellij.xquery.runner.ui.run.RunConfigurationJavaTab; import org.intellij.xquery.runner.ui.run.main.RunConfigurationMainTab; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; public class XQueryRunConfiguration extends ModuleBasedConfiguration<XQueryRunConfigurationModule> implements CommonProgramRunConfigurationParameters, RunConfigurationWithSuppressedDefaultDebugAction { public static final String RUNNER_CLASS = "org.intellij.xquery.runner.rt.XQueryRunnerApp"; private final VariablesValidator variablesValidator; private final DataSourceValidator dataSourceValidator; private final AlternativeJreValidator alternativeJreValidator; private final ModuleValidator moduleValidator; private ContextItemValidator contextItemValidator; private String mainFileName; private String vmParameters; private String programParameters; private String workingDirectory; private boolean alternativeJrePathEnabled; private String alternativeJrePath; private Map<String, String> myEnvs = new LinkedHashMap<String, String>(); private boolean passParentEnvs = true; private XQueryRunVariables variables; private boolean contextItemEnabled; private boolean contextItemFromEditorEnabled = true; private String contextItemText; private String contextItemFile; private String dataSourceName; private String contextItemType; private XmlConfigurationAccessor xmlConfigurationAccessor; private VariablesAccessor variablesAccessor; public XQueryRunConfiguration(String name, XQueryRunConfigurationModule configurationModule, ConfigurationFactory factory) { this(name, configurationModule, factory, new VariablesValidator(), new ContextItemValidator(), new DataSourceValidator(), new AlternativeJreValidator(), new ModuleValidator(), new XmlConfigurationAccessor(), new VariablesAccessor()); setWorkingDirectory(getProject().getBasePath()); } public XQueryRunConfiguration(String name, XQueryRunConfigurationModule configurationModule, ConfigurationFactory factory, VariablesValidator variablesValidator, ContextItemValidator contextItemValidator, DataSourceValidator dataSourceValidator, AlternativeJreValidator alternativeJreValidator, ModuleValidator moduleValidator, XmlConfigurationAccessor xmlConfigurationAccessor, VariablesAccessor variablesAccessor) { super(name, configurationModule, factory); this.variablesValidator = variablesValidator; this.contextItemValidator = contextItemValidator; this.dataSourceValidator = dataSourceValidator; this.alternativeJreValidator = alternativeJreValidator; this.moduleValidator = moduleValidator; this.xmlConfigurationAccessor = xmlConfigurationAccessor; this.variablesAccessor = variablesAccessor; setWorkingDirectory(getProject().getBasePath()); } @Override public Collection<Module> getValidModules() { Module[] modules = ModuleManager.getInstance(getProject()).getModules(); return Arrays.asList(modules); } @Override public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() { SettingsEditorGroup<XQueryRunConfiguration> group = new SettingsEditorGroup<XQueryRunConfiguration>(); group.addEditor("Configuration", new RunConfigurationMainTab(getProject())); group.addEditor("Java Configuration", new RunConfigurationJavaTab(getProject())); group.addEditor("Logs", new LogConfigurationPanel<XQueryRunConfiguration>()); return group; } @Nullable @Override public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { XQueryRunProfileState state = new XQueryRunProfileState(env, (XQueryRunConfiguration) env .getRunnerAndConfigurationSettings().getConfiguration()); XQueryRunConfigurationModule module = getConfigurationModule(); state.setConsoleBuilder(TextConsoleBuilderFactory.getInstance().createBuilder(getProject(), module.getSearchScope())); return state; } @Override public void checkConfiguration() throws RuntimeConfigurationException { alternativeJreValidator.validate(this); moduleValidator.validate(this); variablesValidator.validate(variables); contextItemValidator.validate(contextItemEnabled, contextItemType, contextItemFromEditorEnabled, contextItemText, contextItemType); dataSourceValidator.validate(dataSourceName); } public void readExternal(final Element element) throws InvalidDataException { PathMacroManager.getInstance(getProject()).expandPaths(element); super.readExternal(element); xmlConfigurationAccessor.readConfiguration(element, this); readModule(element); EnvironmentVariablesComponent.readExternal(element, getEnvs()); variablesAccessor.readVariables(element, this); } public void writeExternal(final Element element) throws WriteExternalException { super.writeExternal(element); xmlConfigurationAccessor.writeConfiguration(this, element); writeModule(element); EnvironmentVariablesComponent.writeExternal(element, getEnvs()); PathMacroManager.getInstance(getProject()).collapsePathsRecursively(element); variablesAccessor.writeVariables(this, element); } @Override protected ModuleBasedConfiguration createInstance() { return new XQueryRunConfiguration(getName(), new XQueryRunConfigurationModule(getProject()), XQueryRunConfigurationType.getInstance().getConfigurationFactories()[0]); } public XQueryRunVariables getVariables() { return variables; } public void setVariables(XQueryRunVariables variables) { this.variables = variables; } public String getMainFileName() { return mainFileName; } public void setMainFileName(String mainFileName) { this.mainFileName = mainFileName; } public boolean isContextItemEnabled() { return contextItemEnabled; } public void setContextItemEnabled(boolean contextItemEnabled) { this.contextItemEnabled = contextItemEnabled; } public boolean isContextItemFromEditorEnabled() { return contextItemFromEditorEnabled; } public void setContextItemFromEditorEnabled(boolean contextItemFromEditorEnabled) { this.contextItemFromEditorEnabled = contextItemFromEditorEnabled; } public String getContextItemText() { return contextItemText; } public void setContextItemText(String contextItemText) { this.contextItemText = contextItemText; } public String getContextItemFile() { return contextItemFile; } public void setContextItemFile(String contextItemFile) { this.contextItemFile = contextItemFile; } public String getDataSourceName() { return dataSourceName; } public void setDataSourceName(String dataSourceName) { this.dataSourceName = dataSourceName; } public String getContextItemType() { return contextItemType; } public void setContextItemType(String contextItemType) { this.contextItemType = contextItemType; } public String getRawWorkingDirectory() { return workingDirectory; } public void setRawWorkingDirectory(String workingDirectory) { this.workingDirectory = workingDirectory; } public String getVMParameters() { return vmParameters; } public void setVMParameters(String vmParameters) { this.vmParameters = vmParameters; } public boolean isAlternativeJrePathEnabled() { return alternativeJrePathEnabled; } public void setAlternativeJrePathEnabled(boolean enabled) { alternativeJrePathEnabled = enabled; } public String getAlternativeJrePath() { return alternativeJrePath; } public void setAlternativeJrePath(String path) { alternativeJrePath = path; } @Nullable public String getRunClass() { return RUNNER_CLASS; } @Nullable public String getPackage() { return null; } @Nullable @Override public String getProgramParameters() { return programParameters; } @Override public void setProgramParameters(@Nullable String value) { programParameters = value; } @Nullable @Override public String getWorkingDirectory() { return ExternalizablePath.localPathValue(workingDirectory); } @Override public void setWorkingDirectory(@Nullable String value) { workingDirectory = ExternalizablePath.urlValue(value); } @NotNull public Map<String, String> getEnvs() { return myEnvs; } public void setEnvs(@NotNull final Map<String, String> envs) { myEnvs.clear(); myEnvs.putAll(envs); } public boolean isPassParentEnvs() { return passParentEnvs; } public void setPassParentEnvs(boolean passParentEnvs) { this.passParentEnvs = passParentEnvs; } public XQueryDataSourceType getDataSourceType() { if (dataSourceName != null) { XQueryDataSourceConfiguration dataSourceConfiguration = getDataSourcesSettings() .getDataSourceConfigurationForName(dataSourceName); return dataSourceConfiguration.TYPE; } else { return null; } } protected XQueryDataSourcesSettings getDataSourcesSettings() { return XQueryDataSourcesSettings.getInstance(); } }