Skip to content

Commit 963101e

Browse files
Merge branch 'endgame-202306' into develop
2 parents fbf8be3 + e82ae38 commit 963101e

File tree

90 files changed

+1381
-838
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1381
-838
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
All notable changes to "Azure Toolkit for IntelliJ IDEA" will be documented in this file.
44

55
- [Change Log](#change-log)
6+
- [3.78.0](#3780)
67
- [3.77.0](#3770)
78
- [3.76.0](#3760)
89
- [3.75.0](#3750)
@@ -97,6 +98,20 @@ All notable changes to "Azure Toolkit for IntelliJ IDEA" will be documented in t
9798
- [3.0.7](#307)
9899
- [3.0.6](#306)
99100

101+
## 3.78.0
102+
### Added
103+
- New UX for Azure resource connections in IntelliJ project view
104+
- Support list/add/remove Azure resource connections in project explorer
105+
- Support edit environment variables for Azure resource connections
106+
- Support manage connected Azure resources in project explorer
107+
- Support IntelliJ 2023.2 EAP
108+
109+
### Fixed
110+
- Fix: System environment variables may be missed during function run/deployment
111+
- [#7651](https://github.com/microsoft/azure-tools-for-java/issues/7651): Uncaught Exception DeployFunctionAppAction#update, check if project is a valid function project.
112+
- [#7653](https://github.com/microsoft/azure-tools-for-java/issues/7653): Uncaught Exception com.intellij.diagnostic.PluginException: No display name is specified for configurable com.microsoft.intellij.AzureConfigurable in xml file.
113+
- [#7619](https://github.com/microsoft/azure-tools-for-java/issues/7619): Uncaught Exception Uncaught Exception java.lang.IllegalArgumentException: invalid arguments id/nameId.
114+
100115
## 3.77.0
101116
### Added
102117
- Azure Spring Apps: basic Standard Consumption plan(preview) support.

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-applicationinsights/src/main/java/com/microsoft/azure/toolkit/intellij/applicationinsights/connection/ApplicationInsightsResourcePanel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public ApplicationInsightsResourcePanel() {
4040

4141
private void init() {
4242
this.insightComboBox.setRequired(true);
43-
this.insightComboBox.trackValidation();
4443
this.subscriptionComboBox.addItemListener(e -> {
4544
if (e.getStateChange() == ItemEvent.SELECTED) {
4645
this.insightComboBox.reloadItems();

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/appservice/task/CreateFunctionAppTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void execute() throws Exception {
4343
final FunctionAppConfig functionAppConfig = FunctionAppConfig.getFunctionAppDefaultConfig(name);
4444
functionAppConfig.setName(name);
4545
functionAppConfig.setSubscription(subscription);
46-
functionAppConfig.setRuntime(Runtime.FUNCTION_WINDOWS_JAVA11);
46+
functionAppConfig.setRuntime(Runtime.FUNCTION_WINDOWS_JAVA17);
4747
final FunctionAppBase<?, ?, ?> app = FunctionAppService.getInstance().createOrUpdateFunctionApp(functionAppConfig);
4848
context.applyResult(FUNCTION_ID, app.getId());
4949
context.applyResult(RESOURCE_GROUP, app.getResourceGroupName());

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/appservice/task/DeployWebAppTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ protected RunnerAndConfigurationSettings getRunConfigurationSettings(@Nonnull Co
4545
final AzureArtifact azureArtifact = allSupportedAzureArtifacts.get(0);
4646
((WebAppConfiguration) runConfiguration).saveArtifact(azureArtifact);
4747
final List<BeforeRunTask> beforeRunTasks = new ArrayList<>();
48-
beforeRunTasks.add(BuildArtifactBeforeRunTaskUtils.createBuildTask(azureArtifact, runConfiguration));
48+
beforeRunTasks.add(BuildArtifactBeforeRunTaskUtils.createBuildTask(azureArtifact, runConfiguration, true));
4949
beforeRunTasks.addAll(runConfiguration.getBeforeRunTasks());
5050
manager.setBeforeRunTasks(runConfiguration, beforeRunTasks);
5151
((WebAppConfiguration) runConfiguration).setOpenBrowserAfterDeployment(false);

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/action/CreateFunctionAction.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,19 @@ protected boolean isAvailable(final DataContext dataContext) {
132132
if (project == null || project.isDisposed()) {
133133
return false;
134134
}
135-
final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
136-
final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
137-
if (view != null) {
138-
final List<PsiDirectory> dirs = Arrays.stream(view.getDirectories()).filter(Objects::nonNull).toList();
139-
for (final PsiDirectory dir : dirs) {
140-
if (projectFileIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) && doCheckPackageExists(dir)) {
141-
return true;
135+
try {
136+
final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
137+
final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
138+
if (view != null) {
139+
final List<PsiDirectory> dirs = Arrays.stream(view.getDirectories()).filter(Objects::nonNull).toList();
140+
for (final PsiDirectory dir : dirs) {
141+
if (projectFileIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) && doCheckPackageExists(dir)) {
142+
return true;
143+
}
142144
}
143145
}
146+
} catch (final RuntimeException e) {
147+
// swallow exception when check action availability
144148
}
145149
return false;
146150
}

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/action/RunFunctionAction.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import com.intellij.execution.impl.RunDialog;
1515
import com.intellij.openapi.actionSystem.ActionUpdateThread;
1616
import com.intellij.openapi.actionSystem.AnActionEvent;
17-
import com.intellij.openapi.actionSystem.DataKeys;
17+
import com.intellij.openapi.actionSystem.LangDataKeys;
1818
import com.intellij.openapi.module.Module;
1919
import com.intellij.openapi.project.Project;
2020
import com.microsoft.azure.toolkit.intellij.legacy.function.runner.AzureFunctionSupportConfigurationType;
@@ -32,6 +32,7 @@
3232

3333
import java.util.ArrayList;
3434
import java.util.List;
35+
import java.util.Objects;
3536

3637
import static com.microsoft.azure.toolkit.intellij.common.AzureBundle.message;
3738

@@ -41,15 +42,16 @@ public class RunFunctionAction extends AzureAnAction {
4142

4243
@Override
4344
public boolean onActionPerformed(@NotNull AnActionEvent anActionEvent, @Nullable Operation operation) {
44-
final Module module = DataKeys.MODULE.getData(anActionEvent.getDataContext());
45+
final Module module = LangDataKeys.MODULE.getData(anActionEvent.getDataContext());
4546
AzureTaskManager.getInstance().runLater(() -> runConfiguration(module));
4647
return true;
4748
}
4849

4950
@Override
5051
@ExceptionNotification
51-
public void update(AnActionEvent event) {
52-
event.getPresentation().setEnabledAndVisible(FunctionUtils.isFunctionProject(event.getProject()));
52+
public void update(AnActionEvent e) {
53+
final boolean onModule = Objects.nonNull(LangDataKeys.MODULE.getData(e.getDataContext()));
54+
e.getPresentation().setEnabledAndVisible(onModule && FunctionUtils.isFunctionProject(e.getProject()));
5355
}
5456

5557
@Override

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/runner/core/FunctionUtils.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,17 @@ public static boolean isFunctionProject(Project project) {
180180
return false;
181181
}
182182
final List<Library> libraries = new ArrayList<>();
183-
OrderEnumerator.orderEntries(project).productionOnly().forEachLibrary(library -> {
184-
if (StringUtils.containsAnyIgnoreCase(library.getName(), AZURE_FUNCTIONS_JAVA_LIBRARY, AZURE_FUNCTIONS_JAVA_CORE_LIBRARY)) {
185-
libraries.add(library);
186-
}
187-
return true;
188-
});
189-
return libraries.size() > 0;
183+
try {
184+
OrderEnumerator.orderEntries(project).productionOnly().forEachLibrary(library -> {
185+
if (StringUtils.containsAnyIgnoreCase(library.getName(), AZURE_FUNCTIONS_JAVA_LIBRARY, AZURE_FUNCTIONS_JAVA_CORE_LIBRARY)) {
186+
libraries.add(library);
187+
}
188+
return true;
189+
});
190+
return libraries.size() > 0;
191+
} catch (Throwable t) {
192+
return false;
193+
}
190194
}
191195

192196
@AzureOperation(name = "boundary/function.list_function_methods.module", params = {"module.getName()"})

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/runner/deploy/FunctionDeploymentState.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.microsoft.azure.toolkit.ide.appservice.AppServiceActionsContributor;
1313
import com.microsoft.azure.toolkit.intellij.common.RunProcessHandler;
1414
import com.microsoft.azure.toolkit.intellij.common.RunProcessHandlerMessenger;
15-
import com.microsoft.azure.toolkit.intellij.connector.dotazure.AzureModule;
1615
import com.microsoft.azure.toolkit.intellij.connector.dotazure.DotEnvBeforeRunTaskProvider;
1716
import com.microsoft.azure.toolkit.intellij.legacy.common.AzureRunProfileState;
1817
import com.microsoft.azure.toolkit.intellij.legacy.function.runner.core.FunctionUtils;
@@ -81,11 +80,6 @@ public FunctionDeploymentState(Project project, FunctionDeployConfiguration func
8180
final FunctionAppBase<?, ?, ?> target = FunctionAppService.getInstance().createOrUpdateFunctionApp(deployModel.getFunctionAppConfig());
8281
stagingFolder = FunctionUtils.getTempStagingFolder();
8382
prepareStagingFolder(stagingFolder, operation);
84-
final AzureTaskManager tm = AzureTaskManager.getInstance();
85-
Optional.ofNullable(this.functionDeployConfiguration.getModule()).map(AzureModule::from)
86-
.ifPresent(module -> tm.runLater(() -> tm.write(() -> module
87-
.initializeWithDefaultProfileIfNot()
88-
.addApp(target).save())));
8983
// deploy function to Azure
9084
FunctionAppService.getInstance().deployFunctionApp(target, stagingFolder);
9185
AzureTaskManager.getInstance().runInBackground("list HTTPTrigger url", () -> {
@@ -108,8 +102,8 @@ private void applyResourceConnection() {
108102
final DotEnvBeforeRunTaskProvider.LoadDotEnvBeforeRunTask loadDotEnvBeforeRunTask = functionDeployConfiguration.getLoadDotEnvBeforeRunTask();
109103
final Map<String, String> appSettings = functionDeployConfiguration.getConfig().getAppSettings();
110104
loadDotEnvBeforeRunTask.loadEnv().stream()
111-
.filter(pair -> StringUtils.equalsIgnoreCase(pair.getKey(), "AzureWebJobsStorage") &&
112-
StringUtils.equalsIgnoreCase(pair.getValue(), LOCAL_STORAGE_CONNECTION_STRING)) // remove connection string for azurite
105+
.filter(pair -> !(StringUtils.equalsIgnoreCase(pair.getKey(), "AzureWebJobsStorage") &&
106+
StringUtils.equalsIgnoreCase(pair.getValue(), LOCAL_STORAGE_CONNECTION_STRING))) // workaround to remove local connections
113107
.forEach(env -> appSettings.put(env.getKey(), env.getValue()));
114108
}
115109
}

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/runner/localrun/FunctionRunState.java

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
package com.microsoft.azure.toolkit.intellij.legacy.function.runner.localrun;
77

8-
import com.google.common.base.Supplier;
8+
import com.intellij.execution.ExecutionException;
99
import com.intellij.execution.Executor;
1010
import com.intellij.execution.ExecutorRegistry;
1111
import com.intellij.execution.RunnerAndConfigurationSettings;
12+
import com.intellij.execution.configurations.GeneralCommandLine;
1213
import com.intellij.execution.executors.DefaultDebugExecutor;
1314
import com.intellij.execution.impl.RunManagerImpl;
1415
import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl;
@@ -19,13 +20,13 @@
1920
import com.intellij.execution.remote.RemoteConfiguration;
2021
import com.intellij.execution.remote.RemoteConfigurationType;
2122
import com.intellij.execution.runners.ExecutionUtil;
22-
import com.intellij.openapi.application.ApplicationManager;
2323
import com.intellij.openapi.application.ReadAction;
2424
import com.intellij.openapi.module.Module;
2525
import com.intellij.openapi.project.Project;
2626
import com.intellij.openapi.util.io.FileUtil;
2727
import com.intellij.openapi.wm.ToolWindowId;
2828
import com.intellij.psi.PsiMethod;
29+
import com.intellij.util.EnvironmentUtil;
2930
import com.microsoft.azure.toolkit.intellij.common.ReadStreamLineThread;
3031
import com.microsoft.azure.toolkit.intellij.common.RunProcessHandler;
3132
import com.microsoft.azure.toolkit.intellij.common.RunProcessHandlerMessenger;
@@ -62,9 +63,6 @@
6263
import org.apache.commons.lang3.StringUtils;
6364
import org.apache.maven.artifact.versioning.ComparableVersion;
6465
import org.jetbrains.annotations.NotNull;
65-
import rx.Observable;
66-
import rx.Scheduler;
67-
import rx.schedulers.Schedulers;
6866

6967
import javax.annotation.Nonnull;
7068
import javax.annotation.Nullable;
@@ -78,6 +76,7 @@
7876
import java.util.function.Consumer;
7977
import java.util.regex.Matcher;
8078
import java.util.regex.Pattern;
79+
import java.util.stream.Collectors;
8180
import java.util.stream.Stream;
8281

8382
import static com.microsoft.azure.toolkit.ide.appservice.function.FunctionAppActionsContributor.CONFIG_CORE_TOOLS;
@@ -91,7 +90,7 @@ public class FunctionRunState extends AzureRunProfileState<Boolean> {
9190
private static final int DEFAULT_FUNC_PORT = 7071;
9291
private static final int DEFAULT_DEBUG_PORT = 5005;
9392
private static final String DEBUG_PARAMETERS =
94-
"\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=%s\"";
93+
"--language-worker -- \"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=%s\"";
9594
private static final String HOST_JSON = "host.json";
9695
private static final String EXTENSION_BUNDLE = "extensionBundle";
9796
private static final String EXTENSION_BUNDLE_ID = "Microsoft.Azure.Functions.ExtensionBundle";
@@ -227,10 +226,10 @@ private static ComparableVersion getJavaVersion() {
227226

228227
@AzureOperation(name = "boundary/function.run_cli.folder", params = {"stagingFolder.getName()"})
229228
private int runFunctionCli(RunProcessHandler processHandler, File stagingFolder)
230-
throws IOException, InterruptedException {
229+
throws InterruptedException, ExecutionException {
231230
isDebuggerLaunched = false;
232231
final int debugPort = FunctionUtils.findFreePort(DEFAULT_DEBUG_PORT);
233-
process = getRunFunctionCliProcessBuilder(stagingFolder, debugPort).start();
232+
process = getFunctionCliProcess(stagingFolder, debugPort);
234233
// Redirect function cli output to console
235234
readInputStreamByLines(process.getInputStream(), inputLine -> {
236235
if (isDebugMode() && isFuncInitialized(inputLine) && !isDebuggerLaunched) {
@@ -276,27 +275,31 @@ public void processTerminated(@NotNull ProcessEvent event) {
276275
});
277276
}
278277

279-
private ProcessBuilder getRunFunctionCliProcessBuilder(File stagingFolder, int debugPort) {
280-
final ProcessBuilder processBuilder = new ProcessBuilder();
278+
private Process getFunctionCliProcess(File stagingFolder, int debugPort) throws ExecutionException {
281279
final String funcPath = functionRunConfiguration.getFuncPath();
282280
final String funcArguments = Optional.ofNullable(functionRunConfiguration.getFunctionHostArguments())
283281
.filter(StringUtils::isNoneBlank).orElseGet(FunctionUtils::getDefaultFuncArguments);
284-
final String[] hostParameters = funcArguments.split(" ");
285-
final String[] debugParameters = isDebugMode() ? new String[]{"--language-worker", "--", String.format(DEBUG_PARAMETERS, debugPort)} : null;
286-
final String[] command = Stream.of(new String[]{funcPath}, hostParameters, debugParameters)
287-
.filter(Objects::nonNull).flatMap(Stream::of).toArray(String[]::new);
288-
processBuilder.command(command);
289-
processBuilder.directory(stagingFolder);
290-
return processBuilder;
282+
final String debugParameters = isDebugMode() ? String.format(DEBUG_PARAMETERS, debugPort) : null;
283+
final String[] command = Stream.of(funcArguments, debugParameters)
284+
.filter(StringUtils::isNoneBlank)
285+
.collect(Collectors.joining(StringUtils.SPACE))
286+
.split(StringUtils.SPACE);
287+
final GeneralCommandLine result = new GeneralCommandLine();
288+
result.withEnvironment(EnvironmentUtil.getEnvironmentMap());
289+
result.withExePath(funcPath);
290+
result.withParameters(command);
291+
result.withWorkDirectory(stagingFolder);
292+
return result.createProcess();
291293
}
292294

293-
private ProcessBuilder getRunFunctionCliExtensionInstallProcessBuilder(File stagingFolder) {
294-
final ProcessBuilder processBuilder = new ProcessBuilder();
295+
private Process getExtensionInstallProcess(File stagingFolder) throws ExecutionException {
295296
final String funcPath = functionRunConfiguration.getFuncPath();
296-
final String[] command = new String[]{funcPath, "extensions", "install", "--java"};
297-
processBuilder.command(command);
298-
processBuilder.directory(stagingFolder);
299-
return processBuilder;
297+
final GeneralCommandLine result = new GeneralCommandLine();
298+
result.withEnvironment(EnvironmentUtil.getEnvironmentMap());
299+
result.withExePath(funcPath);
300+
result.withParameters("extensions", "install", "--java");
301+
result.withWorkDirectory(stagingFolder);
302+
return result.createProcess();
300303
}
301304

302305
@AzureOperation(name = "boundary/function.prepare_staging_folder.folder|app", params = {"stagingFolder.getName()", "this.functionRunConfiguration.getFuncPath()"})
@@ -333,7 +336,7 @@ private void prepareStagingFolder(File stagingFolder,
333336

334337
final Set<BindingEnum> bindingClasses = getFunctionBindingEnums(configMap);
335338
if (isInstallingExtensionNeeded(bindingClasses, processHandler)) {
336-
installProcess = getRunFunctionCliExtensionInstallProcessBuilder(stagingFolder).start();
339+
installProcess = getExtensionInstallProcess(stagingFolder);
337340
}
338341
} catch (final AzureExecutionException | IOException e) {
339342
final String error = String.format("failed prepare staging folder[%s]", folder);
@@ -405,7 +408,8 @@ private void saveConnection(@Nonnull final Connection<?, ?> connection, @Nonnull
405408
private boolean isWebJobStorageRequired(@Nonnull List<BindingEnum> bindings) {
406409
return bindings.stream().map(BindingEnum::getType)
407410
.filter(type -> StringUtils.endsWithIgnoreCase(type, "Trigger"))
408-
.anyMatch(type -> !AZURE_WEB_JOBS_STORAGE_NOT_REQUIRED_TRIGGERS.stream().anyMatch(trigger -> StringUtils.equalsIgnoreCase(type, trigger)));
411+
.anyMatch(type -> AZURE_WEB_JOBS_STORAGE_NOT_REQUIRED_TRIGGERS.stream()
412+
.noneMatch(trigger -> StringUtils.equalsIgnoreCase(type, trigger)));
409413
}
410414

411415
private boolean isDebugMode() {

0 commit comments

Comments
 (0)