55
66package com .microsoft .azure .toolkit .intellij .legacy .function .runner .localrun ;
77
8- import com .google . common . base . Supplier ;
8+ import com .intellij . execution . ExecutionException ;
99import com .intellij .execution .Executor ;
1010import com .intellij .execution .ExecutorRegistry ;
1111import com .intellij .execution .RunnerAndConfigurationSettings ;
12+ import com .intellij .execution .configurations .GeneralCommandLine ;
1213import com .intellij .execution .executors .DefaultDebugExecutor ;
1314import com .intellij .execution .impl .RunManagerImpl ;
1415import com .intellij .execution .impl .RunnerAndConfigurationSettingsImpl ;
1920import com .intellij .execution .remote .RemoteConfiguration ;
2021import com .intellij .execution .remote .RemoteConfigurationType ;
2122import com .intellij .execution .runners .ExecutionUtil ;
22- import com .intellij .openapi .application .ApplicationManager ;
2323import com .intellij .openapi .application .ReadAction ;
2424import com .intellij .openapi .module .Module ;
2525import com .intellij .openapi .project .Project ;
2626import com .intellij .openapi .util .io .FileUtil ;
2727import com .intellij .openapi .wm .ToolWindowId ;
2828import com .intellij .psi .PsiMethod ;
29+ import com .intellij .util .EnvironmentUtil ;
2930import com .microsoft .azure .toolkit .intellij .common .ReadStreamLineThread ;
3031import com .microsoft .azure .toolkit .intellij .common .RunProcessHandler ;
3132import com .microsoft .azure .toolkit .intellij .common .RunProcessHandlerMessenger ;
6263import org .apache .commons .lang3 .StringUtils ;
6364import org .apache .maven .artifact .versioning .ComparableVersion ;
6465import org .jetbrains .annotations .NotNull ;
65- import rx .Observable ;
66- import rx .Scheduler ;
67- import rx .schedulers .Schedulers ;
6866
6967import javax .annotation .Nonnull ;
7068import javax .annotation .Nullable ;
7876import java .util .function .Consumer ;
7977import java .util .regex .Matcher ;
8078import java .util .regex .Pattern ;
79+ import java .util .stream .Collectors ;
8180import java .util .stream .Stream ;
8281
8382import 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