public Runnable createAction(CommandLineParser parser, ParsedCommandLine commandLine) {
    Parameters parameters = parametersConverter.convert(commandLine, new Parameters());
    parameters
        .getDaemonParameters()
        .applyDefaultsFor(
            new JvmVersionDetector(new DefaultExecActionFactory(new IdentityFileResolver()))
                .getJavaVersion(parameters.getDaemonParameters().getEffectiveJvm()));

    if (parameters.getDaemonParameters().isStop()) {
      return stopAllDaemons(parameters.getDaemonParameters(), loggingServices);
    }
    if (parameters.getDaemonParameters().isForeground()) {
      DaemonParameters daemonParameters = parameters.getDaemonParameters();
      ForegroundDaemonConfiguration conf =
          new ForegroundDaemonConfiguration(
              UUID.randomUUID().toString(),
              daemonParameters.getBaseDir(),
              daemonParameters.getIdleTimeout(),
              daemonParameters.getPeriodicCheckInterval());
      return new ForegroundDaemonAction(loggingServices, conf);
    }
    if (parameters.getDaemonParameters().getDaemonUsage().isEnabled()) {
      return runBuildWithDaemon(
          parameters.getStartParameter(), parameters.getDaemonParameters(), loggingServices);
    }
    if (canUseCurrentProcess(parameters.getDaemonParameters())) {
      return runBuildInProcess(
          parameters.getStartParameter(), parameters.getDaemonParameters(), loggingServices);
    }

    return runBuildInSingleUseDaemon(
        parameters.getStartParameter(), parameters.getDaemonParameters(), loggingServices);
  }
  private Action<ExecutionListener> createAction(
      CommandLineParser parser,
      final ParsedCommandLine commandLine,
      CommandLineConverter<StartParameter> startParameterConverter,
      final ServiceRegistry loggingServices) {
    if (commandLine.hasOption(HELP)) {
      return new ActionAdapter(new ShowUsageAction(parser));
    }
    if (commandLine.hasOption(VERSION)) {
      return new ActionAdapter(new ShowVersionAction());
    }
    if (commandLine.hasOption(GUI)) {
      return new ActionAdapter(new ShowGuiAction());
    }

    final StartParameter startParameter = new StartParameter();
    startParameterConverter.convert(commandLine, startParameter);
    DaemonParameters daemonParameters = constructDaemonParameters(startParameter);
    if (commandLine.hasOption(FOREGROUND)) {
      ForegroundDaemonConfiguration conf =
          new ForegroundDaemonConfiguration(
              daemonParameters.getUid(),
              daemonParameters.getBaseDir(),
              daemonParameters.getIdleTimeout());
      return new ActionAdapter(new ForegroundDaemonMain(conf));
    }

    if (commandLine.hasOption(STOP)) {
      return stopAllDaemons(daemonParameters, loggingServices);
    }
    if (useDaemon(commandLine, daemonParameters)) {
      return runBuildWithDaemon(commandLine, daemonParameters, loggingServices);
    }
    if (canUseCurrentProcess(daemonParameters)) {
      return runBuildInProcess(loggingServices, startParameter);
    }
    return runBuildInSingleUseDaemon(commandLine, daemonParameters, loggingServices);
  }