/**
   * Adds already running runner.
   *
   * @param processDescriptor The descriptor of new runner
   * @return instance of new runner
   */
  @NotNull
  public Runner addRunner(@NotNull ApplicationProcessDescriptor processDescriptor) {
    RunOptions runOptions = dtoFactory.createDto(RunOptions.class);
    Runner runner = modelsFactory.createRunner(runOptions);

    String environmentId = processDescriptor.getEnvironmentId();

    if (environmentId != null && environmentId.startsWith(PROJECT_PREFIX)) {
      runner.setScope(PROJECT);
    }

    runnersId.add(processDescriptor.getProcessId());

    runner.setProcessDescriptor(processDescriptor);
    runner.setRAM(processDescriptor.getMemorySize());
    runner.setStatus(Runner.Status.DONE);
    runner.resetCreationTime();

    history.addRunner(runner);

    onSelectionChanged(RUNNER);

    runnerTimer.schedule(ONE_SEC.getValue());

    LaunchAction launchAction = actionFactory.createLaunch();
    runnerActions.put(runner, launchAction);

    launchAction.perform(runner);

    selectHistoryTab();

    return runner;
  }
  @NotNull
  private Runner launchRunner(@NotNull Runner runner) {
    if (runActionPermit.isAllowed()) {

      CurrentProject currentProject = appContext.getCurrentProject();

      if (currentProject == null) {
        throw new IllegalStateException(
            "Can't launch runner for current project. Current project is absent...");
      }

      selectedEnvironment = null;

      panelState.setState(RUNNERS);
      view.showOtherButtons();

      history.addRunner(runner);

      runnerInQueueTimer.schedule(ONE_SEC.getValue());

      CheckRamAndRunAction checkRamAndRunAction = actionFactory.createCheckRamAndRun();
      checkRamAndRunAction.perform(runner);

      runnerActions.put(runner, checkRamAndRunAction);

      runner.resetCreationTime();
      runnerTimer.schedule(ONE_SEC.getValue());
    } else {
      runActionDenyAccessDialog.show();
    }
    return runner;
  }
  /** {@inheritDoc} */
  @Override
  public void stopRunner(@NotNull Runner runner) {
    RunnerAction runnerAction = runnerActions.get(runner);
    if (runnerAction != null) {
      runnerAction.stop();
    }

    StopAction stopAction = actionFactory.createStop();
    stopAction.perform(runner);
  }
  /** {@inheritDoc} */
  @Override
  public void onProjectReady(@NotNull ProjectActionEvent projectActionEvent) {
    view.setEnableReRunButton(false);
    view.setEnableStopButton(false);
    view.setEnableLogsButton(false);

    templateContainer.setVisible(true);

    getRunningProcessAction = actionFactory.createGetRunningProcess();

    boolean isRunOperationAvailable = runnerUtil.hasRunPermission();
    view.setEnableRunButton(isRunOperationAvailable);

    if (!isRunOperationAvailable) {
      return;
    }

    templateContainer.showEnvironments();

    getRunningProcessAction.perform();
    getSystemEnvironmentsAction.perform();

    runnerTimer.schedule(ONE_SEC.getValue());
  }