Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 166 additions & 3 deletions src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,15 @@
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.rules.SecurityRule;
import lombok.extern.slf4j.Slf4j;
import org.brapi.client.v2.ApiResponse;
import org.brapi.client.v2.model.exceptions.ApiException;
import org.brapi.v2.model.germ.BrAPIGermplasm;
import org.brapi.client.v2.modules.germplasm.GermplasmApi;
import org.brapi.v2.model.BrAPIIndexPagination;
import org.brapi.v2.model.BrAPIMetadata;
import org.brapi.v2.model.BrAPIStatus;
import org.brapi.v2.model.germ.*;
import org.brapi.v2.model.germ.response.BrAPIGermplasmPedigreeResponse;
import org.brapi.v2.model.germ.response.BrAPIGermplasmProgenyResponse;
import org.breedinginsight.api.auth.ProgramSecured;
import org.breedinginsight.api.auth.ProgramSecuredRoleGroup;
import org.breedinginsight.api.model.v1.request.query.SearchRequest;
Expand All @@ -21,17 +28,20 @@
import org.breedinginsight.api.model.v1.validators.SearchValid;
import org.breedinginsight.brapi.v1.controller.BrapiVersion;
import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery;
import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO;
import org.breedinginsight.brapi.v2.model.request.query.GermplasmQuery;
import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper;
import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService;
import org.breedinginsight.brapps.importer.model.exports.FileType;
import org.breedinginsight.daos.ProgramDAO;
import org.breedinginsight.model.DownloadFile;
import org.breedinginsight.services.exceptions.DoesNotExistException;
import org.breedinginsight.utilities.response.ResponseUtils;

import javax.inject.Inject;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

Expand All @@ -42,11 +52,16 @@ public class GermplasmController {

private final BrAPIGermplasmService germplasmService;
private final GermplasmQueryMapper germplasmQueryMapper;
private final ProgramDAO programDAO;
private final BrAPIGermplasmDAO germplasmDAO;


@Inject
public GermplasmController(BrAPIGermplasmService germplasmService, GermplasmQueryMapper germplasmQueryMapper) {
public GermplasmController(BrAPIGermplasmService germplasmService, GermplasmQueryMapper germplasmQueryMapper, ProgramDAO programDAO, BrAPIGermplasmDAO germplasmDAO) {
this.germplasmService = germplasmService;
this.germplasmQueryMapper = germplasmQueryMapper;
this.programDAO = programDAO;
this.germplasmDAO = germplasmDAO;
}

@Post("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/search/germplasm{?queryParams*}")
Expand Down Expand Up @@ -124,4 +139,152 @@ public HttpResponse<Response<BrAPIGermplasm>> getSingleGermplasm(
return HttpResponse.status(HttpStatus.NOT_FOUND, "Germplasm not found");
}
}

@Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/germplasm/{germplasmId}/pedigree{?notation}{?includeSiblings}")
@Produces(MediaType.APPLICATION_JSON)
@ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL})
public HttpResponse<BrAPIGermplasmPedigreeResponse> getGermplasmPedigreeInfo(
@PathVariable("programId") UUID programId,
@PathVariable("germplasmId") String germplasmId,
@QueryValue(defaultValue = "") String notation,
@QueryValue(defaultValue = "false") Boolean includeSiblings)
{
try {
log.debug("fetching pedigree for germ id:" + germplasmId +" for program: " + programId);
BrAPIPedigreeNode returnNode;
BrAPIGermplasmPedigreeResponse response;
BrAPIMetadata metadata;
if (germplasmId.endsWith("-Unknown")) {
//Unknown germplasm node
returnNode = new BrAPIPedigreeNode();
returnNode.setGermplasmDbId(germplasmId);
returnNode.setGermplasmName("Unknown");

BrAPIPedigreeNodeParents emptyParents = new BrAPIPedigreeNodeParents();
returnNode.addParentsItem(emptyParents);

returnNode.setSiblings(new ArrayList<>());
returnNode.setPedigree("/");
metadata = new BrAPIMetadata();
BrAPIStatus status = new BrAPIStatus();
status.setMessage("Complete");
status.setMessageType(BrAPIStatus.MessageTypeEnum.INFO);
BrAPIIndexPagination pagination = new BrAPIIndexPagination();
pagination.setTotalPages(1);
pagination.setTotalCount(1);
pagination.setPageSize(1);
pagination.setCurrentPage(0);
metadata.setStatus(Collections.singletonList(status));
metadata.setPagination(pagination);
response = new BrAPIGermplasmPedigreeResponse();
} else {
BrAPIGermplasm germplasm = germplasmService.getGermplasmByDBID(programId, germplasmId);
//Forward the pedigree call to the backing BrAPI system of the program passing the germplasmDbId that came in the request
GermplasmApi api = new GermplasmApi(programDAO.getCoreClient(programId));
ApiResponse<BrAPIGermplasmPedigreeResponse> pedigreeResponse = api.germplasmGermplasmDbIdPedigreeGet(germplasmId, notation, includeSiblings);
returnNode = pedigreeResponse.getBody().getResult();
metadata = pedigreeResponse.getBody().getMetadata();
response = pedigreeResponse.getBody();

//Add nodes for unknown parents if applicable
if (germplasm.getAdditionalInfo().has("femaleParentUnknown") && germplasm.getAdditionalInfo().get("femaleParentUnknown").getAsBoolean()) {
BrAPIPedigreeNodeParents unknownFemale = new BrAPIPedigreeNodeParents();
unknownFemale.setGermplasmDbId(germplasm.getGermplasmDbId()+"-F-Unknown");
unknownFemale.setGermplasmName("Unknown");
unknownFemale.setParentType(BrAPIParentType.FEMALE);
returnNode.addParentsItem(unknownFemale);
}
if (germplasm.getAdditionalInfo().has("maleParentUnknown") && germplasm.getAdditionalInfo().get("maleParentUnknown").getAsBoolean()) {
BrAPIPedigreeNodeParents unknownMale = new BrAPIPedigreeNodeParents();
unknownMale.setGermplasmDbId(germplasm.getGermplasmDbId()+"-M-Unknown");
unknownMale.setGermplasmName("Unknown");
unknownMale.setParentType(BrAPIParentType.MALE);
returnNode.addParentsItem(unknownMale);
}

//If no parents, need to add empty parents for display to work
if (returnNode.getParents().isEmpty()) {
BrAPIPedigreeNodeParents emptyParents = new BrAPIPedigreeNodeParents();
returnNode.addParentsItem(emptyParents);
}
}
response.setResult(returnNode);
response.setMetadata(metadata);
return HttpResponse.ok(response);
} catch (InternalServerException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving pedigree node");
} catch (DoesNotExistException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.NOT_FOUND, "Pedigree node not found");
} catch (ApiException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving pedigree node");
}
}

@Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/germplasm/{germplasmId}/progeny")
@Produces(MediaType.APPLICATION_JSON)
@ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL})
public HttpResponse<BrAPIGermplasmProgenyResponse> getGermplasmProgenyInfo(
@PathVariable("programId") UUID programId,
@PathVariable("germplasmId") String germplasmId) {
try {
log.debug("fetching progeny for germ id:" + germplasmId +" for program: " + programId);
BrAPIProgenyNode returnNode;
BrAPIGermplasmProgenyResponse response;
BrAPIMetadata metadata;
if (germplasmId.endsWith("-Unknown")) {
//Unknown germplasm node, only has one child
//We know progeny and parent type based on germplasmId
returnNode = new BrAPIProgenyNode();
returnNode.setGermplasmDbId(germplasmId);
returnNode.setGermplasmName("Unknown [-0]");
ArrayList<BrAPIProgenyNodeProgeny> progeny = new ArrayList<>();
BrAPIProgenyNodeProgeny singleProgeny = new BrAPIProgenyNodeProgeny();
singleProgeny.setGermplasmDbId(germplasmId.split("-")[0]);
singleProgeny.setGermplasmName("Name"); //does not seem necessary, preferable to avoid longer id string/making more endpoint calls
if (germplasmId.endsWith("F-Unknown")) {
singleProgeny.setParentType(BrAPIParentType.FEMALE);
} else {
singleProgeny.setParentType(BrAPIParentType.MALE);
}
returnNode.setProgeny(Collections.singletonList(singleProgeny));

metadata = new BrAPIMetadata();
BrAPIStatus status = new BrAPIStatus();
status.setMessage("Complete");
status.setMessageType(BrAPIStatus.MessageTypeEnum.INFO);
BrAPIIndexPagination pagination = new BrAPIIndexPagination();
pagination.setTotalPages(1);
pagination.setTotalCount(1);
pagination.setPageSize(1);
pagination.setCurrentPage(0);
metadata.setStatus(Collections.singletonList(status));
metadata.setPagination(pagination);
response = new BrAPIGermplasmProgenyResponse();
response.setResult(returnNode);
response.setMetadata(metadata);
return HttpResponse.ok(response);
} else {
//Forward the progeny call to the backing BrAPI system of the program passing the germplasmDbId that came in the request
GermplasmApi api = new GermplasmApi(programDAO.getCoreClient(programId));
ApiResponse<BrAPIGermplasmProgenyResponse> progenyResponse = api.germplasmGermplasmDbIdProgenyGet(germplasmId);

//If no progeny, need to add empty progeny for display to work
if (progenyResponse.getBody().getResult().getProgeny().isEmpty()) {
BrAPIProgenyNodeProgeny emptyProgeny = new BrAPIProgenyNodeProgeny();
progenyResponse.getBody().getResult().addProgenyItem(emptyProgeny);
}
return HttpResponse.ok(progenyResponse.getBody());
}
} catch (InternalServerException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving pedigree node");
} catch (ApiException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving pedigree node");
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,13 @@ private Map<String,BrAPIGermplasm> processGermplasmForDisplay(List<BrAPIGermplas
additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_GID, maleParentAccessionNumber);
}
}
//Add Unknown germplasm for display
if (germplasm.getAdditionalInfo().has("femaleParentUnknown") && germplasm.getAdditionalInfo().get("femaleParentUnknown").getAsBoolean()) {
namePedigreeString = "Unknown";
}
if (germplasm.getAdditionalInfo().has("maleParentUnknown") && germplasm.getAdditionalInfo().get("maleParentUnknown").getAsBoolean()) {
namePedigreeString += "/Unknown";
}
//For use in individual germplasm display
additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_PEDIGREE_BY_NAME, namePedigreeString);
additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_PEDIGREE_BY_UUID, uuidPedigreeString);
Expand Down Expand Up @@ -242,4 +249,16 @@ public BrAPIGermplasm getGermplasmByUUID(String germplasmId, UUID programId) thr
return germplasm;
}

public BrAPIGermplasm getGermplasmByDBID(String germplasmDbId, UUID programId) throws ApiException, DoesNotExistException {
Map<String, BrAPIGermplasm> cache = programGermplasmCache.get(programId);
//key is UUID, want to filter by DBID
BrAPIGermplasm germplasm = null;
if (cache != null) {
germplasm = cache.values().stream().filter(x -> x.getGermplasmDbId().equals(germplasmDbId)).collect(Collectors.toList()).get(0);
}
if (germplasm == null) {
throw new DoesNotExistException("DBID for this germplasm does not exist");
}
return germplasm;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ public BrAPIGermplasm getGermplasmByUUID(UUID programId, String germplasmId) thr
}
}

public BrAPIGermplasm getGermplasmByDBID(UUID programId, String germplasmId) throws DoesNotExistException {
try {
return germplasmDAO.getGermplasmByDBID(germplasmId, programId);
} catch (ApiException e) {
throw new InternalServerException(e.getMessage(), e);
}
}

public List<BrAPIListSummary> getGermplasmListsByProgramId(UUID programId, HttpRequest<String> request) throws DoesNotExistException, ApiException {

if (!programService.exists(programId)) {
Expand Down
Loading