diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/execution/ExternalSystemTaskExecutionSettings.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/execution/ExternalSystemTaskExecutionSettings.java index 8fc4a41c16fd..4f1da98ad976 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/execution/ExternalSystemTaskExecutionSettings.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/execution/ExternalSystemTaskExecutionSettings.java @@ -6,22 +6,20 @@ import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.xmlb.annotations.Tag; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Keeps external system task execution parameters. Basically, this is a model class which holds data represented when * a user opens run configuration editor for corresponding external system. - * - * @author Denis Zhdanov - * @since 24.05.13 12:20 */ @Tag("ExternalSystemSettings") public class ExternalSystemTaskExecutionSettings implements Cloneable { @@ -29,21 +27,28 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { @NotNull @NonNls public static final String TAG_NAME = "ExternalSystemSettings"; @NotNull @NonNls public static final Key JVM_AGENT_SETUP_KEY = Key.create("jvmAgentSetup"); - private List myTaskNames = ContainerUtilRt.newArrayList(); - private List myTaskDescriptions = ContainerUtilRt.newArrayList(); + @NotNull + private List myTaskNames = Collections.emptyList(); + @NotNull + private List myTaskDescriptions = Collections.emptyList(); @Nullable private String myExecutionName; private String myExternalSystemIdString; private String myExternalProjectPath; private String myVmOptions; private String myScriptParameters; - private Map myEnv = ContainerUtilRt.newHashMap(); + @NotNull + private Map myEnv = Collections.emptyMap(); private boolean myPassParentEnvs = true; public ExternalSystemTaskExecutionSettings() { } private ExternalSystemTaskExecutionSettings(@NotNull ExternalSystemTaskExecutionSettings source) { + setFrom(source); + } + + public void setFrom(@NotNull ExternalSystemTaskExecutionSettings source) { myExecutionName = source.myExecutionName; myExternalSystemIdString = source.myExternalSystemIdString; myExternalProjectPath = source.myExternalProjectPath; @@ -53,7 +58,7 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { myTaskNames = ContainerUtil.copyList(source.myTaskNames); myTaskDescriptions = ContainerUtil.copyList(source.myTaskDescriptions); - myEnv = source.myEnv == null ? null : new THashMap<>(source.myEnv); + myEnv = source.myEnv.isEmpty() ? Collections.emptyMap() : new THashMap<>(source.myEnv); myPassParentEnvs = source.myPassParentEnvs; } @@ -102,19 +107,21 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { myScriptParameters = scriptParameters; } + @NotNull public List getTaskNames() { return myTaskNames; } - public void setTaskNames(List taskNames) { + public void setTaskNames(@NotNull List taskNames) { myTaskNames = taskNames; } + @NotNull public List getTaskDescriptions() { return myTaskDescriptions; } - public void setTaskDescriptions(List taskDescriptions) { + public void setTaskDescriptions(@NotNull List taskDescriptions) { myTaskDescriptions = taskDescriptions; } @@ -123,8 +130,8 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { return myEnv; } - public void setEnv(Map env) { - myEnv = env == null ? ContainerUtilRt.newHashMap() : env; + public void setEnv(@NotNull Map value) { + myEnv = value; } public boolean isPassParentEnvs() { @@ -135,6 +142,7 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { myPassParentEnvs = passParentEnvs; } + @SuppressWarnings("MethodDoesntCallSuperMethod") @Override public ExternalSystemTaskExecutionSettings clone() { return new ExternalSystemTaskExecutionSettings(this); @@ -142,13 +150,13 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { @Override public int hashCode() { - int result = myTaskNames != null ? myTaskNames.hashCode() : 0; + int result = myTaskNames.hashCode(); result = 31 * result + (myExecutionName != null ? myExecutionName.hashCode() : 0); result = 31 * result + (myExternalSystemIdString != null ? myExternalSystemIdString.hashCode() : 0); result = 31 * result + (myExternalProjectPath != null ? myExternalProjectPath.hashCode() : 0); result = 31 * result + (myVmOptions != null ? myVmOptions.hashCode() : 0); result = 31 * result + (myScriptParameters != null ? myScriptParameters.hashCode() : 0); - result = 31 * result + (myEnv != null ? myEnv.hashCode() : 0); + result = 31 * result + myEnv.hashCode(); result = 31 * result + (myPassParentEnvs ? 1 : 0); return result; } @@ -160,33 +168,29 @@ public class ExternalSystemTaskExecutionSettings implements Cloneable { ExternalSystemTaskExecutionSettings settings = (ExternalSystemTaskExecutionSettings)o; - if (myExecutionName != null ? !myExecutionName.equals(settings.myExecutionName) : settings.myExecutionName != null) { + if (!Objects.equals(myExecutionName, settings.myExecutionName)) { return false; } - if (myExternalProjectPath != null - ? !myExternalProjectPath.equals(settings.myExternalProjectPath) - : settings.myExternalProjectPath != null) + if (!Objects.equals(myExternalProjectPath, settings.myExternalProjectPath)) { return false; } - if (myExternalSystemIdString != null - ? !myExternalSystemIdString.equals(settings.myExternalSystemIdString) - : settings.myExternalSystemIdString != null) + if (!Objects.equals(myExternalSystemIdString, settings.myExternalSystemIdString)) { return false; } - if (myTaskNames != null ? !myTaskNames.equals(settings.myTaskNames) : settings.myTaskNames != null) return false; + if (!Objects.equals(myTaskNames, settings.myTaskNames)) return false; if (StringUtil.isEmpty(myVmOptions) ^ StringUtil.isEmpty(settings.myVmOptions)) return false; if (StringUtil.isEmpty(myScriptParameters) ^ StringUtil.isEmpty(settings.myScriptParameters)) return false; - if (myEnv != null ? !myEnv.equals(settings.myEnv) : settings.myEnv != null) return false; + if (!Objects.equals(myEnv, settings.myEnv)) return false; if (myPassParentEnvs != settings.myPassParentEnvs) return false; return true; } @Override public String toString() { - return (myTaskNames == null ? "" : StringUtil.join(myTaskNames, " ")) + + return StringUtil.join(myTaskNames, " ") + (StringUtil.isEmpty(myScriptParameters) ? "" : " " + myScriptParameters) + (StringUtil.isEmpty(myVmOptions) ? "" : " " + myVmOptions); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskSettingsControl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskSettingsControl.java index 60f5565363d3..b8635e20248b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskSettingsControl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemTaskSettingsControl.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2013 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.externalSystem.service.execution; import com.intellij.execution.configuration.EnvironmentVariablesComponent; @@ -33,12 +19,13 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.EditorTextField; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.components.JBLabel; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.GridBag; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.Collections; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.normalizePath; @@ -146,8 +133,7 @@ public class ExternalSystemTaskSettingsControl implements ExternalSystemSettings myTasksTextField.setText(StringUtil.join(myOriginalSettings.getTaskNames(), " ")); myVmOptionsEditor.setText(myOriginalSettings.getVmOptions()); myArgumentsEditor.setText(myOriginalSettings.getScriptParameters()); - myEnvVariablesComponent.setEnvData( - EnvironmentVariablesData.create(myOriginalSettings.getEnv(), myOriginalSettings.isPassParentEnvs())); + myEnvVariablesComponent.setEnvData(EnvironmentVariablesData.create(myOriginalSettings.getEnv(), myOriginalSettings.isPassParentEnvs())); } @Override @@ -177,7 +163,7 @@ public class ExternalSystemTaskSettingsControl implements ExternalSystemSettings settings.setVmOptions(myVmOptionsEditor.getText()); settings.setScriptParameters(myArgumentsEditor.getText()); settings.setPassParentEnvs(myEnvVariablesComponent.isPassParentEnvs()); - settings.setEnv(ContainerUtil.newHashMap(myEnvVariablesComponent.getEnvs())); + settings.setEnv(myEnvVariablesComponent.getEnvs().isEmpty() ? Collections.emptyMap() : new THashMap<>(myEnvVariablesComponent.getEnvs())); } @Override diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java index 56480f4105f3..8feea9c429b8 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java @@ -109,7 +109,7 @@ import java.util.function.Supplier; import static com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings.SyncType.*; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.doWriteAction; -import static com.intellij.util.containers.ContainerUtil.*; +import static com.intellij.util.containers.ContainerUtil.list; /** * @author Denis Zhdanov @@ -980,20 +980,13 @@ public class ExternalSystemUtil { @NotNull Project project, @NotNull ProjectSystemId externalSystemId) { AbstractExternalSystemTaskConfigurationType configurationType = findConfigurationType(externalSystemId); - if (configurationType == null) return null; + if (configurationType == null) { + return null; + } String name = AbstractExternalSystemTaskConfigurationType.generateName(project, taskSettings); RunnerAndConfigurationSettings settings = RunManager.getInstance(project).createRunConfiguration(name, configurationType.getFactory()); - ExternalSystemRunConfiguration runConfiguration = (ExternalSystemRunConfiguration)settings.getConfiguration(); - runConfiguration.getSettings().setExternalProjectPath(taskSettings.getExternalProjectPath()); - runConfiguration.getSettings().setTaskNames(newArrayList(taskSettings.getTaskNames())); - runConfiguration.getSettings().setTaskDescriptions(newArrayList(taskSettings.getTaskDescriptions())); - runConfiguration.getSettings().setVmOptions(taskSettings.getVmOptions()); - runConfiguration.getSettings().setScriptParameters(taskSettings.getScriptParameters()); - runConfiguration.getSettings().setPassParentEnvs(taskSettings.isPassParentEnvs()); - runConfiguration.getSettings().setEnv(newHashMap(taskSettings.getEnv())); - runConfiguration.getSettings().setExecutionName(taskSettings.getExecutionName()); - + ((ExternalSystemRunConfiguration)settings.getConfiguration()).getSettings().setFrom(taskSettings); return settings; } diff --git a/platform/util/src/com/intellij/util/containers/ContainerUtil.java b/platform/util/src/com/intellij/util/containers/ContainerUtil.java index 9e111acfeb71..db5712394b9f 100644 --- a/platform/util/src/com/intellij/util/containers/ContainerUtil.java +++ b/platform/util/src/com/intellij/util/containers/ContainerUtil.java @@ -2717,6 +2717,9 @@ public class ContainerUtil extends ContainerUtilRt { else if (list.size() == 1) { return new SmartList(list.get(0)); } + else if (list.isEmpty()) { + return new SmartList(); + } else { return new ArrayList(list); } diff --git a/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java b/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java index cde8d9a24332..d84e15631f3c 100644 --- a/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java +++ b/plugins/gradle/java/src/execution/build/GradleApplicationEnvironmentProvider.java @@ -36,7 +36,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiJavaModule; import com.intellij.task.ExecuteRunConfigurationTask; -import com.intellij.util.containers.ContainerUtil; +import gnu.trove.THashMap; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -99,7 +99,7 @@ public class GradleApplicationEnvironmentProvider implements GradleExecutionEnvi ExternalSystemTaskExecutionSettings taskSettings = new ExternalSystemTaskExecutionSettings(); taskSettings.setPassParentEnvs(params.isPassParentEnvs()); - taskSettings.setEnv(ContainerUtil.newHashMap(params.getEnv())); + taskSettings.setEnv(params.getEnv().isEmpty() ? Collections.emptyMap() : new THashMap<>(params.getEnv())); taskSettings.setExternalSystemIdString(GradleConstants.SYSTEM_ID.getId()); String projectPath = GradleRunnerUtil.resolveProjectPath(module); taskSettings.setExternalProjectPath(projectPath); diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleEnvironmentTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleEnvironmentTest.java index 1b97469c123c..f5f5b7e23dbe 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleEnvironmentTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleEnvironmentTest.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.gradle.importing; import com.intellij.execution.executors.DefaultRunExecutor; @@ -64,7 +50,7 @@ public class GradleEnvironmentTest extends GradleImportingTestCase { "Support for this is available in Gradle 3.5 and all later versions.")); } - private void importAndRunTask(Map passedEnv, StringBuilder gradleEnv) throws IOException { + private void importAndRunTask(@NotNull Map passedEnv, StringBuilder gradleEnv) throws IOException { importProject("task printEnv() {\n" + " doLast { println System.getenv().toMapString()}\n" + "}");