From 7f683a7da1b068aa8e2674090c5ebfa72bbe0cac Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:13:07 -0400 Subject: [PATCH 01/13] [BI-2330] - added service --- .../v2/services/BrAPIObservationService.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java new file mode 100644 index 000000000..3cdbd9a42 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java @@ -0,0 +1,68 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.brapi.v2.services; + +import io.micronaut.context.annotation.Property; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.NotImplementedException; +import org.brapi.v2.model.pheno.*; +import org.breedinginsight.brapi.v2.dao.BrAPIObservationDAO; +import org.breedinginsight.services.ProgramService; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.*; + +@Slf4j +@Singleton +public class BrAPIObservationService { + private final ProgramService programService; + private final BrAPITrialService trialService; + private final BrAPIObservationDAO observationDAO; + private final String referenceSource; + + @Inject + public BrAPIObservationService( + ProgramService programService, + BrAPITrialService trialService, + BrAPIObservationDAO observationDAO, + @Property(name = "brapi.server.reference-source") String referenceSource) { + this.programService = programService; + this.trialService = trialService; + this.observationDAO = observationDAO; + this.referenceSource = referenceSource; + } + + // TODO: add parameters. + public BrAPIObservationTable getBrAPIObservationTable() { + BrAPIObservationTable observationTable = new BrAPIObservationTable() + .headerRow(Arrays.asList(BrAPIObservationTableHeaderRowEnum.values())) + .observationVariables(getTableObservationVariables()) + .data(getTableData()); + return observationTable; + } + + private List getTableObservationVariables() { + throw new NotImplementedException(); // TODO: implement. + } + + private List> getTableData() { + throw new NotImplementedException(); // TODO: implement. + } + +} From 07c36b28183198b0f815b81467eca217c76f8e30 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:14:30 -0400 Subject: [PATCH 02/13] [BI-2330] - updated serverinfo response --- .../java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index f806f5a1b..be5046077 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -113,6 +113,7 @@ public BrAPIServerInfoResponse programServerinfo(@PathVariable("programId") UUID .setBase("variables").GET().addPath("{observationVariableDbId}").GET().withSearch() .setBase("observationunits").GET().addPath("{observationUnitDbId}").GET().setPath("table").GET().withSearch() .setBase("observations").GET().addPath("{observationDbId}").GET().setPath("table").GET().withSearch() + .setBase("observations").addPath("tables").GET() .setBase("observationlevels").GET().build() //GENOTYPING - TODO // .setBase("calls").GET().withSearch() From 39395148152f713987e8330dc7f5606ae957f873 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:22:44 -0400 Subject: [PATCH 03/13] [BI-2330] - added dependencies to controller --- .../brapi/v2/BrAPIObservationsController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java index 5e70846ac..88bc68054 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java @@ -24,11 +24,17 @@ import io.micronaut.security.rules.SecurityRule; import lombok.extern.slf4j.Slf4j; import org.brapi.v2.model.pheno.BrAPIObservation; +import org.brapi.v2.model.pheno.BrAPIObservationTable; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; +import org.breedinginsight.api.model.v1.response.DataResponse; +import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.brapi.v1.controller.BrapiVersion; +import org.breedinginsight.brapi.v2.services.BrAPIObservationService; +import org.breedinginsight.services.ProgramService; import javax.annotation.Nullable; +import javax.inject.Inject; import java.util.Date; import java.util.List; import java.util.Map; @@ -39,6 +45,15 @@ @Secured(SecurityRule.IS_AUTHENTICATED) public class BrAPIObservationsController { + private final BrAPIObservationService observationService; + private final ProgramService programService; + + @Inject + public BrAPIObservationsController(BrAPIObservationService observationService, ProgramService programService) { + this.observationService = observationService; + this.programService = programService; + } + @Get("/observations") @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.PROGRAM_SCOPED_ROLES}) public HttpResponse observationsGet(@PathVariable("programId") UUID programId, From 371cc73b7f1a1a4da8ca2e85348d94bf3259d4e7 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:26:37 -0400 Subject: [PATCH 04/13] [BI-2330] - created ObservationQuery --- .../model/request/query/ObservationQuery.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java new file mode 100644 index 000000000..f9c93e0d0 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -0,0 +1,97 @@ +package org.breedinginsight.brapi.v2.model.request.query; + +import io.micronaut.core.annotation.Introspected; +import lombok.Getter; +import org.breedinginsight.api.model.v1.request.query.FilterRequest; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; +import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; +import org.jooq.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Introspected +public class ObservationQuery extends BrapiQuery { + private String accept; + private String observationUnitDbId; + private String observationVariableDbId; + private String locationDbId; + private String seasonDbId; + private String observationLevel; + private String searchResultsDbId; + private String observationTimeStampRangeStart; + private String observationTimeStampRangeEnd; + private String programDbId; + private String trialDbId; + private String studyDbId; + private String germplasmDbId; + private String observationUnitLevelName; + private String observationUnitLevelOrder; + private String observationUnitLevelCode; + private String observationUnitLevelRelationshipName; + private String observationUnitLevelRelationshipOrder; + private String observationUnitLevelRelationshipCode; + + public SearchRequest constructSearchRequest() { + List filters = new ArrayList<>(); + if (!StringUtils.isBlank(getAccept())) { + filters.add(constructFilterRequest("accept", getAccept())); + } + if (!StringUtils.isBlank(getObservationUnitDbId())) { + filters.add(constructFilterRequest("observationUnitDbId", getObservationUnitDbId())); + } + if (!StringUtils.isBlank(getObservationVariableDbId())) { + filters.add(constructFilterRequest("observationVariableDbId", getObservationVariableDbId())); + } + if (!StringUtils.isBlank(getLocationDbId())) { + filters.add(constructFilterRequest("locationDbId", getLocationDbId())); + } + if (!StringUtils.isBlank(getSeasonDbId())) { + filters.add(constructFilterRequest("seasonDbId", getSeasonDbId())); + } + if (!StringUtils.isBlank(getObservationLevel())) { + filters.add(constructFilterRequest("observationLevel", getObservationLevel())); + } + if (!StringUtils.isBlank(getSearchResultsDbId())) { + filters.add(constructFilterRequest("searchResultsDbId", getSearchResultsDbId())); + } + if (!StringUtils.isBlank(getObservationTimeStampRangeStart())) { + filters.add(constructFilterRequest("observationTimeStampRangeStart", getObservationTimeStampRangeStart())); + } + if (!StringUtils.isBlank(getObservationTimeStampRangeEnd())) { + filters.add(constructFilterRequest("observationTimeStampRangeEnd", getObservationTimeStampRangeEnd())); + } + if (!StringUtils.isBlank(getProgramDbId())) { + filters.add(constructFilterRequest("programDbId", getProgramDbId())); + } + if (!StringUtils.isBlank(getTrialDbId())) { + filters.add(constructFilterRequest("trialDbId", getTrialDbId())); + } + if (!StringUtils.isBlank(getStudyDbId())) { + filters.add(constructFilterRequest("studyDbId", getStudyDbId())); + } + if (!StringUtils.isBlank(getGermplasmDbId())) { + filters.add(constructFilterRequest("germplasmDbId", getGermplasmDbId())); + } + if (!StringUtils.isBlank(getObservationUnitLevelName())) { + filters.add(constructFilterRequest("observationUnitLevelName", getObservationUnitLevelName())); + } + if (!StringUtils.isBlank(getObservationUnitLevelOrder())) { + filters.add(constructFilterRequest("observationUnitLevelOrder", getObservationUnitLevelOrder())); + } + if (!StringUtils.isBlank(getObservationUnitLevelCode())) { + filters.add(constructFilterRequest("observationUnitLevelCode", getObservationUnitLevelCode())); + } + if (!StringUtils.isBlank(getObservationUnitLevelRelationshipName())) { + filters.add(constructFilterRequest("observationUnitLevelRelationshipName", getObservationUnitLevelRelationshipName())); + } + if (!StringUtils.isBlank(getObservationUnitLevelRelationshipOrder())) { + filters.add(constructFilterRequest("observationUnitLevelRelationshipOrder", getObservationUnitLevelRelationshipOrder())); + } + if (!StringUtils.isBlank(getObservationUnitLevelRelationshipCode())) { + filters.add(constructFilterRequest("observationUnitLevelRelationshipCode", getObservationUnitLevelRelationshipCode())); + } + return new SearchRequest(filters); + } +} From 1339fb08c313451a9556bbd2943fce859fa8c8e5 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:12:12 -0400 Subject: [PATCH 05/13] [BI-2330] - updated ObservationQuery --- .../model/request/query/ObservationQuery.java | 75 +++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index f9c93e0d0..674bd1f63 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -2,10 +2,10 @@ import io.micronaut.core.annotation.Introspected; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import org.breedinginsight.api.model.v1.request.query.FilterRequest; import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; -import org.jooq.tools.StringUtils; import java.util.ArrayList; import java.util.List; @@ -13,7 +13,6 @@ @Getter @Introspected public class ObservationQuery extends BrapiQuery { - private String accept; private String observationUnitDbId; private String observationVariableDbId; private String locationDbId; @@ -35,9 +34,6 @@ public class ObservationQuery extends BrapiQuery { public SearchRequest constructSearchRequest() { List filters = new ArrayList<>(); - if (!StringUtils.isBlank(getAccept())) { - filters.add(constructFilterRequest("accept", getAccept())); - } if (!StringUtils.isBlank(getObservationUnitDbId())) { filters.add(constructFilterRequest("observationUnitDbId", getObservationUnitDbId())); } @@ -94,4 +90,73 @@ public SearchRequest constructSearchRequest() { } return new SearchRequest(filters); } + + /** + * Build a query string from the ObservationQuery object. + */ + public String toQueryString() { + StringBuilder queryStringBuilder = new StringBuilder(); + if (StringUtils.isNotBlank(observationUnitDbId)) { + queryStringBuilder.append("observationUnitDbId=").append(observationUnitDbId).append("&"); + } + if (StringUtils.isNotBlank(observationVariableDbId)) { + queryStringBuilder.append("observationVariableDbId=").append(observationVariableDbId).append("&"); + } + if (StringUtils.isNotBlank(locationDbId)) { + queryStringBuilder.append("locationDbId=").append(locationDbId).append("&"); + } + if (StringUtils.isNotBlank(seasonDbId)) { + queryStringBuilder.append("seasonDbId=").append(seasonDbId).append("&"); + } + if (StringUtils.isNotBlank(observationLevel)) { + queryStringBuilder.append("observationLevel=").append(observationLevel).append("&"); + } + if (StringUtils.isNotBlank(searchResultsDbId)) { + queryStringBuilder.append("searchResultsDbId=").append(searchResultsDbId).append("&"); + } + if (StringUtils.isNotBlank(observationTimeStampRangeStart)) { + queryStringBuilder.append("observationTimeStampRangeStart=").append(observationTimeStampRangeStart).append("&"); + } + if (StringUtils.isNotBlank(observationTimeStampRangeEnd)) { + queryStringBuilder.append("observationTimeStampRangeEnd=").append(observationTimeStampRangeEnd).append("&"); + } + if (StringUtils.isNotBlank(programDbId)) { + queryStringBuilder.append("programDbId=").append(programDbId).append("&"); + } + if (StringUtils.isNotBlank(trialDbId)) { + queryStringBuilder.append("trialDbId=").append(trialDbId).append("&"); + } + if (StringUtils.isNotBlank(studyDbId)) { + queryStringBuilder.append("studyDbId=").append(studyDbId).append("&"); + } + if (StringUtils.isNotBlank(germplasmDbId)) { + queryStringBuilder.append("germplasmDbId=").append(germplasmDbId).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelName)) { + queryStringBuilder.append("observationUnitLevelName=").append(observationUnitLevelName).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelOrder)) { + queryStringBuilder.append("observationUnitLevelOrder=").append(observationUnitLevelOrder).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelCode)) { + queryStringBuilder.append("observationUnitLevelCode=").append(observationUnitLevelCode).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelRelationshipName)) { + queryStringBuilder.append("observationUnitLevelRelationshipName=").append(observationUnitLevelRelationshipName).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelRelationshipOrder)) { + queryStringBuilder.append("observationUnitLevelRelationshipOrder=").append(observationUnitLevelRelationshipOrder).append("&"); + } + if (StringUtils.isNotBlank(observationUnitLevelRelationshipCode)) { + queryStringBuilder.append("observationUnitLevelRelationshipCode=").append(observationUnitLevelRelationshipCode).append("&"); + } + + // If any query parameters were added, remove the trailing "&" from the query string. + if (queryStringBuilder.length() > 0) { + queryStringBuilder.deleteCharAt(queryStringBuilder.length() - 1); + } + + return queryStringBuilder.toString(); + } + } From a2eda96d872642df1d7ce90495d76caba305433e Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:24:32 -0400 Subject: [PATCH 06/13] [BI-2330] - improved toQueryString method --- .../model/request/query/ObservationQuery.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index 674bd1f63..cca3c3d48 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -95,68 +95,68 @@ public SearchRequest constructSearchRequest() { * Build a query string from the ObservationQuery object. */ public String toQueryString() { - StringBuilder queryStringBuilder = new StringBuilder(); + StringBuilder queryString = new StringBuilder(); + queryString.append("?"); if (StringUtils.isNotBlank(observationUnitDbId)) { - queryStringBuilder.append("observationUnitDbId=").append(observationUnitDbId).append("&"); + queryString.append("observationUnitDbId=").append(observationUnitDbId).append("&"); } if (StringUtils.isNotBlank(observationVariableDbId)) { - queryStringBuilder.append("observationVariableDbId=").append(observationVariableDbId).append("&"); + queryString.append("observationVariableDbId=").append(observationVariableDbId).append("&"); } if (StringUtils.isNotBlank(locationDbId)) { - queryStringBuilder.append("locationDbId=").append(locationDbId).append("&"); + queryString.append("locationDbId=").append(locationDbId).append("&"); } if (StringUtils.isNotBlank(seasonDbId)) { - queryStringBuilder.append("seasonDbId=").append(seasonDbId).append("&"); + queryString.append("seasonDbId=").append(seasonDbId).append("&"); } if (StringUtils.isNotBlank(observationLevel)) { - queryStringBuilder.append("observationLevel=").append(observationLevel).append("&"); + queryString.append("observationLevel=").append(observationLevel).append("&"); } if (StringUtils.isNotBlank(searchResultsDbId)) { - queryStringBuilder.append("searchResultsDbId=").append(searchResultsDbId).append("&"); + queryString.append("searchResultsDbId=").append(searchResultsDbId).append("&"); } if (StringUtils.isNotBlank(observationTimeStampRangeStart)) { - queryStringBuilder.append("observationTimeStampRangeStart=").append(observationTimeStampRangeStart).append("&"); + queryString.append("observationTimeStampRangeStart=").append(observationTimeStampRangeStart).append("&"); } if (StringUtils.isNotBlank(observationTimeStampRangeEnd)) { - queryStringBuilder.append("observationTimeStampRangeEnd=").append(observationTimeStampRangeEnd).append("&"); + queryString.append("observationTimeStampRangeEnd=").append(observationTimeStampRangeEnd).append("&"); } if (StringUtils.isNotBlank(programDbId)) { - queryStringBuilder.append("programDbId=").append(programDbId).append("&"); + queryString.append("programDbId=").append(programDbId).append("&"); } if (StringUtils.isNotBlank(trialDbId)) { - queryStringBuilder.append("trialDbId=").append(trialDbId).append("&"); + queryString.append("trialDbId=").append(trialDbId).append("&"); } if (StringUtils.isNotBlank(studyDbId)) { - queryStringBuilder.append("studyDbId=").append(studyDbId).append("&"); + queryString.append("studyDbId=").append(studyDbId).append("&"); } if (StringUtils.isNotBlank(germplasmDbId)) { - queryStringBuilder.append("germplasmDbId=").append(germplasmDbId).append("&"); + queryString.append("germplasmDbId=").append(germplasmDbId).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelName)) { - queryStringBuilder.append("observationUnitLevelName=").append(observationUnitLevelName).append("&"); + queryString.append("observationUnitLevelName=").append(observationUnitLevelName).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelOrder)) { - queryStringBuilder.append("observationUnitLevelOrder=").append(observationUnitLevelOrder).append("&"); + queryString.append("observationUnitLevelOrder=").append(observationUnitLevelOrder).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelCode)) { - queryStringBuilder.append("observationUnitLevelCode=").append(observationUnitLevelCode).append("&"); + queryString.append("observationUnitLevelCode=").append(observationUnitLevelCode).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelRelationshipName)) { - queryStringBuilder.append("observationUnitLevelRelationshipName=").append(observationUnitLevelRelationshipName).append("&"); + queryString.append("observationUnitLevelRelationshipName=").append(observationUnitLevelRelationshipName).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelRelationshipOrder)) { - queryStringBuilder.append("observationUnitLevelRelationshipOrder=").append(observationUnitLevelRelationshipOrder).append("&"); + queryString.append("observationUnitLevelRelationshipOrder=").append(observationUnitLevelRelationshipOrder).append("&"); } if (StringUtils.isNotBlank(observationUnitLevelRelationshipCode)) { - queryStringBuilder.append("observationUnitLevelRelationshipCode=").append(observationUnitLevelRelationshipCode).append("&"); + queryString.append("observationUnitLevelRelationshipCode=").append(observationUnitLevelRelationshipCode).append("&"); } - // If any query parameters were added, remove the trailing "&" from the query string. - if (queryStringBuilder.length() > 0) { - queryStringBuilder.deleteCharAt(queryStringBuilder.length() - 1); - } + // If any query parameters were added, this removes the trailing "&" from the query string. + // If no query parameters were added, this removes the superfluous "?" from the query string. + queryString.deleteCharAt(queryString.length() - 1); - return queryStringBuilder.toString(); + return queryString.toString(); } } From 0b0139b7afec5f1d943fc3cf3fefa9196affcb03 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:31:23 -0400 Subject: [PATCH 07/13] [BI-2330] - translated studyDbId request param Mr. Bean integration working --- .../brapi/v2/BrAPIObservationsController.java | 86 ++++++++++++------- .../model/request/query/ObservationQuery.java | 33 +++++++ 2 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java index 88bc68054..12fa35cee 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java @@ -19,26 +19,35 @@ import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.*; +import io.micronaut.http.server.exceptions.InternalServerException; 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.client.v2.modules.phenotype.ObservationsApi; +import org.brapi.v2.model.BrAPIWSMIMEDataTypes; +import org.brapi.v2.model.core.BrAPIStudy; import org.brapi.v2.model.pheno.BrAPIObservation; -import org.brapi.v2.model.pheno.BrAPIObservationTable; +import org.brapi.v2.model.pheno.response.BrAPIObservationTableResponse; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; -import org.breedinginsight.api.model.v1.response.DataResponse; -import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.brapi.v1.controller.BrapiVersion; +import org.breedinginsight.brapi.v2.dao.BrAPIStudyDAO; +import org.breedinginsight.brapi.v2.model.request.query.ObservationQuery; import org.breedinginsight.brapi.v2.services.BrAPIObservationService; +import org.breedinginsight.daos.ProgramDAO; +import org.breedinginsight.model.Program; import org.breedinginsight.services.ProgramService; +import org.breedinginsight.services.brapi.BrAPIEndpointProvider; +import org.breedinginsight.utilities.Utilities; + import javax.annotation.Nullable; import javax.inject.Inject; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; @Slf4j @Controller("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2) @@ -47,11 +56,17 @@ public class BrAPIObservationsController { private final BrAPIObservationService observationService; private final ProgramService programService; + private final ProgramDAO programDAO; + private final BrAPIStudyDAO brAPIStudyDAO; + private final BrAPIEndpointProvider brAPIEndpointProvider; @Inject - public BrAPIObservationsController(BrAPIObservationService observationService, ProgramService programService) { + public BrAPIObservationsController(BrAPIObservationService observationService, ProgramService programService, ProgramDAO programDAO, ProgramDAO programDAO1, BrAPIStudyDAO brAPIStudyDAO, BrAPIEndpointProvider brAPIEndpointProvider) { this.observationService = observationService; this.programService = programService; + this.programDAO = programDAO1; + this.brAPIStudyDAO = brAPIStudyDAO; + this.brAPIEndpointProvider = brAPIEndpointProvider; } @Get("/observations") @@ -124,30 +139,39 @@ public HttpResponse observationsPut(@PathVariable("programId") UUID programId, @ return HttpResponse.notFound(); } - @Get("/observations/table") + @Get("/observations/table{?queryParams*}") @Produces({"application/json", "text/csv", "text/tsv"}) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.PROGRAM_SCOPED_ROLES}) - public HttpResponse observationsTableGet(@PathVariable("programId") UUID programId, - @Nullable @Header("Accept") String accept, - @Nullable @QueryValue("observationUnitDbId") String observationUnitDbId, - @Nullable @QueryValue("observationVariableDbId") String observationVariableDbId, - @Nullable @QueryValue("locationDbId") String locationDbId, - @Nullable @QueryValue("seasonDbId") String seasonDbId, - @Nullable @QueryValue("observationLevel") String observationLevel, - @Nullable @QueryValue("searchResultsDbId") String searchResultsDbId, - @Nullable @QueryValue("observationTimeStampRangeStart") Date observationTimeStampRangeStart, - @Nullable @QueryValue("observationTimeStampRangeEnd") Date observationTimeStampRangeEnd, - @Nullable @QueryValue("programDbId") String programDbId, - @Nullable @QueryValue("trialDbId") String trialDbId, - @Nullable @QueryValue("studyDbId") String studyDbId, - @Nullable @QueryValue("germplasmDbId") String germplasmDbId, - @Nullable @QueryValue("observationUnitLevelName") String observationUnitLevelName, - @Nullable @QueryValue("observationUnitLevelOrder") String observationUnitLevelOrder, - @Nullable @QueryValue("observationUnitLevelCode") String observationUnitLevelCode, - @Nullable @QueryValue("observationUnitLevelRelationshipName") String observationUnitLevelRelationshipName, - @Nullable @QueryValue("observationUnitLevelRelationshipOrder") String observationUnitLevelRelationshipOrder, - @Nullable @QueryValue("observationUnitLevelRelationshipCode") String observationUnitLevelRelationshipCode, - @Nullable @QueryValue("observationUnitLevelRelationshipDbId") String observationUnitLevelRelationshipDbId) { - return HttpResponse.notFound(); + public HttpResponse observationsTableGet( + @PathVariable("programId") UUID programId, + @QueryValue ObservationQuery queryParams) { + + Optional program = programService.getById(programId); + if(program.isEmpty()) { + return HttpResponse.notFound(); + } + + try { + // Translate studyDbId if provided. + if (queryParams.getStudyDbId() != null) { + Optional study = brAPIStudyDAO.getStudyByEnvironmentId(UUID.fromString(queryParams.getStudyDbId()), program.get()); + if (study.isEmpty()) { + return HttpResponse.notFound(); + } + queryParams.setStudyDbId(study.get().getStudyDbId()); + } + // TODO: Translate other DbIds if provided as well (but studyDbId is sufficient for Mr. Bean). + + ObservationsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), ObservationsApi.class); + ApiResponse response = api.observationsTableGet(BrAPIWSMIMEDataTypes.APPLICATION_JSON, queryParams.toBrAPIQueryParams()); + + return HttpResponse.ok(response.getBody()); + } catch (InternalServerException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving observations table"); + } catch (ApiException e) { + log.error(Utilities.generateApiExceptionLogMessage(e), e); + return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving observations table"); + } } } diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index cca3c3d48..bd0b2abb1 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -2,7 +2,9 @@ import io.micronaut.core.annotation.Introspected; import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; +import org.brapi.client.v2.model.queryParams.phenotype.ObservationTableQueryParams; import org.breedinginsight.api.model.v1.request.query.FilterRequest; import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; @@ -13,17 +15,26 @@ @Getter @Introspected public class ObservationQuery extends BrapiQuery { + @Setter private String observationUnitDbId; + @Setter private String observationVariableDbId; + @Setter private String locationDbId; + @Setter private String seasonDbId; private String observationLevel; + @Setter private String searchResultsDbId; private String observationTimeStampRangeStart; private String observationTimeStampRangeEnd; + @Setter private String programDbId; + @Setter private String trialDbId; + @Setter private String studyDbId; + @Setter private String germplasmDbId; private String observationUnitLevelName; private String observationUnitLevelOrder; @@ -32,6 +43,28 @@ public class ObservationQuery extends BrapiQuery { private String observationUnitLevelRelationshipOrder; private String observationUnitLevelRelationshipCode; + public ObservationTableQueryParams toBrAPIQueryParams() { + return new ObservationTableQueryParams() + .observationUnitDbId(observationUnitDbId) + .observationVariableDbId(observationVariableDbId) + .locationDbId(locationDbId) + .seasonDbId(seasonDbId) + .observationLevel(observationLevel) + .searchResultsDbId(searchResultsDbId) + .observationTimeStampRangeStart(observationTimeStampRangeStart) + .observationTimeStampRangeEnd(observationTimeStampRangeEnd) + .programDbId(programDbId) + .trialDbId(trialDbId) + .studyDbId(studyDbId) + .germplasmDbId(germplasmDbId) + .observationUnitLevelName(observationUnitLevelName) + .observationUnitLevelOrder(observationUnitLevelOrder) + .observationUnitLevelCode(observationUnitLevelCode) + .observationUnitLevelRelationshipName(observationUnitLevelRelationshipName) + .observationUnitLevelRelationshipOrder(observationUnitLevelRelationshipOrder) + .observationUnitLevelRelationshipCode(observationUnitLevelRelationshipCode); + } + public SearchRequest constructSearchRequest() { List filters = new ArrayList<>(); if (!StringUtils.isBlank(getObservationUnitDbId())) { From c7cddf9cb07301dc7b10961452c6216f85c7223c Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:57:57 -0400 Subject: [PATCH 08/13] [BI-2330] - updated test --- .../v2/BrAPIObservationsControllerIntegrationTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java index be3f61e4f..b9ba07d43 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java @@ -260,7 +260,7 @@ public void testPutMultipleObsNotFound() { @Test @SneakyThrows - public void testGetObsTableNotFound() { + public void testGetObsTableOK() { Flowable> getCall = client.exchange( GET(String.format("/programs/%s/brapi/v2/observations/table", program.getId().toString())) @@ -268,10 +268,8 @@ public void testGetObsTableNotFound() { .bearerAuth("test-registered-user"), String.class ); - HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { - HttpResponse response = getCall.blockingFirst(); - }); - assertEquals(HttpStatus.NOT_FOUND, e.getStatus()); + HttpResponse response = getCall.blockingFirst(); + assertEquals(HttpStatus.OK, response.getStatus()); } @Test From d32e897c56b100ed6c783014029c192adc5def5a Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:58:27 -0400 Subject: [PATCH 09/13] [BI-2330] - updated comment --- .../brapi/v2/model/request/query/ObservationQuery.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index bd0b2abb1..49fb8fa7a 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -126,6 +126,7 @@ public SearchRequest constructSearchRequest() { /** * Build a query string from the ObservationQuery object. + * This may be useful for proxying requests to the backing BrAPI service. */ public String toQueryString() { StringBuilder queryString = new StringBuilder(); From afaeb762590f1f5ee119f212be242ddeaa3943e6 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:47:28 -0400 Subject: [PATCH 10/13] [BI-2330] - removed unused service --- .../v2/services/BrAPIObservationService.java | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java deleted file mode 100644 index 3cdbd9a42..000000000 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIObservationService.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.breedinginsight.brapi.v2.services; - -import io.micronaut.context.annotation.Property; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.NotImplementedException; -import org.brapi.v2.model.pheno.*; -import org.breedinginsight.brapi.v2.dao.BrAPIObservationDAO; -import org.breedinginsight.services.ProgramService; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.*; - -@Slf4j -@Singleton -public class BrAPIObservationService { - private final ProgramService programService; - private final BrAPITrialService trialService; - private final BrAPIObservationDAO observationDAO; - private final String referenceSource; - - @Inject - public BrAPIObservationService( - ProgramService programService, - BrAPITrialService trialService, - BrAPIObservationDAO observationDAO, - @Property(name = "brapi.server.reference-source") String referenceSource) { - this.programService = programService; - this.trialService = trialService; - this.observationDAO = observationDAO; - this.referenceSource = referenceSource; - } - - // TODO: add parameters. - public BrAPIObservationTable getBrAPIObservationTable() { - BrAPIObservationTable observationTable = new BrAPIObservationTable() - .headerRow(Arrays.asList(BrAPIObservationTableHeaderRowEnum.values())) - .observationVariables(getTableObservationVariables()) - .data(getTableData()); - return observationTable; - } - - private List getTableObservationVariables() { - throw new NotImplementedException(); // TODO: implement. - } - - private List> getTableData() { - throw new NotImplementedException(); // TODO: implement. - } - -} From 99525cf432744f364f07438ad32c3dcbed278521 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:48:49 -0400 Subject: [PATCH 11/13] [BI-2330] - removed unused dependency --- .../brapi/v2/BrAPIObservationsController.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java index 12fa35cee..cbb476910 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIObservationsController.java @@ -37,7 +37,6 @@ import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v2.dao.BrAPIStudyDAO; import org.breedinginsight.brapi.v2.model.request.query.ObservationQuery; -import org.breedinginsight.brapi.v2.services.BrAPIObservationService; import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.model.Program; import org.breedinginsight.services.ProgramService; @@ -54,15 +53,13 @@ @Secured(SecurityRule.IS_AUTHENTICATED) public class BrAPIObservationsController { - private final BrAPIObservationService observationService; private final ProgramService programService; private final ProgramDAO programDAO; private final BrAPIStudyDAO brAPIStudyDAO; private final BrAPIEndpointProvider brAPIEndpointProvider; @Inject - public BrAPIObservationsController(BrAPIObservationService observationService, ProgramService programService, ProgramDAO programDAO, ProgramDAO programDAO1, BrAPIStudyDAO brAPIStudyDAO, BrAPIEndpointProvider brAPIEndpointProvider) { - this.observationService = observationService; + public BrAPIObservationsController(ProgramService programService, ProgramDAO programDAO, ProgramDAO programDAO1, BrAPIStudyDAO brAPIStudyDAO, BrAPIEndpointProvider brAPIEndpointProvider) { this.programService = programService; this.programDAO = programDAO1; this.brAPIStudyDAO = brAPIStudyDAO; From 740df0927e861e096979b00c8229d409f75362e4 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:12:18 -0400 Subject: [PATCH 12/13] [BI-2330] - added pagination info in toBrAPIQueryParams --- .../brapi/v2/model/request/query/ObservationQuery.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index 49fb8fa7a..4dd56957a 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -44,7 +44,7 @@ public class ObservationQuery extends BrapiQuery { private String observationUnitLevelRelationshipCode; public ObservationTableQueryParams toBrAPIQueryParams() { - return new ObservationTableQueryParams() + return (ObservationTableQueryParams) new ObservationTableQueryParams() .observationUnitDbId(observationUnitDbId) .observationVariableDbId(observationVariableDbId) .locationDbId(locationDbId) @@ -62,7 +62,9 @@ public ObservationTableQueryParams toBrAPIQueryParams() { .observationUnitLevelCode(observationUnitLevelCode) .observationUnitLevelRelationshipName(observationUnitLevelRelationshipName) .observationUnitLevelRelationshipOrder(observationUnitLevelRelationshipOrder) - .observationUnitLevelRelationshipCode(observationUnitLevelRelationshipCode); + .observationUnitLevelRelationshipCode(observationUnitLevelRelationshipCode) + .page(getPage()) + .pageSize(getPageSize()); } public SearchRequest constructSearchRequest() { From 9b919111a85e16b20da6344e90d2ba871a4ae395 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:04:29 -0400 Subject: [PATCH 13/13] [BI-2330] - removed unused methods --- .../model/request/query/ObservationQuery.java | 128 ------------------ 1 file changed, 128 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java index 4dd56957a..95ef760a2 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/ObservationQuery.java @@ -67,132 +67,4 @@ public ObservationTableQueryParams toBrAPIQueryParams() { .pageSize(getPageSize()); } - public SearchRequest constructSearchRequest() { - List filters = new ArrayList<>(); - if (!StringUtils.isBlank(getObservationUnitDbId())) { - filters.add(constructFilterRequest("observationUnitDbId", getObservationUnitDbId())); - } - if (!StringUtils.isBlank(getObservationVariableDbId())) { - filters.add(constructFilterRequest("observationVariableDbId", getObservationVariableDbId())); - } - if (!StringUtils.isBlank(getLocationDbId())) { - filters.add(constructFilterRequest("locationDbId", getLocationDbId())); - } - if (!StringUtils.isBlank(getSeasonDbId())) { - filters.add(constructFilterRequest("seasonDbId", getSeasonDbId())); - } - if (!StringUtils.isBlank(getObservationLevel())) { - filters.add(constructFilterRequest("observationLevel", getObservationLevel())); - } - if (!StringUtils.isBlank(getSearchResultsDbId())) { - filters.add(constructFilterRequest("searchResultsDbId", getSearchResultsDbId())); - } - if (!StringUtils.isBlank(getObservationTimeStampRangeStart())) { - filters.add(constructFilterRequest("observationTimeStampRangeStart", getObservationTimeStampRangeStart())); - } - if (!StringUtils.isBlank(getObservationTimeStampRangeEnd())) { - filters.add(constructFilterRequest("observationTimeStampRangeEnd", getObservationTimeStampRangeEnd())); - } - if (!StringUtils.isBlank(getProgramDbId())) { - filters.add(constructFilterRequest("programDbId", getProgramDbId())); - } - if (!StringUtils.isBlank(getTrialDbId())) { - filters.add(constructFilterRequest("trialDbId", getTrialDbId())); - } - if (!StringUtils.isBlank(getStudyDbId())) { - filters.add(constructFilterRequest("studyDbId", getStudyDbId())); - } - if (!StringUtils.isBlank(getGermplasmDbId())) { - filters.add(constructFilterRequest("germplasmDbId", getGermplasmDbId())); - } - if (!StringUtils.isBlank(getObservationUnitLevelName())) { - filters.add(constructFilterRequest("observationUnitLevelName", getObservationUnitLevelName())); - } - if (!StringUtils.isBlank(getObservationUnitLevelOrder())) { - filters.add(constructFilterRequest("observationUnitLevelOrder", getObservationUnitLevelOrder())); - } - if (!StringUtils.isBlank(getObservationUnitLevelCode())) { - filters.add(constructFilterRequest("observationUnitLevelCode", getObservationUnitLevelCode())); - } - if (!StringUtils.isBlank(getObservationUnitLevelRelationshipName())) { - filters.add(constructFilterRequest("observationUnitLevelRelationshipName", getObservationUnitLevelRelationshipName())); - } - if (!StringUtils.isBlank(getObservationUnitLevelRelationshipOrder())) { - filters.add(constructFilterRequest("observationUnitLevelRelationshipOrder", getObservationUnitLevelRelationshipOrder())); - } - if (!StringUtils.isBlank(getObservationUnitLevelRelationshipCode())) { - filters.add(constructFilterRequest("observationUnitLevelRelationshipCode", getObservationUnitLevelRelationshipCode())); - } - return new SearchRequest(filters); - } - - /** - * Build a query string from the ObservationQuery object. - * This may be useful for proxying requests to the backing BrAPI service. - */ - public String toQueryString() { - StringBuilder queryString = new StringBuilder(); - queryString.append("?"); - if (StringUtils.isNotBlank(observationUnitDbId)) { - queryString.append("observationUnitDbId=").append(observationUnitDbId).append("&"); - } - if (StringUtils.isNotBlank(observationVariableDbId)) { - queryString.append("observationVariableDbId=").append(observationVariableDbId).append("&"); - } - if (StringUtils.isNotBlank(locationDbId)) { - queryString.append("locationDbId=").append(locationDbId).append("&"); - } - if (StringUtils.isNotBlank(seasonDbId)) { - queryString.append("seasonDbId=").append(seasonDbId).append("&"); - } - if (StringUtils.isNotBlank(observationLevel)) { - queryString.append("observationLevel=").append(observationLevel).append("&"); - } - if (StringUtils.isNotBlank(searchResultsDbId)) { - queryString.append("searchResultsDbId=").append(searchResultsDbId).append("&"); - } - if (StringUtils.isNotBlank(observationTimeStampRangeStart)) { - queryString.append("observationTimeStampRangeStart=").append(observationTimeStampRangeStart).append("&"); - } - if (StringUtils.isNotBlank(observationTimeStampRangeEnd)) { - queryString.append("observationTimeStampRangeEnd=").append(observationTimeStampRangeEnd).append("&"); - } - if (StringUtils.isNotBlank(programDbId)) { - queryString.append("programDbId=").append(programDbId).append("&"); - } - if (StringUtils.isNotBlank(trialDbId)) { - queryString.append("trialDbId=").append(trialDbId).append("&"); - } - if (StringUtils.isNotBlank(studyDbId)) { - queryString.append("studyDbId=").append(studyDbId).append("&"); - } - if (StringUtils.isNotBlank(germplasmDbId)) { - queryString.append("germplasmDbId=").append(germplasmDbId).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelName)) { - queryString.append("observationUnitLevelName=").append(observationUnitLevelName).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelOrder)) { - queryString.append("observationUnitLevelOrder=").append(observationUnitLevelOrder).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelCode)) { - queryString.append("observationUnitLevelCode=").append(observationUnitLevelCode).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelRelationshipName)) { - queryString.append("observationUnitLevelRelationshipName=").append(observationUnitLevelRelationshipName).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelRelationshipOrder)) { - queryString.append("observationUnitLevelRelationshipOrder=").append(observationUnitLevelRelationshipOrder).append("&"); - } - if (StringUtils.isNotBlank(observationUnitLevelRelationshipCode)) { - queryString.append("observationUnitLevelRelationshipCode=").append(observationUnitLevelRelationshipCode).append("&"); - } - - // If any query parameters were added, this removes the trailing "&" from the query string. - // If no query parameters were added, this removes the superfluous "?" from the query string. - queryString.deleteCharAt(queryString.length() - 1); - - return queryString.toString(); - } - }