private LinkedHashMap cancelBuilds()

in rest-api/src/jetbrains/buildServer/server/rest/request/BuildRequest.java [1077:1147]


  private LinkedHashMap<Long, RuntimeException> cancelBuilds(@NotNull final List<BuildPromotion> builds,
                                                             @NotNull final BuildCancelRequest cancelRequest,
                                                             @Nullable final SUser currentUser) {
    LinkedHashMap<Long, RuntimeException> errors = new LinkedHashMap<>();

    if (cancelRequest.readdIntoQueue) {
      if (currentUser == null) {
        throw new BadRequestException("Cannot re-add build into queue when no current user is present. Please make sure the operation is performed under a regular user.");
      }
    }

    final jetbrains.buildServer.serverSide.BuildQueueEx buildQueue = (BuildQueueEx)myBeanContext.getSingletonService(BuildQueue.class);
    Set<String> queuedBuildIds = builds.stream().map(BuildPromotion::getQueuedBuild).filter(Objects::nonNull).map(QueuedBuild::getItemId).collect(Collectors.toSet());
    if (!queuedBuildIds.isEmpty()) {
      buildQueue.removeItems(queuedBuildIds, currentUser, cancelRequest.comment);
    }

    List<SRunningBuild> stoppedBuilds = new ArrayList<>();
    RunningBuildsManager runningBuildsManager = myBeanContext.getSingletonService(RunningBuildsManager.class);
    for (BuildPromotion build : builds) {
      final SBuild sBuild = build.getAssociatedBuild();
      if (sBuild == null) {
        if (build.getQueuedBuild() != null) {
          if (currentUser != null && !AuthUtil.hasPermissionToStopBuild(currentUser, build)) {
            errors.put(build.getId(), new AuthorizationFailedException("You do not have enough permissions to cancel the build"));
          } else {
            errors.putIfAbsent(build.getId(), new OperationException("Failed to cancel queued build"));
          }
        }
        continue;
      }
      if (sBuild.isFinished()) {
        if (sBuild.getCanceledInfo() == null) {
          errors.put(build.getId(), new BadRequestException("Cannot cancel finished build"));
        }
        continue;
      }

      SRunningBuild runningBuild = runningBuildsManager.findRunningBuildById(sBuild.getBuildId());
      if (runningBuild == null) {
        errors.put(build.getId(), new BadRequestException("Cannot cancel not running build"));
        continue;
      }

      try {
        if (cancelRequest.readdIntoQueue) {
          stoppedBuilds.add(runningBuild);
        }
        final String comment = cancelRequest.comment == null ? "Canceled via REST API" : cancelRequest.comment;
        if (!cancelRequest.readdIntoQueue && currentUser == null) {
          ((RunningBuildEx)runningBuild).stop(RunningBuildState.INTERRUPTED_BY_USER, null, comment, cancelRequest.readdIntoQueue);
        } else {
          runningBuild.stop(currentUser, comment);
        }
      } catch (RuntimeException e) {
        errors.putIfAbsent(build.getId(), e);
      }
    }


    if (cancelRequest.readdIntoQueue && !stoppedBuilds.isEmpty()) {
      stoppedBuilds.forEach(build -> {
        try {
          restoreInQueue(build, currentUser);
        } catch (RuntimeException e) {
          errors.putIfAbsent(build.getBuildPromotion().getId(), e);
        }
      });
    }
    return errors;
  }