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);
}