From c68aa811c4632de52315596b5a901d473443bf6b Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 9 Jun 2023 15:35:32 -0400 Subject: [PATCH] check for programs already sharing --- .../services/OntologyService.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/services/OntologyService.java b/src/main/java/org/breedinginsight/services/OntologyService.java index 569500ff2..702073a54 100644 --- a/src/main/java/org/breedinginsight/services/OntologyService.java +++ b/src/main/java/org/breedinginsight/services/OntologyService.java @@ -51,15 +51,42 @@ public List getSharedOntology(@NotNull UUID programId, @NotNull Boolean sharedOn // Get program with that id Program program = getProgram(programId); + // Get any programs targeted for sharing by this program List formattedPrograms = getSharedProgramsFormatted(program); Set sharedProgramIds = formattedPrograms.stream().map(SharedOntology::getProgramId).collect(Collectors.toSet()); - // Add other programs + // Add other sharable programs if (!sharedOnly) { // TODO: Test if localhost vs localhost/brapi/v2 makes a difference List matchingPrograms = getMatchingPrograms(program); + + // Collect the ids of any matching programs that are either sharing-sources or + // sharing-targets that have accepted + Set shareSourceIds = new HashSet<>(); + Set shareTargetIds = new HashSet<>(); + for (Program candidate: matchingPrograms) { + List shareTargetsFormatted = getSharedProgramsFormatted(candidate); + if (!shareTargetsFormatted.isEmpty()) { + + // The program is sharing its ontology, so collect its id as a source + shareSourceIds.add(candidate.getId()); + + // Collect the ids of target-programs that have accepted + shareTargetIds.addAll(shareTargetsFormatted + .stream() + .filter(SharedOntology::getAccepted) + .map(SharedOntology::getProgramId) + .collect(Collectors.toSet()) + ); + } + } + + Set unsharableIds = new HashSet<>(); + unsharableIds.addAll(sharedProgramIds); + unsharableIds.addAll(shareSourceIds); + unsharableIds.addAll(shareTargetIds); formattedPrograms.addAll(matchingPrograms.stream() - .filter(matchingProgram -> !sharedProgramIds.contains(matchingProgram.getId())) + .filter(matchingProgram -> !unsharableIds.contains(matchingProgram.getId())) .map(matchingProgram -> formatResponse(matchingProgram)) .collect(Collectors.toList())); }