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
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import javax.inject.Inject;
import javax.validation.Valid;
import java.util.HashMap;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This import statement isn't needed

import java.util.List;
import java.util.UUID;

Expand Down Expand Up @@ -61,4 +62,25 @@ public HttpResponse<Response<DataResponse<List<BrAPITrial>>>> getExperiments(
return HttpResponse.status(HttpStatus.NOT_FOUND, e.getMessage());
}
}

@Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/trials/{trialId}")
@Produces(MediaType.APPLICATION_JSON)
@ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL})
public HttpResponse<Response<BrAPITrial>> getExperimentById(
@PathVariable("programId") UUID programId,
@PathVariable("trialId") UUID trialId,
@QueryValue(defaultValue = "false") Boolean stats){
try {
String logMsg = "fetching trial id:" + trialId +" for program: " + programId;
if(stats){
logMsg += " with stats";
}
log.debug(logMsg);
Response<BrAPITrial> response = new Response<>(experimentService.getTrialDataByUUID(programId, trialId, stats));
return HttpResponse.ok(response);
} catch (DoesNotExistException e) {
log.info(e.getMessage(), e);
return HttpResponse.status(HttpStatus.NOT_FOUND, e.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package org.breedinginsight.brapi.v2.services;

import io.micronaut.context.annotation.Property;
import io.micronaut.http.server.exceptions.InternalServerException;
import org.brapi.client.v2.model.exceptions.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.brapi.v2.model.core.BrAPITrial;
import org.brapi.v2.model.pheno.BrAPIObservationUnit;
import org.breedinginsight.brapps.importer.daos.BrAPIObservationUnitDAO;
import org.breedinginsight.brapps.importer.daos.BrAPITrialDAO;
import org.breedinginsight.services.ProgramService;
import org.breedinginsight.services.exceptions.DoesNotExistException;
import org.breedinginsight.utilities.Utilities;

import javax.inject.Inject;
import javax.inject.Singleton;
Expand All @@ -17,19 +18,38 @@
@Singleton
public class BrAPITrialService {

@Property(name = "brapi.server.reference-source")
private String referenceSource;

private final BrAPITrialDAO trialDAO;
private final ProgramService programService;
private final BrAPIObservationUnitDAO ouDAO;

@Inject
public BrAPITrialService(ProgramService programService, BrAPITrialDAO trialDAO) {
this.programService = programService;
public BrAPITrialService( BrAPITrialDAO trialDAO,BrAPIObservationUnitDAO ouDAO) {
this.trialDAO = trialDAO;
this.ouDAO = ouDAO;
}

public List<BrAPITrial> getExperiments(UUID programId) throws ApiException, DoesNotExistException {
return trialDAO.getTrials(programId);
}

public BrAPITrial getTrialDataByUUID(UUID programId, UUID trialId, boolean stats) throws DoesNotExistException {
try {
BrAPITrial trial = trialDAO.getTrialById(programId,trialId).orElseThrow(() -> new DoesNotExistException("Trial does not exist"));
//Remove the [program key] from the trial name
trial.setTrialName( Utilities.removeUnknownProgramKey( trial.getTrialName()) );
if( stats ){
int environmentsCount = 1; // For now this is hardcoded to 1, because we are only supporting one environment per experiment
long germplasmCount = countGermplasm(programId, trial.getTrialDbId());
trial.putAdditionalInfoItem("environmentsCount", environmentsCount);
trial.putAdditionalInfoItem("germplasmCount", germplasmCount);
}
return trial;
} catch (ApiException e) {
throw new InternalServerException(e.getMessage(), e);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a error log message here. You can use Utilities#generateApiExceptionLogMessage to generate a log message from the ApiException object.

}
}

private long countGermplasm(UUID programId, String trialDbId) throws ApiException, DoesNotExistException{
List<BrAPIObservationUnit> obUnits = ouDAO.getObservationUnitsForTrialDbId(programId, trialDbId);
return obUnits.stream().map(BrAPIObservationUnit::getGermplasmDbId).distinct().count();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
import org.breedinginsight.brapps.importer.services.ExternalReferenceSource;
import org.breedinginsight.daos.ProgramDAO;
import org.breedinginsight.model.Program;
import org.breedinginsight.services.ProgramService;
import org.breedinginsight.services.brapi.BrAPIEndpointProvider;
import org.breedinginsight.services.exceptions.DoesNotExistException;
import org.breedinginsight.utilities.BrAPIDAOUtil;

import javax.inject.Inject;
Expand All @@ -36,44 +38,24 @@

@Singleton
public class BrAPIObservationUnitDAO {

public static String OU_ID_REFERENCE_SOURCE = "ou_id";

private ProgramDAO programDAO;
private ImportDAO importDAO;
private final ProgramDAO programDAO;
private final ImportDAO importDAO;
private final BrAPIDAOUtil brAPIDAOUtil;
private final BrAPIEndpointProvider brAPIEndpointProvider;
private final ProgramService programService;

private final String referenceSource;

@Inject
public BrAPIObservationUnitDAO(ProgramDAO programDAO, ImportDAO importDAO, BrAPIDAOUtil brAPIDAOUtil, BrAPIEndpointProvider brAPIEndpointProvider, @Property(name = "brapi.server.reference-source") String referenceSource) {
public BrAPIObservationUnitDAO(ProgramDAO programDAO, ImportDAO importDAO, BrAPIDAOUtil brAPIDAOUtil, BrAPIEndpointProvider brAPIEndpointProvider, ProgramService programService, @Property(name = "brapi.server.reference-source") String referenceSource) {
this.programDAO = programDAO;
this.importDAO = importDAO;
this.brAPIDAOUtil = brAPIDAOUtil;
this.brAPIEndpointProvider = brAPIEndpointProvider;
this.referenceSource = referenceSource;
this.programService = programService;
}

/*
public List<BrAPIObservationUnit> getObservationUnitsByNameAndStudyName(List<Pair<String, String>> nameStudyPairs, BrAPIProgram brAPIProgram) throws ApiException {

List<String> observationUnitNames = nameStudyPairs.stream().map(Pair::getLeft).collect(Collectors.toList());
BrAPIObservationUnitSearchRequest observationUnitSearchRequest = new BrAPIObservationUnitSearchRequest();
observationUnitSearchRequest.setObservationUnitNames(new ArrayList<>(observationUnitNames));
observationUnitSearchRequest.setProgramDbIds(List.of(brAPIProgram.getProgramDbId()));
ObservationUnitsApi api = brAPIProvider.getObservationUnitApi(BrAPIClientType.CORE);
List<BrAPIObservationUnit> observationUnits = BrAPIDAOUtil.search(
api::searchObservationunitsPost,
api::searchObservationunitsSearchResultsDbIdGet,
observationUnitSearchRequest
);

// TODO: Select for study as well
return observationUnits;
}
*/

public List<BrAPIObservationUnit> getObservationUnitByName(List<String> observationUnitNames, Program program) throws ApiException {
if(observationUnitNames.isEmpty()) {
return Collections.emptyList();
Expand Down Expand Up @@ -115,12 +97,25 @@ public List<BrAPIObservationUnit> getObservationUnitsById(Collection<String> obs
public List<BrAPIObservationUnit> getObservationUnitsForStudyDbId(@NotNull String studyDbId, Program program) throws ApiException {
BrAPIObservationUnitSearchRequest observationUnitSearchRequest = new BrAPIObservationUnitSearchRequest();
observationUnitSearchRequest.programDbIds(List.of(program.getBrapiProgram()
.getProgramDbId()));
.getProgramDbId()));
observationUnitSearchRequest.studyDbIds(List.of(studyDbId));

ObservationUnitsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), ObservationUnitsApi.class);
return brAPIDAOUtil.search(api::searchObservationunitsPost,
api::searchObservationunitsSearchResultsDbIdGet,
observationUnitSearchRequest);
api::searchObservationunitsSearchResultsDbIdGet,
observationUnitSearchRequest);
}
public List<BrAPIObservationUnit> getObservationUnitsForTrialDbId(@NotNull UUID programId, @NotNull String trialDbId) throws ApiException, DoesNotExistException {
Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Program id does not exist"));

BrAPIObservationUnitSearchRequest observationUnitSearchRequest = new BrAPIObservationUnitSearchRequest();
observationUnitSearchRequest.programDbIds(List.of(program.getBrapiProgram()
.getProgramDbId()));
observationUnitSearchRequest.trialDbIds(List.of(trialDbId));

ObservationUnitsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), ObservationUnitsApi.class);
return brAPIDAOUtil.search(api::searchObservationunitsPost,
api::searchObservationunitsSearchResultsDbIdGet,
observationUnitSearchRequest);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
import org.brapi.client.v2.modules.core.TrialsApi;
import org.brapi.v2.model.core.BrAPITrial;
import org.brapi.v2.model.core.request.BrAPITrialSearchRequest;
import org.brapi.v2.model.core.response.BrAPIListDetails;
import org.brapi.v2.model.core.response.BrAPIListResponse;
import org.brapi.v2.model.core.response.BrAPITrialSingleResponse;
import org.breedinginsight.brapps.importer.model.ImportUpload;
import org.breedinginsight.brapps.importer.services.ExternalReferenceSource;
import org.breedinginsight.daos.ProgramDAO;
Expand All @@ -40,11 +37,13 @@

@Singleton
public class BrAPITrialDAO {
@Property(name = "brapi.server.reference-source")
private String BRAPI_REFERENCE_SOURCE;

private ProgramDAO programDAO;
private ImportDAO importDAO;
private final ProgramDAO programDAO;
private final ImportDAO importDAO;
private final BrAPIDAOUtil brAPIDAOUtil;
private ProgramService programService;
private final ProgramService programService;
private final BrAPIEndpointProvider brAPIEndpointProvider;

private final String referenceSource;
Expand Down Expand Up @@ -75,6 +74,19 @@ public List<BrAPITrial> getTrialsByName(List<String> trialNames, Program program
);
}

private List<BrAPITrial> getTrialsByExRef(String referenceSource, String referenceId, Program program) throws ApiException {
BrAPITrialSearchRequest trialSearch = new BrAPITrialSearchRequest();
trialSearch.programDbIds(List.of(program.getBrapiProgram().getProgramDbId()));
trialSearch.externalReferenceSources(List.of(referenceSource));
trialSearch.externalReferenceIDs(List.of(referenceId));
TrialsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), TrialsApi.class);
return brAPIDAOUtil.search(
api::searchTrialsPost,
api::searchTrialsSearchResultsDbIdGet,
trialSearch
);
}

public List<BrAPITrial> createBrAPITrials(List<BrAPITrial> brAPITrialList, UUID programId, ImportUpload upload) throws ApiException {
TrialsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), TrialsApi.class);
return brAPIDAOUtil.post(brAPITrialList, upload, api::trialsPost, importDAO::update);
Expand Down Expand Up @@ -123,12 +135,18 @@ private List<BrAPITrial> processExperimentsForDisplay(List<BrAPITrial> trials, S
return displayExperiments;
}

public Optional<BrAPITrial> getTrialByDbId(String trialDbId, Program program) throws ApiException {
List<BrAPITrial> trials = getTrialsByDbIds(List.of(trialDbId), program);
public Optional<BrAPITrial> getTrialById(UUID programId, UUID trialDbId) throws ApiException, DoesNotExistException {
Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Program id does not exist"));
String refSoure = Utilities.generateReferenceSource(BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS);
List<BrAPITrial> trials = getTrialsByExRef(refSoure, trialDbId.toString(), program);

return Utilities.getSingleOptional(trials);
}

public Optional<BrAPITrial> getTrialByDbId(String trialDbId, Program program) throws ApiException {
List<BrAPITrial> trials = getTrialsByDbIds(List.of(trialDbId), program);
return Utilities.getSingleOptional(trials);
}
public List<BrAPITrial> getTrialsByDbIds(Collection<String> trialDbIds, Program program) throws ApiException {
if(trialDbIds.isEmpty()) {
return Collections.emptyList();
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/org/breedinginsight/utilities/Utilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,17 @@ public static String appendProgramKey( String original, String programKey ){
return appendProgramKey( original, programKey, null);
}

/**
* Remove unknown program key from a string. Returns a new value instead of altering original string.
*
* @param original - The string with a [program key]
* @return - the original string without the [program key]
*/
public static String removeUnknownProgramKey(String original) {
return original.replaceAll("\\[.*\\]", "").trim();
}


/**
* Remove program key from a string. Returns a new value instead of altering original string.
*
Expand Down