public void doWork()

in src/main/java/com/google/gcs/sdrs/service/worker/impl/ValidationWorker.java [59:138]


  public void doWork() {
    List<RetentionJob> retentionJobs = jobValidationDao.findAllPendingRetentionJobs();

    // Create a map of user retention job keyed of jobId for later look up.
    Map<Integer, RetentionJob> dmRetentionJobMap = new HashMap<>();
    retentionJobs.stream()
        .filter(job -> job.getRetentionRuleType() == RetentionRuleType.USER)
        .forEach(job -> dmRetentionJobMap.put(job.getId(), job));

    if (retentionJobs.size() > 0) {
      // An STS job status query can only be done on one project id at a time, so split the list
      // into lists of projects grouped by project id
      Map<String, List<RetentionJob>> jobsByProject =
          retentionJobs.stream()
              .collect(Collectors.groupingBy(RetentionJob::getRetentionRuleProjectId));

      Map<String, List<RetentionJobValidation>> stsValidations = new HashMap<>();
      for (List<RetentionJob> jobs : jobsByProject.values()) {
        // Get validation results from STS for each group of jobs
        List<RetentionJobValidation> retentionJobValidations =
            stsRuleValidator.validateRetentionJobs(jobs);
        // Combine all retentionJobValidation results from STS into one map by JobName so we can
        // quickly search it later on
        retentionJobValidations.stream()
            .forEach(
                validation -> {
                  validation.setBatchId(getUuid());
                  String jobOperationName = validation.getJobOperationName();
                  if (stsValidations.containsKey(jobOperationName)) {
                    stsValidations.get(jobOperationName).add(validation);
                  } else {
                    List<RetentionJobValidation> validationSet = new ArrayList<>();
                    validationSet.add(validation);
                    stsValidations.put(jobOperationName, validationSet);
                  }
                });
      }

      if (stsValidations.size() > 0) {
        // Our map of STS validations may or may not already exist in the DB. We need to query the
        // DB for each one to see if it exists.
        List<RetentionJobValidation> existingValidations =
            jobValidationDao.findAllByRetentionJobNames(new ArrayList<>(stsValidations.keySet()));

        // For each validation that exists in the DB, update the matching STS validation with the Id
        // so it can be properly updated
        for (RetentionJobValidation existingValidation : existingValidations) {
          stsValidations.get(existingValidation.getJobOperationName()).stream()
              .forEach(
                  validation -> {
                    if (existingValidation.getRetentionJobId().intValue()
                        == validation.getRetentionJobId().intValue()) {
                      validation.setId(existingValidation.getId());
                    }
                  });
        }

        List<RetentionJobValidation> finalValidationList =
            stsValidations.values().stream()
                .reduce(
                    (v1, v2) -> {
                      v1.addAll(v2);
                      return v1;
                    })
                .get();

        jobValidationDao.saveOrUpdateBatch(finalValidationList);
        logger.info(
            String.format("%d retention jobs have been validated.", finalValidationList.size()));

        List<RetentionJobValidation> dmValidationList =
            finalValidationList.stream()
                .filter(validation -> dmRetentionJobMap.containsKey(validation.getRetentionJobId()))
                .collect(Collectors.toList());

        updateDmRequests(dmValidationList);
      }
    }
    workerResult.setStatus(WorkerResult.WorkerResultStatus.SUCCESS);
  }