Skip to content
Snippets Groups Projects
Commit aa461607 authored by Martin Lowe's avatar Martin Lowe :flag_ca:
Browse files

Merge branch 'malowe/main/jenkins-label-update' into 'main'

Iss #129 - Add fix for statuses to look for duplicates at update time

See merge request eclipsefdn/it/api/git-eca-rest-api!183
parents da7ec0cf 3c6bf889
No related branches found
No related tags found
No related merge requests found
......@@ -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) {
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment