From 8c4025496b42c666682b54fa37349c39e935f264 Mon Sep 17 00:00:00 2001 From: Michael Golubev Date: Mon, 1 Dec 2014 22:43:29 +0100 Subject: [PATCH] CR-IC-6746 - workaround for SCL-7751 - Runner-specific data in application server run configurations deserialized incorrectly when scala plugin is enabled --- .../RunnerAndConfigurationSettingsImpl.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java index 885e12dcf4e9..00dba9124fe8 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.java @@ -23,6 +23,7 @@ import com.intellij.openapi.extensions.ExtensionException; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.jdom.Element; @@ -129,7 +130,7 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C for (Iterator iterator = element.getChildren(childTagName).iterator(); iterator.hasNext(); ) { Element state = iterator.next(); - ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(state.getAttributeValue(RUNNER_ID)); + ProgramRunner runner = findRunner(state.getAttributeValue(RUNNER_ID)); if (runner == null) { iterator.remove(); } @@ -137,6 +138,36 @@ public class RunnerAndConfigurationSettingsImpl implements JDOMExternalizable, C } } + private ProgramRunner findRunner(final String runnerId) { + List runnersById + = ContainerUtil.filter(RunnerRegistry.getInstance().getRegisteredRunners(), new Condition() { + + @Override + public boolean value(ProgramRunner runner) { + return Comparing.equal(runnerId, runner.getRunnerId()); + } + }); + + int runnersByIdCount = runnersById.size(); + if (runnersByIdCount == 0) { + return null; + } + else if (runnersByIdCount == 1) { + return ContainerUtil.getFirstItem(runnersById); + } + else { + LOG.error("More than one runner found for ID: " + runnerId); + for (final Executor executor : ExecutorRegistry.getInstance().getRegisteredExecutors()) { + for (ProgramRunner runner : runnersById) { + if (runner.canRun(executor.getId(), myConfiguration)) { + return runner; + } + } + } + return null; + } + } + public void getState(@NotNull Element element) throws WriteExternalException { List runnerSettings = new SmartList(); for (ProgramRunner runner : settings.keySet()) {