diff --git a/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationService.java b/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationService.java index 241a21db6f1911f3d851149e892a11f7e1ca52eb..0e03e739fe8e851b85efdd1e74afeb512ccc9951 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationService.java +++ b/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationService.java @@ -14,12 +14,6 @@ package org.eclipsefoundation.git.eca.service.impl; import java.util.List; import java.util.Optional; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import jakarta.ws.rs.WebApplicationException; -import jakarta.ws.rs.core.Response; -import jakarta.ws.rs.core.Response.Status; - import org.apache.commons.lang3.StringUtils; import org.eclipsefoundation.core.model.RequestWrapper; import org.eclipsefoundation.efservices.api.models.Project; @@ -36,11 +30,15 @@ import org.eclipsefoundation.git.eca.namespace.APIStatusCode; import org.eclipsefoundation.git.eca.service.UserService; import org.eclipsefoundation.git.eca.service.ValidationService; import org.eclipsefoundation.git.eca.service.ValidationStatusService; -import org.eclipsefoundation.persistence.dao.PersistenceDao; -import org.eclipsefoundation.persistence.service.FilterService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; + /** * Default service for validating external requests for ECA validation, as well as storing and retrieving information * about historic requests. @@ -62,10 +60,6 @@ public class DefaultValidationService implements ValidationService { @Inject ValidationStatusService statusService; - @Inject - PersistenceDao dao; - @Inject - FilterService filters; @Override public ValidationResponse validateIncomingRequest(ValidationRequest req, RequestWrapper wrapper) { diff --git a/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationStatusService.java b/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationStatusService.java index 96359379de9761a8460defe253d1d8821da2fa84..18963669c7c73198fb6fa296929742cbd1d675ae 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationStatusService.java +++ b/src/main/java/org/eclipsefoundation/git/eca/service/impl/DefaultValidationStatusService.java @@ -102,7 +102,7 @@ public class DefaultValidationStatusService implements ValidationStatusService { .entrySet() .stream() .filter(e -> !ValidationResponse.NIL_HASH_PLACEHOLDER.equalsIgnoreCase(e.getKey())) - .map(e -> recordUpdatedValidationStatus(req, statuses, p, e)) + .map(e -> recordUpdatedValidationStatus(req, wrapper, p, e)) .toList(); String fingerprint = CommitHelper.generateRequestHash(req); // update the base commit status and messages @@ -122,8 +122,8 @@ public class DefaultValidationStatusService implements ValidationStatusService { * @param e the current commit that is being updated * @return the new or updated commit status */ - private CommitValidationStatus recordUpdatedValidationStatus(ValidationRequest req, List<CommitValidationStatus> existingStatuses, - Project p, Entry<String, CommitStatus> e) { + private CommitValidationStatus recordUpdatedValidationStatus(ValidationRequest req, RequestWrapper wrap, Project p, + Entry<String, CommitStatus> e) { // get the commit for current status Optional<Commit> commit = req.getCommits().stream().filter(c -> e.getKey().equals(c.getHash())).findFirst(); if (commit.isEmpty()) { @@ -132,11 +132,16 @@ public class DefaultValidationStatusService implements ValidationStatusService { return null; } Commit c = commit.get(); + // lookup the existing status one at a time to prevent issues with near parallel requests/duplicate commit data + MultivaluedMap<String, String> params = new MultivaluedMapImpl<>(); + params.add(GitEcaParameterNames.SHAS_RAW, c.getHash()); + params.add(GitEcaParameterNames.REPO_URL_RAW, req.getRepoUrl().toString()); + List<CommitValidationStatus> existingStatus = dao.get(new RDBMSQuery<>(wrap, filters.get(CommitValidationStatus.class), params)); + // update the status if present, otherwise make new one. - Optional<CommitValidationStatus> status = existingStatuses.stream().filter(s -> e.getKey().equals(s.getCommitHash())).findFirst(); CommitValidationStatus base; - if (status.isPresent()) { - base = status.get(); + if (existingStatus != null && !existingStatus.isEmpty()) { + base = existingStatus.get(0); if (LOGGER.isTraceEnabled()) { LOGGER .trace("Found existing commit status for commit '{}' in repository {}, {} existing errors", c.getHash(), @@ -200,6 +205,9 @@ public class DefaultValidationStatusService implements ValidationStatusService { * @return copy of the input list for easier chaining with updated statuses. */ private List<CommitValidationStatus> deduplicateErrorMessages(List<CommitValidationStatus> outgoing) { + if (outgoing == null) { + return Collections.emptyList(); + } outgoing.forEach(s -> s.getErrors().removeIf(distinctByKey(err -> err.getCommit().getCommitHash() + err.getStatusCode()))); return outgoing; }