@Override public String getDescription(RunConfigurableBeforeRunTask task) { if (task.getSettings() == null) { return ExecutionBundle.message("before.launch.run.another.configuration"); } else { return ExecutionBundle.message( "before.launch.run.certain.configuration", task.getSettings().getName()); } }
@Override public boolean canExecuteTask(RunConfiguration configuration, RunConfigurableBeforeRunTask task) { RunnerAndConfigurationSettings settings = task.getSettings(); if (settings == null) { return false; } String executorId = DefaultRunExecutor.getRunExecutorInstance().getId(); final ProgramRunner runner = ProgramRunnerUtil.getRunner(executorId, settings); return runner != null && runner.canRun(executorId, settings.getConfiguration()); }
@Override public boolean configureTask( RunConfiguration runConfiguration, RunConfigurableBeforeRunTask task) { SelectionDialog dialog = new SelectionDialog(task.getSettings(), getAvailableConfigurations(runConfiguration)); dialog.show(); RunnerAndConfigurationSettings settings = dialog.getSelectedSettings(); if (settings != null) { task.setSettings(settings); return true; } else { return false; } }
@Override public Icon getTaskIcon(RunConfigurableBeforeRunTask task) { if (task.getSettings() == null) return null; return ProgramRunnerUtil.getConfigurationIcon(task.getSettings(), false); }
@Override public boolean executeTask( final DataContext dataContext, RunConfiguration configuration, final ExecutionEnvironment env, RunConfigurableBeforeRunTask task) { RunnerAndConfigurationSettings settings = task.getSettings(); if (settings == null) { return false; } final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); final String executorId = executor.getId(); ExecutionEnvironmentBuilder builder = ExecutionEnvironmentBuilder.createOrNull(executor, settings); if (builder == null) { return false; } final ExecutionEnvironment environment = builder.build(); environment.setExecutionId(env.getExecutionId()); if (!ExecutionTargetManager.canRun(settings, env.getExecutionTarget())) { return false; } if (!environment.getRunner().canRun(executorId, environment.getRunProfile())) { return false; } else { final Semaphore targetDone = new Semaphore(); final Ref<Boolean> result = new Ref<Boolean>(false); final Disposable disposable = Disposer.newDisposable(); myProject .getMessageBus() .connect(disposable) .subscribe( ExecutionManager.EXECUTION_TOPIC, new ExecutionAdapter() { @Override public void processStartScheduled( final String executorIdLocal, final ExecutionEnvironment environmentLocal) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { targetDone.down(); } } @Override public void processNotStarted( final String executorIdLocal, @NotNull final ExecutionEnvironment environmentLocal) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { targetDone.up(); } } @Override public void processStarted( final String executorIdLocal, @NotNull final ExecutionEnvironment environmentLocal, @NotNull final ProcessHandler handler) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { handler.addProcessListener( new ProcessAdapter() { @Override public void processTerminated(ProcessEvent event) { result.set(event.getExitCode() == 0); targetDone.up(); } }); } } }); try { ApplicationManager.getApplication() .invokeAndWait( new Runnable() { @Override public void run() { try { environment.getRunner().execute(environment); } catch (ExecutionException e) { targetDone.up(); LOG.error(e); } } }, ModalityState.NON_MODAL); } catch (Exception e) { LOG.error(e); Disposer.dispose(disposable); return false; } targetDone.waitFor(); Disposer.dispose(disposable); return result.get(); } }