diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java index 4824993b6..8023327d7 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java @@ -82,10 +82,15 @@ public Optional getGermplasmByDBID(UUID programId, String germpl return germplasmDAO.getGermplasmByDBID(germplasmId, programId); } - public List> processListData(List germplasm, BrAPIListDetails germplasmList){ + public List> processListData(List germplasm, BrAPIListDetails germplasmList, Program program){ Map germplasmByName = new HashMap<>(); for (BrAPIGermplasm g: germplasm) { - germplasmByName.put(g.getGermplasmName(), g); + // Use the full, unique germplasmName with programKey and accessionNumber (GID) for 2 reasons: + // 1. the BrAPI list items are full names, and + // 2. germplasmNames alone are not unique within a program, this led to unexpected behavior, see BI-2344. + String uniqueGermplasmName = String.format("%s [%s-%s]", g.getGermplasmName(), program.getKey(), g.getAccessionNumber()); + g.setGermplasmName(uniqueGermplasmName); // Mutate the germplasmName in place for later use. + germplasmByName.put(uniqueGermplasmName, g); } List> processedData = new ArrayList<>(); @@ -107,14 +112,13 @@ public List> processListData(List germplasm, for (String germplasmName: orderedGermplasmNames) { // Increment entryNumber. ++entryNumber; - // Strip program key and accession number from germplasm name. - germplasmName = Utilities.removeUnknownProgramKey(germplasmName); // TODO: could move to the germplasmList != null codepath. // Lookup the BrAPI germplasm in the map. BrAPIGermplasm germplasmEntry = germplasmByName.get(germplasmName); HashMap row = new HashMap<>(); row.put("GID", Integer.valueOf(germplasmEntry.getAccessionNumber())); - row.put("Germplasm Name", germplasmEntry.getGermplasmName()); + // Strip programKey and accessionNumber from germplasmName for the file output. + row.put("Germplasm Name", Utilities.removeProgramKeyAnyAccession(germplasmEntry.getGermplasmName(), program.getKey())); row.put("Breeding Method", germplasmEntry.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD).getAsString()); String source = germplasmEntry.getSeedSource(); row.put("Source", source); @@ -217,7 +221,7 @@ private BrAPIGermplasm cloneBrAPIGermplasm(BrAPIGermplasm germplasm) { return (BrAPIGermplasm) gson.fromJson(gson.toJson(germplasm), BrAPIGermplasm.class); } - public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException { + public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException, DoesNotExistException { List columns = GermplasmFileColumns.getOrderedColumns(); //Retrieve germplasm list data @@ -238,7 +242,8 @@ public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) thro StreamedFile downloadFile; //Convert list data to List> data to pass into file writer - List> processedData = processListData(germplasm, null); + Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Could not find program: " + programId)); + List> processedData = processListData(germplasm, null, program); if (fileExtension == FileType.CSV){ downloadFile = CSVWriter.writeToDownload(columns, processedData, fileExtension); @@ -249,7 +254,7 @@ public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) thro return new DownloadFile(fileName, downloadFile); } - public DownloadFile exportGermplasmList(UUID programId, String listId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException { + public DownloadFile exportGermplasmList(UUID programId, String listId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException, DoesNotExistException { List columns = GermplasmFileColumns.getOrderedColumns(); //Retrieve germplasm list data @@ -260,15 +265,12 @@ public DownloadFile exportGermplasmList(UUID programId, String listId, FileType List germplasm = germplasmDAO.getGermplasmByRawName(germplasmNames, programId); String listName = listData.getListName(); - Optional optionalProgram = programService.getById(programId); - if (optionalProgram.isPresent()) { - Program program = optionalProgram.get(); - listName = removeAppendedKey(listName, program.getKey()); - } + Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Could not find program: " + programId)); + listName = removeAppendedKey(listName, program.getKey()); String fileName = createFileName(listData, listName); StreamedFile downloadFile; //Convert list data to List> data to pass into file writer - List> processedData = processListData(germplasm, listData); + List> processedData = processListData(germplasm, listData, program); if (fileExtension == FileType.CSV){ downloadFile = CSVWriter.writeToDownload(columns, processedData, fileExtension);