From 529b5533dff71663970d24258acd3a58b0f6b0c9 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Sat, 26 Jun 2010 20:10:48 +0400 Subject: [PATCH] WI-1124 Can`t create Run configuration for xsl files. --- .../intellij/execution/CantRunException.java | 0 .../configurations/SimpleJavaParameters.java | 23 +++++++++++ .../xpath/xslt/run/RunSettingsEditor.form | 2 +- .../xpath/xslt/run/XsltCommandLineState.java | 12 +++--- .../xpath/xslt/run/XsltRunConfiguration.java | 24 +++++++++++- .../xpath/xslt/run/XsltRunSettingsEditor.java | 3 ++ .../lang/xpath/xslt/run/XsltRunner.java | 39 +++++++++++++++++++ .../xpath/xslt/run/XsltRunnerExtension.java | 4 +- .../xpath/xpath-view/src/META-INF/plugin.xml | 1 + 9 files changed, 97 insertions(+), 11 deletions(-) rename {java/execution/openapi => platform/lang-api}/src/com/intellij/execution/CantRunException.java (100%) create mode 100644 plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunner.java diff --git a/java/execution/openapi/src/com/intellij/execution/CantRunException.java b/platform/lang-api/src/com/intellij/execution/CantRunException.java similarity index 100% rename from java/execution/openapi/src/com/intellij/execution/CantRunException.java rename to platform/lang-api/src/com/intellij/execution/CantRunException.java diff --git a/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java b/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java index 7e3b2962644b..0946e86544bd 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java @@ -16,6 +16,13 @@ package com.intellij.execution.configurations; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.process.OSProcessHandler; +import com.intellij.execution.process.ProcessTerminatedListener; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JdkUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.util.PathsList; @@ -71,4 +78,20 @@ public class SimpleJavaParameters extends SimpleProgramParameters { public void setCharset(final Charset charset) { myCharset = charset; } + + public OSProcessHandler createOSProcessHandler() throws ExecutionException { + final Sdk sdk = getJdk(); + assert sdk != null : "SDK should be defined"; + final GeneralCommandLine commandLine = JdkUtil.setupJVMCommandLine(((JavaSdkType)sdk.getSdkType()).getVMExecutablePath(sdk), this, + JdkUtil.useDynamicClasspath( + PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()))); + final OSProcessHandler processHandler = new OSProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString()) { + @Override + public Charset getCharset() { + return commandLine.getCharset(); + } + }; + ProcessTerminatedListener.attach(processHandler); + return processHandler; + } } diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/RunSettingsEditor.form b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/RunSettingsEditor.form index 376a80ddf339..8df8114f5fbc 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/RunSettingsEditor.form +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/RunSettingsEditor.form @@ -229,7 +229,7 @@ - + diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltCommandLineState.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltCommandLineState.java index 44cc15511824..6d2be4a0e386 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltCommandLineState.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltCommandLineState.java @@ -49,7 +49,7 @@ import java.util.List; import static org.intellij.lang.xpath.xslt.run.XsltRunConfiguration.isEmpty; -class XsltCommandLineState extends JavaCommandLineState { +class XsltCommandLineState extends CommandLineState { private static final Logger LOG = Logger.getInstance(XsltCommandLineState.class.getName()); public static final Key STATE = Key.create("STATE"); @@ -62,12 +62,12 @@ class XsltCommandLineState extends JavaCommandLineState { public XsltCommandLineState(XsltRunConfiguration xsltRunConfiguration, ExecutionEnvironment env) { super(env); myXsltRunConfiguration = xsltRunConfiguration; - final RunnerSettings settings = env.getRunnerSettings(); - myIsDebugger = settings != null && settings.getData() instanceof DebuggingRunnerData; + final ConfigurationPerRunnerSettings settings = env.getConfigurationSettings(); + myIsDebugger = settings != null && "Debug".equals(settings.getRunnerId()); } protected OSProcessHandler startProcess() throws ExecutionException { - final OSProcessHandler osProcessHandler = super.startProcess(); + final OSProcessHandler osProcessHandler = createJavaParameters().createOSProcessHandler(); osProcessHandler.putUserData(STATE, this); osProcessHandler.addProcessListener(new MyProcessAdapter()); @@ -79,13 +79,13 @@ class XsltCommandLineState extends JavaCommandLineState { return osProcessHandler; } - protected JavaParameters createJavaParameters() throws ExecutionException { + protected SimpleJavaParameters createJavaParameters() throws ExecutionException { final Sdk jdk = myXsltRunConfiguration.getEffectiveJDK(); if (jdk == null) { throw CantRunException.noJdkConfigured(); } - final JavaParameters parameters = new JavaParameters(); + final SimpleJavaParameters parameters = new SimpleJavaParameters(); parameters.setJdk(jdk); if (myXsltRunConfiguration.getJdkChoice() == XsltRunConfiguration.JdkChoice.FROM_MODULE) { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunConfiguration.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunConfiguration.java index c2d55aa28ee9..cf418924b5cd 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunConfiguration.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunConfiguration.java @@ -33,8 +33,8 @@ 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.projectRoots.ProjectJdkTable; -import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.project.ProjectBundle; +import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; @@ -47,6 +47,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; +import com.intellij.util.SystemProperties; import org.intellij.lang.xpath.xslt.XsltSupport; import org.intellij.lang.xpath.xslt.associations.FileAssociationsManager; import org.jdom.Element; @@ -439,8 +440,27 @@ public final class XsltRunConfiguration extends RunConfigurationBase implements myJdkChoice = jdkChoice; } + private static Sdk ourDefaultSdk; + + private static synchronized Sdk getDefaultSdk() { + if (ourDefaultSdk == null) { + final String jdkHome = SystemProperties.getJavaHome(); + final String versionName = ProjectBundle.message("sdk.java.name.template", SystemProperties.getJavaVersion()); + Sdk sdk = ProjectJdkTable.getInstance().createSdk(versionName, new SimpleJavaSdkType()); + SdkModificator modificator = sdk.getSdkModificator(); + modificator.setHomePath(jdkHome); + modificator.commitChanges(); + ourDefaultSdk = sdk; + } + + return ourDefaultSdk; + } + @Nullable public Sdk getEffectiveJDK() { + if (!XsltRunSettingsEditor.ALLOW_CHOOSING_SDK) { + return getDefaultSdk(); + } if (myJdkChoice == JdkChoice.JDK) { return myJdk != null ? ProjectJdkTable.getInstance().findJdk(myJdk) : null; } diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunSettingsEditor.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunSettingsEditor.java index 9abbdcc5a97c..cedccc39fee9 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunSettingsEditor.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunSettingsEditor.java @@ -64,6 +64,7 @@ import java.util.*; import java.util.List; class XsltRunSettingsEditor extends SettingsEditor { + static final boolean ALLOW_CHOOSING_SDK = !(StdFileTypes.JAVA instanceof PlainTextFileType); private final Project myProject; private Editor myEditor; @@ -124,6 +125,7 @@ class XsltRunSettingsEditor extends SettingsEditor { private ComboBox myModule; private ComboBox myJDK; private ComboBox myFileType; + private JPanel myClasspathAndJDKPanel; private final AnyXMLDescriptor myXmlDescriptor; private final FileChooserDescriptor myXsltDescriptor; @@ -228,6 +230,7 @@ class XsltRunSettingsEditor extends SettingsEditor { myShowInConsole.addItemListener(outputStateListener); myShowInStdout.addItemListener(outputStateListener); mySaveToFile.addItemListener(outputStateListener); + myClasspathAndJDKPanel.setVisible(ALLOW_CHOOSING_SDK); updateOutputState(); myFileType.setRenderer(new FileTypeRenderer() { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunner.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunner.java new file mode 100644 index 000000000000..2017cf5ca350 --- /dev/null +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunner.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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.lang.xpath.xslt.run; + +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.executors.DefaultRunExecutor; +import com.intellij.execution.runners.DefaultProgramRunner; +import org.jetbrains.annotations.NotNull; + +/** + * User: Maxim.Mossienko + * Date: 26.06.2010 + * Time: 19:59:57 + */ +public class XsltRunner extends DefaultProgramRunner { + @NotNull + public String getRunnerId() { + return "XsltProgramRunner"; + } + + public boolean canRun(@NotNull final String executorId, @NotNull final RunProfile profile) { + return DefaultRunExecutor.EXECUTOR_ID.equals(executorId) && + profile instanceof XsltRunConfiguration && + !XsltRunSettingsEditor.ALLOW_CHOOSING_SDK; // default java runner will run us when we have Java & can choose sdk + } +} diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunnerExtension.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunnerExtension.java index 5d85f19fd53e..fac3bdda80d5 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunnerExtension.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltRunnerExtension.java @@ -19,7 +19,7 @@ package org.intellij.lang.xpath.xslt.run; import com.intellij.diagnostic.logging.AdditionalTabComponent; import com.intellij.execution.CantRunException; import com.intellij.execution.configurations.AdditionalTabComponentManager; -import com.intellij.execution.configurations.JavaParameters; +import com.intellij.execution.configurations.SimpleJavaParameters; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.process.ProcessListener; import com.intellij.openapi.extensions.ExtensionPointName; @@ -47,7 +47,7 @@ public abstract class XsltRunnerExtension { */ public abstract boolean createTabs(Project project, AdditionalTabComponentManager manager, AdditionalTabComponent outputConsole, ProcessHandler process); - public abstract void patchParameters(JavaParameters parameters, XsltRunConfiguration xsltCommandLineState, UserDataHolder extensionData) throws CantRunException; + public abstract void patchParameters(SimpleJavaParameters parameters, XsltRunConfiguration xsltCommandLineState, UserDataHolder extensionData) throws CantRunException; protected abstract boolean supports(XsltRunConfiguration config, boolean debugger); diff --git a/plugins/xpath/xpath-view/src/META-INF/plugin.xml b/plugins/xpath/xpath-view/src/META-INF/plugin.xml index 1ea90b0b9cb0..f8d0cf860e6a 100644 --- a/plugins/xpath/xpath-view/src/META-INF/plugin.xml +++ b/plugins/xpath/xpath-view/src/META-INF/plugin.xml @@ -50,6 +50,7 @@ +