Skip to content

Commit bd0a8c0

Browse files
Merge pull request #7659 from microsoft/hanli-fixes-202306
Migrate to general command line to run function core tools
2 parents 83a18f7 + 86a9db8 commit bd0a8c0

File tree

1 file changed

+29
-25
lines changed
  • PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/function/runner/localrun

1 file changed

+29
-25
lines changed

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)