diff --git a/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java b/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java index 875aa50cd666..44299a432075 100644 --- a/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java +++ b/java/execution/impl/src/com/intellij/execution/RunConfigurationExtension.java @@ -25,24 +25,32 @@ package com.intellij.execution; import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.configurations.RunnerSettings; +import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.execution.process.OSProcessHandler; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.SettingsEditorGroup; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.WriteExternalException; import com.intellij.ui.LayeredIcon; -import org.jetbrains.annotations.Nullable; +import org.jdom.Content; import org.jdom.Element; +import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.ArrayList; +import java.util.List; public abstract class RunConfigurationExtension { public static final ExtensionPointName EP_NAME = new ExtensionPointName("com.intellij.runConfigurationExtension"); + public static final Key RUN_EXTENSIONS = Key.create("run.extension.elemnts"); public abstract void handleStartProcess(final ModuleBasedConfiguration configuration, final OSProcessHandler handler); public abstract SettingsEditor createEditor(T configuration); public abstract String getEditorTitle(); + public abstract String getName(); @Nullable public abstract Icon getIcon(T runConfiguration); @@ -67,15 +75,68 @@ public abstract class RunConfigurationExtension { public abstract void updateJavaParameters(final T configuration, final JavaParameters params, RunnerSettings runnerSettings); - public abstract void readExternal(ModuleBasedConfiguration runConfiguration, Element element) throws InvalidDataException; + protected abstract void readExternal(ModuleBasedConfiguration runConfiguration, Element element) throws InvalidDataException; - public abstract void writeExternal(ModuleBasedConfiguration runConfiguration, Element element) throws WriteExternalException; + public static void readSettings(ModuleBasedConfiguration runConfiguration, Element parentNode) throws InvalidDataException { + List children = parentNode.getChildren("extension"); + boolean found = true; + ext: for (Object o : children) { + final Element element = (Element)o; + final String extensionName = element.getAttributeValue("name"); + for (RunConfigurationExtension extension : Extensions.getExtensions(EP_NAME)) { + if (Comparing.strEqual(extensionName, extension.getName())) { + extension.readExternal(runConfiguration, element); + continue ext; + } + } + found = false; + } + if (!found) { + runConfiguration.putCopyableUserData(RUN_EXTENSIONS, children); + } + } + + public static void writeSettings(ModuleBasedConfiguration runConfiguration, Element element) throws WriteExternalException { + for (RunConfigurationExtension extension : Extensions.getExtensions(EP_NAME)) { + Element el = new Element("extension"); + el.setAttribute("name", extension.getName()); + extension.writeExternal(runConfiguration, el); + element.addContent(el); + } + List elements = runConfiguration.getCopyableUserData(RUN_EXTENSIONS); + if (elements != null && !elements.isEmpty()) { + final List foundNames = new ArrayList(); + final List children = element.getChildren("extension"); + for (Object o : children) { + foundNames.add(((Element)o).getAttributeValue("name")); + } + + int idx = children.isEmpty() ? element.getContentSize() : element.indexOf((Content)children.get(0)); + for (Element el : elements) { + final String name = el.getAttributeValue("name"); + int i = foundNames.indexOf(name); + if (i == -1) { + element.addContent(idx, (Content)el.clone()); + } + idx ++; + } + } + } + + protected abstract void writeExternal(ModuleBasedConfiguration runConfiguration, Element element) throws WriteExternalException; public abstract void patchConfiguration(T runJavaConfiguration); + public abstract void checkConfiguration(T runJavaConfiguration) throws RuntimeConfigurationException; public static void patchCreatedConfiguration(T configuration) { for (RunConfigurationExtension extension : Extensions.getExtensions(EP_NAME)) { extension.patchConfiguration(configuration); } } + + public static void checkConfigurationIsValid(T configuration) throws RuntimeConfigurationException { + for (RunConfigurationExtension extension : Extensions.getExtensions(EP_NAME)) { + extension.checkConfiguration(configuration); + } + } } \ No newline at end of file diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java index 840e62243b7c..65f73f40ca9e 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java @@ -125,6 +125,8 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration getValidModules() { @@ -211,9 +211,7 @@ public class JUnitConfiguration extends ModuleBasedConfiguration implements RunJavaConfiguration, RefactoringListenerProvider { //private TestNGResultsContainer resultsContainer; @@ -260,6 +259,7 @@ public class TestNGConfiguration extends ModuleBasedConfiguration Icon getIcon(T runConfiguration) { return null; //To change body of implemented methods use File | Settings | File Templates. @@ -130,4 +135,10 @@ public class SnapShooterConfigurationExtension extends RunConfigurationExtension @Override public void patchConfiguration(T runJavaConfiguration) { } + + @Override + public void checkConfiguration(T runJavaConfiguration) + throws RuntimeConfigurationException { + + } } \ No newline at end of file