diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 55cc1ad5826136eeb8c81fdacaf86e62fae8453d..a801d6ca7ec7f31de021702199096c6831226776 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,8 +52,8 @@ build-loader-docker-image: - changes: - Dockerfile - scripts/* - - backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/*_mapping.json - - backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json + - backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/*_mapping.json + - backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json - .gitlab-ci.yml - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH allow_failure: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d760ec6adacfe12bb2a75e792815543c496d1546..4211bdf23d6dd49b07af370637412618b27ecdbb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,6 +68,9 @@ * `detect-secrets scan --update .secrets.baseline` to update the secret baseline, then * `detect-secrets audit .secrets.baseline` to tag it as a false positive if relevant. +### Test data +`docker compose up` will start an Elasticsearch instance +`./scripts/harvest.sh -jsonDir data/test/ -es_host localhost -env dev -v` will load the test data with the necessary indices and mappings. ## Testing recommendations Behaviour driven development (upon [TDD](https://dannorth.net/2012/05/31/bdd-is-like-tdd-if/)) is recommended for all new developments. diff --git a/Dockerfile b/Dockerfile index 75b15021ab79c72735bec70dc527e7c2c3708269..5ecb550f08997c0f51517dcede755ebe99380123 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,10 +5,10 @@ COPY scripts/harvest.sh /opt/scripts/ COPY scripts/to_bulk.jq /opt/scripts/ # COPY dao settings -COPY backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json /opt/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json +COPY backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json /opt/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json # COPY dao mappings -COPY backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/*_mapping.json /opt/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/ +COPY backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/*_mapping.json /opt/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/ RUN apk add --update --no-cache bash curl jq parallel wget grep gzip sed date coreutils diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 0b2e2bcf637da7d52a26e8abcde00e4160a7769a..bfb0ca7ebc59cba71caff753ea0ea1b3229ccbc2 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -10,15 +10,13 @@ buildscript { plugins { java jacoco - id("org.springframework.boot") version "2.6.10" - id("com.gorylenko.gradle-git-properties") version "2.4.0" - id("io.spring.dependency-management") version "1.0.11.RELEASE" - id("org.sonarqube") - id("org.owasp.dependencycheck") version "7.0.0" + id("org.springframework.boot") version "3.1.5" + id("io.spring.dependency-management") version "1.1.3" + id("com.gorylenko.gradle-git-properties") version "2.4.1" } java { - sourceCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 } repositories { @@ -40,7 +38,7 @@ tasks { // makes the test task out of date, which makes the build much longer. // See https://github.com/spring-projects/spring-boot/issues/13152 val buildInfo by registering(BuildInfo::class) { - destinationDir = file("$buildDir/buildInfo") + destinationDir.set(file(project.layout.buildDirectory.dir("buildInfo"))) } bootJar { @@ -91,7 +89,7 @@ tasks { } } -extra["springCloudVersion"] = "2021.0.1" +extra["springCloudVersion"] = "2022.0.4" dependencyManagement { imports { mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}") @@ -99,15 +97,6 @@ dependencyManagement { } dependencies { - constraints { - implementation("org.apache.logging.log4j:log4j-core") { - version { - strictly("[2.17, 3[") - prefer("2.17.0") - } - because("CVE-2021-44228, CVE-2021-45046, CVE-2021-45105: Log4j vulnerable to remote code execution and other critical security vulnerabilities") - } - } // Spring annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") @@ -115,21 +104,18 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-security") - implementation("org.springframework.cloud:spring-cloud-starter-config") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") + implementation("org.springframework.boot:spring-boot-starter-data-elasticsearch") - // Elasticsearch - implementation("org.elasticsearch:elasticsearch") - implementation("org.elasticsearch.client:elasticsearch-rest-high-level-client") + implementation("org.springframework.cloud:spring-cloud-starter-config") - // Swagger - implementation("org.springdoc:springdoc-openapi-ui:1.6.6") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0") // Others implementation("com.google.guava:guava:31.1-jre") - implementation("com.opencsv:opencsv:5.6") + implementation("com.opencsv:opencsv:5.7.0") // Test dependencies testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.jsoup:jsoup:1.14.3") + testImplementation("org.jsoup:jsoup:1.15.3") } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandler.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandler.java deleted file mode 100644 index 3d4f78b1a4cbe6973d03663b4c805448c00a8ab3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandler.java +++ /dev/null @@ -1,125 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.api.BadRequestException; -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.api.brapi.v1.exception.BrapiPaginationException; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiPagination; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiStatus; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindException; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; -import org.springframework.web.HttpMediaTypeNotAcceptableException; -import org.springframework.web.HttpMediaTypeNotSupportedException; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Brapi exception handling intercepting every spring web Exception and generate a correct BrAPI response out of it. - * - * @author gcornut - */ -@ControllerAdvice(basePackages = "fr.inra.urgi.faidare.api.brapi.v1") -public class BrapiExceptionHandler { - - private static ResponseEntity<Object> createErrorResponse( - HttpStatus httpStatus, List<BrapiStatus> statuses, BrapiPagination pagination - ) { - Object body; - if (pagination != null) { - body = ApiResponseFactory.createListResponse(pagination, statuses, null, false); - } else { - body = ApiResponseFactory.createSingleObjectResponse(null, statuses); - } - return ResponseEntity.status(httpStatus).body(body); - } - - /** - * Generate BrAPI error response from Exception - * - * Automatically extracts javax.validation error message into the BrAPI status - */ - private static ResponseEntity<Object> createErrorResponse( - Exception exception, HttpStatus httpStatus - ) { - List<BrapiStatus> statuses = new ArrayList<>(); - BrapiPagination pagination = null; - - if (exception instanceof BindException || exception instanceof MethodArgumentNotValidException) { - BindingResult bindingResult; - if (exception instanceof BindException) { - // Exception occurring when a user provided parameter that did not pass spring validation - bindingResult = (BindException) exception; - } else { - // Exception occurring when a user provided request body parameter that did not pass spring validation - bindingResult = ((MethodArgumentNotValidException) exception).getBindingResult(); - } - - List<ObjectError> errors = bindingResult.getAllErrors(); - errors.stream() - // Convert to Exception - .map(err -> new Exception(err.getDefaultMessage())) - // Convert to BrapiStatus - .map(ex -> ApiResponseFactory.createStatus(ex, httpStatus)) - .collect(Collectors.toCollection(() -> statuses)); - } else { - // Other exceptions - - if (exception instanceof BrapiPaginationException) { - // Brapi pagination exception when pagination validation failed (page index out of bound, negative page, etc.) - pagination = ((BrapiPaginationException) exception).getPagination(); - } - - statuses.add(ApiResponseFactory.createStatus(exception, httpStatus)); - } - - return createErrorResponse(httpStatus, statuses, pagination); - } - - /** - * Generates Brapi not found response - */ - @ExceptionHandler({NotFoundException.class}) - public ResponseEntity<Object> handleNotFound(Exception exception) { - return createErrorResponse(exception, HttpStatus.NOT_FOUND); - } - - /** - * Generates Brapi bad request response - * - * Handles {@link BindException} resulting from Spring's parsing of params - * (query params, path params, etc.) - * - * Handle {@link MethodArgumentNotValidException} resulting from Spring's validation of request body params - * - */ - @ExceptionHandler({ - BadRequestException.class, - BindException.class, - MethodArgumentNotValidException.class, - HttpMediaTypeNotSupportedException.class, - HttpMediaTypeNotAcceptableException.class, - HttpRequestMethodNotSupportedException.class - }) - public ResponseEntity<Object> handleBadRequest(Exception exception) { - return createErrorResponse(exception, HttpStatus.BAD_REQUEST); - } - - /** - * Generates Brapi unexpected exception response - */ - @ExceptionHandler(Exception.class) - public ResponseEntity<Object> handleOtherException(Exception exception) { - exception.printStackTrace(); - return createErrorResponse(exception, HttpStatus.INTERNAL_SERVER_ERROR); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiJSONViewHandler.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiJSONViewHandler.java deleted file mode 100644 index f881453103b1a86d69065990d788a28f69fbf122..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiJSONViewHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.JSONView; -import org.springframework.core.MethodParameter; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJacksonValue; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice; - -import java.util.List; - -/** - * Switch which Jackson View to use depending on the HTTP Accept header - * - * When the request accepts JSON-LD, switch to BrAPI with JSON-LD fields - * - * @author gcornut - */ -@ControllerAdvice(basePackages = "fr.inra.urgi.faidare.api.brapi.v1") -@Order(Ordered.HIGHEST_PRECEDENCE) -public class BrapiJSONViewHandler extends AbstractMappingJacksonResponseBodyAdvice { - - public static final MediaType APPLICATION_LD_JSON = new MediaType("application","ld+json"); - - @Override - protected void beforeBodyWriteInternal( - MappingJacksonValue bodyContainer, - MediaType contentType, - MethodParameter returnType, - ServerHttpRequest req, - ServerHttpResponse response - ) { - // Default: display only BrAPI Fields - bodyContainer.setSerializationView(JSONView.BrapiFields.class); - - // But if requested, also display JSON-LD fields - List<MediaType> accept = req.getHeaders().getAccept(); - for (MediaType mediaType : accept) { - if (APPLICATION_LD_JSON.includes(mediaType)) { - bodyContainer.setSerializationView(JSONView.BrapiWithJSONLD.class); - break; - } - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/CallsController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/CallsController.java deleted file mode 100644 index 3ab6049edda81056a456a667cbd5f99039f82ff9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/CallsController.java +++ /dev/null @@ -1,97 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import java.util.Comparator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableSet; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiCall; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.CallVO; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springdoc.webmvc.api.OpenApiWebMvcResource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class CallsController { - private static final String BRAPI_PATH = "/brapi/v1/"; - - public static final Set<String> DEFAULT_DATA_TYPES = ImmutableSet.of( - "json" - ); - - public static final Set<String> DEFAULT_BRAPI_VERSIONS = ImmutableSet.of( - "1.0", - "1.1", - "1.2" - ); - private final OpenApiWebMvcResource openApiResource; - private final ObjectMapper objectMapper; - - private AtomicReference<List<BrapiCall>> implementedCalls = new AtomicReference<>(null); - - public CallsController(OpenApiWebMvcResource openApiResource, ObjectMapper objectMapper) { - this.openApiResource = openApiResource; - this.objectMapper = objectMapper; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Calls/Calls.md - */ - @Operation(summary = "List implemented Breeding API calls") - @GetMapping("/brapi/v1/calls") - public BrapiListResponse<BrapiCall> calls(@Valid PaginationCriteriaImpl criteria, HttpServletRequest request) throws JsonProcessingException { - if (implementedCalls.get() == null) { - implementedCalls.set(swaggerToBrapiCalls(request)); - } - - return ApiResponseFactory.createSubListResponse( - criteria.getPageSize(), criteria.getPage(), implementedCalls.get() - ); - } - - /** - * Get swagger API documentation and transform it to list of BrAPI calls - * - * This must be done after swagger has time to generate the API - * documentation and thus can't be done in this class constructor - */ - @SuppressWarnings("unchecked") - private List<BrapiCall> swaggerToBrapiCalls(HttpServletRequest request) throws JsonProcessingException { - String json = openApiResource.openapiJson(request, "/v3/api-docs", Locale.ENGLISH); - - Map<String, Object> map = objectMapper.readValue(json, - new TypeReference<Map<String, Object>>() {}); - - Map<String, Object> pathMap = (Map<String, Object>) map.get("paths"); - return pathMap.entrySet().stream() - .filter(entry -> entry.getKey().startsWith(BRAPI_PATH)) - .map(entry -> { - String path = entry.getKey(); - Map<String, Object> methodMap = (Map<String, Object>) entry.getValue(); - Set<String> methods = methodMap.keySet().stream().map(String::toUpperCase).collect(Collectors.toSet()); - CallVO call = new CallVO(path.replace(BRAPI_PATH, "")); - call.setMethods(methods); - return call; - }) - .sorted(Comparator.comparing(CallVO::getCall)) - .collect(Collectors.toList()); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmController.java deleted file mode 100644 index 922258cce393b3ed7a118c8bd4370585fb07e68e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmController.java +++ /dev/null @@ -1,167 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import java.util.List; -import javax.validation.Valid; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasm; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValueList; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiPedigree; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiProgeny; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.GermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.repository.es.GermplasmAttributeRepository; -import fr.inra.urgi.faidare.service.es.GermplasmService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class GermplasmController { - - private final static Logger LOGGER = LoggerFactory.getLogger(GermplasmController.class); - - private final GermplasmService germplasmService; - private final GermplasmAttributeRepository germplasmAttributeRepository; - - @Autowired - public GermplasmController(GermplasmService germplasmService, GermplasmAttributeRepository germplasmAttributeRepository) { - this.germplasmService = germplasmService; - this.germplasmAttributeRepository = germplasmAttributeRepository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Germplasm/GermplasmDetailsByGermplasmDbId.md - */ - @Operation(summary = "Get germplasm by id") - @GetMapping("/brapi/v1/germplasm/{germplasmDbId}") - public BrapiResponse<BrapiGermplasm> getGermplasm(@PathVariable String germplasmDbId) { - LOGGER.debug("germplasmDbId = " + germplasmDbId); - BrapiGermplasm germplasm = germplasmService.getById(germplasmDbId); - if (germplasm == null) { - throw new NotFoundException("Germplasm not found for id '" + germplasmDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(germplasm, null); - } - - @Operation(summary = "List germplasm") - @GetMapping("/brapi/v1/germplasm") - public BrapiListResponse<? extends BrapiGermplasm> listGermplasm( - @Valid PaginationCriteriaImpl paginationCriteria - ) { - GermplasmGETSearchCriteria criteria = new GermplasmGETSearchCriteria(); - criteria.setPageSize(paginationCriteria.getPageSize()); - criteria.setPage(paginationCriteria.getPage()); - return searchGermplasmService(criteria); - } - - /** - * @link https://brapi.docs.apiary.io/#reference/germplasm/germplasm/get-germplasm-mcpd-by-germplasmdbid - */ - @Operation(summary = "Get germplasm mcpd by id") - @GetMapping("/brapi/v1/germplasm/{germplasmDbId}/mcpd") - public BrapiResponse<GermplasmMcpdVO> getGermplasmMcpd(@PathVariable String germplasmDbId) { - LOGGER.debug("germplasmDbId = " + germplasmDbId); - GermplasmMcpdVO germplasm = germplasmService.getAsMcpdById(germplasmDbId); - if (germplasm == null) { - throw new NotFoundException("Germplasm not found for id '" + germplasmDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(germplasm, null); - } - - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Germplasm/GermplasmSearchGET.md - */ - @Operation(summary = "Search germplasm") - @GetMapping(value = "/brapi/v1/germplasm-search") - public BrapiListResponse<? extends BrapiGermplasm> searchGermplasm( - @Valid GermplasmGETSearchCriteria criteria - ) { - return searchGermplasmService(criteria); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Germplasm/GermplasmSearchPOST.md - */ - @Operation(summary = "Search germplasm") - @PostMapping(value = "/brapi/v1/germplasm-search", consumes = APPLICATION_JSON_VALUE) - public BrapiListResponse<? extends BrapiGermplasm> searchGermplasm( - @Valid @RequestBody(required = false) GermplasmPOSTSearchCriteria criteria - ) { - return searchGermplasmService(criteria); - } - - private BrapiListResponse<? extends BrapiGermplasm> searchGermplasmService(GermplasmSearchCriteria searchCriteria) { - PaginatedList<? extends BrapiGermplasm> pager = germplasmService.find(searchCriteria); - Pagination pagination = pager.getPagination(); - return ApiResponseFactory.createListResponse(pagination, null, pager); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/GermplasmAttributes/GermplasmAttributeValuesByGermplasmDbId.md - */ - @Operation(summary = "List germplasm attributes") - @GetMapping("/brapi/v1/germplasm/{germplasmDbId}/attributes") - public BrapiResponse<BrapiGermplasmAttributeValueList> listGermplasmAttributes( - @PathVariable String germplasmDbId, - @RequestParam(required = false) List<String> attributeList, - @Valid PaginationCriteriaImpl paginationCriteria - ) { - GermplasmAttributeCriteria listCriteria = new GermplasmAttributeCriteria(); - listCriteria.setAttributeList(attributeList); - listCriteria.setGermplasmDbId(germplasmDbId); - listCriteria.setPage(paginationCriteria.getPage()); - listCriteria.setPageSize(paginationCriteria.getPageSize()); - PaginatedList<? extends BrapiGermplasmAttributeValueList> pager = germplasmAttributeRepository.find(listCriteria); - BrapiGermplasmAttributeValueList attributes = null; - if (pager.size() == 1) { - attributes = pager.get(0); - } - return ApiResponseFactory.createSingleObjectResponse(attributes, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/GermplasmAttributes/GermplasmAttributeValuesByGermplasmDbId.md - */ - @Operation(summary = "Get germplasm pedigree") - @GetMapping("/brapi/v1/germplasm/{germplasmDbId}/pedigree") - public BrapiResponse<BrapiPedigree> getPedigree( - @PathVariable String germplasmDbId - ) { - BrapiPedigree pedigree = germplasmService.getPedigree(germplasmDbId); - return ApiResponseFactory.createSingleObjectResponse(pedigree, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Germplasm/Germplasm_GermplasmDbId_Progeny_GET.yaml - */ - @Operation(summary = "Get germplasm progeny") - @GetMapping("/brapi/v1/germplasm/{germplasmDbId}/progeny") - public BrapiResponse<BrapiProgeny> getProgeny( - @PathVariable String germplasmDbId - ) { - BrapiProgeny progeny = germplasmService.getProgeny(germplasmDbId); - return ApiResponseFactory.createSingleObjectResponse(progeny, null); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/LocationController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/LocationController.java deleted file mode 100644 index 87850e3d7447e5d6b4003f87caf6b9ac0c6ec9f6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/LocationController.java +++ /dev/null @@ -1,58 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import javax.validation.Valid; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiLocation; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.LocationCriteria; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class LocationController { - - private final LocationRepository repository; - - @Autowired - public LocationController(LocationRepository repository) { - this.repository = repository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/LocationDetails.md - */ - @Operation(summary = "Get location") - @GetMapping("/brapi/v1/locations/{locationDbId}") - public BrapiResponse<BrapiLocation> getLocation(@PathVariable String locationDbId) { - BrapiLocation location = repository.getById(locationDbId); - if (location == null) { - throw new NotFoundException("Location not found for id '" + locationDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(location, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/ListLocations.md - */ - @Operation(summary = "List locations") - @GetMapping("/brapi/v1/locations") - public BrapiListResponse<? extends BrapiLocation> listLocations( - @Valid LocationCriteria criteria - ) { - PaginatedList<? extends BrapiLocation> result = repository.find(criteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableController.java deleted file mode 100644 index b2fc03486e8b4c6d58f5cb90a99b130e267505c8..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableController.java +++ /dev/null @@ -1,89 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import java.util.List; -import javax.validation.Valid; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationVariable; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiOntology; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.ObservationVariableCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class ObservationVariableController { - - private final CropOntologyRepository repository; - - @Autowired - public ObservationVariableController(CropOntologyRepository repository) { - this.repository = repository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/ObservationVariables/VariableDetails.md - */ - @Operation(summary = "Get variable") - @GetMapping("/brapi/v1/variables/{observationVariableDbId}") - public BrapiResponse<BrapiObservationVariable> getVariable(@PathVariable String observationVariableDbId) { - BrapiObservationVariable variable = repository.getVariableById(observationVariableDbId); - if (variable == null) { - throw new NotFoundException("Variable not found for id '" + observationVariableDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(variable, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/ObservationVariables/VariableOntologyList.md - */ - @Operation(summary = "List ontologies") - @GetMapping("/brapi/v1/ontologies") - public BrapiListResponse<? extends BrapiOntology> listOntologies( - @Valid @Parameter PaginationCriteriaImpl criteria - ) { - List<? extends BrapiOntology> ontologies = repository.getOntologies(); - - return ApiResponseFactory.createSubListResponse( - criteria.getPageSize(), criteria.getPage(), - ontologies - ); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/ObservationVariables/VariableList.md - */ - @Operation(summary = "List variables") - @GetMapping("/brapi/v1/variables") - public BrapiListResponse<? extends BrapiObservationVariable> listVariables( - @Valid @Parameter ObservationVariableCriteria criteria - ) { - // Get variables by trait class or get all variables - List<? extends BrapiObservationVariable> variables; - if (StringUtils.isNotBlank(criteria.getTraitClass())) { - variables = repository.getVariablesByTraitClass(criteria.getTraitClass()); - } else { - variables = repository.getVariables(); - } - - return ApiResponseFactory.createSubListResponse( - criteria.getPageSize(), criteria.getPage(), - variables - ); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/PhenotypeController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/PhenotypeController.java deleted file mode 100644 index f74e27bbed832f007229a257237e2074b0896123..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/PhenotypeController.java +++ /dev/null @@ -1,44 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import javax.validation.Valid; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnit; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.criteria.ObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.ObservationUnitRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class PhenotypeController { - - private final ObservationUnitRepository repository; - - @Autowired - public PhenotypeController(ObservationUnitRepository repository) { - this.repository = repository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Phenotypes/PhenotypeSearch.md - */ - @Operation(summary = "Search phenotypes") - @PostMapping(value = "/brapi/v1/phenotypes-search", consumes = APPLICATION_JSON_VALUE) - public BrapiListResponse<? extends BrapiObservationUnit> searchPhenotypes(@Valid @RequestBody(required = false) ObservationUnitCriteria criteria) { - PaginatedList<? extends BrapiObservationUnit> result = repository.find(criteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramController.java deleted file mode 100644 index 89c1e49db7ade1e1fe3c05d1815b9d244e69ab4c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramController.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import javax.validation.Valid; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiProgram; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.ProgramCriteria; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.ProgramRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class ProgramController { - - private final ProgramRepository repository; - - @Autowired - public ProgramController(ProgramRepository repository) { - this.repository = repository; - } - - /** - * Not officially present in BrAPI - */ - @Operation(summary = "Get program") - @GetMapping("/brapi/v1/programs/{programDbId}") - public BrapiResponse<BrapiProgram> getProgram(@PathVariable String programDbId) { - ProgramVO program = repository.getById(programDbId); - if (program == null) { - throw new NotFoundException("Program not found for id '" + programDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(program, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ListPrograms.md - */ - @Operation(summary = "List programs") - @GetMapping("/brapi/v1/programs") - public BrapiListResponse<? extends BrapiProgram> listPrograms(@Valid @Parameter ProgramCriteria criteria) { - PaginatedList<ProgramVO> result = repository.find(criteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ProgramSearch.md - */ - @Operation(summary = "Search programs") - @PostMapping(value = "/brapi/v1/programs-search", consumes = APPLICATION_JSON_VALUE) - public BrapiListResponse<? extends BrapiProgram> searchPrograms(@Valid @RequestBody(required = false) ProgramCriteria criteria) { - return listPrograms(criteria); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/StudyController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/StudyController.java deleted file mode 100644 index 2411dcfebfaab53cb91b77c6192144ed36571313..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/StudyController.java +++ /dev/null @@ -1,183 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import java.util.List; -import java.util.Set; -import javax.validation.Valid; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasm; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnit; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationVariable; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudyDetail; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudySummary; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.ObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.criteria.StudyObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.criteria.StudySearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.StudySummaryCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.ObservationUnitRepository; -import fr.inra.urgi.faidare.repository.es.StudyRepository; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import fr.inra.urgi.faidare.utils.StringFunctions; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class StudyController { - - private final StudyRepository repository; - private final ObservationUnitRepository observationUnitRepository; - private final GermplasmRepository germplasmRepository; - private final CropOntologyRepository cropOntologyRepository; - - @Autowired - public StudyController( - StudyRepository repository, - ObservationUnitRepository observationUnitRepository, - GermplasmRepository germplasmRepository, - CropOntologyRepository cropOntologyRepository - ) { - this.repository = repository; - this.observationUnitRepository = observationUnitRepository; - this.germplasmRepository = germplasmRepository; - this.cropOntologyRepository = cropOntologyRepository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ - @Operation(summary = "Get study") - @GetMapping("/brapi/v1/studies/{studyDbId}") - public BrapiResponse<BrapiStudyDetail> getStudy(@PathVariable String studyDbId) throws Exception { - studyDbId = StringFunctions.asUTF8(studyDbId); - StudyDetailVO result = repository.getById(studyDbId); - if (result == null) { - throw new NotFoundException("Study not found for id '" + studyDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(result, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/ListStudySummaries.md - */ - @Operation(summary = "List studies") - @GetMapping("/brapi/v1/studies") - public BrapiListResponse<? extends BrapiStudySummary> listStudies(@Valid StudySummaryCriteria criteria) { - if (criteria == null) { - criteria = new StudySummaryCriteria(); - } - PaginatedList<StudySummaryVO> result = repository.find(criteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/SearchStudies.md - */ - @Operation(summary = "Search studies") - @GetMapping(value = "/brapi/v1/studies-search") - public BrapiListResponse<? extends BrapiStudySummary> searchStudiesGet(@Valid StudySearchCriteria criteria) { - return listStudies(criteria); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/SearchStudies.md - */ - @Operation(summary = "Search studies") - @PostMapping(value = "/brapi/v1/studies-search", consumes = APPLICATION_JSON_VALUE) - public BrapiListResponse<? extends BrapiStudySummary> searchStudiesPost(@RequestBody(required = false) @Valid StudySearchCriteria criteria) { - return listStudies(criteria); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyObservationVariables.md - */ - @Operation(summary = "List study observation variables") - @GetMapping(value = {"/brapi/v1/studies/{studyDbId}/observationVariables", "/brapi/v1/studies/{studyDbId}/observationvariables"}) - public BrapiListResponse<? extends BrapiObservationVariable> listStudyVariables( - @PathVariable String studyDbId, @Valid PaginationCriteriaImpl criteria - ) throws Exception { - studyDbId = StringFunctions.asUTF8(studyDbId); - if (repository.getById(studyDbId) == null) { - throw new NotFoundException("Study not found for id '" + studyDbId + "'"); - } - - Set<String> variableIds = repository.getVariableIds(studyDbId); - List<ObservationVariableVO> result = cropOntologyRepository.getVariableByIds(variableIds); - - return ApiResponseFactory.createSubListResponse( - criteria.getPageSize(), criteria.getPage(), - result - ); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/ObservationUnitDetails.md - */ - @Operation(summary = "List study observation units") - @GetMapping(value = {"/brapi/v1/studies/{studyDbId}/observationUnits", "/brapi/v1/studies/{studyDbId}/observationunits"}) - public BrapiListResponse<? extends BrapiObservationUnit> listStudyObservationUnits( - @PathVariable String studyDbId, @Valid StudyObservationUnitCriteria criteria - ) throws Exception { - studyDbId = StringFunctions.asUTF8(studyDbId); - ObservationUnitCriteria ouCriteria = new ObservationUnitCriteria(); - ouCriteria.setPage(criteria.getPage()); - ouCriteria.setPageSize(criteria.getPageSize()); - ouCriteria.setStudyDbIds(Sets.newHashSet(studyDbId)); - ouCriteria.setObservationLevel(criteria.getObservationLevel()); - PaginatedList<ObservationUnitVO> result = observationUnitRepository.find(ouCriteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyGermplasmDetails.md - */ - @Operation(summary = "List study germplasm") - @GetMapping("/brapi/v1/studies/{studyDbId}/germplasm") - public BrapiListResponse<? extends BrapiGermplasm> listStudyGermplasm( - @PathVariable String studyDbId, @Valid PaginationCriteriaImpl criteria - ) throws Exception { - studyDbId = StringFunctions.asUTF8(studyDbId); - StudyDetailVO study = (StudyDetailVO) this.getStudy(studyDbId).getResult(); - - PaginatedList<GermplasmVO> pager; - if (CollectionUtils.isEmpty(study.getGermplasmDbIds())) { - pager = PaginatedList.createEmptyPaginatedList(criteria); - } else { - GermplasmPOSTSearchCriteria germplasmCriteria = new GermplasmPOSTSearchCriteria(); - germplasmCriteria.setPage(criteria.getPage()); - germplasmCriteria.setPageSize(criteria.getPageSize()); - germplasmCriteria.setGermplasmDbIds(Lists.newArrayList(study.getGermplasmDbIds())); - - pager = germplasmRepository.find(germplasmCriteria); - } - Pagination pagination = pager.getPagination(); - return ApiResponseFactory.createListResponse(pagination, null, pager); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/TrialController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/TrialController.java deleted file mode 100644 index f936d47e7fd492e9ee694e4699a7e44fb8e5a379..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/TrialController.java +++ /dev/null @@ -1,58 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import javax.validation.Valid; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrial; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.criteria.TrialCriteria; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.TrialRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author gcornut - */ -@Tag(name = "Breeding API", description = "BrAPI endpoint") -@RestController -public class TrialController { - - private final TrialRepository repository; - - @Autowired - public TrialController(TrialRepository repository) { - this.repository = repository; - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/GetTrialById.md - */ - @Operation(summary = "Get trial") - @GetMapping("/brapi/v1/trials/{trialDbId}") - public BrapiResponse<BrapiTrial> getTrial(@PathVariable String trialDbId) { - TrialVO program = repository.getById(trialDbId); - if (program == null) { - throw new NotFoundException("Trial not found for id '" + trialDbId + "'"); - } - return ApiResponseFactory.createSingleObjectResponse(program, null); - } - - /** - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/ListTrialSummaries.md - */ - @Operation(summary = "List trials") - @GetMapping("/brapi/v1/trials") - public BrapiListResponse<? extends BrapiTrial> listTrials(@Valid TrialCriteria criteria) { - PaginatedList<? extends BrapiTrial> result = repository.find(criteria); - return ApiResponseFactory.createListResponse(result.getPagination(), null, result); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiException.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiException.java deleted file mode 100644 index 74f7732a3f9f9c1abe15bc59e5d838452dbafdcb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiException.java +++ /dev/null @@ -1,7 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1.exception; - -/** - * @author gcornut - */ -public interface BrapiException { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiPaginationException.java b/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiPaginationException.java deleted file mode 100644 index 2ba358ad25427267dc3fa3735aa57dcaebde9597..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/brapi/v1/exception/BrapiPaginationException.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1.exception; - -import fr.inra.urgi.faidare.api.BadRequestException; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiPagination; - -/** - * @author gcornut - */ -public class BrapiPaginationException extends BadRequestException implements BrapiException { - - private BrapiPagination pagination; - - public BrapiPaginationException(String message, BrapiPagination pagination) { - super(message); - this.pagination = pagination; - } - - public BrapiPagination getPagination() { - return pagination; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/DataDiscoveryController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/DataDiscoveryController.java deleted file mode 100644 index 3956a70263a7b60b65fda9092f5eb794adfb599b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/DataDiscoveryController.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import java.io.UnsupportedEncodingException; -import java.util.Collection; -import java.util.List; -import javax.validation.Valid; - -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteriaImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSourceImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.repository.es.DataDiscoveryRepository; -import fr.inra.urgi.faidare.utils.StringFunctions; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "FAIDARE API", description = "Extended FAIDARE API") -@RestController -@RequestMapping(value = "/faidare/v1/datadiscovery") -public class DataDiscoveryController { - - private final DataDiscoveryRepository dataDiscoveryRepository; - private final FaidareProperties properties; - - @Autowired - public DataDiscoveryController(DataDiscoveryRepository dataDiscoveryRepository, FaidareProperties properties) { - this.dataDiscoveryRepository = dataDiscoveryRepository; - this.properties = properties; - } - - @Operation(summary = "Suggest data discovery document field values") - @PostMapping("/suggest") - public Collection<String> suggest( - @RequestParam String field, - @RequestParam(required = false) String text, - @RequestParam(required = false) Integer fetchSize, - @RequestBody(required = false) @Valid DataDiscoveryCriteriaImpl criteria - ) throws UnsupportedEncodingException { - if (fetchSize == null) { - fetchSize = Integer.MAX_VALUE; - } - return dataDiscoveryRepository.suggest(field, StringFunctions.asUTF8(text), fetchSize, criteria); - } - - @Operation(summary = "Search for data discovery documents") - @PostMapping(value = "/search", consumes = APPLICATION_JSON_VALUE) - public DataDiscoveryResponse search( - @RequestBody @Valid DataDiscoveryCriteriaImpl criteria - ) { - return dataDiscoveryRepository.find(criteria); - } - - @Operation(summary = "Get list of data sources") - @GetMapping("/sources") - public BrapiListResponse<? extends DataSource> sources() { - List<DataSourceImpl> dataSources = properties.getDataSources(); - return ApiResponseFactory.createSubListResponse(dataSources.size(), 0, dataSources); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISExceptionHandler.java b/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISExceptionHandler.java deleted file mode 100644 index c53270fd10fb50f2f8432a5baa5dc0293af2671b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISExceptionHandler.java +++ /dev/null @@ -1,66 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import fr.inra.urgi.faidare.api.BadRequestException; -import fr.inra.urgi.faidare.api.NotFoundException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindException; -import org.springframework.web.HttpMediaTypeNotAcceptableException; -import org.springframework.web.HttpMediaTypeNotSupportedException; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - - -/** - * GnpIS API exception handling - * - * @author gcornut - */ -@ControllerAdvice(basePackages = "fr.inra.urgi.faidare.api.faidare.v1") -public class GnpISExceptionHandler { - - /** - * Return a simple HTTP response with a HTTP code corresponding to the error and the Exception message in the body - */ - private static ResponseEntity<Object> createErrorResponse( - Exception exception, HttpStatus httpStatus - ) { - String body = "HTTP Error " + httpStatus + ": " + exception.getLocalizedMessage(); - return ResponseEntity.status(httpStatus).body((Object) body); - } - - /** - * Generates Brapi not found response - */ - @ExceptionHandler(NotFoundException.class) - public ResponseEntity<Object> handleNotFound(Exception exception) { - return createErrorResponse(exception, HttpStatus.NOT_FOUND); - } - - /** - * Generates Brapi bad request response - */ - @ExceptionHandler({ - BadRequestException.class, - BindException.class, - MethodArgumentNotValidException.class, - HttpMediaTypeNotSupportedException.class, - HttpMediaTypeNotAcceptableException.class, - HttpRequestMethodNotSupportedException.class - }) - public ResponseEntity<Object> handleBadRequest(Exception exception) { - return createErrorResponse(exception, HttpStatus.BAD_REQUEST); - } - - /** - * Generates Brapi unexpected exception response - */ - @ExceptionHandler(Exception.class) - public ResponseEntity<Object> handleOtherException(Exception exception) { - exception.printStackTrace(); - return createErrorResponse(exception, HttpStatus.INTERNAL_SERVER_ERROR); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmController.java deleted file mode 100644 index 1c92aa098bde6237f3b468a07a1b19b0f32f7e89..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmController.java +++ /dev/null @@ -1,165 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -import java.io.File; -import java.util.Collections; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; - -import com.google.common.base.Strings; -import fr.inra.urgi.faidare.api.BadRequestException; -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.api.brapi.v1.GermplasmController; -import fr.inra.urgi.faidare.domain.criteria.FaidareGermplasmPOSTShearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.service.es.GermplasmService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.FileSystemResource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "FAIDARE API", description = "Extended FAIDARE API") -@RestController -@RequestMapping(value = "/faidare/v1/germplasm") -public class GnpISGermplasmController { - - private final GermplasmService germplasmService; - private final static Logger LOGGER = LoggerFactory.getLogger(GermplasmController.class); - - @Autowired - public GnpISGermplasmController(GermplasmService germplasmService) { - this.germplasmService = germplasmService; - } - - @Operation(summary = "Search germplasm by ID or PUI") - @GetMapping - public GermplasmVO get( - @RequestParam(required = false) String id, - @RequestParam(required = false) String pui - ) { - GermplasmVO germplasm = null; - boolean hasId = !Strings.isNullOrEmpty(id); - boolean hasPui = !Strings.isNullOrEmpty(pui); - - if (!hasId && !hasPui) { - throw new BadRequestException("You must provide at least one identifier (PUI or ID) in the query params."); - } - - if (hasId && !hasPui) { - germplasm = germplasmService.getById(id); - } else { - GermplasmGETSearchCriteria criteria = new GermplasmGETSearchCriteria(); - criteria.setGermplasmPUI(Collections.singletonList(pui)); - if (hasId) { - criteria.setGermplasmDbId(Collections.singletonList(id)); - } - PaginatedList<GermplasmVO> pager = germplasmService.find(criteria); - if (pager != null && pager.size() == 1) { - germplasm = pager.get(0); - } - } - - if (germplasm == null) { - String message = "Germplasm not found"; - if (hasId) { - message += " for id: '" + id + "'"; - } - if (hasPui) { - if (hasId) message += " and"; - message += " for pui: '" + pui + "'"; - } - - throw new NotFoundException(message); - } - return germplasm; - } - - - /** - * Webservice for exporting germplasm by criteria into a CSV. - * <p> - * See http://stackoverflow.com/questions/5673260/downloading-a-file-from- - * spring-controllers resp.setContentType("application/csv"); - * - * <pre> - * resp.setContentType("application/vnd.ms-excel"); - * resp.setContentType("application/zip"); - * </pre> - */ - @PostMapping(value = "/csv", produces = "text/csv", consumes = APPLICATION_JSON_VALUE) - public FileSystemResource export(@RequestBody @Valid GermplasmPOSTSearchCriteria criteria, HttpServletResponse response) { - - try { - File exportFile = germplasmService.exportCSV(criteria); - response.setHeader("Content-Disposition", "attachment; filename=germplasm.gnpis.csv"); - return new FileSystemResource(exportFile); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("An error occurred when exporting germplasm: " + e.getMessage() + ".", e); - } - } - - @PostMapping(value = "/germplasm-list-csv", produces = "text/csv", consumes = APPLICATION_JSON_VALUE) - public FileSystemResource export(@RequestBody @Valid FaidareGermplasmPOSTShearchCriteria criteria, HttpServletResponse response) { - - long limitResult = 50000L; - long nbResult = germplasmService.germplasmFind(criteria).getMetadata().getPagination().getTotalCount(); - - if (!(nbResult > limitResult)) { - try { - File exportFile = germplasmService.exportListGermplasmCSV(criteria); - response.setHeader("Content-Disposition", "attachment; filename=germplasm.gnpis.csv"); - return new FileSystemResource(exportFile); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("An error occurred when exporting germplasm: " + e.getMessage() + ".", e); - } - } - return null; - } - - - - @PostMapping(value = "/germplasm-mcpd-csv", produces = "text/csv", consumes = APPLICATION_JSON_VALUE) - public FileSystemResource exportMcpd(@RequestBody @Valid FaidareGermplasmPOSTShearchCriteria criteria, HttpServletResponse response) { - - long limitResult = 50000L; - long nbResult = germplasmService.germplasmFind(criteria).getMetadata().getPagination().getTotalCount(); - - if (!(nbResult > limitResult)) { - try { - File exportFile = germplasmService.exportGermplasmMcpd(criteria); - response.setHeader("Content-Disposition", "attachment; filename=germplasm.gnpis.csv"); - return new FileSystemResource(exportFile); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("An error occurred when exporting germplasm: " + e.getMessage() + ".", e); - } - } - return null; - } - - @Operation(summary = "Search list of germplasm") - @PostMapping(value = "/search", consumes = APPLICATION_JSON_VALUE) - public GermplasmSearchResponse germplasmSearch(@RequestBody @Valid FaidareGermplasmPOSTShearchCriteria criteria) { - try { - return germplasmService.germplasmFind(criteria); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(); - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISJSONViewHandler.java b/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISJSONViewHandler.java deleted file mode 100644 index fee692e09e95862e899c1fb3e7bb0769c39a6e89..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISJSONViewHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import fr.inra.urgi.faidare.domain.JSONView; -import org.springframework.core.MethodParameter; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJacksonValue; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice; - -/** - * @author gcornut - */ -@ControllerAdvice(basePackages = "fr.inra.urgi.faidare.api.faidare.v1") -public class GnpISJSONViewHandler extends AbstractMappingJacksonResponseBodyAdvice { - - @Override - protected void beforeBodyWriteInternal( - MappingJacksonValue bodyContainer, - MediaType contentType, - MethodParameter returnType, - ServerHttpRequest req, - ServerHttpResponse response - ) { - // Default: display only GnpIS API Fields (BrAPI + GnpIS fileds) - bodyContainer.setSerializationView(JSONView.GnpISAPI.class); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/XRefDocumentController.java b/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/XRefDocumentController.java deleted file mode 100644 index af79dc6b08ff9b65485865590783088f1b5f5342..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/faidare/v1/XRefDocumentController.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import java.util.List; - -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - - -/** - * Imported and adapted from unified-interface legacy - */ -@Tag(name = "FAIDARE API", description = "Extended FAIDARE API") -@RestController -public class XRefDocumentController { - - private final XRefDocumentRepository repository; - - @Autowired - public XRefDocumentController(XRefDocumentRepository repository) { - this.repository = repository; - } - - @Operation(summary = "Find xref documents") - @GetMapping(value = "/faidare/v1/xref/documentbyfulltextid") - public PaginatedList<XRefDocumentVO> documentByFullTextId( - @RequestParam(required = false, value = "entryType") String entryType, - @RequestParam(required = false) List<String> linkedResourcesID - ) { - XRefDocumentSearchCriteria criteria = new XRefDocumentSearchCriteria(); - criteria.setEntryType(entryType); - criteria.setLinkedResourcesID(linkedResourcesID); - return repository.find(criteria); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/SecurityConfig.java b/backend/src/main/java/fr/inra/urgi/faidare/config/SecurityConfig.java deleted file mode 100644 index 25b71df768766c7765cc196d2f4bc1d148bd8540..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/SecurityConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; - -/** - * Security configuration. It makes sure that harvest endpoints and the actuator endpoints are only accessible to - * authenticated users - * - * @author JB Nizet - */ -@Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/actuator**").authenticated() - .and() - .httpBasic() - .and() - .csrf().disable() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); - } - - @Override - public void configure(WebSecurity web) throws Exception { - // Ignore every URL not containing '/actuator' - web.ignoring().regexMatchers("^((?!\\/actuator).)*$"); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeCriteria.java deleted file mode 100644 index eeb03593ecba586128fb99884e5e2b1133139020..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeCriteria.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmAttributeCriteria { - List<String> getAttributeList(); - - String getGermplasmDbId(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeListCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeListCriteria.java deleted file mode 100644 index 01ba6513e9641381a8e99e8c78155449fefd961b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmAttributeListCriteria.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmAttributeListCriteria { - - List<String> getAttributeCategoryDbId(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmGETSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmGETSearchCriteria.java deleted file mode 100644 index 398efdc5162ba5b10859c0d3a80b87e76e4cce40..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmGETSearchCriteria.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmGETSearchCriteria extends BrapiPaginationCriteria { - List<String> getGermplasmPUI(); - - List<String> getGermplasmDbId(); - - List<String> getGermplasmName(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmPOSTSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmPOSTSearchCriteria.java deleted file mode 100644 index 1b3d82911a9edd1bd3cfd17c0e365e2e281392cf..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiGermplasmPOSTSearchCriteria.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmPOSTSearchCriteria extends BrapiPaginationCriteria { - List<String> getGermplasmPUIs(); - - List<String> getGermplasmDbIds(); - - List<String> getGermplasmSpecies(); - - List<String> getGermplasmGenus(); - - List<String> getGermplasmNames(); - - List<String> getAccessionNumbers(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiLocationCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiLocationCriteria.java deleted file mode 100644 index e61ab3e39648b49a364bbe93f2125d9216fc8658..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiLocationCriteria.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.Set; - -/** - * @author gcornut - */ -public interface BrapiLocationCriteria extends BrapiPaginationCriteria { - - Set<String> getLocationTypes(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationUnitCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationUnitCriteria.java deleted file mode 100644 index a0666582c439436d54f84a19d94d585d5c0e6947..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationUnitCriteria.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.List; -import java.util.Set; - -/** - * @author gcornut - */ -public interface BrapiObservationUnitCriteria extends BrapiPaginationCriteria { - List<String> getObservationTimeStampRange(); - - Set<String> getGermplasmDbIds(); - - Set<String> getObservationVariableDbIds(); - - Set<String> getStudyDbIds(); - - Set<String> getLocationDbIds(); - - Set<String> getProgramDbIds(); - - Set<String> getSeasonDbIds(); - - String getObservationLevel(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationVariableCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationVariableCriteria.java deleted file mode 100644 index a5d90e66e76ead70d5b6a81191c7fddd189d2002..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiObservationVariableCriteria.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.Set; - -/** - * @author gcornut - */ -public interface BrapiObservationVariableCriteria extends BrapiPaginationCriteria { - - String getTraitClass(); - - Set<String> getObservationVariableDbIds(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiPaginationCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiPaginationCriteria.java deleted file mode 100644 index caac92a7c5ba040161199c52d375853118aaed9b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiPaginationCriteria.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -/** - * @author gcornut - */ -public interface BrapiPaginationCriteria { - - Long DEFAULT_PAGE = 0L; - Long DEFAULT_PAGE_SIZE = 100L; - - Long getPage(); - - Long getPageSize(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiProgramCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiProgramCriteria.java deleted file mode 100644 index ea8837556d717da5cd0cff4a0986f4e7a4a6c36f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiProgramCriteria.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ProgramSearch.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ListPrograms.md - */ -public interface BrapiProgramCriteria extends BrapiPaginationCriteria { - - String getProgramDbId(); - - String getName(); - - String getAbbreviation(); - - String getObjective(); - - String getLeadPerson(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiSortCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiSortCriteria.java deleted file mode 100644 index ccb49dd6f22d1de638921d833b75b45cbb9745b9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiSortCriteria.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -/** - * @author gcornut - */ -public interface BrapiSortCriteria { - - String getSortBy(); - - String getSortOrder(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyCriteria.java deleted file mode 100644 index 8e592fd699c5e9232f3709acdeff662ef8898eee..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyCriteria.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.Set; - -/** - * @author gcornut - */ -public interface BrapiStudyCriteria extends BrapiPaginationCriteria, BrapiSortCriteria { - - String getStudyType(); - - String getProgramDbId(); - - String getLocationDbId(); - - String getSeasonDbId(); - - Set<String> getGermplasmDbIds(); - - Set<String> getObservationVariableDbIds(); - - Boolean getActive(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyObservationUnitCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyObservationUnitCriteria.java deleted file mode 100644 index 52e19f2c09840e2d3b3222471f376db086f4b0ac..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudyObservationUnitCriteria.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -/** - * @author gcornut - */ -public interface BrapiStudyObservationUnitCriteria extends BrapiPaginationCriteria { - - String getObservationLevel(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudySearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudySearchCriteria.java deleted file mode 100644 index 0043f99f074c5192a248abe4f0c34235f0de7554..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiStudySearchCriteria.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -import java.util.Set; - -/** - * @author gcornut - */ -public interface BrapiStudySearchCriteria extends BrapiPaginationCriteria, BrapiSortCriteria, BrapiStudyCriteria { - - Set<String> getStudyLocations(); - - Set<String> getProgramNames(); - - Set<String> getStudyNames(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiTrialCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiTrialCriteria.java deleted file mode 100644 index 4ce30335614ff748de139efa4d824d9f9a9fe094..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/criteria/BrapiTrialCriteria.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.criteria; - -/** - * @author gcornut - */ -public interface BrapiTrialCriteria extends BrapiPaginationCriteria, BrapiSortCriteria { - - String getProgramDbId(); - - String getLocationDbId(); - - Boolean getActive(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiAdditionalInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiAdditionalInfo.java deleted file mode 100644 index a1f7074ab309c406052750217d7d2470f7b1a8b2..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiAdditionalInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -/** - * Additional info with a dynamic JSON mapping to a Java <code>Map<String,Object></code> - * <p> - * How the dynamic mapping is configured: - * - * @author gcornut - * @link http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html - * <p> - * Used in BrapiLocation, BrapiStudy and BrapiTrial: - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/ListLocations.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/LocationDetails.md - */ -public class BrapiAdditionalInfo implements Serializable { - - private Map<String, Object> properties = new HashMap<>(); - - @JsonView(JSONView.BrapiFields.class) - @JsonAnyGetter - public Map<String, Object> getProperties() { - return properties; - } - - @JsonAnySetter - public void addProperty(String key, Object value) { - this.properties.put(key, value); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiCall.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiCall.java deleted file mode 100644 index d5f0c33fb2d101cf5edd5c47e249aa90f2e589e6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiCall.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.Set; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Calls/Calls.md - */ -public interface BrapiCall { - - @JsonView(JSONView.BrapiFields.class) - String getCall(); - - @JsonView(JSONView.BrapiFields.class) - Set<String> getDatatypes(); - - @JsonView(JSONView.BrapiFields.class) - Set<String> getMethods(); - - @JsonView(JSONView.BrapiFields.class) - Set<String> getVersions(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiContact.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiContact.java deleted file mode 100644 index ee711a321b15cabb7abf9118d0bf94c1f5867a8f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiContact.java +++ /dev/null @@ -1,33 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/GetTrialById.md - */ -public interface BrapiContact extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - String getContactDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getEmail(); - - @JsonView(JSONView.BrapiFields.class) - String getType(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteName(); - - @JsonView(JSONView.BrapiFields.class) - String getOrcid(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasm.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasm.java deleted file mode 100644 index c798100b21536dcb9c4287fe830e5a7c122a2605..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasm.java +++ /dev/null @@ -1,81 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasm extends HasBrapiDocumentationURL { - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getDefaultDisplayName(); - - @JsonView(JSONView.BrapiFields.class) - String getAccessionNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmName(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmPUI(); - - @JsonView(JSONView.BrapiFields.class) - String getPedigree(); - - @JsonView(JSONView.BrapiFields.class) - String getSeedSource(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getSynonyms(); - - @JsonView(JSONView.BrapiFields.class) - String getCommonCropName(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteCode(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteName(); - - @JsonView(JSONView.BrapiFields.class) - String getBiologicalStatusOfAccessionCode(); - - @JsonView(JSONView.BrapiFields.class) - String getCountryOfOriginCode(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getTypeOfGermplasmStorageCode(); - - @JsonView(JSONView.BrapiFields.class) - String getGenus(); - - @JsonView(JSONView.BrapiFields.class) - String getSpecies(); - - @JsonView(JSONView.BrapiFields.class) - String getSpeciesAuthority(); - - @JsonView(JSONView.BrapiFields.class) - String getSubtaxa(); - - @JsonView(JSONView.BrapiFields.class) - String getSubtaxaAuthority(); - - @JsonView(JSONView.BrapiFields.class) - List<? extends BrapiGermplasmDonor> getDonors(); - - @JsonView(JSONView.BrapiFields.class) - String getAcquisitionDate(); - - @JsonView(JSONView.BrapiFields.class) - List<? extends BrapiGermplasmTaxonSource> getTaxonIds(); - - @Override - String getDocumentationURL(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValue.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValue.java deleted file mode 100644 index 5d1d946527153ff5d1da61532f3863acece6242e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValue.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.Date; - -/** - * @author gcornut - */ -public interface BrapiGermplasmAttributeValue { - @JsonView(JSONView.BrapiFields.class) - String getAttributeDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getAttributeName(); - - @JsonView(JSONView.BrapiFields.class) - String getAttributeCode(); - - @JsonView(JSONView.BrapiFields.class) - String getValue(); - - @JsonView(JSONView.BrapiFields.class) - Date getDeterminedDate(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValueList.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValueList.java deleted file mode 100644 index b828aa22226d02961b65fea6722786c178dcecdc..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmAttributeValueList.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmAttributeValueList { - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiGermplasmAttributeValue> getData(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingInfo.java deleted file mode 100644 index 2acbf77fe3b9243509bc769f123ed41c2f529738..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.data.germplasm.ExtendedInstitute; -import fr.inra.urgi.faidare.domain.data.germplasm.InstituteVO; - -import java.io.Serializable; -import java.util.List; - -public interface BrapiGermplasmCollectingInfo extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - List<? extends BrapiGermplasmInstitute> getCollectingInstitutes(); - - @JsonView(JSONView.BrapiFields.class) - String getCollectingMissionIdentifier(); - - @JsonView(JSONView.BrapiFields.class) - String getCollectingNumber(); - - @JsonView(JSONView.BrapiFields.class) - BrapiGermplasmCollectingSite getCollectingSite(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingSite.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingSite.java deleted file mode 100644 index c16d41c5f6c0efdb79457536d48e3a77a010813c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmCollectingSite.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - -public interface BrapiGermplasmCollectingSite extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - String getCoordinateUncertainty(); - - @JsonView(JSONView.BrapiFields.class) - String getElevation(); - - @JsonView(JSONView.BrapiFields.class) - String getGeoreferencingMethod(); - - @JsonView(JSONView.BrapiFields.class) - String getLatitudeDecimal(); - - @JsonView(JSONView.BrapiFields.class) - String getLatitudeDegrees(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationDescription(); - - @JsonView(JSONView.BrapiFields.class) - String getLongitudeDecimal(); - - @JsonView(JSONView.BrapiFields.class) - String getLongitudeDegrees(); - - @JsonView(JSONView.BrapiFields.class) - String getSpatialReferenceSystem(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonor.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonor.java deleted file mode 100644 index 84d9f16c8e0e83e0764642b4c346de0def016475..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonor.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiGermplasmDonor { - @JsonView(JSONView.BrapiFields.class) - String getDonorGermplasmPUI(); - - @JsonView(JSONView.BrapiFields.class) - String getDonorAccessionNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getDonorInstituteCode(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonorInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonorInfo.java deleted file mode 100644 index b47883d4e79387623cad7d56bf9ef5c823211872..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmDonorInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.data.germplasm.ExtendedInstitute; - -import java.io.Serializable; - -public interface BrapiGermplasmDonorInfo extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - String getDonorAccessionNumber(); - - @JsonView(JSONView.BrapiFields.class) - BrapiGermplasmInstitute getDonorInstitute(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmInstitute.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmInstitute.java deleted file mode 100644 index dfe70de89ab640e3aed3ae90121e4b65819428bb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmInstitute.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiGermplasmInstitute { - @JsonView(JSONView.BrapiFields.class) - String getInstituteName(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteCode(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmMcpd.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmMcpd.java deleted file mode 100644 index f1fea8bc5d27aca6fc77d43c1a3a613d25b501e6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmMcpd.java +++ /dev/null @@ -1,87 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.data.germplasm.DonorInfoVO; -import fr.inra.urgi.faidare.domain.data.germplasm.InstituteVO; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiGermplasmMcpd { - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmPUI(); - - @JsonView(JSONView.BrapiFields.class) - String getAccessionNumber(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getAccessionNames(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getAlternateIDs(); - - @JsonView(JSONView.BrapiFields.class) - String getCommonCropName(); - - @JsonView(JSONView.BrapiFields.class) - String getGenus(); - - @JsonView(JSONView.BrapiFields.class) - String getSpecies(); - - @JsonView(JSONView.BrapiFields.class) - String getSpeciesAuthority(); - - @JsonView(JSONView.BrapiFields.class) - String getSubtaxon(); - - @JsonView(JSONView.BrapiFields.class) - String getSubtaxonAuthority(); - - @JsonView(JSONView.BrapiFields.class) - String getAncestralData(); - - @JsonView(JSONView.BrapiFields.class) - String getBiologicalStatusOfAccessionCode(); - - @JsonView(JSONView.BrapiFields.class) - String getMlsStatus(); - - @JsonView(JSONView.BrapiFields.class) - String getCountryOfOriginCode(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteCode(); - - @JsonView(JSONView.BrapiFields.class) - BrapiGermplasmCollectingInfo getCollectingInfo(); - - @JsonView(JSONView.BrapiFields.class) - String getAcquisitionDate(); - - @JsonView(JSONView.BrapiFields.class) - String getAcquisitionSourceCode(); - - @JsonView(JSONView.BrapiFields.class) - List<DonorInfoVO> getDonorInfo(); - - @JsonView(JSONView.BrapiFields.class) - List<? extends BrapiGermplasmInstitute> getBreedingInstitutes(); - - @JsonView(JSONView.BrapiFields.class) - List<? extends BrapiGermplasmInstitute> getSafetyDuplicateInstitutes(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getStorageTypeCodes(); - - @JsonView(JSONView.BrapiFields.class) - String getRemarks(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmTaxonSource.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmTaxonSource.java deleted file mode 100644 index 4977846e61965623d2f0f4e3c189e1555adf1c77..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiGermplasmTaxonSource.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiGermplasmTaxonSource { - @JsonView(JSONView.BrapiFields.class) - String getTaxonId(); - - @JsonView(JSONView.BrapiFields.class) - String getSourceName(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiLocation.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiLocation.java deleted file mode 100644 index 81ffd3a95f3e21b83c5af3821b675f02fb426f13..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiLocation.java +++ /dev/null @@ -1,70 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/ListLocations.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Locations/LocationDetails.md - */ -public interface BrapiLocation extends HasBrapiDocumentationURL { - - // Location - @JsonView(JSONView.BrapiFields.class) - String getLocationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationType(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationName(); - - @Deprecated - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getAbbreviation(); - - @Deprecated - @JsonView(JSONView.BrapiFields.class) - String getAbreviation(); - - // Geo - @JsonView(JSONView.BrapiFields.class) - Double getLatitude(); - - @JsonView(JSONView.BrapiFields.class) - Double getLongitude(); - - @JsonView(JSONView.BrapiFields.class) - Double getAltitude(); - - // Country - @JsonView(JSONView.BrapiFields.class) - String getCountryCode(); - - @JsonView(JSONView.BrapiFields.class) - String getCountryName(); - - // Institution - - @JsonView(JSONView.BrapiFields.class) - String getInstituteAddress(); - - // For backward compatibility with brapi v1 - @JsonView(JSONView.BrapiFields.class) - @Deprecated - String getInstituteAdress(); - - @JsonView(JSONView.BrapiFields.class) - String getInstituteName(); - - // Additional info - @JsonView(JSONView.BrapiFields.class) - BrapiAdditionalInfo getAdditionalInfo(); - - @Override - String getDocumentationURL(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservation.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservation.java deleted file mode 100644 index 96d45884585ab3ebd2f03cd70dd899fedf8da1db..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservation.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.Date; - -/** - * @author gcornut - */ -public interface BrapiObservation { - @JsonView(JSONView.BrapiFields.class) - String getObservationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationVariableDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationVariableName(); - - @JsonView(JSONView.BrapiFields.class) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'") - Date getObservationTimeStamp(); - - @JsonView(JSONView.BrapiFields.class) - String getSeason(); - - @JsonView(JSONView.BrapiFields.class) - String getCollector(); - - @JsonView(JSONView.BrapiFields.class) - String getValue(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnit.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnit.java deleted file mode 100644 index 2eaaae70b69dcc84f14e5be13370c9e12f055754..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnit.java +++ /dev/null @@ -1,84 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiObservationUnit { - @JsonView(JSONView.BrapiFields.class) - String getProgramDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationUnitDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationUnitName(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationLevel(); - - @JsonView(JSONView.BrapiFields.class) - String getObservationLevels(); - - @JsonView(JSONView.BrapiFields.class) - String getPlotNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getPlantNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getBlockNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getReplicate(); - - @JsonView(JSONView.BrapiFields.class) - String getEntryType(); - - @JsonView(JSONView.BrapiFields.class) - String getEntryNumber(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmName(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyName(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyLocationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyLocation(); - - @JsonView(JSONView.BrapiFields.class) - String getProgramName(); - - @JsonView(JSONView.BrapiFields.class) - @JsonProperty("X") - String getX(); - - @JsonView(JSONView.BrapiFields.class) - @JsonProperty("Y") - String getY(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiObservationUnitTreatment> getTreatments(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiObservation> getObservations(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiObservationUnitXRef> getObservationUnitXref(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitTreatment.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitTreatment.java deleted file mode 100644 index 4c43bfe40188fee50b4cec0235e024a68158a3d3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitTreatment.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiObservationUnitTreatment { - @JsonView(JSONView.BrapiFields.class) - String getFactor(); - - @JsonView(JSONView.BrapiFields.class) - String getModality(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitXRef.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitXRef.java deleted file mode 100644 index 6a7bd8713eac6f8676940041475551fb0aae7625..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationUnitXRef.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiObservationUnitXRef { - @JsonView(JSONView.BrapiFields.class) - String getSource(); - - @JsonView(JSONView.BrapiFields.class) - String getId(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiParentProgeny.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiParentProgeny.java deleted file mode 100644 index 67d8d5a24993fb1d35710f6b50b1dd42b7c138de..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiParentProgeny.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -public interface BrapiParentProgeny { - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getDefaultDisplayName(); - - @JsonView(JSONView.BrapiFields.class) - String getParentType(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiPedigree.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiPedigree.java deleted file mode 100644 index 87a63f60482b6c61b5c49190bf6164f058f2e8bd..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiPedigree.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author cpommier, mbuy - */ -public interface BrapiPedigree { - - @JsonView(JSONView.BrapiFields.class) - String getPedigree(); - - @JsonView(JSONView.BrapiFields.class) - String getCrossingPlan(); - - @JsonView(JSONView.BrapiFields.class) - String getCrossingYear(); - - @JsonView(JSONView.BrapiFields.class) - String getFamilyCode(); - - @JsonView(JSONView.BrapiFields.class) - String getParent1DbId(); - - @JsonView(JSONView.BrapiFields.class) - String getParent1Name(); - - @JsonView(JSONView.BrapiFields.class) - String getParent1Type(); - - @JsonView(JSONView.BrapiFields.class) - String getParent2DbId(); - - @JsonView(JSONView.BrapiFields.class) - String getParent2Name(); - - @JsonView(JSONView.BrapiFields.class) - String getParent2Type(); - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getDefaultDisplayName(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiSibling> getSiblings(); - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgeny.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgeny.java deleted file mode 100644 index 66bfc823b4051beb17dcac61f62549a940139fc3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgeny.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * + * @author mbuy - * + * - * + * - * + - */ - -public interface BrapiProgeny { - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getDefaultDisplayName(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiParentProgeny> getProgeny(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgram.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgram.java deleted file mode 100644 index 952b9b12e32515193d9f6a043117f17440ce8cfe..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiProgram.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ListPrograms.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Programs/ProgramSearch.md - */ -public interface BrapiProgram { - - @JsonView(JSONView.BrapiFields.class) - String getProgramDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getProgramName(); - - @Deprecated - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getAbbreviation(); - - @JsonView(JSONView.BrapiFields.class) - String getLeadPerson(); - - @JsonView(JSONView.BrapiFields.class) - String getObjective(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiSibling.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiSibling.java deleted file mode 100644 index 282361731260d07ca3cda190c73872aa337db1cb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiSibling.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -public interface BrapiSibling { - - @JsonView(JSONView.BrapiFields.class) - String getGermplasmDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getDefaultDisplayName(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudy.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudy.java deleted file mode 100644 index aacd23722d863c53059f0c0d59be034f94753c12..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudy.java +++ /dev/null @@ -1,75 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -/** - * Generic Brapi study. - * <p> - * No <code>@JsonDeserialize</code> is declared here because this interface is - * not used directly (only extended). - * <p> - * Extended in {@link BrapiStudySummary} and {@link BrapiStudyDetail} - * - * @author gcornut - */ -public interface BrapiStudy extends HasBrapiDocumentationURL { - - // Study - @JsonView(JSONView.BrapiFields.class) - String getStudyDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyName(); - - @Deprecated - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyType(); - - @JsonView(JSONView.BrapiFields.class) - Boolean getActive(); - - @JsonView(JSONView.BrapiFields.class) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - Date getStartDate(); - - @JsonView(JSONView.BrapiFields.class) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - Date getEndDate(); - - // Seasons - @JsonView(JSONView.BrapiFields.class) - List<String> getSeasons(); - - // Program - @JsonView(JSONView.BrapiFields.class) - String getProgramDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getProgramName(); - - // Trials - @JsonView(JSONView.BrapiFields.class) - String getTrialName(); - - @JsonView(JSONView.BrapiFields.class) - String getTrialDbId(); - - @JsonView(JSONView.BrapiFields.class) - Set<String> getTrialDbIds(); - - // Additional info - @JsonView(JSONView.BrapiFields.class) - BrapiAdditionalInfo getAdditionalInfo(); - - @Override - String getDocumentationURL(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDataLink.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDataLink.java deleted file mode 100644 index dc6eca031e32ee8ac79570f9dc7d0e40677503c3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDataLink.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public interface BrapiStudyDataLink extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getType(); - - @JsonView(JSONView.BrapiFields.class) - String getUrl(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDetail.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDetail.java deleted file mode 100644 index 9aad252e95f8e7a2e7a20ce2be5b1e7c0990f289..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyDetail.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public interface BrapiStudyDetail extends BrapiStudy { - - // Study description - @JsonView(JSONView.BrapiFields.class) - String getStudyDescription(); - - // Study last update - @JsonView(JSONView.BrapiFields.class) - BrapiStudyLastUpdate getLastUpdate(); - - // Contacts - @JsonView(JSONView.BrapiFields.class) - List<BrapiContact> getContacts(); - - // Location - @JsonView(JSONView.BrapiFields.class) - BrapiLocation getLocation(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationName(); - - // Data links - @JsonView(JSONView.BrapiFields.class) - List<BrapiStudyDataLink> getDataLinks(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyLastUpdate.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyLastUpdate.java deleted file mode 100644 index 060f7cd7c251ac912f74021e0535a209a174c1f7..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudyLastUpdate.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public interface BrapiStudyLastUpdate extends Serializable { - - @JsonView(JSONView.BrapiFields.class) - String getVersion(); - - @JsonView(JSONView.BrapiFields.class) - //@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd, yyyy-MM-dd'T'HH:mm:ss'Z'") - String getTimestamp(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudySummary.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudySummary.java deleted file mode 100644 index 08ada70747e998a5126fd4233d812896762df4f5..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiStudySummary.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/SearchStudies.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/ListStudySummaries.md - */ -public interface BrapiStudySummary extends BrapiStudy { - - // Location - @JsonView(JSONView.BrapiFields.class) - String getLocationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationName(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrial.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrial.java deleted file mode 100644 index f88dd346a9cd928ca122dc2a9dc2f2b4c7b28f52..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrial.java +++ /dev/null @@ -1,62 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.Date; -import java.util.List; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/GetTrialById.md - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/ListTrialSummaries.md - */ -public interface BrapiTrial extends HasBrapiDocumentationURL { - - // Trial - @JsonView(JSONView.BrapiFields.class) - String getTrialDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getTrialName(); - - @JsonView(JSONView.BrapiFields.class) - String getTrialType(); - - @JsonView(JSONView.BrapiFields.class) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - Date getEndDate(); - - @JsonView(JSONView.BrapiFields.class) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - Date getStartDate(); - - @JsonView(JSONView.BrapiFields.class) - Boolean getActive(); - - @JsonView(JSONView.BrapiFields.class) - String getProgramDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getProgramName(); - - // Authorship - @JsonView(JSONView.BrapiFields.class) - BrapiTrialDatasetAuthorship getDatasetAuthorship(); - - // Contacts - @JsonView(JSONView.BrapiFields.class) - List<BrapiContact> getContacts(); - - // Studies - @JsonView(JSONView.BrapiFields.class) - List<BrapiTrialStudy> getStudies(); - - // Additional info - @JsonView(JSONView.BrapiFields.class) - BrapiAdditionalInfo getAdditionalInfo(); - - @Override - String getDocumentationURL(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialDatasetAuthorship.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialDatasetAuthorship.java deleted file mode 100644 index fc62675fc6d836c6833b3296cda9a40cac08991e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialDatasetAuthorship.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Trials/GetTrialById.md - */ -public interface BrapiTrialDatasetAuthorship { - - @JsonView(JSONView.BrapiFields.class) - String getLicense(); - - @JsonView(JSONView.BrapiFields.class) - String getDatasetPUI(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialStudy.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialStudy.java deleted file mode 100644 index 6c50078c0b9a697146d000470ee2305cbc08e752..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrialStudy.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - -/** - * Generic Brapi study. - * <p> - * No <code>@JsonDeserialize</code> is declared here because this interface is - * not used directly (only extended). - * <p> - * Extended in {@link BrapiStudySummary} and {@link BrapiStudyDetail} - * - * @author gcornut - */ -public interface BrapiTrialStudy extends Serializable { - - // Study - @JsonView(JSONView.BrapiFields.class) - String getStudyDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getStudyName(); - - // Location - @JsonView(JSONView.BrapiFields.class) - String getLocationDbId(); - - @JsonView(JSONView.BrapiFields.class) - String getLocationName(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/package-info.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/package-info.java deleted file mode 100644 index 5f4c903b534420326a13001140b9180db142a106..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * BrAPI v1.2 data interfaces (with the exception of the added `documentationURL` field from BrAPI v1.3) - * {@see https://app.swaggerhub.com/apis-docs/PlantBreedingAPI/BrAPI/1.2} - * - * @author gcornut - */ -package fr.inra.urgi.faidare.domain.brapi.v1; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiData.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiData.java deleted file mode 100644 index ba74640b054e92dff18953ac6185d3430d7e00ae..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiData.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiData<T> { - - @JsonView(JSONView.BrapiFields.class) - List<T> getData(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiListResponse.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiListResponse.java deleted file mode 100644 index c67194a15df16b558d13d5f807cfce4c3e01c8c6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiListResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - -/** - * bean for general paginated response structure for breeding API - * - * @author gcornut - * - * <code> - * { - * "metadata": { - * "data": [] - * }, - * "result" : {} - * } - * </code> - */ -public interface BrapiListResponse<T> extends BrapiResponse<BrapiData<T>> { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiMetadata.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiMetadata.java deleted file mode 100644 index fde394084d30c6b5b621db2db8e0bb580004aa52..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiMetadata.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface BrapiMetadata { - @JsonView(JSONView.BrapiFields.class) - BrapiPagination getPagination(); - - @JsonView(JSONView.BrapiFields.class) - List<BrapiStatus> getStatus(); - - @JsonView(JSONView.BrapiFields.class) - List<String> getDatafiles(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiPagination.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiPagination.java deleted file mode 100644 index 33fb0fb2feac3b5b071dc6d27ff74c90defb45ca..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiPagination.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiPagination { - @JsonView(JSONView.BrapiFields.class) - long getPageSize(); - - @JsonView(JSONView.BrapiFields.class) - long getCurrentPage(); - - @JsonView(JSONView.BrapiFields.class) - long getTotalCount(); - - @JsonView(JSONView.BrapiFields.class) - long getTotalPages(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiResponse.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiResponse.java deleted file mode 100644 index b95cf714dca413c587c50c0839931e33d48f8397..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * bean for general response structure for breeding API - * - * @author cpommier, gcornut - * - * - * <code> - * { - * "metadata": {}, - * "result" : {} - * } - * </code> - */ - -public interface BrapiResponse<T> { - @JsonView(JSONView.BrapiFields.class) - T getResult(); - - @JsonView(JSONView.BrapiFields.class) - BrapiMetadata getMetadata(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiStatus.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiStatus.java deleted file mode 100644 index 8ec5b05d266c8bc15560a931ac527baf68602a3d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/response/BrapiStatus.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface BrapiStatus { - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getCode(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/FaidareGermplasmPOSTShearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/FaidareGermplasmPOSTShearchCriteria.java deleted file mode 100644 index 5c46dc15d629891beb98e3b8a7dae2bf022f7509..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/FaidareGermplasmPOSTShearchCriteria.java +++ /dev/null @@ -1,204 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; - -import java.util.List; - -/** - * @author jdestin - */ -@CriteriaForDocument(GermplasmVO.class) -public class FaidareGermplasmPOSTShearchCriteria extends GermplasmPOSTSearchCriteria implements SortCriteria { - - @DocumentPath(value = "synonyms") - private List<String> synonyms; - - /*@DocumentPath(value = {"panel", "name"}, objectsValue = CollPopVO.class) - private List<String> panel; - - @DocumentPath(value = {"collection", "name"}, objectsValue = CollPopVO.class) - private List<String> collection; - - @DocumentPath(value = {"population", "name"}, objectsValue = CollPopVO.class) - private List<String> population;*/ - - @DocumentPath(value = "commonCropName") - private List<String> commonCropName; - - @DocumentPath(value = "species") - private List<String> species; - - @DocumentPath(value = "genus") - private List<String> genus; - - @DocumentPath(value = "genusSpecies") - private List<String> genusSpecies; - - @DocumentPath(value = "subtaxa") - private List<String> subtaxa; - - @DocumentPath(value = "genusSpeciesSubtaxa") - private List<String> genusSpeciesSubtaxa; - - @DocumentPath("taxonSynonyms") - private List<String> taxonSynonyms; - - @DocumentPath("taxonCommonNames") - private List<String> taxonCommonNames; - - @DocumentPath(value = {"holdingInstitute", "organisation"}) - private List<String> holdingInstitute; - - @DocumentPath("sourceUri") - private List<String> sources; - - @DocumentPath("biologicalStatusOfAccessionCode") - private List<String> biologicalStatus; - - @DocumentPath("geneticNature") - private List<String> geneticNature; - - @DocumentPath("countryOfOriginCode") - private List<String> country; - - @NoDocumentMapping - private List<String> facetFields; - - @NoDocumentMapping - private String sortBy = null;// = "schema:name"; - - @NoDocumentMapping - private String sortOrder = null;// = SortOrder.ASC.name(); - - - - - /*public List<String> getPanel() { return panel; } - - public void setPanel(List<String> panel) { this.panel = panel; } - - public List<String> getCollection() { return collection; } - - public void setCollection(List<String> collection) { this.collection = collection; } - - public List<String> getPopulation() { return population; } - - public void setPopulation(List<String> population) { this.population = population; }*/ - - public List<String> getCommonCropName() { return commonCropName; } - - public void setCommonCropName(List<String> commonCropName) { - this.commonCropName = commonCropName; - } - - public List<String> getSpecies() { return species; } - - public void setSpecies(List<String> species) { this.species = species; } - - public List<String> getGenus() { return genus; } - - public void setGenus(List<String> genus) { this.genus = genus; } - - public List<String> getGenusSpecies() { return genusSpecies; } - - public void setGenusSpecies(List<String> genusSpecies) { - this.genusSpecies = genusSpecies; - } - - public List<String> getSubtaxa() { return subtaxa; } - - public void setSubtaxa(List<String> subtaxa) { this.subtaxa = subtaxa; } - - public List<String> getGenusSpeciesSubtaxa() { return genusSpeciesSubtaxa; } - - public void setGenusSpeciesSubtaxa(List<String> genusSpeciesSubtaxa) { - this.genusSpeciesSubtaxa = genusSpeciesSubtaxa; - } - - public List<String> getTaxonSynonyms() { return taxonSynonyms; } - - public void setTaxonSynonyms(List<String> taxonSynonyms) { - this.taxonSynonyms = taxonSynonyms; - } - - public List<String> getSynonyms() { return synonyms; } - - public void setSynonyms(List<String> synonyms) { this.synonyms = synonyms; } - - public List<String> getTaxonCommonNames() { - return taxonCommonNames; - } - - public void setTaxonCommonNames(List<String> taxonCommonNames) { - this.taxonCommonNames = taxonCommonNames; - } - - public List<String> getHoldingInstitute() { - return holdingInstitute; - } - - public void setHoldingInstitute(List<String> holdingInstitute) { - this.holdingInstitute = holdingInstitute; - } - - public List<String> getSources() { - return sources; - } - - public void setSources(List<String> sources) { - this.sources = sources; - } - - public List<String> getBiologicalStatus() { return biologicalStatus; } - - public void setBiologicalStatus(List<String> biologicalStatus) { - this.biologicalStatus = biologicalStatus; - } - - public List<String> getGeneticNature() { - return geneticNature; - } - - public void setGeneticNature(List<String> geneticNature) { - this.geneticNature = geneticNature; - } - - public List<String> getCountry() { return country; } - - public void setCountry(List<String> country) { - this.country = country; - } - - - public void setSortBy(String sortBy) { - this.sortBy = sortBy; - } - - - public void setSortOrder(String sortOrder) { - this.sortOrder = sortOrder; - } - - @Override - public String getSortBy() { - return sortBy; - } - - @Override - public String getSortOrder() { - return sortOrder; - } - - - public List<String> getFacetFields() { - return facetFields; - } - - public void setFacetFields(List<String> facetFields) { - this.facetFields = facetFields; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeCriteria.java deleted file mode 100644 index 7aaa5f60148530d5c179e17eed93d79b3181188e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeCriteria.java +++ /dev/null @@ -1,42 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiGermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(GermplasmAttributeValueListVO.class) -public class GermplasmAttributeCriteria - extends PaginationCriteriaImpl - implements BrapiGermplasmAttributeCriteria { - - @DocumentPath("germplasmDbId") - private String germplasmDbId; - - @DocumentPath({"data", "attributeDbId"}) - private List<String> attributeList; - - @Override - public List<String> getAttributeList() { - return attributeList; - } - - public void setAttributeList(List<String> attributeList) { - this.attributeList = attributeList; - } - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeListCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeListCriteria.java deleted file mode 100644 index 74ceec99dd031ad0f7ff3036a37963461bcbb8a3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmAttributeListCriteria.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiGermplasmAttributeListCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(GermplasmAttributeValueListVO.class) -public class GermplasmAttributeListCriteria - extends PaginationCriteriaImpl - implements BrapiGermplasmAttributeListCriteria { - - @DocumentPath("attributeCategoryDbId") - private List<String> attributeCategoryDbId; - - @Override - public List<String> getAttributeCategoryDbId() { - return attributeCategoryDbId; - } - - public void setAttributeCategoryDbId(List<String> attributeCategoryDbId) { - this.attributeCategoryDbId = attributeCategoryDbId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmGETSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmGETSearchCriteria.java deleted file mode 100644 index 02274c9fb62b6ea7d8f041d0157a1d3535889cfc..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmGETSearchCriteria.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiGermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(GermplasmVO.class) -public class GermplasmGETSearchCriteria - extends PaginationCriteriaImpl - implements GermplasmSearchCriteria, BrapiGermplasmGETSearchCriteria { - - @DocumentPath("germplasmDbId") - private List<String> germplasmDbId; - - @DocumentPath("germplasmPUI") - private List<String> germplasmPUI; - - @DocumentPath("germplasmName") - private List<String> germplasmName; - - @Override - public List<String> getGermplasmPUI() { - return germplasmPUI; - } - - public void setGermplasmPUI(List<String> germplasmPUI) { - this.germplasmPUI = germplasmPUI; - } - - @Override - public List<String> getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(List<String> germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public List<String> getGermplasmName() { - return germplasmName; - } - - public void setGermplasmName(List<String> germplasmName) { - this.germplasmName = germplasmName; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmPOSTSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmPOSTSearchCriteria.java deleted file mode 100644 index 55d6dd1aec505d8129ea42466d0831aaad719734..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmPOSTSearchCriteria.java +++ /dev/null @@ -1,90 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiGermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(GermplasmVO.class) -public class GermplasmPOSTSearchCriteria - extends PaginationCriteriaImpl - implements GermplasmSearchCriteria, BrapiGermplasmPOSTSearchCriteria { - - @DocumentPath("germplasmDbId") - private List<String> germplasmDbIds; - - @DocumentPath("germplasmPUI") - private List<String> germplasmPUIs; - - @DocumentPath("species") - private List<String> germplasmSpecies; - - @DocumentPath("genus") - private List<String> germplasmGenus; - - @DocumentPath("germplasmName") - private List<String> germplasmNames; - - @DocumentPath("accessionNumber") - private List<String> accessionNumbers; - - @Override - public List<String> getGermplasmPUIs() { - return germplasmPUIs; - } - - public void setGermplasmPUIs(List<String> germplasmPUIs) { - this.germplasmPUIs = germplasmPUIs; - } - - @Override - public List<String> getGermplasmDbIds() { - return germplasmDbIds; - } - - public void setGermplasmDbIds(List<String> germplasmDbIds) { - this.germplasmDbIds = germplasmDbIds; - } - - @Override - public List<String> getGermplasmSpecies() { - return germplasmSpecies; - } - - public void setGermplasmSpecies(List<String> germplasmSpecies) { - this.germplasmSpecies = germplasmSpecies; - } - - @Override - public List<String> getGermplasmGenus() { - return germplasmGenus; - } - - public void setGermplasmGenus(List<String> germplasmGenus) { - this.germplasmGenus = germplasmGenus; - } - - @Override - public List<String> getGermplasmNames() { - return germplasmNames; - } - - public void setGermplasmNames(List<String> germplasmNames) { - this.germplasmNames = germplasmNames; - } - - @Override - public List<String> getAccessionNumbers() { - return accessionNumbers; - } - - public void setAccessionNumbers(List<String> accessionNumbers) { - this.accessionNumbers = accessionNumbers; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmSearchCriteria.java deleted file mode 100644 index 897999f0d1b59e0a4b54ca91be4a6295ee93f93c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/GermplasmSearchCriteria.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; - -/** - * Regroups {@link GermplasmGETSearchCriteria} & {@link GermplasmPOSTSearchCriteria} - * - * @author gcornut - */ -public interface GermplasmSearchCriteria extends PaginationCriteria { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/LocationCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/LocationCriteria.java deleted file mode 100644 index c641c3a8294bff336ba432383a4ed14f9d657a76..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/LocationCriteria.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiLocationCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.Set; - -/** - * @author gcornut - */ -@CriteriaForDocument(LocationVO.class) -public class LocationCriteria extends PaginationCriteriaImpl - implements BrapiPaginationCriteria, BrapiLocationCriteria { - - @DocumentPath("locationType") - private Set<String> locationTypes; - - @Override - public Set<String> getLocationTypes() { - return locationTypes; - } - - public void setLocationTypes(Set<String> locationTypes) { - this.locationTypes = locationTypes; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationUnitCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationUnitCriteria.java deleted file mode 100644 index b8d32310f56954eb0db09e03ee224cd8bdbfa99e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationUnitCriteria.java +++ /dev/null @@ -1,121 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.QueryType; -import org.elasticsearch.index.query.RangeQueryBuilder; - -import java.util.List; -import java.util.Set; - -/** - * @author gcornut - */ -@CriteriaForDocument(ObservationUnitVO.class) -public class ObservationUnitCriteria - extends PaginationCriteriaImpl - implements BrapiObservationUnitCriteria { - - @DocumentPath("germplasmDbId") - private Set<String> germplasmDbIds; - - @DocumentPath("studyDbId") - private Set<String> studyDbIds; - - @DocumentPath("studyLocationDbId") - private Set<String> locationDbIds; - - @DocumentPath("programDbId") - private Set<String> programDbIds; - - @DocumentPath("observationLevel") - private String observationLevel; - - // Map to nested fields - @DocumentPath({"observations", "observationVariableDbId"}) - private Set<String> observationVariableDbIds; - - // Map to nested field - @DocumentPath({"observations", "season"}) - private Set<String> seasonDbIds; - - // Map to nested field - @DocumentPath({"observations", "observationTimeStamp"}) - @QueryType(RangeQueryBuilder.class) - private List<String> observationTimeStampRange; - - @Override - public List<String> getObservationTimeStampRange() { - return observationTimeStampRange; - } - - public void setObservationTimeStampRange(List<String> observationTimeStampRange) { - this.observationTimeStampRange = observationTimeStampRange; - } - - @Override - public Set<String> getGermplasmDbIds() { - return germplasmDbIds; - } - - public void setGermplasmDbIds(Set<String> germplasmDbIds) { - this.germplasmDbIds = germplasmDbIds; - } - - @Override - public Set<String> getObservationVariableDbIds() { - return observationVariableDbIds; - } - - public void setObservationVariableDbIds(Set<String> observationVariableDbIds) { - this.observationVariableDbIds = observationVariableDbIds; - } - - @Override - public Set<String> getStudyDbIds() { - return studyDbIds; - } - - public void setStudyDbIds(Set<String> studyDbIds) { - this.studyDbIds = studyDbIds; - } - - @Override - public Set<String> getLocationDbIds() { - return locationDbIds; - } - - public void setLocationDbIds(Set<String> locationDbIds) { - this.locationDbIds = locationDbIds; - } - - @Override - public Set<String> getProgramDbIds() { - return programDbIds; - } - - public void setProgramDbIds(Set<String> programDbIds) { - this.programDbIds = programDbIds; - } - - @Override - public Set<String> getSeasonDbIds() { - return seasonDbIds; - } - - public void setSeasonDbIds(Set<String> seasonDbIds) { - this.seasonDbIds = seasonDbIds; - } - - @Override - public String getObservationLevel() { - return observationLevel; - } - - public void setObservationLevel(String observationLevel) { - this.observationLevel = observationLevel; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationVariableCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationVariableCriteria.java deleted file mode 100644 index 2544e91398b255a255d9cd435f41be5544ecca68..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ObservationVariableCriteria.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiObservationVariableCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; - -import java.util.Set; - -/** - * @author gcornut - */ -public class ObservationVariableCriteria extends PaginationCriteriaImpl - implements BrapiPaginationCriteria, BrapiObservationVariableCriteria { - - private String traitClass; - private Set<String> observationVariableDbIds; - - @Override - public String getTraitClass() { - return traitClass; - } - - public void setTraitClass(String traitClass) { - this.traitClass = traitClass; - } - - @Override - public Set<String> getObservationVariableDbIds() { - return observationVariableDbIds; - } - - public void setObservationVariableDbIds(Set<String> observationVariableDbIds) { - this.observationVariableDbIds = observationVariableDbIds; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ProgramCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ProgramCriteria.java deleted file mode 100644 index be3c809f8485bca83b6aeb63ea32dab2c65607d3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/ProgramCriteria.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiProgramCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -/** - * @author gcornut - */ -@CriteriaForDocument(ProgramVO.class) -public class ProgramCriteria extends PaginationCriteriaImpl - implements BrapiPaginationCriteria, BrapiProgramCriteria { - - @DocumentPath("programDbId") - private String programDbId; - - @DocumentPath("programName") - private String name; - - @DocumentPath("abbreviation") - private String abbreviation; - - @DocumentPath("objective") - private String objective; - - @DocumentPath("leadPerson") - private String leadPerson; - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String getAbbreviation() { - return abbreviation; - } - - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } - - @Override - public String getObjective() { - return objective; - } - - public void setObjective(String objective) { - this.objective = objective; - } - - @Override - public String getLeadPerson() { - return leadPerson; - } - - public void setLeadPerson(String leadPerson) { - this.leadPerson = leadPerson; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyCriteria.java deleted file mode 100644 index ccb1bfc17f2139b0833d1c1be1f0f119f7ff7b62..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyCriteria.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; - -/** - * @author gcornut - */ -public interface StudyCriteria extends PaginationCriteria { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyObservationUnitCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyObservationUnitCriteria.java deleted file mode 100644 index 8e670e74d0fd7a15834d91f94205651b764da7a3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudyObservationUnitCriteria.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiStudyObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; - -/** - * @author gcornut - */ -public class StudyObservationUnitCriteria - extends PaginationCriteriaImpl - implements BrapiStudyObservationUnitCriteria { - - private String observationLevel; - - @Override - public String getObservationLevel() { - return observationLevel; - } - - public void setObservationLevel(String observationLevel) { - this.observationLevel = observationLevel; - } - - @Override - public Long getPage() { - return super.getPage(); - } - - @Override - public void setPage(Long page) { - super.setPage(page); - } - - @Override - public Long getPageSize() { - return super.getPageSize(); - } - - @Override - public void setPageSize(Long pageSize) { - super.setPageSize(pageSize); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySearchCriteria.java deleted file mode 100644 index d511f6316860b961c6219f9bd7f4407769627603..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySearchCriteria.java +++ /dev/null @@ -1,56 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiSortCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiStudySearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.Set; - -/** - * @author gcornut - */ -@CriteriaForDocument(StudySummaryVO.class) -public class StudySearchCriteria extends StudySummaryCriteria - implements SortCriteria, BrapiPaginationCriteria, BrapiSortCriteria, BrapiStudySearchCriteria { - - @DocumentPath("studyName") - private Set<String> studyNames; - - @DocumentPath("programName") - private Set<String> programNames; - - @DocumentPath("locationName") - private Set<String> studyLocations; - - @Override - public Set<String> getStudyLocations() { - return studyLocations; - } - - public void setStudyLocations(Set<String> studyLocations) { - this.studyLocations = studyLocations; - } - - @Override - public Set<String> getProgramNames() { - return programNames; - } - - public void setProgramNames(Set<String> programNames) { - this.programNames = programNames; - } - - @Override - public Set<String> getStudyNames() { - return studyNames; - } - - public void setStudyNames(Set<String> studyNames) { - this.studyNames = studyNames; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySummaryCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySummaryCriteria.java deleted file mode 100644 index 9bd84d296fc292b879d3456a344f5234bd780fa5..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/StudySummaryCriteria.java +++ /dev/null @@ -1,131 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiSortCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiStudyCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; - -import java.util.Set; - -/** - * @author gcornut - */ -@CriteriaForDocument(StudySummaryVO.class) -public class StudySummaryCriteria extends PaginationCriteriaImpl - implements SortCriteria, StudyCriteria, BrapiPaginationCriteria, BrapiSortCriteria, BrapiStudyCriteria { - - @DocumentPath("studyType") - private String studyType; - - @DocumentPath("programDbId") - private String programDbId; - - @DocumentPath("locationDbId") - private String locationDbId; - - @DocumentPath("seasons") - private String seasonDbId; - - @DocumentPath("germplasmDbIds") - private Set<String> germplasmDbIds; - - @DocumentPath("observationVariableDbIds") - private Set<String> observationVariableDbIds; - - @DocumentPath("active") - private Boolean active; - - // Map to nothing (used for result sorting not as an actual criteria) - @NoDocumentMapping - private String sortBy; - - // Map to nothing (used for result sorting not as an actual criteria) - @NoDocumentMapping - private String sortOrder; - - @Override - public String getSortBy() { - return sortBy; - } - - public void setSortBy(String sortBy) { - this.sortBy = sortBy; - } - - @Override - public String getSortOrder() { - return sortOrder; - } - - public void setSortOrder(String sortOrder) { - this.sortOrder = sortOrder; - } - - @Override - public String getStudyType() { - return studyType; - } - - public void setStudyType(String studyType) { - this.studyType = studyType; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } - - @Override - public String getSeasonDbId() { - return seasonDbId; - } - - public void setSeasonDbId(String seasonDbId) { - this.seasonDbId = seasonDbId; - } - - @Override - public Set<String> getGermplasmDbIds() { - return germplasmDbIds; - } - - public void setGermplasmDbIds(Set<String> germplasmDbIds) { - this.germplasmDbIds = germplasmDbIds; - } - - @Override - public Set<String> getObservationVariableDbIds() { - return observationVariableDbIds; - } - - public void setObservationVariableDbIds(Set<String> observationVariableDbIds) { - this.observationVariableDbIds = observationVariableDbIds; - } - - @Override - public Boolean getActive() { - return active; - } - - public void setActive(Boolean active) { - this.active = active; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/TrialCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/TrialCriteria.java deleted file mode 100644 index 608741955e313f9e518b1d2d22c748608d2343d1..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/TrialCriteria.java +++ /dev/null @@ -1,81 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiTrialCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; - -/** - * @author gcornut - */ -@CriteriaForDocument(TrialVO.class) -public class TrialCriteria - extends PaginationCriteriaImpl - implements SortCriteria, BrapiPaginationCriteria, BrapiTrialCriteria { - - @DocumentPath("programDbId") - private String programDbId; - - // Query non nested sub field - @DocumentPath({"studies", "locationDbId"}) - private String locationDbId; - - @DocumentPath("active") - private Boolean active; - - // Map to nothing - @NoDocumentMapping - private String sortBy; - - @NoDocumentMapping - private String sortOrder; - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } - - @Override - public Boolean getActive() { - return active; - } - - public void setActive(Boolean active) { - this.active = active; - } - - @Override - public String getSortBy() { - return sortBy; - } - - public void setSortBy(String sortBy) { - this.sortBy = sortBy; - } - - @Override - public String getSortOrder() { - return sortOrder; - } - - public void setSortOrder(String sortOrder) { - this.sortOrder = sortOrder; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteria.java deleted file mode 100644 index 54f4655733ff51bbf173e1653eb48d33fb1374a1..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteria.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiPaginationCriteria; - -/** - * @author gcornut - */ -public interface PaginationCriteria extends BrapiPaginationCriteria { - - @Override - Long getPage(); - - @Override - Long getPageSize(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteriaImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteriaImpl.java deleted file mode 100644 index 939ddbd44336517104971c630230e21ebdfce725..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationCriteriaImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -/** - * @author gcornut - */ -@ValidPagination // global validation rule -public class PaginationCriteriaImpl implements PaginationCriteria { - public static final long MIN_PAGE = 0; - public static final long MIN_PAGE_SIZE = 1; - public static final long MAX_PAGE_SIZE = 1000; - - public static final String ERROR_PAGE_NULL = "Page number cannot be null"; - public static final String ERROR_PAGE_SIZE_NULL = "Page size cannot be null"; - public static final String ERROR_PAGE_MIN = "Page number cannot be below " + MIN_PAGE; - public static final String ERROR_PAGE_SIZE_MIN = "Page size cannot be below " + MIN_PAGE_SIZE; - public static final String ERROR_PAGE_SIZE_MAX = "Page size cannot be above " + MAX_PAGE_SIZE; - - @NoDocumentMapping // No mapping to VO (used for pagination) - @NotNull(message = ERROR_PAGE_NULL) - @Min(value = MIN_PAGE, message = ERROR_PAGE_MIN) - private Long page = DEFAULT_PAGE; - - @NoDocumentMapping // No mapping to VO (used for pagination) - @NotNull(message = ERROR_PAGE_SIZE_NULL) - @Min(value = MIN_PAGE_SIZE, message = ERROR_PAGE_SIZE_MIN) - @Max(value = MAX_PAGE_SIZE, message = ERROR_PAGE_SIZE_MAX) - private Long pageSize = DEFAULT_PAGE_SIZE; - - @Override - public Long getPage() { - return page; - } - - public void setPage(Long page) { - this.page = page; - } - - @Override - public Long getPageSize() { - return pageSize; - } - - public void setPageSize(Long pageSize) { - this.pageSize = pageSize; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationMaxResultValidator.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationMaxResultValidator.java deleted file mode 100644 index 1f7f00962825ff4b1296e32c16fdaf22bc4b6ef0..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationMaxResultValidator.java +++ /dev/null @@ -1,42 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - -/** - * Pagination validator restricting the max result window to match elasticsearch constrains - * - * @author gcornut - */ -public class PaginationMaxResultValidator implements ConstraintValidator<ValidPagination, PaginationCriteriaImpl> { - - /** - * Default constrain on elasticsearch search result window - * - * @link https://www.elastic.co/guide/en/elasticsearch/reference/2.4/index-modules.html - */ - public static final long MAX_RESULT_WINDOW = 10000; - - public static final String ERROR_MAX_RESULT_WINDOW = - "The result window (page x pageSize) cannot be over " + MAX_RESULT_WINDOW + ". " + - "Please use an export API to download all the requested data."; - - @Override - public void initialize(ValidPagination annotation) { - } - - @Override - public boolean isValid(PaginationCriteriaImpl paginationCriteria, ConstraintValidatorContext context) { - Long pageSize = paginationCriteria.getPageSize(); - Long page = paginationCriteria.getPage(); - - if (page != null && pageSize != null) { - if (page * pageSize >= (MAX_RESULT_WINDOW - pageSize)) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate(ERROR_MAX_RESULT_WINDOW).addConstraintViolation(); - return false; - } - } - return true; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/SortCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/SortCriteria.java deleted file mode 100644 index d6f77cc466a03e8c339176d4f4a7c37c8a6c021c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/SortCriteria.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import fr.inra.urgi.faidare.domain.brapi.v1.criteria.BrapiSortCriteria; - -/** - * @author gcornut - */ -public interface SortCriteria extends BrapiSortCriteria { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/ValidPagination.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/ValidPagination.java deleted file mode 100644 index 230976133a197d90849d192bdd2e344b465649a6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/criteria/base/ValidPagination.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import javax.validation.Constraint; -import javax.validation.Payload; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * @author gcornut - */ - -@Target({TYPE, ANNOTATION_TYPE}) -@Retention(RUNTIME) -@Constraint(validatedBy = PaginationMaxResultValidator.class) -@Documented -public @interface ValidPagination { - - String message() default ""; - - Class<?>[] groups() default {}; - - Class<? extends Payload>[] payload() default {}; -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/CallVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/CallVO.java deleted file mode 100644 index 6fd6838f47fb5a948ceac5c3b2dfec743798dfc5..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/CallVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiCall; - -import java.util.Set; - -import static fr.inra.urgi.faidare.api.brapi.v1.CallsController.DEFAULT_BRAPI_VERSIONS; -import static fr.inra.urgi.faidare.api.brapi.v1.CallsController.DEFAULT_DATA_TYPES; - -/** - * @author gcornut - */ -public class CallVO implements BrapiCall { - - private final String call; - private Set<String> datatypes = DEFAULT_DATA_TYPES; - private Set<String> versions = DEFAULT_BRAPI_VERSIONS; - private Set<String> methods; - - public CallVO(String call) { - this.call = call; - } - - @Override - public String getCall() { - return call; - } - - @Override - public Set<String> getDatatypes() { - return datatypes; - } - - @Override - public Set<String> getMethods() { - return methods; - } - - @Override - public Set<String> getVersions() { - return versions; - } - - public void setDatatypes(Set<String> datatypes) { - this.datatypes = datatypes; - } - - public void setMethods(Set<String> methods) { - this.methods = methods; - } - - public void setVersions(Set<String> versions) { - this.versions = versions; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/GnpISInternal.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/GnpISInternal.java deleted file mode 100644 index dfecbe9ec9e1c0e5ff454cbbdcb09f0b5d2dd9ef..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/GnpISInternal.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; -import java.util.List; - -/** - * Properties used internally which should not be exposed - * - * @author gcornut - */ -public interface GnpISInternal extends Serializable { - - /** - * Restricted group DB identifier from which the VO belong - */ - @JsonView(JSONView.Internal.class) - Long getGroupId(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationSitemapVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationSitemapVO.java deleted file mode 100644 index 1ee34df29e0c81442293391c34f8947f08b5311e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationSitemapVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import java.util.List; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiLocation; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -/** - * A minimal view of a location containing only its ID, used to generate sitemaps - */ -@Document(type = "location", includedFields = "locationDbId") -public class LocationSitemapVO { - - @Id - private String locationDbId; - - public LocationSitemapVO() { - } - - public LocationSitemapVO(String locationDbId) { - this.locationDbId = locationDbId; - } - - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/ProgramVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/ProgramVO.java deleted file mode 100644 index 70362a5ea404821db66e96123df5ea87cdb70b83..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/ProgramVO.java +++ /dev/null @@ -1,135 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiProgram; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.util.List; - -/** - * ProgramVO extending the official BreedingAPI specs with specific fields - * - * @author gcornut - */ -@Document(type = "program") -public class ProgramVO implements GnpISInternal, BrapiProgram, HasURI, HasURL, IncludedInDataCatalog { - - @Id - private String programDbId; - private String programName; - - private String abbreviation; - - // This field is required to be non null in BRAVA - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String leadPerson = ""; - - // This field is required to be non null in BRAVA - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String objective = ""; - - // GnpIS specific fields - private Long groupId; - private List<Long> speciesGroup; - - // JSON-LD fields - private String uri; - private String url; - private String sourceUri; - - @Override - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getSourceUri() { - return sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public String getProgramName() { - return programName; - } - - public void setProgramName(String programName) { - this.programName = programName; - } - - @Override - public String getAbbreviation() { - return abbreviation; - } - - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } - - @Override - public String getLeadPerson() { - return leadPerson; - } - - public void setLeadPerson(String leadPerson) { - this.leadPerson = leadPerson; - } - - @Override - public String getName() { - return programName; - } - - public void setName(String name) { - this.programName = name; - } - - @Override - public String getObjective() { - return objective; - } - - public void setObjective(String objective) { - this.objective = objective; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialDatasetAuthorshipVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialDatasetAuthorshipVO.java deleted file mode 100644 index a99c764c37e8105fd696aea312f1c2166411ed17..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialDatasetAuthorshipVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrialDatasetAuthorship; - -/** - * @author gcornut - */ -public class TrialDatasetAuthorshipVO implements BrapiTrialDatasetAuthorship { - - public static final TrialDatasetAuthorshipVO EMPTY = new TrialDatasetAuthorshipVO(); - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String license = ""; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String datasetPUI = ""; - - @Override - public String getLicense() { - return license; - } - - @Override - public String getDatasetPUI() { - return datasetPUI; - } - - public void setLicense(String license) { - this.license = license; - } - - public void setDatasetPUI(String datasetPUI) { - this.datasetPUI = datasetPUI; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialStudySummaryVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialStudySummaryVO.java deleted file mode 100644 index 1bd7d5377d690d65d6e4e6fdb63974a29ed95388..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialStudySummaryVO.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrialStudy; - -/** - * @author gcornut - */ -public class TrialStudySummaryVO implements BrapiTrialStudy { - - private String studyDbId; - private String studyName; - - private String locationDbId; - private String locationName; - - @Override - public String getStudyDbId() { - return studyDbId; - } - - public void setStudyDbId(String studyDbId) { - this.studyDbId = studyDbId; - } - - @Override - public String getStudyName() { - return studyName; - } - - public void setStudyName(String studyName) { - this.studyName = studyName; - } - - @Override - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } - - @Override - public String getLocationName() { - return locationName; - } - - public void setLocationName(String locationName) { - this.locationName = locationName; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialVO.java deleted file mode 100644 index 021533298b85aad42846f7a0c6658d4ff1f8075e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/TrialVO.java +++ /dev/null @@ -1,209 +0,0 @@ -package fr.inra.urgi.faidare.domain.data; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.*; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.util.Date; -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "trial") -public class TrialVO implements GnpISInternal, BrapiTrial, HasURI, HasURL, IncludedInDataCatalog { - - @Id - private String trialDbId; - - private String trialName; - private String trialType; - private Date endDate; - private Date startDate; - private Boolean active; - - private String programDbId; - private String programName; - - @JsonSetter(contentNulls = Nulls.AS_EMPTY) - @JsonDeserialize(as = TrialDatasetAuthorshipVO.class) - private BrapiTrialDatasetAuthorship datasetAuthorship = TrialDatasetAuthorshipVO.EMPTY; - - @JsonDeserialize(contentAs = ContactVO.class) - private List<BrapiContact> contacts; - - @JsonDeserialize(contentAs = TrialStudySummaryVO.class) - private List<BrapiTrialStudy> studies; - - private BrapiAdditionalInfo additionalInfo; - - // GnpIS specific fields - private List<Long> speciesGroup; - private Long groupId; - - // JSON-LD fields - private String uri; - private String url; - private String sourceUri; - - @Override - public String getDocumentationURL() { - return url; - } - - public void setDocumentationURL(String documentationURL) { - this.url = documentationURL; - } - - @Override - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getSourceUri() { - return sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public String getTrialDbId() { - return trialDbId; - } - - @Override - public String getTrialName() { - return trialName; - } - - @Override - public String getTrialType() { - return trialType; - } - - @Override - public Date getEndDate() { - return endDate; - } - - @Override - public Date getStartDate() { - return startDate; - } - - @Override - public Boolean getActive() { - return active; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getProgramName() { - return programName; - } - - public void setProgramName(String programName) { - this.programName = programName; - } - - @Override - public BrapiTrialDatasetAuthorship getDatasetAuthorship() { - return datasetAuthorship; - } - - @Override - public List<BrapiContact> getContacts() { - return contacts; - } - - @Override - public List<BrapiTrialStudy> getStudies() { - return studies; - } - - @Override - public BrapiAdditionalInfo getAdditionalInfo() { - return additionalInfo; - } - - public void setTrialDbId(String trialDbId) { - this.trialDbId = trialDbId; - } - - public void setTrialName(String trialName) { - this.trialName = trialName; - } - - public void setTrialType(String trialType) { - this.trialType = trialType; - } - - public void setEndDate(Date endDate) { - this.endDate = endDate; - } - - public void setStartDate(Date startDate) { - this.startDate = startDate; - } - - public void setActive(Boolean active) { - this.active = active; - } - - public void setDatasetAuthorship(BrapiTrialDatasetAuthorship datasetAuthorship) { - if (datasetAuthorship != null) { - this.datasetAuthorship = datasetAuthorship; - } - } - - public void setContacts(List<BrapiContact> contacts) { - this.contacts = contacts; - } - - public void setStudies(List<BrapiTrialStudy> studies) { - this.studies = studies; - } - - public void setAdditionalInfo(BrapiAdditionalInfo additionalInfo) { - this.additionalInfo = additionalInfo; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPop.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPop.java deleted file mode 100644 index 32cb9c4b080a7511a2a364ee010c22415f5adb8b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPop.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface CollPop { - @JsonView(JSONView.BrapiFields.class) - Long getId(); - - @JsonView(JSONView.BrapiFields.class) - String getName(); - - @JsonView(JSONView.BrapiFields.class) - String getType(); - - @JsonView(JSONView.BrapiFields.class) - PuiNameValue getGermplasmRef(); - - @JsonView(JSONView.BrapiFields.class) - Integer getGermplasmCount(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingInfoVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingInfoVO.java deleted file mode 100644 index a4ec3abe7c23c4b771b9c114311fa1c40d674d5a..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingInfoVO.java +++ /dev/null @@ -1,85 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmCollectingInfo; -import fr.inra.urgi.faidare.domain.data.germplasm.InstituteVO; - -import java.io.Serializable; -import java.util.List; - -public class CollectingInfoVO implements BrapiGermplasmCollectingInfo, ExtendedCollectingInfo, Serializable { - - @JsonDeserialize(contentAs = InstituteVO.class) - private List<InstituteVO> collectingInstitutes; - - private String collectingMissionIdentifier; - private String collectingNumber; - private String materialType; - private String collectors; - private String collectingDate; - - @JsonDeserialize(as = CollectingSiteVO.class) - private CollectingSiteVO collectingSite; - - @Override - public List<InstituteVO> getCollectingInstitutes() { - return collectingInstitutes; - } - - public void setCollectingInstitutes(List<InstituteVO> collectingInstitutes) { - this.collectingInstitutes = collectingInstitutes; - } - - @Override - public String getCollectingMissionIdentifier() { - return collectingMissionIdentifier; - } - - public void setCollectingMissionIdentifier(String collectingMissionIdentifier) { - this.collectingMissionIdentifier = collectingMissionIdentifier; - } - - @Override - public String getCollectingNumber() { - return collectingNumber; - } - - public void setCollectingNumber(String collectingNumber) { - this.collectingNumber = collectingNumber; - } - - public String getMaterialType() { - return materialType; - } - - public void setMaterialType(String materialType) { - this.materialType = materialType; - } - - public String getCollectors() { - return collectors; - } - - public void setCollectors(String collectors) { - this.collectors = collectors; - } - - public String getCollectingDate() { - return collectingDate; - } - - public void setCollectingDate(String collectingDate) { - this.collectingDate = collectingDate; - } - - @Override - public CollectingSiteVO getCollectingSite() { - return collectingSite; - } - - public void setCollectingSite(CollectingSiteVO collectingSite) { - this.collectingSite = collectingSite; - } - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfo.java deleted file mode 100644 index 91fe99b3689dbb1bace263a4ff847c62277d7e42..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.io.Serializable; - - -public interface DistributorInfo extends Serializable { - - @JsonView(JSONView.GnpISFields.class) - String getAccessionNumber(); - - @JsonView(JSONView.GnpISFields.class) - ExtendedInstitute getInstitute(); - - @JsonView(JSONView.GnpISFields.class) - String getDistributionStatus(); - -} - diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfoVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfoVO.java deleted file mode 100644 index f30df0204a86e925f8e3b1c071c58d904219353d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DistributorInfoVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -public class DistributorInfoVO implements DistributorInfo { - - private String accessionNumber; - private InstituteVO institute; - private String distributionStatus; - - public String getAccessionNumber() { - return accessionNumber; - } - - public void setAccessionNumber(String accessionNumber) { - this.accessionNumber = accessionNumber; - } - - public InstituteVO getInstitute() { - return institute; - } - - public void setInstitute(InstituteVO institute) { - this.institute = institute; - } - - public String getDistributionStatus() { - return distributionStatus; - } - - public void setDistributionStatus(String distributionStatus) { - this.distributionStatus = distributionStatus; - } - - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorInfoVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorInfoVO.java deleted file mode 100644 index e82ff5a28112946d9c3027240c402096f3a6beb5..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorInfoVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmDonorInfo; - -public class DonorInfoVO implements BrapiGermplasmDonorInfo, ExtendedDonorInfo { - - private String donorAccessionNumber; - private InstituteVO donorInstitute; - private String donationDate; - - @Override - public String getDonorAccessionNumber() { - return donorAccessionNumber; - } - - @Override - public InstituteVO getDonorInstitute() { - return donorInstitute; - } - - public void setDonorAccessionNumber(String donorAccessionNumber) { - this.donorAccessionNumber = donorAccessionNumber; - } - - public void setDonorInstitute(InstituteVO donorInstitute) { - this.donorInstitute = donorInstitute; - } - - public String getDonationDate() { - return donationDate; - } - - public void setDonationDate(String donationDate) { - this.donationDate = donationDate; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingInfo.java deleted file mode 100644 index b32bc616bf3f718cf3674a9ec2a454f73bcbcd22..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingInfo.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import fr.inra.urgi.faidare.domain.JSONView; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmCollectingInfo; - -import java.io.Serializable; - -public interface ExtendedCollectingInfo extends Serializable, BrapiGermplasmCollectingInfo { - - @JsonView(JSONView.GnpISFields.class) - String getMaterialType(); - - @JsonView(JSONView.GnpISFields.class) - String getCollectors(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingSite.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingSite.java deleted file mode 100644 index 2c13f9b443dcc41fd00f99dc846f51f7ea7fe5da..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedCollectingSite.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmCollectingSite; - -import java.io.Serializable; - -public interface ExtendedCollectingSite extends Serializable, BrapiGermplasmCollectingSite { - - @JsonView(JSONView.GnpISFields.class) - String getLocationDbId(); - - @JsonView(JSONView.GnpISFields.class) - String getSiteName(); - - @JsonView(JSONView.GnpISFields.class) - String getSiteType() ; - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonor.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonor.java deleted file mode 100644 index fd5164d5d6c2a789170707b2a5c492d851c567f4..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonor.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmDonor; - -/** - * Extends the BrAPI germplasm with GnpIS fields - * - * @author gcornut - */ -public interface ExtendedDonor extends BrapiGermplasmDonor { - - @JsonView(JSONView.GnpISFields.class) - Institute getDonorInstitute(); - - @JsonView(JSONView.GnpISFields.class) - Integer getDonationDate(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonorInfo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonorInfo.java deleted file mode 100644 index f4d5ba7e132f903f56d95926c2cdde2d4469a2ec..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedDonorInfo.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmDonorInfo; - -import java.io.Serializable; - - -public interface ExtendedDonorInfo extends Serializable, BrapiGermplasmDonorInfo { - - @JsonView(JSONView.GnpISFields.class) - String getDonationDate(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasm.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasm.java deleted file mode 100644 index 6b6201fbff2def00b502d45e0a221fcf85507d49..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasm.java +++ /dev/null @@ -1,85 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasm; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; - -import java.util.List; - -/** - * Extends the BrAPI germplasm with GnpIS fields - * - * @author gcornut - */ -public interface ExtendedGermplasm extends BrapiGermplasm, GnpISInternal { - - @JsonView(JSONView.GnpISFields.class) - List<String> getTaxonSynonyms(); - - @JsonView(JSONView.GnpISFields.class) - List<String> getTaxonCommonNames(); - - @JsonView(JSONView.GnpISFields.class) - String getTaxonComment(); - - @JsonView(JSONView.GnpISFields.class) - public String getGenusSpecies(); - - @JsonView(JSONView.GnpISFields.class) - public String getGenusSpeciesSubtaxa(); - - @JsonView(JSONView.GnpISFields.class) - String getGeneticNature(); - - @JsonView(JSONView.GnpISFields.class) - String getComment(); - - @JsonView(JSONView.GnpISFields.class) - Photo getPhoto(); - - @JsonView(JSONView.GnpISFields.class) - InstituteVO getHoldingInstitute(); - - @JsonView(JSONView.GnpISFields.class) - InstituteVO getHoldingGenbank(); - - @JsonView(JSONView.GnpISFields.class) - String getPresenceStatus(); - - @JsonView(JSONView.GnpISFields.class) - Genealogy getGenealogy(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends Genealogy> getChildren(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends PuiNameValue> getDescriptors(); - - @JsonView(JSONView.GnpISFields.class) - Site getOriginSite(); - - @JsonView(JSONView.GnpISFields.class) - Site getCollectingSite(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends Site> getEvaluationSites(); - - @JsonView(JSONView.GnpISFields.class) - GermplasmInstitute getCollector(); - - @JsonView(JSONView.GnpISFields.class) - GermplasmInstitute getBreeder(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends GermplasmInstitute> getDistributors(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends CollPop> getPanel(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends CollPop> getCollection(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends CollPop> getPopulation(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasmMcpd.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasmMcpd.java deleted file mode 100644 index 09c154c70fada1fee50b9af1fb303fd0c104f26f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedGermplasmMcpd.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmMcpd; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; - -import java.util.List; - -public interface ExtendedGermplasmMcpd extends BrapiGermplasmMcpd, GnpISInternal { - - @JsonView(JSONView.GnpISFields.class) - String getGeneticNature(); - - @JsonView(JSONView.GnpISFields.class) - String getPresenceStatus(); - - @JsonView(JSONView.GnpISFields.class) - String getRemarks(); - - @JsonView(JSONView.GnpISFields.class) - Site getOriginSite(); - - @JsonView(JSONView.GnpISFields.class) - ExtendedInstitute getHoldingInstitute(); - - @JsonView(JSONView.GnpISFields.class) - ExtendedInstitute getHoldingGenbank(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends DistributorInfo> getDistributorInfo(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends ExtendedInstitute> getBreedingInstitutes(); - - @JsonView(JSONView.GnpISFields.class) - String getBreederAccessionNumber(); - - @JsonView(JSONView.GnpISFields.class) - String getBreedingCreationYear(); - - @JsonView(JSONView.GnpISFields.class) - String getCatalogRegistrationYear(); - - @JsonView(JSONView.GnpISFields.class) - String getCatalogDeregistrationYear(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedInstitute.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedInstitute.java deleted file mode 100644 index 58a61d8fb7375fe59bd6c3fc3ca18cd29a886d1e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ExtendedInstitute.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmInstitute; - -public interface ExtendedInstitute extends BrapiGermplasmInstitute { - - @JsonView(JSONView.GnpISFields.class) - String getAcronym(); - - @JsonView(JSONView.GnpISFields.class) - String getOrganisation(); - - @JsonView(JSONView.GnpISFields.class) - String getInstituteType(); - - @JsonView(JSONView.GnpISFields.class) - String getWebSite(); - - @JsonView(JSONView.GnpISFields.class) - String getAddress(); - - @JsonView(JSONView.GnpISFields.class) - String getLogo(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Genealogy.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Genealogy.java deleted file mode 100644 index 5d4f3182ed82561c69963a080504a54cbcc9e787..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Genealogy.java +++ /dev/null @@ -1,41 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface Genealogy { - @JsonView(JSONView.GnpISFields.class) - String getCrossingPlan(); - - @JsonView(JSONView.GnpISFields.class) - String getCrossingYear(); - - @JsonView(JSONView.GnpISFields.class) - String getFamilyCode(); - - @JsonView(JSONView.GnpISFields.class) - String getFirstParentName(); - - @JsonView(JSONView.GnpISFields.class) - String getFirstParentPUI(); - - @JsonView(JSONView.GnpISFields.class) - String getFirstParentType(); - - @JsonView(JSONView.GnpISFields.class) - String getSecondParentName(); - - @JsonView(JSONView.GnpISFields.class) - String getSecondParentPUI(); - - @JsonView(JSONView.GnpISFields.class) - String getSecondParentType(); - - @JsonView(JSONView.GnpISFields.class) - List<PuiNameValueVO> getSibblings(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueListVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueListVO.java deleted file mode 100644 index 6676f0394d8b4a7276284821fc2291dcd7ae373f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueListVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValue; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValueList; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; - -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "germplasmAttribute") -public class GermplasmAttributeValueListVO implements BrapiGermplasmAttributeValueList, GnpISInternal { - - private String germplasmDbId; - - @Nested - @JsonDeserialize(contentAs = GermplasmAttributeValueVO.class) - private List<BrapiGermplasmAttributeValue> data; - - // GnpIS specific fields - private List<Long> speciesGroup; - private Long groupId; - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public List<BrapiGermplasmAttributeValue> getData() { - return data; - } - - public void setData(List<BrapiGermplasmAttributeValue> data) { - this.data = data; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstitute.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstitute.java deleted file mode 100644 index 906d6851ef2014321234002f7d19684cf95264aa..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstitute.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface GermplasmInstitute { - @JsonView(JSONView.GnpISFields.class) - InstituteVO getInstitute(); - - @JsonView(JSONView.GnpISFields.class) - String getGermplasmPUI(); - - @JsonView(JSONView.GnpISFields.class) - String getAccessionNumber(); - - @JsonView(JSONView.GnpISFields.class) - Integer getAccessionCreationDate(); - - @JsonView(JSONView.GnpISFields.class) - String getMaterialType(); - - @JsonView(JSONView.GnpISFields.class) - String getCollectors(); - - @JsonView(JSONView.GnpISFields.class) - Integer getRegistrationYear(); - - @JsonView(JSONView.GnpISFields.class) - Integer getDeregistrationYear(); - - @JsonView(JSONView.GnpISFields.class) - String getDistributionStatus(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmMcpdVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmMcpdVO.java deleted file mode 100644 index 0d475bb1843ad5d432e2b8a986fbec3b3a39409a..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmMcpdVO.java +++ /dev/null @@ -1,342 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmMcpd; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.io.Serializable; -import java.util.List; - -@Document(type = "germplasmMcpd") -public class GermplasmMcpdVO implements Serializable, BrapiGermplasmMcpd, ExtendedGermplasmMcpd { - - private Long groupId; - - @Id - private String germplasmDbId; - private String germplasmPUI; - private String accessionNumber; - private List<String> alternateIDs; - private List<String> accessionNames; - - private String commonCropName; - private String genus; - private String species; - private String speciesAuthority; - private String subtaxon; - private String subtaxonAuthority; - - private String ancestralData; - private String biologicalStatusOfAccessionCode; - private String mlsStatus; - private String geneticNature; - private String presenceStatus; - private String remarks; - - private String countryOfOriginCode; - private SiteVO originSite; - - private String instituteCode; - private InstituteVO holdingInstitute; - private InstituteVO holdingGenbank; - - private CollectingInfoVO collectingInfo; - private String acquisitionDate; - private String acquisitionSourceCode; - - private List<DonorInfoVO> donorInfo; - private List<DistributorInfoVO> distributorInfo; - - - @JsonDeserialize(contentAs = InstituteVO.class) - private List<InstituteVO> breedingInstitutes; - private String breederAccessionNumber; - private String breedingCreationYear; - private String catalogRegistrationYear; - private String catalogDeregistrationYear; - - @JsonDeserialize(contentAs = InstituteVO.class) - private List<InstituteVO> safetyDuplicateInstitutes; - private List<String> storageTypeCodes; - - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - public String getGermplasmPUI() { - return germplasmPUI; - } - - public void setGermplasmPUI(String germplasmPUI) { - this.germplasmPUI = germplasmPUI; - } - - public String getAccessionNumber() { - return accessionNumber; - } - - public void setAccessionNumber(String accessionNumber) { - this.accessionNumber = accessionNumber; - } - - public List<String> getAlternateIDs() { - return alternateIDs; - } - - public void setAlternateIDs(List<String> alternateIDs) { - this.alternateIDs = alternateIDs; - } - - public List<String> getAccessionNames() { - return accessionNames; - } - - public void setAccessionNames(List<String> accessionNames) { - this.accessionNames = accessionNames; - } - - public String getCommonCropName() { - return commonCropName; - } - - public void setCommonCropName(String commonCropName) { - this.commonCropName = commonCropName; - } - - public String getGenus() { - return genus; - } - - public void setGenus(String genus) { - this.genus = genus; - } - - public String getSpecies() { - return species; - } - - public void setSpecies(String species) { - this.species = species; - } - - public String getSpeciesAuthority() { - return speciesAuthority; - } - - public void setSpeciesAuthority(String speciesAuthority) { - this.speciesAuthority = speciesAuthority; - } - - public String getSubtaxon() { - return subtaxon; - } - - public void setSubtaxon(String subtaxon) { - this.subtaxon = subtaxon; - } - - public String getSubtaxonAuthority() { - return subtaxonAuthority; - } - - public void setSubtaxonAuthority(String subtaxonAuthority) { - this.subtaxonAuthority = subtaxonAuthority; - } - - public String getAncestralData() { - return ancestralData; - } - - public void setAncestralData(String ancestralData) { - this.ancestralData = ancestralData; - } - - public String getBiologicalStatusOfAccessionCode() { - return biologicalStatusOfAccessionCode; - } - - public void setBiologicalStatusOfAccessionCode(String biologicalStatusOfAccessionCode) { - this.biologicalStatusOfAccessionCode = biologicalStatusOfAccessionCode; - } - - public String getMlsStatus() { - return mlsStatus; - } - - public void setMlsStatus(String mlsStatus) { - this.mlsStatus = mlsStatus; - } - - public String getGeneticNature() { - return geneticNature; - } - - public void setGeneticNature(String geneticNature) { - this.geneticNature = geneticNature; - } - - public String getPresenceStatus() { - return presenceStatus; - } - - public void setPresenceStatus(String presenceStatus) { - this.presenceStatus = presenceStatus; - } - - public String getRemarks() { - return remarks; - } - - public void setRemarks(String remarks) { - this.remarks = remarks; - } - - public String getCountryOfOriginCode() { - return countryOfOriginCode; - } - - public void setCountryOfOriginCode(String countryOfOriginCode) { - this.countryOfOriginCode = countryOfOriginCode; - } - - public SiteVO getOriginSite() { - return originSite; - } - - public void setOriginSite(SiteVO originSite) { - this.originSite = originSite; - } - - public String getInstituteCode() { - return instituteCode; - } - - public void setInstituteCode(String instituteCode) { - this.instituteCode = instituteCode; - } - - public InstituteVO getHoldingInstitute() { - return holdingInstitute; - } - - public void setHoldingInstitute(InstituteVO holdingInstitute) { - this.holdingInstitute = holdingInstitute; - } - - public InstituteVO getHoldingGenbank() { - return holdingGenbank; - } - - public void setHoldingGenbank(InstituteVO holdingGenbank) { - this.holdingGenbank = holdingGenbank; - } - - public CollectingInfoVO getCollectingInfo() { - return collectingInfo; - } - - public void setCollectingInfo(CollectingInfoVO collectingInfo) { - this.collectingInfo = collectingInfo; - } - - public String getAcquisitionDate() { - return acquisitionDate; - } - - public void setAcquisitionDate(String acquisitionDate) { - this.acquisitionDate = acquisitionDate; - } - - public String getAcquisitionSourceCode() { - return acquisitionSourceCode; - } - - public void setAcquisitionSourceCode(String acquisitionSourceCode) { - this.acquisitionSourceCode = acquisitionSourceCode; - } - - public List<DonorInfoVO> getDonorInfo() { - return donorInfo; - } - - public void setDonorInfo(List<DonorInfoVO> donorInfo) { - this.donorInfo = donorInfo; - } - - public List<DistributorInfoVO> getDistributorInfo() { - return distributorInfo; - } - - public void setDistributorInfo(List<DistributorInfoVO> distributorInfo) { - this.distributorInfo = distributorInfo; - } - - public List<InstituteVO> getBreedingInstitutes() { - return breedingInstitutes; - } - - public void setBreedingInstitutes(List<InstituteVO> breedingInstitutes) { - this.breedingInstitutes = breedingInstitutes; - } - - public String getBreederAccessionNumber() { - return breederAccessionNumber; - } - - public void setBreederAccessionNumber(String breederAccessionNumber) { - this.breederAccessionNumber = breederAccessionNumber; - } - - public String getBreedingCreationYear() { - return breedingCreationYear; - } - - public void setBreedingCreationYear(String breedingCreationYear) { - this.breedingCreationYear = breedingCreationYear; - } - - public String getCatalogRegistrationYear() { - return catalogRegistrationYear; - } - - public void setCatalogRegistrationYear(String catalogRegistrationYear) { - this.catalogRegistrationYear = catalogRegistrationYear; - } - - public String getCatalogDeregistrationYear() { - return catalogDeregistrationYear; - } - - public void setCatalogDeregistrationYear(String catalogDeregistrationYear) { - this.catalogDeregistrationYear = catalogDeregistrationYear; - } - - public List<InstituteVO> getSafetyDuplicateInstitutes() { - return safetyDuplicateInstitutes; - } - - public void setSafetyDuplicateInstitutes(List<InstituteVO> safetyDuplicateInstitutes) { - this.safetyDuplicateInstitutes = safetyDuplicateInstitutes; - } - - public List<String> getStorageTypeCodes() { - return storageTypeCodes; - } - - public void setStorageTypeCodes(List<String> storageTypeCodes) { - this.storageTypeCodes = storageTypeCodes; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmSitemapVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmSitemapVO.java deleted file mode 100644 index b7dc268148ed53309a64f4fbf808d5bdec580e68..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmSitemapVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import java.io.Serializable; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasm; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -/** - * A minimal view of a germplasm, containing only its ID, used for sitemaps - */ -@Document(type = "germplasm", includedFields = "germplasmDbId") -public class GermplasmSitemapVO { - - @Id - private String germplasmDbId; - - public GermplasmSitemapVO() { - } - - public GermplasmSitemapVO(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmVO.java deleted file mode 100644 index 84426201bf77cdfa0b9ec55a2cd030b56298484f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmVO.java +++ /dev/null @@ -1,537 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasm; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.io.Serializable; -import java.util.List; - -/** - * Germplasm model based on {@link BrapiGermplasm} and extended with GnpIs specific fields (see {@link ExtendedGermplasm} - * - * @author C. Michotey, gcornut - */ -@Document(type = "germplasm") -public class GermplasmVO - implements Serializable, BrapiGermplasm, ExtendedGermplasm, HasURI, HasURL, IncludedInDataCatalog { - - private static final long serialVersionUID = -7719928853974382749L; - - private Long groupId; - - @Id - private String germplasmDbId; - private String defaultDisplayName; - private String accessionNumber; - private String germplasmName; - private String pedigree; - private String seedSource; - private List<String> synonyms; - private String commonCropName; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String instituteCode = ""; - - private String instituteName; - private String biologicalStatusOfAccessionCode; - private String countryOfOriginCode; - private List<String> typeOfGermplasmStorageCode; - private List<TaxonSourceVO> taxonIds; - private List<DonorVO> donors; - - private String genus; - private String species; - private String genusSpecies; - private String speciesAuthority; - private String subtaxa; - private String genusSpeciesSubtaxa; - private String subtaxaAuthority; - private String acquisitionDate; - - private List<String> taxonSynonyms; - private List<String> taxonCommonNames; - private String taxonComment; - private String geneticNature; - private String comment; - private PhotoVO photo; - private InstituteVO holdingInstitute; - private InstituteVO holdingGenbank; - private String presenceStatus; - - private GenealogyVO genealogy; - private List<GenealogyVO> children; - private List<SimpleVO> descriptors; - - private SiteVO originSite; - private SiteVO collectingSite; - private List<SiteVO> evaluationSites; - - private GermplasmInstituteVO collector; - private GermplasmInstituteVO breeder; - private List<GermplasmInstituteVO> distributors; - - private List<CollPopVO> panel; - private List<CollPopVO> collection; - private List<CollPopVO> population; - - // JSON-LD fields - private String uri; - private String url; - private String sourceUri; - - @Override - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getSourceUri() { - return this.sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public String getUrl() { - return this.url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getDocumentationURL() { - return url; - } - - public void setDocumentationURL(String documentationURL) { - this.url = documentationURL; - } - - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public String getDefaultDisplayName() { - return defaultDisplayName; - } - - public void setDefaultDisplayName(String defaultDisplayName) { - this.defaultDisplayName = defaultDisplayName; - } - - @Override - public String getAccessionNumber() { - return accessionNumber; - } - - public void setAccessionNumber(String accessionNumber) { - this.accessionNumber = accessionNumber; - } - - @Override - public String getGermplasmName() { - return germplasmName; - } - - public void setGermplasmName(String germplasmName) { - this.germplasmName = germplasmName; - } - - @Override - public String getGermplasmPUI() { - return uri; - } - - public void setGermplasmPUI(String germplasmPUI) { - this.uri = germplasmPUI; - } - - @Override - public String getPedigree() { - return pedigree; - } - - public void setPedigree(String pedigree) { - this.pedigree = pedigree; - } - - @Override - public String getSeedSource() { - return seedSource; - } - - public void setSeedSource(String seedSource) { - this.seedSource = seedSource; - } - - @Override - public List<String> getSynonyms() { - return synonyms; - } - - public void setSynonyms(List<String> synonyms) { - this.synonyms = synonyms; - } - - @Override - public String getCommonCropName() { - return commonCropName; - } - - public void setCommonCropName(String commonCropName) { - this.commonCropName = commonCropName; - } - - @Override - public String getInstituteCode() { - return instituteCode; - } - - public void setInstituteCode(String instituteCode) { - this.instituteCode = instituteCode; - } - - @Override - public String getInstituteName() { - return instituteName; - } - - public void setInstituteName(String instituteName) { - this.instituteName = instituteName; - } - - @Override - public String getBiologicalStatusOfAccessionCode() { - return biologicalStatusOfAccessionCode; - } - - public void setBiologicalStatusOfAccessionCode(String biologicalStatusOfAccessionCode) { - this.biologicalStatusOfAccessionCode = biologicalStatusOfAccessionCode; - } - - @Override - public String getCountryOfOriginCode() { - return countryOfOriginCode; - } - - public void setCountryOfOriginCode(String countryOfOriginCode) { - this.countryOfOriginCode = countryOfOriginCode; - } - - @Override - public List<String> getTypeOfGermplasmStorageCode() { - return typeOfGermplasmStorageCode; - } - - public void setTypeOfGermplasmStorageCode(List<String> typeOfGermplasmStorageCode) { - this.typeOfGermplasmStorageCode = typeOfGermplasmStorageCode; - } - - @Override - public List<TaxonSourceVO> getTaxonIds() { - return taxonIds; - } - - public void setTaxonIds(List<TaxonSourceVO> taxonIds) { - this.taxonIds = taxonIds; - } - - @Override - public String getGenus() { - return genus; - } - - public void setGenus(String genus) { - this.genus = genus; - } - - @Override - public String getSpecies() { - return species; - } - - public void setSpecies(String species) { - this.species = species; - } - - @Override - public String getGenusSpecies() { return genusSpecies; } - - public void setGenusSpecies(String genusSpecies) { - this.genusSpecies = genusSpecies; - } - - @Override - public String getSpeciesAuthority() { - return speciesAuthority; - } - - public void setSpeciesAuthority(String speciesAuthority) { - this.speciesAuthority = speciesAuthority; - } - - @Override - public String getSubtaxa() { - return subtaxa; - } - - public void setSubtaxa(String subtaxa) { - this.subtaxa = subtaxa; - } - - @Override - public String getGenusSpeciesSubtaxa() { - return genusSpeciesSubtaxa; - } - - public void setGenusSpeciesSubtaxa(String genusSpeciesSubtaxa) { - this.genusSpeciesSubtaxa = genusSpeciesSubtaxa; - } - - @Override - public String getSubtaxaAuthority() { - return subtaxaAuthority; - } - - public void setSubtaxaAuthority(String subtaxaAuthority) { - this.subtaxaAuthority = subtaxaAuthority; - } - - @Override - public List<DonorVO> getDonors() { - return donors; - } - - public void setDonors(List<DonorVO> donors) { - this.donors = donors; - } - - @Override - public String getAcquisitionDate() { - return acquisitionDate; - } - - public void setAcquisitionDate(String acquisitionDate) { - this.acquisitionDate = acquisitionDate; - } - - @Override - public List<String> getTaxonSynonyms() { - return taxonSynonyms; - } - - public void setTaxonSynonyms(List<String> taxonSynonyms) { - this.taxonSynonyms = taxonSynonyms; - } - - @Override - public List<String> getTaxonCommonNames() { - return taxonCommonNames; - } - - public void setTaxonCommonNames(List<String> taxonCommonNames) { - this.taxonCommonNames = taxonCommonNames; - } - - @Override - public String getTaxonComment() { - return taxonComment; - } - - public void setTaxonComment(String taxonComment) { - this.taxonComment = taxonComment; - } - - @Override - public String getGeneticNature() { - return geneticNature; - } - - public void setGeneticNature(String geneticNature) { - this.geneticNature = geneticNature; - } - - @Override - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - @Override - public PhotoVO getPhoto() { - return photo; - } - - public void setPhoto(PhotoVO photo) { - this.photo = photo; - } - - @Override - public InstituteVO getHoldingInstitute() { - return holdingInstitute; - } - - public void setHoldingInstitute(InstituteVO holdingInstitute) { - this.holdingInstitute = holdingInstitute; - } - - @Override - public InstituteVO getHoldingGenbank() { - return holdingGenbank; - } - - public void setHoldingGenbank(InstituteVO holdingGenbank) { - this.holdingGenbank = holdingGenbank; - } - - @Override - public String getPresenceStatus() { - return presenceStatus; - } - - public void setPresenceStatus(String presenceStatus) { - this.presenceStatus = presenceStatus; - } - - @Override - public GenealogyVO getGenealogy() { - return genealogy; - } - - public void setGenealogy(GenealogyVO genealogy) { - this.genealogy = genealogy; - } - - @Override - public List<GenealogyVO> getChildren() { - return children; - } - - public void setChildren(List<GenealogyVO> children) { - this.children = children; - } - - @Override - public List<SimpleVO> getDescriptors() { - return descriptors; - } - - public void setDescriptors(List<SimpleVO> descriptors) { - this.descriptors = descriptors; - } - - @Override - public SiteVO getOriginSite() { - return originSite; - } - - public void setOriginSite(SiteVO originSite) { - this.originSite = originSite; - } - - @Override - public SiteVO getCollectingSite() { - return collectingSite; - } - - public void setCollectingSite(SiteVO collectingSite) { - this.collectingSite = collectingSite; - } - - @Override - public List<SiteVO> getEvaluationSites() { - return evaluationSites; - } - - public void setEvaluationSites(List<SiteVO> evaluationSites) { - this.evaluationSites = evaluationSites; - } - - @Override - public GermplasmInstituteVO getCollector() { - return collector; - } - - public void setCollector(GermplasmInstituteVO collector) { - this.collector = collector; - } - - @Override - public GermplasmInstituteVO getBreeder() { - return breeder; - } - - public void setBreeder(GermplasmInstituteVO breeder) { - this.breeder = breeder; - } - - @Override - public List<GermplasmInstituteVO> getDistributors() { - return distributors; - } - - public void setDistributors(List<GermplasmInstituteVO> distributors) { - this.distributors = distributors; - } - - @Override - public List<CollPopVO> getPanel() { - return panel; - } - - public void setPanel(List<CollPopVO> panel) { - this.panel = panel; - } - - @Override - public List<CollPopVO> getCollection() { - return collection; - } - - public void setCollection(List<CollPopVO> collection) { - this.collection = collection; - } - - @Override - public List<CollPopVO> getPopulation() { - return population; - } - - public void setPopulation(List<CollPopVO> population) { - this.population = population; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Institute.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Institute.java deleted file mode 100644 index 918211210a890847ec8c1e5f0e6cea7e1949b5f9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Institute.java +++ /dev/null @@ -1,33 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface Institute { - @JsonView(JSONView.GnpISFields.class) - String getInstituteName(); - - @JsonView(JSONView.GnpISFields.class) - String getInstituteCode(); - - @JsonView(JSONView.GnpISFields.class) - String getAcronym(); - - @JsonView(JSONView.GnpISFields.class) - String getOrganisation(); - - @JsonView(JSONView.GnpISFields.class) - String getInstituteType(); - - @JsonView(JSONView.GnpISFields.class) - String getWebSite(); - - @JsonView(JSONView.GnpISFields.class) - String getAddress(); - - @JsonView(JSONView.GnpISFields.class) - String getLogo(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PedigreeVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PedigreeVO.java deleted file mode 100644 index 6c5914d00d7e2937f8b1edd8ac1849bf852f54dd..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PedigreeVO.java +++ /dev/null @@ -1,192 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiPedigree; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiSibling; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -import java.io.Serializable; -import java.util.List; - -/** - * Model taken from the breeding API Germplasm MCPD call - * - * @author cpommier, mbuy - */ -@Document(type = "germplasmPedigree") -public class PedigreeVO implements Serializable, BrapiPedigree { - - private static final long serialVersionUID = -2037667912012821133L; - private String germplasmDbId; - private String defaultDisplayName; - private String pedigree; - private Long groupId; - private String crossingPlan; - private String crossingYear; - private String familyCode; - private String parent1DbId; - private String parent1Name; - private String parent1Type; - private String parent2DbId; - private String parent2Name; - private String parent2Type; - - @JsonDeserialize(contentAs = SiblingVO.class) - private List<BrapiSibling> siblings; - - @Override - public String getPedigree() { - return pedigree; - } - - public void setPedigree(String pedigree) { - this.pedigree = pedigree; - } - - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - @Override - public String getCrossingPlan() { - return crossingPlan; - } - - public void setCrossingPlan(String crossingPlan) { - this.crossingPlan = crossingPlan; - } - - @Override - public String getCrossingYear() { - return crossingYear; - } - - public void setCrossingYear(String crossingYear) { - this.crossingYear = crossingYear; - } - - @Override - public String getFamilyCode() { - return familyCode; - } - - public void setFamilyCode(String familyCode) { - this.familyCode = familyCode; - } - - @Override - public String getParent1DbId() { - return parent1DbId; - } - - public void setParent1DbId(String parent1DbId) { - this.parent1DbId = parent1DbId; - } - - @Override - public String getParent1Name() { - return parent1Name; - } - - public void setParent1Name(String parent1Name) { - this.parent1Name = parent1Name; - } - - @Override - public String getParent1Type() { - return parent1Type; - } - - public void setParent1Type(String parent1Type) { - this.parent1Type = parent1Type; - } - - @Override - public String getParent2DbId() { - return parent2DbId; - } - - public void setParent2DbId(String parent2DbId) { - this.parent2DbId = parent2DbId; - } - - @Override - public String getParent2Name() { - return parent2Name; - } - - public void setParent2Name(String parent2Name) { - this.parent2Name = parent2Name; - } - - @Override - public String getParent2Type() { - return parent2Type; - } - - public void setParent2Type(String parent2Type) { - this.parent2Type = parent2Type; - } - - @Override - public List<BrapiSibling> getSiblings() { - return siblings; - } - - public void setSiblings(List<BrapiSibling> siblings) { - this.siblings = siblings; - } - - public static long getSerialversionuid() { - return serialVersionUID; - } - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public String getDefaultDisplayName() { - return defaultDisplayName; - } - - public void setDefaultDisplayName(String defaultDisplayName) { - this.defaultDisplayName = defaultDisplayName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((germplasmDbId == null) ? 0 : germplasmDbId.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - PedigreeVO other = (PedigreeVO) obj; - if (germplasmDbId == null) { - if (other.germplasmDbId != null) - return false; - } else if (!germplasmDbId.equals(other.germplasmDbId)) - return false; - - return true; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Photo.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Photo.java deleted file mode 100644 index 928719b7f2704575a5e1944c63e26ff37b383398..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Photo.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface Photo { - @JsonView(JSONView.GnpISFields.class) - String getFile(); - - @JsonView(JSONView.GnpISFields.class) - String getThumbnailFile(); - - @JsonView(JSONView.GnpISFields.class) - String getPhotoName(); - - @JsonView(JSONView.GnpISFields.class) - String getDescription(); - - @JsonView(JSONView.GnpISFields.class) - String getCopyright(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ProgenyVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ProgenyVO.java deleted file mode 100644 index 88d8f908ef5031045085bfdbd0d73786727ee51b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ProgenyVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiParentProgeny; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiProgeny; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -import java.io.Serializable; -import java.util.List; - -/** - * Model taken from the breeding API Germplasm MCPD call - * - * @author mbuy - */ - -@Document(type = "germplasmProgeny") -public class ProgenyVO implements Serializable, BrapiProgeny { - - private static final long serialVersionUID = -8748938185286594606L; - private String germplasmDbId; - private String defaultDisplayName; - - @JsonDeserialize(contentAs = ParentProgenyVO.class) - private List<BrapiParentProgeny> progeny; - - public static long getSerialversionuid() { - return serialVersionUID; - } - - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - public String getDefaultDisplayName() { - return defaultDisplayName; - } - - public void setDefaultDisplayName(String defaultDisplayName) { - this.defaultDisplayName = defaultDisplayName; - } - - public void setProgeny(List<BrapiParentProgeny> progeny) { - this.progeny = progeny; - } - - @Override - public List<BrapiParentProgeny> getProgeny() { - return progeny; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValue.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValue.java deleted file mode 100644 index 21611a08c3bddd1e53ff6d13a449e688b2e70ed7..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValue.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface PuiNameValue { - @JsonView(JSONView.GnpISFields.class) - String getPui(); - - @JsonView(JSONView.GnpISFields.class) - String getName(); - - @JsonView(JSONView.GnpISFields.class) - String getValue(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValueVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValueVO.java deleted file mode 100644 index a397533bbbe72cc449650940ae33e08fc0af49df..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PuiNameValueVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import java.io.Serializable; - -/** - * @author C. Michotey - */ -public class PuiNameValueVO implements Serializable, PuiNameValue { - - private static final long serialVersionUID = 3440255005695104200L; - - private String pui; - private String name; - private String value; - - public PuiNameValueVO() { - } - - public PuiNameValueVO(String pui, String name, String value) { - this.pui = pui; - this.name = name; - this.value = value; - } - - @Override - public String getPui() { - return pui; - } - - public void setPui(String pui) { - this.pui = pui; - } - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiblingVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiblingVO.java deleted file mode 100644 index f26f0acdf078d8bc559758b42faafc2f1f0058c8..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiblingVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiSibling; - -import java.io.Serializable; - -public class SiblingVO implements Serializable, BrapiSibling { - - private static final long serialVersionUID = -5847740199508355155L; - - private String germplasmDbId; - private String defaultDisplayName; - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public String getDefaultDisplayName() { - return defaultDisplayName; - } - - public void setDefaultDisplayName(String defaultDisplayName) { - this.defaultDisplayName = defaultDisplayName; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Site.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Site.java deleted file mode 100644 index 83032740ec7b95fea5bd020d89b44a56c613c9bf..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/Site.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface Site { - @JsonView(JSONView.GnpISFields.class) - String getSiteId(); - - @JsonView(JSONView.GnpISFields.class) - String getSiteName(); - - @JsonView(JSONView.GnpISFields.class) - Float getLatitude(); - - @JsonView(JSONView.GnpISFields.class) - Float getLongitude(); - - @JsonView(JSONView.GnpISFields.class) - String getSiteType(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiteVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiteVO.java deleted file mode 100644 index a005a4a35d31f78471bd8a4537432ae19aa78ddd..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SiteVO.java +++ /dev/null @@ -1,61 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import java.io.Serializable; - -public class SiteVO implements Serializable, Site { - - private static final long serialVersionUID = 7058708694739141664L; - - private String siteId; - private String siteName; - private Float latitude; - private Float longitude; - private String siteType; - - @Override - public String getSiteId() { - return siteId; - } - - - public void setSiteId(String siteId) { - this.siteId = siteId; - } - - @Override - public String getSiteName() { - return siteName; - } - - public void setSiteName(String siteName) { - this.siteName = siteName; - } - - @Override - public Float getLatitude() { - return latitude; - } - - public void setLatitude(Float latitude) { - this.latitude = latitude; - } - - @Override - public Float getLongitude() { - return longitude; - } - - public void setLongitude(Float longitude) { - this.longitude = longitude; - } - - @Override - public String getSiteType() { - return siteType; - } - - public void setSiteType(String siteType) { - this.siteType = siteType; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitVO.java deleted file mode 100644 index 3d163e02e2c7dd725966ce486497c12408afe21f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitVO.java +++ /dev/null @@ -1,316 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.phenotype; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservation; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnit; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnitTreatment; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnitXRef; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; - -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "observationUnit") -public class ObservationUnitVO implements BrapiObservationUnit, GnpISInternal, HasURI, IncludedInDataCatalog { - - @Id - private String observationUnitDbId; - private String observationUnitName; - - // Layout - private String observationLevel; - private String observationLevels; - private String plotNumber; - private String plantNumber; - private String blockNumber; - private String replicate; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String entryType = ""; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String entryNumber = ""; - - private String X; - private String Y; - - // XRef - @JsonDeserialize(contentAs = ObservationUnitXRefVO.class) - private List<BrapiObservationUnitXRef> observationUnitXref; - - // Germplasm - private String germplasmDbId; - private String germplasmName; - - // Study - private String studyDbId; - private String studyName; - - // Study location - private String studyLocationDbId; - private String studyLocation; - - // Program - private String programDbId; - private String programName; - - @JsonDeserialize(contentAs = TreatmentVO.class) - private List<BrapiObservationUnitTreatment> treatments; - - @Nested - @JsonDeserialize(contentAs = ObservationVO.class) - private List<BrapiObservation> observations; - - // GnpIS specific fields - private Long groupId; - private List<Long> speciesGroup; - - // JSON-LD fields - private String uri; - private String sourceUri; - - @Override - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getSourceUri() { - return sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public List<BrapiObservationUnitXRef> getObservationUnitXref() { - return observationUnitXref; - } - - public void setObservationUnitXref(List<BrapiObservationUnitXRef> observationUnitXref) { - this.observationUnitXref = observationUnitXref; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getObservationUnitDbId() { - return observationUnitDbId; - } - - public void setObservationUnitDbId(String observationUnitDbId) { - this.observationUnitDbId = observationUnitDbId; - } - - @Override - public String getObservationUnitName() { - return observationUnitName; - } - - public void setObservationUnitName(String observationUnitName) { - this.observationUnitName = observationUnitName; - } - - @Override - public String getObservationLevel() { - return observationLevel; - } - - public void setObservationLevel(String observationLevel) { - this.observationLevel = observationLevel; - } - - @Override - public String getObservationLevels() { - return observationLevels; - } - - public void setObservationLevels(String observationLevels) { - this.observationLevels = observationLevels; - } - - @Override - public String getPlotNumber() { - return plotNumber; - } - - public void setPlotNumber(String plotNumber) { - this.plotNumber = plotNumber; - } - - @Override - public String getPlantNumber() { - return plantNumber; - } - - public void setPlantNumber(String plantNumber) { - this.plantNumber = plantNumber; - } - - @Override - public String getBlockNumber() { - return blockNumber; - } - - public void setBlockNumber(String blockNumber) { - this.blockNumber = blockNumber; - } - - @Override - public String getReplicate() { - return replicate; - } - - public void setReplicate(String replicate) { - this.replicate = replicate; - } - - @Override - public String getEntryType() { - return entryType; - } - - public void setEntryType(String entryType) { - this.entryType = entryType; - } - - @Override - public String getEntryNumber() { - return entryNumber; - } - - public void setEntryNumber(String entryNumber) { - this.entryNumber = entryNumber; - } - - @Override - public String getGermplasmDbId() { - return germplasmDbId; - } - - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; - } - - @Override - public String getGermplasmName() { - return germplasmName; - } - - public void setGermplasmName(String germplasmName) { - this.germplasmName = germplasmName; - } - - @Override - public String getStudyDbId() { - return studyDbId; - } - - public void setStudyDbId(String studyDbId) { - this.studyDbId = studyDbId; - } - - @Override - public String getStudyName() { - return studyName; - } - - public void setStudyName(String studyName) { - this.studyName = studyName; - } - - @Override - public String getStudyLocationDbId() { - return studyLocationDbId; - } - - public void setStudyLocationDbId(String studyLocationDbId) { - this.studyLocationDbId = studyLocationDbId; - } - - @Override - public String getStudyLocation() { - return studyLocation; - } - - public void setStudyLocation(String studyLocation) { - this.studyLocation = studyLocation; - } - - @Override - public String getProgramName() { - return programName; - } - - public void setProgramName(String programName) { - this.programName = programName; - } - - @Override - public String getX() { - return X; - } - - public void setX(String x) { - X = x; - } - - @Override - public String getY() { - return Y; - } - - public void setY(String y) { - Y = y; - } - - @Override - public List<BrapiObservationUnitTreatment> getTreatments() { - return treatments; - } - - public void setTreatments(List<BrapiObservationUnitTreatment> treatments) { - this.treatments = treatments; - } - - @Override - public List<BrapiObservation> getObservations() { - return observations; - } - - public void setObservations(List<BrapiObservation> observations) { - this.observations = observations; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitXRefVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitXRefVO.java deleted file mode 100644 index 08368c0ff47febaf9e33120f21205fa6b6859399..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationUnitXRefVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.phenotype; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnitXRef; - -/** - * @author gcornut - */ -public class ObservationUnitXRefVO implements BrapiObservationUnitXRef { - - private String source; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String id = ""; - - @Override - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - @Override - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationVO.java deleted file mode 100644 index c3b758862950fc7c66d16ac1f6f7e0b01daec715..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/ObservationVO.java +++ /dev/null @@ -1,83 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.phenotype; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservation; - -import java.util.Date; - -/** - * @author gcornut - */ -public class ObservationVO implements BrapiObservation { - - private String observationDbId; - private String observationVariableDbId; - private String observationVariableName; - private Date observationTimeStamp; - private String season; - private String collector; - private String value; - - @Override - public String getObservationDbId() { - return observationDbId; - } - - public void setObservationDbId(String observationDbId) { - this.observationDbId = observationDbId; - } - - @Override - public String getObservationVariableDbId() { - return observationVariableDbId; - } - - public void setObservationVariableDbId(String observationVariableDbId) { - this.observationVariableDbId = observationVariableDbId; - } - - @Override - public String getObservationVariableName() { - return observationVariableName; - } - - public void setObservationVariableName(String observationVariableName) { - this.observationVariableName = observationVariableName; - } - - @Override - public Date getObservationTimeStamp() { - return observationTimeStamp; - } - - public void setObservationTimeStamp(Date observationTimeStamp) { - this.observationTimeStamp = observationTimeStamp; - } - - @Override - public String getSeason() { - return season; - } - - public void setSeason(String season) { - this.season = season; - } - - @Override - public String getCollector() { - return collector; - } - - public void setCollector(String collector) { - this.collector = collector; - } - - @Override - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/TreatmentVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/TreatmentVO.java deleted file mode 100644 index 480d33359aea35411b5835d78787c70d6d3601b6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/phenotype/TreatmentVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.phenotype; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationUnitTreatment; - -/** - * @author gcornut - */ -public class TreatmentVO implements BrapiObservationUnitTreatment { - - private String factor; - private String modality; - - @Override - public String getFactor() { - return factor; - } - - public void setFactor(String factor) { - this.factor = factor; - } - - @Override - public String getModality() { - return modality; - } - - public void setModality(String modality) { - this.modality = modality; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDataLinkVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDataLinkVO.java deleted file mode 100644 index 175be394962fff735e3e11b252c303188d8b89c4..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDataLinkVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.study; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudyDataLink; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public class StudyDataLinkVO implements BrapiStudyDataLink { - private String name; - private String type; - private String url; - - @Override - public String getName() { - return name; - } - - @Override - public String getType() { - return type; - } - - @Override - public String getUrl() { - return url; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(String type) { - this.type = type; - } - - public void setUrl(String url) { - this.url = url; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDetailVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDetailVO.java deleted file mode 100644 index d5a7ea32cc2aa2d12044c95e95308ab9c268cb8a..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyDetailVO.java +++ /dev/null @@ -1,318 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.study; - -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.data.*; -import fr.inra.urgi.faidare.domain.data.ContactVO; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -/** - * StudyVO extending the official BreedingAPI specs with specific fields - * - * @author gcornut - */ -@Document(type = "study", - // Fields for query and not display - excludedFields = {"observationVariableDbIds"}) -public class StudyDetailVO implements GnpISInternal, BrapiStudyDetail, HasURI, HasURL, IncludedInDataCatalog { - - @Id - private String studyDbId; - - private String studyName; - private String studyType; - private String studyDescription; - private Boolean active; - private List<String> seasons; - private Date endDate; - private Date startDate; - - private String programDbId; - private String programName; - - private String trialDbId; - private String trialName; - private Set<String> trialDbIds; - - private BrapiAdditionalInfo additionalInfo; - - @JsonDeserialize(as = StudyLastUpdateVO.class) - private BrapiStudyLastUpdate lastUpdate; - - @JsonDeserialize(contentAs = ContactVO.class) - private List<BrapiContact> contacts; - - @JsonDeserialize(as = LocationVO.class) - private BrapiLocation location; - - private String locationDbId; - private String locationName; - - @JsonDeserialize(contentAs = StudyDataLinkVO.class) - private List<BrapiStudyDataLink> dataLinks; - - // GnpIS specific fields - private List<Long> speciesGroup; - private Long groupId; - - @JsonView(JSONView.Internal.class) - private Set<String> germplasmDbIds; - - // JSON-LD fields - private String uri; - private String url; - private String sourceUri; - - @Override - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getUri() { - return this.uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getSourceUri() { - return this.sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public String getStudyName() { - return studyName; - } - - public void setStudyName(String studyName) { - this.studyName = studyName; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getProgramName() { - return programName; - } - - public void setProgramName(String programName) { - this.programName = programName; - } - - @Override - public String getDocumentationURL() { - return url; - } - - public void setDocumentationURL(String documentationURL) { - this.url = documentationURL; - } - - @Override - public String getStudyDbId() { - return studyDbId; - } - - public void setStudyDbId(String studyDbId) { - this.studyDbId = studyDbId; - } - - @Override - public String getStudyType() { - return studyType; - } - - public void setStudyType(String studyType) { - this.studyType = studyType; - } - - @Override - public String getName() { - return studyName; - } - - public void setName(String name) { - this.studyName = name; - } - - @Override - public Boolean getActive() { - return active; - } - - public void setActive(Boolean active) { - this.active = active; - } - - @Override - public List<String> getSeasons() { - return seasons; - } - - public void setSeasons(List<String> seasons) { - this.seasons = seasons; - } - - @Override - public Date getEndDate() { - return endDate; - } - - public void setEndDate(Date endDate) { - this.endDate = endDate; - } - - @Override - public Date getStartDate() { - return startDate; - } - - public void setStartDate(Date startDate) { - this.startDate = startDate; - } - - @Override - public String getTrialName() { - return trialName; - } - - public void setTrialName(String trialName) { - this.trialName = trialName; - } - - @Override - public String getTrialDbId() { - return trialDbId; - } - - public void setTrialDbId(String trialDbId) { - this.trialDbId = trialDbId; - } - - @Override - public Set<String> getTrialDbIds() { - return trialDbIds; - } - - public void setTrialDbIds(Set<String> trialDbIds) { - this.trialDbIds = trialDbIds; - } - - @Override - public BrapiAdditionalInfo getAdditionalInfo() { - return additionalInfo; - } - - public void setAdditionalInfo(BrapiAdditionalInfo additionalInfo) { - this.additionalInfo = additionalInfo; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - @Override - public String getStudyDescription() { - return studyDescription; - } - - public void setStudyDescription(String studyDescription) { - this.studyDescription = studyDescription; - } - - @Override - public BrapiStudyLastUpdate getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(BrapiStudyLastUpdate lastUpdate) { - this.lastUpdate = lastUpdate; - } - - @Override - public List<BrapiContact> getContacts() { - return contacts; - } - - public void setContacts(List<BrapiContact> contacts) { - this.contacts = contacts; - } - - @Override - public BrapiLocation getLocation() { - return location; - } - - public void setLocation(BrapiLocation location) { - this.location = location; - } - - @Override - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } - - @Override - public String getLocationName() { - return locationName; - } - - public void setLocationName(String locationName) { - this.locationName = locationName; - } - - @Override - public List<BrapiStudyDataLink> getDataLinks() { - return dataLinks; - } - - public void setDataLinks(List<BrapiStudyDataLink> dataLinks) { - this.dataLinks = dataLinks; - } - - public Set<String> getGermplasmDbIds() { - return germplasmDbIds; - } - - public void setGermplasmDbIds(Set<String> germplasmDbIds) { - this.germplasmDbIds = germplasmDbIds; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySitemapVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySitemapVO.java deleted file mode 100644 index c4900361a93329fa4c623b71b4cebf7a360e49d6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySitemapVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.study; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudySummary; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -/** - * A minimal view of a study containing only its ID, used to generate sitemaps - */ -@Document(type = "study", includedFields = "studyDbId") -public class StudySitemapVO { - - @Id - private String studyDbId; - - public StudySitemapVO() { - } - - public StudySitemapVO(String studyDbId) { - this.studyDbId = studyDbId; - } - - public String getStudyDbId() { - return studyDbId; - } - - public void setStudyDbId(String studyDbId) { - this.studyDbId = studyDbId; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySummaryVO.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySummaryVO.java deleted file mode 100644 index adfc0d7a680e8eb3a7db53a1ffa71c7d7a6ee0c9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudySummaryVO.java +++ /dev/null @@ -1,271 +0,0 @@ -package fr.inra.urgi.faidare.domain.data.study; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudySummary; -import fr.inra.urgi.faidare.domain.data.GnpISInternal; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -/** - * StudyVO extending the official BreedingAPI specs with specific fields - * - * @author gcornut - */ -@Document(type = "study", - // Fields for query and not display - excludedFields = {"dataLinks", "contacts", "observationVariableDbIds", "germplasmDbIds"}) -public class StudySummaryVO implements GnpISInternal, BrapiStudySummary, HasURI, HasURL, IncludedInDataCatalog { - - @Id - private String studyDbId; - - private String studyName; - private String studyType; - private Boolean active; - private List<String> seasons; - private Date endDate; - private Date startDate; - - private String programDbId; - private String programName; - - private String trialDbId; - private String trialName; - private Set<String> trialDbIds; - - private BrapiAdditionalInfo additionalInfo; - - // Study summary only properties - private String locationDbId; - private String locationName; - - - // Field only used to check mapping of criteria to this VO - @JsonIgnore - private List<String> observationVariableDbIds; - - @JsonIgnore - private List<String> germplasmDbIds; - - // GnpIS specific fields - private List<Long> speciesGroup; - private Long groupId; - - // JSON-LD fields - private String uri; - private String url; - private String sourceUri; - - @Override - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getUri() { - return this.uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getSourceUri() { - return this.sourceUri; - } - - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; - } - - @Override - public String getStudyName() { - return studyName; - } - - public void setStudyName(String studyName) { - this.studyName = studyName; - } - - @Override - public String getDocumentationURL() { - return url; - } - - public void setDocumentationURL(String documentationURL) { - this.url = documentationURL; - } - - @Override - public String getLocationDbId() { - return locationDbId; - } - - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; - } - - @Override - public String getLocationName() { - return locationName; - } - - public void setLocationName(String locationName) { - this.locationName = locationName; - } - - @Override - public String getProgramDbId() { - return programDbId; - } - - public void setProgramDbId(String programDbId) { - this.programDbId = programDbId; - } - - @Override - public String getProgramName() { - return programName; - } - - public void setProgramName(String programName) { - this.programName = programName; - } - - @Override - public String getStudyDbId() { - return studyDbId; - } - - public void setStudyDbId(String studyDbId) { - this.studyDbId = studyDbId; - } - - @Override - public String getStudyType() { - return studyType; - } - - public void setStudyType(String studyType) { - this.studyType = studyType; - } - - @Override - public String getName() { - return studyName; - } - - public void setName(String name) { - this.studyName = name; - } - - @Override - public Boolean getActive() { - return active; - } - - public void setActive(Boolean active) { - this.active = active; - } - - @Override - public Date getEndDate() { - return endDate; - } - - public void setEndDate(Date endDate) { - this.endDate = endDate; - } - - @Override - public Date getStartDate() { - return startDate; - } - - public void setStartDate(Date startDate) { - this.startDate = startDate; - } - - @Override - public String getTrialName() { - return trialName; - } - - public void setTrialName(String trialName) { - this.trialName = trialName; - } - - @Override - public String getTrialDbId() { - return trialDbId; - } - - public void setTrialDbId(String trialDbId) { - this.trialDbId = trialDbId; - } - - @Override - public Set<String> getTrialDbIds() { - return trialDbIds; - } - - public void setTrialDbIds(Set<String> trialDbIds) { - this.trialDbIds = trialDbIds; - } - - @Override - public BrapiAdditionalInfo getAdditionalInfo() { - return additionalInfo; - } - - public void setAdditionalInfo(BrapiAdditionalInfo additionalInfo) { - this.additionalInfo = additionalInfo; - } - - @Override - public List<String> getSeasons() { - return seasons; - } - - public void setSeasons(List<String> seasons) { - this.seasons = seasons; - } - - @Override - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - public List<String> getObservationVariableDbIds() { - return observationVariableDbIds; - } - - public void setObservationVariableDbIds(List<String> observationVariableDbIds) { - this.observationVariableDbIds = observationVariableDbIds; - } - - public List<String> getGermplasmDbIds() { - return germplasmDbIds; - } - - public void setGermplasmDbIds(List<String> germplasmDbIds) { - this.germplasmDbIds = germplasmDbIds; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteria.java deleted file mode 100644 index 5e4615a5e0705c162a9ee63adfa9ebef6b1ad42d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteria.java +++ /dev/null @@ -1,39 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.criteria; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; - -import java.util.List; - -/** - * @author gcornut - */ -public interface DataDiscoveryCriteria extends PaginationCriteria, SortCriteria { - - List<String> getCrops(); - - List<String> getGermplasmLists(); - - List<String> getAccessions(); - - List<String> getObservationVariableIds(); - - List<String> getSources(); - - List<String> getTypes(); - - List<String> getFacetFields(); - - @Override - Long getPage(); - - @Override - Long getPageSize(); - - @Override - String getSortBy(); - - @Override - String getSortOrder(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteriaImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteriaImpl.java deleted file mode 100644 index 892f95d0cdee4ba14b4ae4ac4b4f767a319a9c12..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/criteria/DataDiscoveryCriteriaImpl.java +++ /dev/null @@ -1,130 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.criteria; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.QueryType; -import org.elasticsearch.index.query.MatchPhraseQueryBuilder; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(DataDiscoveryDocument.class) -public class DataDiscoveryCriteriaImpl extends PaginationCriteriaImpl implements DataDiscoveryCriteria { - - @DocumentPath({"germplasm", "cropName"}) - private List<String> crops; - - @DocumentPath({"germplasm", "germplasmList"}) - private List<String> germplasmLists; - - @DocumentPath(value = {"germplasm", "accession"}, virtualField = "suggest") - @QueryType(MatchPhraseQueryBuilder.class) - private List<String> accessions; - - @DocumentPath({"trait", "observationVariableIds"}) - private List<String> observationVariableIds; - - @DocumentPath("sourceUri") - private List<String> sources; - - @DocumentPath("type") - private List<String> types; - - /** - * Field used to request for facets of fields present in this criteria - */ - @NoDocumentMapping - private List<String> facetFields; - - @NoDocumentMapping - private String sortBy = null;// = "schema:name"; - - public void setSortBy(String sortBy) { - this.sortBy = sortBy; - } - - @NoDocumentMapping - private String sortOrder = null;// = SortOrder.ASC.name(); - - public void setSortOrder(String sortOrder) { - this.sortOrder = sortOrder; - } - - @Override - public List<String> getCrops() { - return crops; - } - - public void setCrops(List<String> crops) { - this.crops = crops; - } - - @Override - public List<String> getGermplasmLists() { - return germplasmLists; - } - - public void setGermplasmLists(List<String> germplasmLists) { - this.germplasmLists = germplasmLists; - } - - @Override - public List<String> getAccessions() { - return accessions; - } - - public void setAccessions(List<String> accessions) { - this.accessions = accessions; - } - - @Override - public List<String> getObservationVariableIds() { - return observationVariableIds; - } - - public void setObservationVariableIds(List<String> observationVariableIds) { - this.observationVariableIds = observationVariableIds; - } - - @Override - public List<String> getSources() { - return sources; - } - - public void setSources(List<String> sources) { - this.sources = sources; - } - - @Override - public List<String> getTypes() { - return types; - } - - public void setTypes(List<String> types) { - this.types = types; - } - - @Override - public List<String> getFacetFields() { - return facetFields; - } - - public void setFacetFields(List<String> facetFields) { - this.facetFields = facetFields; - } - - @Override - public String getSortBy() { - return sortBy; - } - - @Override - public String getSortOrder() { - return sortOrder; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscovery.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscovery.java deleted file mode 100644 index 146a1a5c38444db265f17546531a4a564ce2d21e..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscovery.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.jsonld.data.Dataset; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -import java.util.List; - -/** - * Properties used for data discovery - * - * @author gcornut - */ -@Document(type = "datadiscovery") -public interface DataDiscovery extends Dataset { - - @Override - @JsonView(JSONView.GnpISFields.class) - String getIdentifier(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getUri(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getName(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getSourceUri(); - - @Override - @JsonView(JSONView.GnpISFields.class) - List<String> getType(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getDescription(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getUrl(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryDocument.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryDocument.java deleted file mode 100644 index 1901337d4433eb57020d1fdcec35e34c867eb304..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryDocument.java +++ /dev/null @@ -1,111 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.io.Serializable; -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "datadiscovery") -public class DataDiscoveryDocument - implements Serializable, DataDiscovery, DataDiscoveryViaGermplasm, - DataDiscoveryViaTrait { - - @Id(jsonName = "@id") - private String uri; - - private List<String> type; - private String identifier; - private String name; - private String url; - private String description; - private String sourceUri; - - private DataDiscoveryViaGermplasm.GermplasmSection germplasm; - - private DataDiscoveryViaTrait.TraitSection trait; - - @Override - public String getIdentifier() { - return identifier; - } - - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - @Override - public List<String> getType() { - return type; - } - - public void setType(List<String> type) { - this.type = type; - } - - @Override - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public String getSourceUri() { - return sourceUri; - } - - public void setSourceUri(String source) { - this.sourceUri = source; - } - - @Override - public GermplasmSection getGermplasm() { - return germplasm; - } - - public void setGermplasm(GermplasmSection germplasm) { - this.germplasm = germplasm; - } - - @Override - public TraitSection getTrait() { - return trait; - } - - public void setTrait(TraitSection trait) { - this.trait = trait; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaGermplasm.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaGermplasm.java deleted file mode 100644 index b67faa7afdbf7e625ff2120441a69ea5f4df9b62..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaGermplasm.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -import java.util.List; - -/** - * Properties used for search and faceting on data discovery document linked to germplasm. - * <p> - * These properties are not serialized in JSON but used in introspection of ElasticSearch queries. - * - * @author gcornut - */ -@Document(type = "datadiscovery") -public interface DataDiscoveryViaGermplasm { - - @JsonIgnore - GermplasmSection getGermplasm(); - - interface GermplasmSection { - List<String> getCropName(); - - List<String> getGermplasmList(); - - List<String> getAccession(); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaTrait.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaTrait.java deleted file mode 100644 index fda94bdbc2c567a43fb8124122e71d3b042c2b5d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataDiscoveryViaTrait.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -import java.util.List; - -/** - * Properties used for search and faceting on data discovery document linked to - * traits - * <p> - * These properties are not serialized in JSON but used in introspection of - * ElasticSearch queries. - * - * @author gcornut - */ -@Document(type = "datadiscovery") -public interface DataDiscoveryViaTrait { - - @JsonIgnore - TraitSection getTrait(); - - interface TraitSection { - List<String> getObservationVariableIds(); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSource.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSource.java deleted file mode 100644 index 2c23f5db92f5507ac7e23c065504670a78c84a93..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSource.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.jsonld.data.DataCatalog; - -import java.util.List; - -/** - * Data discovery source defined as a schema.org/DataCatalog - * - * @author gcornut - */ -public interface DataSource extends DataCatalog { - - @Override - @JsonView(JSONView.GnpISFields.class) - String getUri(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getIdentifier(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getName(); - - @Override - @JsonView(JSONView.GnpISFields.class) - List<String> getType(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getUrl(); - - @Override - @JsonView(JSONView.GnpISFields.class) - String getImage(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSourceImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSourceImpl.java deleted file mode 100644 index a877ab913fde033bd92691d6087b1b52ae157a47..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/DataSourceImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import java.io.Serializable; -import java.util.Collections; -import java.util.List; - - -/** - * @author gcornut - */ -public class DataSourceImpl implements Serializable, DataSource { - private final List<String> type = Collections.singletonList( - "schema:DataCatalog" - ); - private String uri; - private String identifier; - private String name; - private String url; - private String image; - - public DataSourceImpl() {} - public DataSourceImpl(String uri, String identifier, String name, String url, String image) { - this.uri = uri; - this.identifier = identifier; - this.name = name; - this.url = url; - this.image = image; - } - - @Override - public String getIdentifier() { - return identifier; - } - - @Override - public String getName() { - return name; - } - - @Override - public List<String> getType() { - return type; - } - - @Override - public String getUri() { - return uri; - } - - @Override - public String getUrl() { - return url; - } - - @Override - public String getImage() { - return image; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - public void setName(String name) { - this.name = name; - } - - public void setUrl(String url) { - this.url = url; - } - - public void setImage(String image) { - this.image = image; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/Facet.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/Facet.java deleted file mode 100644 index 90635032fd27023bc778f280e730b41d28ebbd52..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/Facet.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -import java.util.List; - -/** - * @author gcornut - */ -public interface Facet { - - @JsonView(JSONView.GnpISFields.class) - String getField(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends FacetTerm> getTerms(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetImpl.java deleted file mode 100644 index b07a667967e3ff410f64860f1fa8e25172edabdd..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import java.util.List; - -/** - * @author gcornut - */ -public class FacetImpl implements Facet { - private String field; - private List<FacetTermImpl> terms; - - public FacetImpl(String field, List<FacetTermImpl> terms) { - this.field = field; - this.terms = terms; - } - - public FacetImpl() { - } - - @Override - public String getField() { - return field; - } - - @Override - public List<FacetTermImpl> getTerms() { - return terms; - } - - public void setField(String field) { - this.field = field; - } - - public void setTerms(List<FacetTermImpl> terms) { - this.terms = terms; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTerm.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTerm.java deleted file mode 100644 index 84c7fa56dff66d5d54ea1233f463d28f406a0f21..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTerm.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; - -/** - * @author gcornut - */ -public interface FacetTerm { - - @JsonView(JSONView.GnpISFields.class) - String getTerm(); - - @JsonView(JSONView.GnpISFields.class) - Long getCount(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTermImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTermImpl.java deleted file mode 100644 index 33c1a0169c38d41c4ae6e23824bcb674a746a118..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/data/FacetTermImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.data; - -/** - * @author gcornut - */ -public class FacetTermImpl implements FacetTerm { - private String term; - private Long count; - - public FacetTermImpl(String term, Long count) { - this.term = term; - this.count = count; - } - - public FacetTermImpl() { - } - - @Override - public String getTerm() { - return term; - } - - @Override - public Long getCount() { - return count; - } - - public void setCount(Long count) { - this.count = count; - } - - public void setTerm(String term) { - this.term = term; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/DataDiscoveryResponse.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/DataDiscoveryResponse.java deleted file mode 100644 index 2e92bea47dd53dd934e762c5349c3b8175f5fcf0..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/DataDiscoveryResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiData; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.domain.datadiscovery.data.Facet; - -import java.util.List; - -/** - * @author gcornut - */ -public interface DataDiscoveryResponse extends BrapiListResponse<DataDiscoveryDocument> { - - @Override - @JsonView(JSONView.GnpISFields.class) - BrapiMetadata getMetadata(); - - @Override - @JsonView(JSONView.GnpISFields.class) - BrapiData<DataDiscoveryDocument> getResult(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends Facet> getFacets(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/GermplasmSearchResponse.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/GermplasmSearchResponse.java deleted file mode 100644 index 1daacd4eb8b91bd4324a6b36f59c7671567024d0..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/datadiscovery/response/GermplasmSearchResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.inra.urgi.faidare.domain.datadiscovery.response; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiData; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.Facet; - -import java.util.List; - -public interface GermplasmSearchResponse extends BrapiListResponse<GermplasmVO> { - - @Override - @JsonView(JSONView.GnpISFields.class) - BrapiMetadata getMetadata(); - - @Override - @JsonView(JSONView.GnpISFields.class) - BrapiData<GermplasmVO> getResult(); - - @JsonView(JSONView.GnpISFields.class) - List<? extends Facet> getFacets(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiListResponseImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiListResponseImpl.java deleted file mode 100644 index c215a839000bb9b0410a70eb1f6ff892e8002546..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiListResponseImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiData; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; - -import java.util.List; - -/** - * bean for general paginated response structure for breeding API - * - * @author gcornut - * - * <code> - * { - * "metadata": { - * "data": [] - * }, - * "result" : {} - * } - * </code> - */ -class ApiListResponseImpl<T> extends ApiResponseImpl<BrapiData<T>> implements BrapiListResponse<T> { - - ApiListResponseImpl(BrapiMetadata metadata, List<T> result) { - super(metadata, new BrapiDataImpl<>(result)); - } - - /** - * @author gcornut - */ - public static class BrapiDataImpl<T> implements BrapiData<T> { - - private final List<T> data; - - BrapiDataImpl(List<T> data) { - this.data = data; - } - - @Override - public List<T> getData() { - return data; - } - - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiMetadataImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiMetadataImpl.java deleted file mode 100644 index 185c0de0f312c7374a9ef3ea31ba40f9d766e3cb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiMetadataImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiPagination; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiStatus; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author gornut - */ -class ApiMetadataImpl implements BrapiMetadata { - - private final BrapiPagination pagination; - private final List<BrapiStatus> status; - private final List<String> datafiles; - - ApiMetadataImpl(BrapiPagination pagination, List<BrapiStatus> status, List<String> datafiles) { - if (pagination == null) { - this.pagination = new BrapiPagination() { - - @Override - public long getTotalPages() { - return 0; - } - - @Override - public long getTotalCount() { - return 0; - } - - @Override - public long getPageSize() { - return 0; - } - - @Override - public long getCurrentPage() { - return 0; - } - }; - } else { - this.pagination = pagination; - } - - if (status == null) { - this.status = new ArrayList<>(); - } else { - this.status = status; - } - this.datafiles = datafiles; - - } - - @Override - public BrapiPagination getPagination() { - return pagination; - } - - @Override - public List<BrapiStatus> getStatus() { - return status; - } - - @Override - public List<String> getDatafiles() { - return datafiles; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseFactory.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseFactory.java deleted file mode 100644 index b51e11234c4e5b2c99285266d1bc418365abb309..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseFactory.java +++ /dev/null @@ -1,127 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.api.brapi.v1.exception.BrapiPaginationException; -import fr.inra.urgi.faidare.domain.brapi.v1.response.*; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import org.springframework.http.HttpStatus; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Factory creating API responses - * - * @author gcornut - */ -public class ApiResponseFactory { - - public static BrapiMetadata createMetadata(BrapiPagination pagination, List<BrapiStatus> status) { - return new ApiMetadataImpl(pagination, status, Collections.emptyList()); - } - - public static BrapiStatus createStatus(String name, String code) { - return new ApiStatusImpl(name, code); - } - - public static BrapiStatus createStatus(Exception exception, HttpStatus httpStatus) { - // Ex: Bad Request: Invalid page number - String message = httpStatus.getReasonPhrase(); - if (exception.getMessage() != null) { - message += ": " + exception.getMessage(); - } - - // Ex: 400 - String code = String.valueOf(httpStatus.value()); - - return createStatus(message, code); - } - - /** - * Create a BrAPI response with only status (when an error occurred) - */ - public static <T> BrapiResponse<T> createSingleObjectResponse(T result, List<BrapiStatus> status) { - BrapiMetadata metadata = createMetadata(null, status); - return new ApiResponseImpl<>(metadata, result); - } - - /** - * Create a BrAPI list response with pagination and error statuses (with or - * without pagination checking) - * - * @param doPaginationChecks whether or not this method should check the pagination for inconsistencies - */ - public static <T> BrapiListResponse<T> createListResponse( - BrapiPagination pagination, List<BrapiStatus> status, List<T> results, boolean doPaginationChecks - ) { - if (doPaginationChecks && pagination != null) { - if (results != null && results.size() > pagination.getPageSize()) { - throw new BrapiPaginationException("The result size is greater than the pageSize", pagination); - } - if (pagination.getTotalPages() > 0 && pagination.getCurrentPage() >= pagination.getTotalPages()) { - throw new BrapiPaginationException( - "The current page should be strictly less than the total number of pages.", - pagination - ); - } - } - - BrapiMetadata metadata = createMetadata(pagination, status); - return new ApiListResponseImpl<>(metadata, results); - } - - /** - * Create a BrAPI list response with pagination and error statuses (with - * pagination checking) - */ - public static <T> BrapiListResponse<T> createListResponse(BrapiPagination pagination, List<BrapiStatus> status, - List<T> results) { - return createListResponse(pagination, status, results, true); - } - - /** - * Create a BrAPI list response from a non paginated list and pagination - * info (page & pageSize) - * <p> - * This method will generate a sub list of the given result list to match - * the given pagination info - */ - public static <T> BrapiListResponse<T> createSubListResponse(long pageSize, long page, List<T> bigList) { - long totalCount = bigList.size(); - - BrapiPagination pagination = PaginationImpl.create(pageSize, page, totalCount); - long totalPages = pagination.getTotalPages(); - - // Sub list with page & pageSize - List<T> partData; - if (page >= totalPages) { - partData = new ArrayList<>(); - } else { - long start = page * pageSize; - long end = Math.min(totalCount, start + pageSize); - partData = bigList.subList((int) start, (int) end); - } - - return createListResponse(pagination, null, partData, true); - } - - /** - * Create data discovery response (brapi list response with facets) - */ - public static DataDiscoveryResponse createListResponseWithFacets(Pagination pagination, List<DataDiscoveryDocument> results, List<FacetImpl> facets) { - BrapiMetadata metadata = ApiResponseFactory.createMetadata(pagination, null); - return new DataDiscoveryResponseImpl(metadata, results, facets); - } - - /** - * Create germplasm search response (brapi list response with facets) - */ - public static GermplasmSearchResponse createGermplasmListResponseWithFacets(Pagination pagination, List<GermplasmVO> results, List<FacetImpl> facets) { - BrapiMetadata metadata = ApiResponseFactory.createMetadata(pagination, null); - return new GermplasmSearchResponseImpl(metadata, results, facets); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseImpl.java deleted file mode 100644 index 5be75cfccd9ee30c8afd9c4d8743ef2f58913e52..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiResponseImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.jsonld.data.Context; -import fr.inra.urgi.faidare.domain.jsonld.data.HasContext; - -/** - * @author gcornut - */ -public class ApiResponseImpl<T> implements BrapiResponse<T>, HasContext { - - /** - * Default JSON-LD bringing context to the API response JSON so that a JSON-LD parser can extract RDF - */ - private static final Context JSONLD_CONTEXT = new Context(); - static { - JSONLD_CONTEXT.addProperty("schema", "http://schema.org/"); - JSONLD_CONTEXT.addProperty("result", "http://brapi.org/rdf/result"); - JSONLD_CONTEXT.addProperty("data", "http://brapi.org/rdf/resultData"); - } - - private final BrapiMetadata metadata; - - private final T result; - - ApiResponseImpl(BrapiMetadata metadata, T result) { - this.metadata = metadata; - this.result = result; - } - - @Override - public T getResult() { - return result; - } - - @Override - public BrapiMetadata getMetadata() { - return metadata; - } - - @Override - public Context getContext() { - return JSONLD_CONTEXT; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiStatusImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiStatusImpl.java deleted file mode 100644 index d23fa1a2b3c5401c40e2c043815551519db4cceb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/ApiStatusImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiStatus; - -/** - * @author gcornut - */ -public class ApiStatusImpl implements BrapiStatus { - - private final String name; - private final String code; - - public ApiStatusImpl(String name, String code) { - this.name = name; - this.code = code; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getCode() { - return code; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/DataDiscoveryResponseImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/DataDiscoveryResponseImpl.java deleted file mode 100644 index 695ad6dc6c5a2609c8b2249327997efac9b7c562..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/DataDiscoveryResponseImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.domain.datadiscovery.data.Facet; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; - -import java.util.List; - -/** - * @author gcornut - */ -public class DataDiscoveryResponseImpl extends ApiListResponseImpl<DataDiscoveryDocument> implements DataDiscoveryResponse { - - private final List<FacetImpl> facets; - - public DataDiscoveryResponseImpl(BrapiMetadata metadata, List<DataDiscoveryDocument> result, List<FacetImpl> facets) { - super(metadata, result); - this.facets = facets; - } - - @Override - public List<? extends Facet> getFacets() { - return facets; - } - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/GermplasmSearchResponseImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/GermplasmSearchResponseImpl.java deleted file mode 100644 index 430130197f65cfb3114f6547f6270969590f0552..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/GermplasmSearchResponseImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiMetadata; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.Facet; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; - -import java.util.List; - -public class GermplasmSearchResponseImpl extends ApiListResponseImpl<GermplasmVO> implements GermplasmSearchResponse { - - private final List<FacetImpl> facets; - - public GermplasmSearchResponseImpl(BrapiMetadata metadata, List<GermplasmVO> result, List<FacetImpl> facets) { - super(metadata, result); - this.facets = facets; - } - - @Override - public List<? extends Facet> getFacets() { - return facets; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginatedList.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginatedList.java deleted file mode 100644 index c05f459c8da0ec72927713a4ba0e3ee374cc52b8..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginatedList.java +++ /dev/null @@ -1,147 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; - -import java.util.*; - -/** - * List decorator with added pagination info - * - * @author gcornut - */ -public class PaginatedList<T> implements List<T> { - - private Pagination pagination; - private List<T> list; - - public PaginatedList(Pagination pagination, List<T> list) { - this.pagination = pagination; - this.list = list; - } - - public static <T> PaginatedList<T> createEmptyPaginatedList(PaginationCriteria criteria) { - return new PaginatedList<>( - PaginationImpl.create(criteria.getPageSize(), criteria.getPage(), 0), - Collections.<T>emptyList() - ); - } - - public Pagination getPagination() { - return pagination; - } - - @Override - public int size() { - return list.size(); - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - @Override - public boolean contains(Object o) { - return list.contains(o); - } - - @Override - public Iterator<T> iterator() { - return list.iterator(); - } - - @Override - public Object[] toArray() { - return list.toArray(); - } - - @Override - public <T1> T1[] toArray(T1[] a) { - return list.toArray(a); - } - - @Override - public boolean add(T t) { - return list.add(t); - } - - @Override - public boolean remove(Object o) { - return list.remove(o); - } - - @Override - public boolean containsAll(Collection<?> c) { - return list.containsAll(c); - } - - @Override - public boolean addAll(Collection<? extends T> c) { - return list.addAll(c); - } - - @Override - public boolean addAll(int index, Collection<? extends T> c) { - return list.addAll(index, c); - } - - @Override - public boolean removeAll(Collection<?> c) { - return list.removeAll(c); - } - - @Override - public boolean retainAll(Collection<?> c) { - return list.retainAll(c); - } - - @Override - public void clear() { - list.clear(); - } - - @Override - public T get(int index) { - return list.get(index); - } - - @Override - public T set(int index, T element) { - return list.set(index, element); - } - - @Override - public void add(int index, T element) { - list.add(index, element); - } - - @Override - public T remove(int index) { - return list.remove(index); - } - - @Override - public int indexOf(Object o) { - return list.indexOf(o); - } - - @Override - public int lastIndexOf(Object o) { - return list.lastIndexOf(o); - } - - @Override - public ListIterator<T> listIterator() { - return list.listIterator(); - } - - @Override - public ListIterator<T> listIterator(int index) { - return list.listIterator(index); - } - - @Override - public List<T> subList(int fromIndex, int toIndex) { - return list.subList(fromIndex, toIndex); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/Pagination.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/Pagination.java deleted file mode 100644 index 8c52676948bf0f573bb8940599cfd3f1e37a691a..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/Pagination.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiPagination; - -/** - * @author gcornut - */ -public interface Pagination extends BrapiPagination { - - @Override - long getCurrentPage(); - - @Override - long getPageSize(); - - @Override - long getTotalCount(); - - @Override - long getTotalPages(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginationImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginationImpl.java deleted file mode 100644 index 01dc1e7b31ca7e95f368688aed78c2ea43aac818..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/response/PaginationImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; - -/** - * @author gcornut - */ -public class PaginationImpl implements Pagination { - - private final long pageSize; - private final long currentPage; - private final long totalCount; - private final long totalPages; - - private PaginationImpl(long pageSize, long currentPage, long totalCount, long totalPages) { - this.pageSize = pageSize; - this.currentPage = currentPage; - this.totalCount = totalCount; - this.totalPages = totalPages; - } - - @Override - public long getPageSize() { - return pageSize; - } - - @Override - public long getCurrentPage() { - return currentPage; - } - - @Override - public long getTotalCount() { - return totalCount; - } - - @Override - public long getTotalPages() { - return totalPages; - } - - public static Pagination create(long pageSize, long currentPage, long totalCount) { - long totalPages = (long) Math.ceil((double) totalCount / (double) pageSize); - return create(pageSize, currentPage, totalCount, totalPages); - } - - public static Pagination create(long pageSize, long currentPage, long totalCount, long totalPages) { - return new PaginationImpl(pageSize, currentPage, totalCount, totalPages); - } - - public static <C extends PaginationCriteria> Pagination create(C criteria, Long totalCount) { - return create(criteria.getPageSize(), criteria.getPage(), totalCount); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFields.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFields.java deleted file mode 100644 index 5a43e4d68a5522e54a328ae8fae803297da68eef..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFields.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.inra.urgi.faidare.domain.xref; - -/** - * Imported and adapted from unified-interface legacy - */ -public enum DocumentFields { - - ENTRY_TYPE("entryType"), LINKED_RESOURCES_ID("linkedResourcesID"); - - private String field; - - DocumentFields(String field) { - this.field = field; - } - - public static DocumentFields from(String value) { - try { - for (DocumentFields field : DocumentFields.values()) { - if (field.toString().equalsIgnoreCase(value)) { - return field; - } - } - } catch (Exception e) { - throw new DocumentFieldsException( - "Cannot create a " + DocumentFields.class.getName() + " because of: " + e.getMessage() + "!", e); - } - throw new DocumentFieldsException( - "Cannot create a " + DocumentFields.class.getName() + " using value: " + value + "!"); - } - - @Override - public String toString() { - return field; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFieldsException.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFieldsException.java deleted file mode 100644 index 715f76e1c5441f226ed3908b11be09293e25da9f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/DocumentFieldsException.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.inra.urgi.faidare.domain.xref; - - -/** - * Imported and adapted from unified-interface legacy - */ -class DocumentFieldsException extends RuntimeException{ - - DocumentFieldsException(String message, Exception e) { - super(message, e); - } - - DocumentFieldsException(String message) { - super(message); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentSearchCriteria.java b/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentSearchCriteria.java deleted file mode 100644 index e205689d39491b94e1ede89ef8d5a86397587c5d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentSearchCriteria.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.inra.urgi.faidare.domain.xref; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteriaImpl; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -import java.util.Collections; -import java.util.List; - -/** - * Imported and adapted from unified-interface legacy - */ -@CriteriaForDocument(XRefDocumentVO.class) -public class XRefDocumentSearchCriteria extends PaginationCriteriaImpl { - - @DocumentPath("entryType") - private String entryType; - - @DocumentPath("linkedResourcesID") // pragma: allowlist secret - private List<String> linkedResourcesID; - - public static XRefDocumentSearchCriteria forXRefId(String resourceId) { - XRefDocumentSearchCriteria criteria = new XRefDocumentSearchCriteria(); - criteria.setLinkedResourcesID(Collections.singletonList(resourceId)); - return criteria; - } - - public String getEntryType() { - return entryType; - } - - public void setEntryType(String entryType) { - this.entryType = entryType; - } - - public List<String> getLinkedResourcesID() { - return linkedResourcesID; - } - - public void setLinkedResourcesID(List<String> linkedResourcesID) { - this.linkedResourcesID = linkedResourcesID; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactory.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactory.java deleted file mode 100644 index 6b558514e7205ddeaf14cc8b631774776aefd45c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch; - -import com.google.common.base.Joiner; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.repository.http.UserGroupsResourceClient; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchRequestBuilder; -import org.elasticsearch.action.search.SearchScrollRequest; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -@Component -public class ESRequestFactory { - - private static final Logger logger = LoggerFactory.getLogger(ESRequestFactory.class); - - public static final int MAX_TERM_AGG_SIZE = Integer.MAX_VALUE; - - private UserGroupsResourceClient userGroupsResourceClient; - private FaidareProperties properties; - - private final IndicesOptions indicesOptions; - - public ESRequestFactory( - UserGroupsResourceClient userGroupsResourceClient, - FaidareProperties properties - ) { - this.userGroupsResourceClient = userGroupsResourceClient; - this.properties = properties; - boolean ignoreUnavailable = true; - boolean allowNoIndices = true; - boolean expandToOpenIndices = true; - boolean expandToClosedIndices = false; - indicesOptions = IndicesOptions.fromOptions( - ignoreUnavailable, allowNoIndices, expandToOpenIndices, expandToClosedIndices - ); - } - - /** - * Utility method to retrieve a new {@link SearchRequestBuilder} already - * configured with the index. This method allows to not forget the index and - * so to not query the whole cluster! - * - * @return the {@link SearchRequestBuilder} configured with index - */ - public SearchRequest prepareSearch(String documentType, QueryBuilder query) { - String[] aliases = getAliases(documentType, null); - - SearchRequest request = new SearchRequest(); - request.indices(aliases); - request.source(new SearchSourceBuilder()); - request.indicesOptions(indicesOptions); - - if (query != null) { - request.source().query(query); - } - - // Debug - if (logger.isDebugEnabled()) { - String aliasesString = Joiner.on(",").join(aliases); - StringBuilder message = new StringBuilder(); - message.append("Search ES:\n"); - message.append("POST ").append(aliasesString); - if (documentType != null) { - message.append("/").append(documentType); - } - message.append("/_search"); - if (query != null) { - message.append("\n"); - message.append(request.source().toString()); - } - logger.debug(message.toString()); - } - - return request; - } - - /** - * List ElasticSearch index group id filtered aliases to a document type - */ - public String[] getAliases(String documentType) { - List<String> aliasList = getAliasList(documentType, null); - return aliasList.toArray(new String[0]); - } - - /** - * List ElasticSearch index group id filtered aliases to a document type - */ - public String[] getAliases(String documentType, List<String> sourceIds) { - List<String> aliasList = getAliasList(documentType, sourceIds); - return aliasList.toArray(new String[0]); - } - - /** - * List ElasticSearch index group id filtered aliases to a document type - */ - private List<String> getAliasList(String documentType, List<String> sourceIds) { - if (sourceIds == null) { - sourceIds = new ArrayList<>(); - sourceIds.add("*"); - } - List<Integer> groupIds = userGroupsResourceClient.getUserGroups(); - List<String> aliases = new ArrayList<>(); - for (Integer groupId : groupIds) { - aliases.add(properties.getAliasName(documentType, groupId)); - } - return aliases; - } - - public SearchRequest prepareSearch(String documentType) { - return prepareSearch(documentType, null); - } - - public SearchScrollRequest getSearchScroll(String scrollId) { - return new SearchScrollRequest(scrollId); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParser.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParser.java deleted file mode 100644 index c73afbcd5fa99aaaab4e62c08e7ea53e6f1ea1cd..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParser.java +++ /dev/null @@ -1,174 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.google.common.base.Joiner; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetTermImpl; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.Aggregation; -import org.elasticsearch.search.aggregations.Aggregations; -import org.elasticsearch.search.aggregations.bucket.SingleBucketAggregation; -import org.elasticsearch.search.aggregations.bucket.terms.Terms; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -/** - * @author gcornut - */ -@Component -public class ESResponseParser { - - private final ObjectMapper objectMapper; - - public ESResponseParser(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; - } - - /** - * Parse the total hits number from an ElasticSearch search response - * - * @param response the ElasticSearch search response - */ - public Long parseTotalHits(SearchResponse response) { - if (response == null) return null; - SearchHits hits = response.getHits(); - if (hits == null) return null; - return hits.getTotalHits().value; - } - - /** - * Parse hits as value objects from an ElasticSearch search response - * - * @param response the ElasticSearch search response - * @param clazz the value object class - * @return the list of value object - */ - public <T> List<T> parseHits(SearchResponse response, Class<T> clazz) throws IOException, ReflectiveOperationException { - SearchHits hits = response.getHits(); - if (hits == null) return null; - - SearchHit[] searchHits = hits.getHits(); - if (searchHits == null) return null; - - DocumentMetadata<T> metadata = DocumentAnnotationUtil.getDocumentObjectMetadata(clazz); - - List<T> parsedHits = new ArrayList<>(); - - // Base JSON Object reader configured with the internal view - ObjectReader baseReader = objectMapper.readerWithView(JSONView.Internal.class); - - ObjectReader rootDocumentReader = baseReader.forType(clazz); - for (SearchHit hit : searchHits) { - T value = rootDocumentReader.readValue(hit.getSourceAsString()); - - if (hit.getInnerHits() != null) { - - for (String fieldName : metadata.getFieldsByName().keySet()) { - DocumentMetadata.Field field = metadata.getFieldsByName().get(fieldName); - if (!field.isNestedObject()) { - continue; - } - String stringPath = Joiner.on(".").join(field.getPath()); - - ObjectReader nestedReader = baseReader.forType(field.getFieldClass()); - - SearchHits innerHits = hit.getInnerHits().get(stringPath); - if (innerHits == null) { - throw new IllegalArgumentException("Could not find inner hit for path: " + stringPath); - } - - // Collect inner hits - List<Object> innerValues = new ArrayList<>(); - for (SearchHit innerHit : innerHits.getHits()) { - innerValues.add(nestedReader.readValue(innerHit.getSourceAsString())); - } - - // Set inner hit value - Method nestedSetter = field.getDescriptor().getWriteMethod(); - nestedSetter.invoke(value, innerValues); - } - } - - parsedHits.add(value); - } - return parsedHits; - } - - /** - * Parse keys of a term aggregation result - * - * @param response the ElasticSearch search response - * @param aggregationPath array of aggregation name used as path to find the term aggregation - */ - public List<String> parseTermAggKeys(SearchResponse response, List<String> aggregationPath) { - Terms termAgg = findAggregation(response, aggregationPath, Terms.class); - if (termAgg == null) return null; - - List<String> keys = new ArrayList<>(); - for (Terms.Bucket bucket : termAgg.getBuckets()) { - keys.add(bucket.getKey().toString()); - } - return keys; - } - - /** - * Find aggregation result in search response using the aggregation path and its type - */ - private <T> T findAggregation( - SearchResponse response, List<String> aggregationPath, Class<T> aggregationType - ) { - Aggregations aggregations = response.getAggregations(); - if (aggregations == null) return null; - - Aggregation aggregation = null; - for (String aggregationName : aggregationPath) { - if (aggregation == null || aggregation instanceof SingleBucketAggregation) { - if (aggregation != null) { - aggregations = ((SingleBucketAggregation) aggregation).getAggregations(); - } - - aggregation = aggregations.get(aggregationName); - } else { - // Invalid aggregation path - return null; - } - } - try { - return aggregationType.cast(aggregation); - } catch (ClassCastException e) { - return null; - } - } - - /** - * Parse terms aggregation results into facet VO - */ - public List<FacetTermImpl> parseFacetTerms(SearchResponse response, List<String> aggregationPath) { - Terms termAgg = findAggregation(response, aggregationPath, Terms.class); - if (termAgg == null) return null; - - List<FacetTermImpl> terms = new ArrayList<>(); - for (Terms.Bucket bucket : termAgg.getBuckets()) { - terms.add(new FacetTermImpl(bucket.getKey().toString(), bucket.getDocCount())); - } - return terms; - } - - /** - * Parse terms aggregation results into facet VO - */ - public List<FacetTermImpl> parseFacetTerms(SearchResponse response, String... aggregationPath) { - return parseFacetTerms(response, Arrays.asList(aggregationPath)); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESScrollIterator.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESScrollIterator.java deleted file mode 100644 index b6a070e563ebbf0dd9f86b42350674a59695ec2d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/ESScrollIterator.java +++ /dev/null @@ -1,141 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch; - -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.search.SearchScrollRequest; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.core.TimeValue; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.concurrent.TimeUnit; - -/** - * Scroll through all result of an Elasticsearch query as an Iterator - * - * <b>!Warning!: This iterator is lazy. Pages will be fetched only when the iterator is consumed and uses - * Elasticsearch scroll API which includes a timeout/keepAlive time after which you are not guaranteed access - * to the remaining pages. Please make sure to consume the iterator within the - * keep alive time {@link #DEFAULT_KEEP_ALIVE_TIME}</b> - * - * @author gcornut - */ -public class ESScrollIterator<T> implements Iterator<T> { - - public static final TimeValue DEFAULT_KEEP_ALIVE_TIME = new TimeValue(60, TimeUnit.SECONDS); - - private static final Logger LOGGER = LoggerFactory.getLogger(ESScrollIterator.class); - - private final Class<T> documentClass; - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final ESResponseParser parser; - private final long totalHits; - - private long hitIndex; - private String scrollId; - private Iterator<T> currentIterator; - - public ESScrollIterator( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser, Class<T> documentClass, - QueryBuilder query, - int fetchSize - ) { - this.client = client; - this.requestFactory = requestFactory; - this.parser = parser; - this.documentClass = documentClass; - - DocumentMetadata<T> documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(documentClass); - - SearchRequest request = requestFactory - .prepareSearch(documentMetadata.getDocumentType(), query) - .scroll(DEFAULT_KEEP_ALIVE_TIME); - - request.source() - .size(fetchSize) - .sort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC); - - // Add included and excluded fields if requested - String[] includedFields = documentMetadata.getIncludedFields(); - String[] excludedFields = documentMetadata.getExcludedFields(); - if ((includedFields != null && includedFields.length >= 1) || (excludedFields != null && excludedFields.length >= 1)) { - request.source().fetchSource(includedFields, excludedFields); - } - - SearchResponse response = null; - try { - response = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - - this.scrollId = response.getScrollId(); - this.totalHits = response.getHits().getTotalHits().value; - this.hitIndex = 0; - this.currentIterator = parseIterator(response); - } - - private Iterator<T> parseIterator(SearchResponse pageResponse) { - try { - List<T> hits = parser.parseHits(pageResponse, documentClass); - if (hits != null) { - return hits.iterator(); - } - throw new RuntimeException("Could not parse Elasticsearch hits"); - } catch (IOException | ReflectiveOperationException e) { - throw new RuntimeException(e); - } - } - - @Override - public boolean hasNext() { - if (currentIterator != null && currentIterator.hasNext()) { - return true; - } else if (totalHits > hitIndex) { - - SearchScrollRequest request = requestFactory - .getSearchScroll(scrollId) - .scroll(DEFAULT_KEEP_ALIVE_TIME); - - LOGGER.debug("Scroll new page: " + scrollId); - - SearchResponse response = null; - try { - response = client.scroll(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.scrollId = response.getScrollId(); - this.currentIterator = parseIterator(response); - return true; - } - return false; - } - - @Override - public T next() { - if (hasNext()) { - hitIndex++; - return currentIterator.next(); - } - throw new NoSuchElementException(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapper.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapper.java deleted file mode 100644 index 8a3b2484cc037a4bfeabe3edfd058eb10ea19de6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapper.java +++ /dev/null @@ -1,196 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria; - -import com.google.common.collect.ImmutableList; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTree; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTreeNode; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl.CriteriaMappingCriterionImpl; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl.CriteriaMappingImpl; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl.CriteriaMappingTreeNodeImpl; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import org.springframework.beans.BeanUtils; - -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Class generating mapping from value object to criteria using - * {@link CriteriaForDocument} and {@link DocumentPath} annotations on the given criteria. - * - * @author gcornut - */ -public class AnnotatedCriteriaMapper { - - private static final Map<Class, CriteriaMapping> mappingCache = new HashMap<>(); - - public static <C> CriteriaMapping getMapping(Class<C> criteriaClass) throws CriteriaMappingException { - if (mappingCache.containsKey(criteriaClass)) { - return mappingCache.get(criteriaClass); - } - try { - Map<List<String>, CriteriaMappingTree> tree = new HashMap<>(); - - CriteriaForDocument documentClass = criteriaClass.getAnnotation(CriteriaForDocument.class); - if (documentClass == null) { - throw CriteriaMappingException.missingDocumentClassAnnotation(criteriaClass); - } - - DocumentMetadata documentMetadata = DocumentAnnotationUtil - .getDocumentObjectMetadata(documentClass.value()); - - for (Field field : criteriaClass.getDeclaredFields()) { - PropertyDescriptor descriptor = BeanUtils.getPropertyDescriptor(criteriaClass, field.getName()); - if (!field.isSynthetic() && descriptor == null) { - throw CriteriaMappingException.fieldNotBeanProperty(field); - } - } - - for (PropertyDescriptor criteriaProperty : BeanUtils.getPropertyDescriptors(criteriaClass)) { - String criteriaName = criteriaProperty.getName(); - if (criteriaName.equals("class")) { - // Ignore java class property - continue; - } - - Field criterionField = getField(criteriaClass, criteriaName); - if (criterionField == null) { - throw CriteriaMappingException.fieldNotFound(criteriaClass, criteriaName); - } - - NoDocumentMapping noDocumentMapping = criterionField.getAnnotation(NoDocumentMapping.class); - if (noDocumentMapping != null) { - // Ignore criteria properties explicitly declared with no VO mapping - continue; - } - - DocumentPath documentPath = criterionField.getAnnotation(DocumentPath.class); - if (documentPath == null) { - // Throw exception on criteria properties not annotated (to avoid ignored properties) - throw CriteriaMappingException.mappingNotFound(criterionField); - } - - Class clazz = documentMetadata.getDocumentClass(); - - String virtualField = documentPath.virtualField(); - boolean isVirtualField = !virtualField.isEmpty(); - - List<String> fullDocumentFieldPath = ImmutableList.copyOf(documentPath.value()); - ImmutableList.Builder<String> javaFieldPathBuilder = new ImmutableList.Builder<>(); - List<String> jsonFieldPath = new ArrayList<>(); - - Map<List<String>, CriteriaMappingTree> subTree = tree; - for (int index = 0, size = fullDocumentFieldPath.size(); index < size; index++) { - String documentFieldName = fullDocumentFieldPath.get(index); - - javaFieldPathBuilder.add(documentFieldName); - List<String> javaFieldPath = javaFieldPathBuilder.build(); - - DocumentMetadata.Field field = documentMetadata.getByPath(javaFieldPath); - if (field == null) { - throw CriteriaMappingException.fieldNotFound(clazz, documentFieldName); - } - clazz = field.getFieldClass(); - - jsonFieldPath = field.getJsonPath(); - - boolean isLeaf = !isVirtualField && index == size - 1; - - if (isLeaf) { - subTree.put(jsonFieldPath, new CriteriaMappingCriterionImpl( - documentFieldName, jsonFieldPath, criteriaProperty, criterionField, - isVirtualField - )); - } else { - CriteriaMappingTree treeNode = subTree.get(jsonFieldPath); - if (!(treeNode instanceof CriteriaMappingTreeNode)) { - treeNode = new CriteriaMappingTreeNodeImpl(documentFieldName, jsonFieldPath); - subTree.put(jsonFieldPath, treeNode); - } - subTree = ((CriteriaMappingTreeNode) treeNode).getMappingTree(); - } - - } - - if (isVirtualField) { - List<String> documentFieldPath = ImmutableList.<String>builder() - .addAll(jsonFieldPath) - .add(virtualField) - .build(); - - subTree.put(documentFieldPath, new CriteriaMappingCriterionImpl( - virtualField, documentFieldPath, criteriaProperty, criterionField, - isVirtualField - )); - } - } - - if (tree.isEmpty()) { - throw CriteriaMappingException.noPropertyFoundInCriteria(criteriaClass); - } - - CriteriaMapping mapping = new CriteriaMappingImpl(criteriaClass, tree, documentMetadata); - mappingCache.put(criteriaClass, mapping); - return mapping; - } catch (Throwable e) { - throw new CriteriaMappingException(e); - } - } - - private static Field getField(Class<?> aClass, String fieldName) { - try { - if (aClass == null) return null; - return aClass.getDeclaredField(fieldName); - } catch (NoSuchFieldException e) { - return getField(aClass.getSuperclass(), fieldName); - } - } - - public static class CriteriaMappingException extends RuntimeException { - CriteriaMappingException(String message) { - super(message); - } - - CriteriaMappingException(Throwable e) { - super(e); - } - - - static CriteriaMappingException noPropertyFoundInCriteria(Class clazz) { - return new CriteriaMappingException("Could not find any property for criteria class '" + clazz + "'"); - - } - - static CriteriaMappingException fieldNotFound(Class clazz, String field) { - return new CriteriaMappingException("Could not find field '" + field + "' for class '" + clazz + "'"); - - } - - static CriteriaMappingException mappingNotFound(Field criteriaField) { - return new CriteriaMappingException( - "Could not find any mapping annotation on criteria field '" - + criteriaField.getName() + "'. Please use the '@" + DocumentPath.class.getSimpleName() - + "' annotation" - ); - } - - static CriteriaMappingException fieldNotBeanProperty(Field field) { - return new CriteriaMappingException( - "Field '" + field.getName() + "' from class '" + field.getDeclaringClass().getSimpleName() + - "' is not a valid java bean property (probably due to incorrect getter or setter definition)." - ); - } - - static <C> CriteriaMappingException missingDocumentClassAnnotation(Class<C> criteriaClass) { - return new CriteriaMappingException("Criteria '" + criteriaClass + "' should be annotated with '@" - + CriteriaForDocument.class.getSimpleName() + "' annotation"); - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/CriteriaForDocument.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/CriteriaForDocument.java deleted file mode 100644 index a831dcbafedb91b692938d91c87ffc2a6ce08b87..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/CriteriaForDocument.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author gcornut - */ -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface CriteriaForDocument { - Class<?> value(); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/DocumentPath.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/DocumentPath.java deleted file mode 100644 index 3f006d964dc59d00bd1b4dad04e27fb7a85c462b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/DocumentPath.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Maps a criteria property to a value object property - * - * @author gcornut - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface DocumentPath { - - /** - * Path into the document to the desired field - */ - String[] value(); - - /** - * Extra field path leading to elasticsearch virtual field - */ - String virtualField() default ""; - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/NoDocumentMapping.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/NoDocumentMapping.java deleted file mode 100644 index 0e6c55b4cecfe085f93f19a086ea3f0f39587e85..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/NoDocumentMapping.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Declares a criteria property not to be mapped to any value object property - * - * @author gcornut - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface NoDocumentMapping { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/QueryType.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/QueryType.java deleted file mode 100644 index 282dabb2033412d14684fbb7938502df02cbc207..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/annotation/QueryType.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.annotation; - - -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.TermQueryBuilder; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotated a criteria field to specify which kind of ES query it maps to - * - * @author gcornut - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface QueryType { - Class<? extends QueryBuilder> value() default TermQueryBuilder.class; -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMapping.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMapping.java deleted file mode 100644 index 0ba7fb5aa8511f50bde74f253738c8ba12f9cd61..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMapping.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping; - -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; - -import java.util.List; -import java.util.Map; - -/** - * A criteria mapping from document field tree to criterion field (from criteria - * object) - * - * @author gcornut - */ -public interface CriteriaMapping extends CriteriaMappingTreeNode { - - /** - * Get document field path using a criteria name - * - * @param criterionName name of the criterion in the criteria class - * @param noVirtualField whether or not you want the path to the virtual field or the parent concrete field - */ - String getDocumentPath(String criterionName, boolean noVirtualField); - - /** - * Criteria class mapped in this mapping - */ - Class<?> getCriteriaClass(); - - @Override - String getDocumentFieldName(); - - @Override - List<String> getDocumentFieldPath(); - - @Override - Map<List<String>, CriteriaMappingTree> getMappingTree(); - - @Override - <N extends CriteriaMappingTree> N getMapping(Class<N> clazz, List<String> documentFieldPath); - - DocumentMetadata<?> getDocumentMetadata(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingCriterion.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingCriterion.java deleted file mode 100644 index c56c146b83c653cb334f6bac75989c5e330d205f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingCriterion.java +++ /dev/null @@ -1,45 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping; - -import org.elasticsearch.index.query.QueryBuilder; - -import java.lang.reflect.InvocationTargetException; -import java.util.List; - -/** - * Leaf node of the criteria mapping representing a criterion (part of a larger - * criteria object) - */ -public interface CriteriaMappingCriterion extends CriteriaMappingTree { - - @Override - List<String> getDocumentFieldPath(); - - @Override - String getDocumentFieldName(); - - /** - * Whether or not the criterion maps to a virtual field in the document - */ - boolean isVirtualField(); - - /** - * Get the criterion value from the parent criteria object - */ - Object getValue(Object searchCriteria) throws InvocationTargetException, IllegalAccessException; - - /** - * Set the criterion value from the parent criteria object - */ - void setValue(Object searchCriteria, Object criteriaValue) throws InvocationTargetException, IllegalAccessException; - - /** - * Get the criterion query type - */ - Class<? extends QueryBuilder> getQueryType(); - - /** - * Get the criterion name - */ - String getName(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTree.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTree.java deleted file mode 100644 index f6324bbcbad6b60a92aed3353d12cce327d5d181..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTree.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping; - -import java.util.List; - -/** - * A criteria mapping from document field tree to criterion field (from criteria - * object) - * - * @author gcornut - */ -public interface CriteriaMappingTree { - - /** - * Get the full JSON path for the document field this criterion maps to - */ - List<String> getDocumentFieldPath(); - - /** - * Get the document field name - */ - String getDocumentFieldName(); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTreeNode.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTreeNode.java deleted file mode 100644 index 05ad78364181ae5757b8ff4184095d9982e465f6..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/CriteriaMappingTreeNode.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping; - -import java.util.List; -import java.util.Map; - -/** - * Node in the mapping from document to criteria which has children nodes - * (nested object or simple object in the document) - */ -public interface CriteriaMappingTreeNode extends CriteriaMappingTree { - - @Override - List<String> getDocumentFieldPath(); - - @Override - String getDocumentFieldName(); - - /** - * List children criteria - */ - Map<List<String>, CriteriaMappingTree> getMappingTree(); - - /** - * Get criterion from document field path - */ - <N extends CriteriaMappingTree> N getMapping(Class<N> clazz, List<String> documentFieldPath); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingCriterionImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingCriterionImpl.java deleted file mode 100644 index 38ab2b603ca4f12a85cee97f9f17daa0db060488..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingCriterionImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.QueryType; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingCriterion; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.TermQueryBuilder; - -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.util.List; - -/** - * @author gcornut - */ -public class CriteriaMappingCriterionImpl implements CriteriaMappingCriterion { - - private final String documentFieldName; - private final List<String> documentFieldPath; - private final String criterionName; - private final boolean virtualField; - private final PropertyDescriptor criteriaProperty; - private final Class<? extends QueryBuilder> queryType; - - public CriteriaMappingCriterionImpl(String documentFieldName, List<String> documentFieldPath, - PropertyDescriptor criteriaProperty, Field criterionField, boolean virtualField) { - this.documentFieldName = documentFieldName; - this.documentFieldPath = documentFieldPath; - this.virtualField = virtualField; - this.criteriaProperty = criteriaProperty; - this.queryType = findQueryType(criterionField); - this.criterionName = criterionField.getName(); - } - - private Class<? extends QueryBuilder> findQueryType(Field criterionField) { - // Default ES query type - Class<? extends QueryBuilder> queryBuilder = TermQueryBuilder.class; - - // EQ query type given via @QueryType annotation - QueryType queryType = criterionField.getAnnotation(QueryType.class); - if (queryType != null) { - queryBuilder = queryType.value(); - } - return queryBuilder; - } - - @Override - public String getName() { - return criterionName; - } - - @Override - public String getDocumentFieldName() { - return documentFieldName; - } - - @Override - public List<String> getDocumentFieldPath() { - return documentFieldPath; - } - - @Override - public boolean isVirtualField() { - return virtualField; - } - - @Override - public Object getValue(Object searchCriteria) throws InvocationTargetException, IllegalAccessException { - return criteriaProperty.getReadMethod().invoke(searchCriteria); - } - - @Override - public void setValue(Object searchCriteria, Object criteriaValue) - throws InvocationTargetException, IllegalAccessException { - criteriaProperty.getWriteMethod().invoke(searchCriteria, criteriaValue); - } - - @Override - public Class<? extends QueryBuilder> getQueryType() { - return queryType; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingImpl.java deleted file mode 100644 index 5e97eefa10a7f66976913e90c6e8c80f5dc0460c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingImpl.java +++ /dev/null @@ -1,120 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingCriterion; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTree; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTreeNode; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; - -import java.util.*; - -/** - * See {@link CriteriaMapping} docs - * - * @author gcornut - */ -public class CriteriaMappingImpl implements CriteriaMapping { - - private final Class<?> criteriaClass; - private final Map<List<String>, CriteriaMappingTree> flattenTreeByPath; - private final Map<List<String>, CriteriaMappingTree> mappingSubTree; - private final DocumentMetadata<?> documentMetadata; - - public CriteriaMappingImpl(Class<?> criteriaClass, Map<List<String>, CriteriaMappingTree> mappingSubTree, DocumentMetadata<?> documentMetadata) { - this.criteriaClass = criteriaClass; - this.mappingSubTree = mappingSubTree; - this.flattenTreeByPath = flattenTree(null, mappingSubTree.values()); - this.documentMetadata = documentMetadata; - } - - /** - * Walk the recursive tree to produce a flatten representation - */ - private static Map<List<String>, CriteriaMappingTree> flattenTree(CriteriaMappingTree parent, - Collection<CriteriaMappingTree> nodes) { - Map<List<String>, CriteriaMappingTree> flattenTree = new HashMap<>(); - for (CriteriaMappingTree tree : nodes) { - flattenTree.put(tree.getDocumentFieldPath(), tree); - if (tree instanceof CriteriaMappingTreeNode) { - CriteriaMappingTreeNode node = (CriteriaMappingTreeNode) tree; - flattenTree.putAll(flattenTree(node, node.getMappingTree().values())); - } else if (tree instanceof CriteriaMappingCriterion) { - CriteriaMappingCriterion criterion = (CriteriaMappingCriterion) tree; - if (criterion.isVirtualField() && parent != null) { - flattenTree.put(parent.getDocumentFieldPath(), criterion); - } - } - } - return flattenTree; - } - - /** - * Copy input list with all its element except the last one - */ - private static <T> List<T> allButLast(List<T> list) { - ImmutableList.Builder<T> builder = ImmutableList.builder(); - for (int i = 0; i < list.size() - 1; i++) { - builder.add(list.get(i)); - } - return builder.build(); - } - - @Override - public String getDocumentPath(String criterionName, boolean noVirtualField) { - for (List<String> documentFieldPath : flattenTreeByPath.keySet()) { - CriteriaMappingTree tree = flattenTreeByPath.get(documentFieldPath); - - if (tree instanceof CriteriaMappingCriterion) { - CriteriaMappingCriterion criterion = (CriteriaMappingCriterion) tree; - if (criterion.getName().equals(criterionName)) { - List<String> path = criterion.getDocumentFieldPath(); - if (noVirtualField && criterion.isVirtualField()) { - // truncate path because the last part is the virtual field - path = allButLast(path); - } - return Joiner.on(".").join(path); - } - } - } - throw new RuntimeException("Could not find document field path for criteria named '" + criterionName + "' " - + "in '" + criteriaClass.getSimpleName() + "'"); - } - - @Override - public <N extends CriteriaMappingTree> N getMapping(Class<N> clazz, List<String> documentFieldPath) { - CriteriaMappingTree node = flattenTreeByPath.get(documentFieldPath); - try { - return clazz.cast(node); - } catch (ClassCastException | NullPointerException e) { - throw new RuntimeException("Could not find criterion for document field path '" - + Joiner.on(".").join(documentFieldPath) + "'"); - } - } - - @Override - public Map<List<String>, CriteriaMappingTree> getMappingTree() { - return mappingSubTree; - } - - @Override - public List<String> getDocumentFieldPath() { - return Collections.emptyList(); - } - - @Override - public String getDocumentFieldName() { - return null; - } - - @Override - public Class<?> getCriteriaClass() { - return criteriaClass; - } - - @Override - public DocumentMetadata<?> getDocumentMetadata() { - return documentMetadata; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingTreeNodeImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingTreeNodeImpl.java deleted file mode 100644 index 05d99d7511460473e14cc8ebc8f55f03fbe343cc..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/criteria/mapping/impl/CriteriaMappingTreeNodeImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.mapping.impl; - -import com.google.common.base.Joiner; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTree; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTreeNode; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author gcornut - */ -public class CriteriaMappingTreeNodeImpl implements CriteriaMappingTreeNode { - - private final String documentFieldName; - private final List<String> documentFieldPath; - private final Map<List<String>, CriteriaMappingTree> mappingSubTree; - - public CriteriaMappingTreeNodeImpl(String documentFieldName, List<String> documentFieldPath) { - this.documentFieldName = documentFieldName; - this.documentFieldPath = documentFieldPath; - this.mappingSubTree = new HashMap<>(); - } - - @Override - public String getDocumentFieldName() { - return documentFieldName; - } - - @Override - public List<String> getDocumentFieldPath() { - return documentFieldPath; - } - - @Override - public Map<List<String>, CriteriaMappingTree> getMappingTree() { - return mappingSubTree; - } - - @Override - public <N extends CriteriaMappingTree> N getMapping(Class<N> clazz, List<String> documentFieldPath) { - CriteriaMappingTree node = mappingSubTree.get(documentFieldPath); - try { - return clazz.cast(node); - } catch (ClassCastException | NullPointerException e) { - throw new RuntimeException("Could not find criterion for document field path '" - + Joiner.on(".").join(documentFieldPath) + "'"); - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtil.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtil.java deleted file mode 100644 index eb63d3e3424b7addbbf70f1731001c94a4959d8d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtil.java +++ /dev/null @@ -1,227 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.google.common.collect.ImmutableList; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; -import org.springframework.beans.BeanUtils; - -import java.beans.PropertyDescriptor; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.*; - -/** - * @author gcornut - */ -public class DocumentAnnotationUtil { - - private static final Map<Class, DocumentMetadata> metadataCache = new HashMap<>(); - - /** - * Describes a value object document annotated with {@link Document}, {@link Id} - * and {@link Nested} annotations - */ - public static <VO> DocumentMetadata<VO> getDocumentObjectMetadata(Class<VO> valueObjectClass) { - DocumentMetadata metadata = metadataCache.get(valueObjectClass); - if (metadata == null) { - Document document = valueObjectClass.getAnnotation(Document.class); - String valueObjectName = valueObjectClass.getSimpleName(); - - if (document == null) { - throw new ValueObjectMetadataException( - "Could not find @Document annotation on value object '" + valueObjectName + "'"); - } - String documentType = document.type(); - - String idFieldName = null; - for (Field field : valueObjectClass.getDeclaredFields()) { - String fieldName = field.getName(); - - Id id = field.getAnnotation(Id.class); - if (id != null) { - if (id.jsonName().isEmpty()) { - idFieldName = fieldName; - } else { - idFieldName = id.jsonName(); - } - } - } - - Map<String, DocumentMetadata.Field> fields = findDocumentFields(ImmutableList.<String>of(), - valueObjectClass); - - String[] includedFields = document.includedFields(); - String[] excludedFields = document.excludedFields(); - metadata = new DocumentMetadata<>(documentType, idFieldName, valueObjectClass, includedFields, excludedFields, fields); - metadataCache.put(valueObjectClass, metadata); - } - return metadata; - } - - private static Set<String> getAllField(Class<?> clazz) { - Set<String> fields = new HashSet<>(); - for (PropertyDescriptor property : BeanUtils.getPropertyDescriptors(clazz)) { - if (property.getName().equals("class")) { - // Ignore java class property - continue; - } - fields.add(property.getName()); - } - for (Field field : clazz.getDeclaredFields()) { - if (field.isSynthetic()) { - continue; - } - fields.add(field.getName()); - } - return fields; - } - - /** - * Recursively find document fields - */ - private static Map<String, DocumentMetadata.Field> findDocumentFields(List<String> parentPath, Class clazz) { - Map<String, DocumentMetadata.Field> fields = new HashMap<>(); - - for (String fieldName : getAllField(clazz)) { - Class<?> fieldClass = null; - boolean isNestedObject = false; - boolean isObject = false; - JsonDeserialize deserialize = null; - String jsonName = null; - - // Get annotation from Java Field - try { - Field field = clazz.getDeclaredField(fieldName); - fieldClass = field.getType(); - - deserialize = field.getAnnotation(JsonDeserialize.class); - if (deserialize != null && !deserialize.as().equals(Void.class)) { - fieldClass = deserialize.as(); - } - - isNestedObject = field.getAnnotation(Nested.class) != null; - isObject = isObject(fieldClass); - - JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class); - if (jsonProperty != null) { - jsonName = jsonProperty.value(); - } - } catch (NoSuchFieldException ignored) { - } - - // Get annotations from Java bean getters - PropertyDescriptor descriptor = BeanUtils.getPropertyDescriptor(clazz, fieldName); - if (descriptor != null) { - fieldClass = descriptor.getPropertyType(); - - Method getter = descriptor.getReadMethod(); - if (getter != null) { - Class<?> returnType = getter.getReturnType(); - isObject = isObject(returnType); - isNestedObject = isNestedObject || getter.getAnnotation(Nested.class) != null; - - if (deserialize == null) { - deserialize = getter.getAnnotation(JsonDeserialize.class); - } - - if (jsonName == null) { - JsonProperty jsonProperty = recursivelyGetAnnotation(getter, JsonProperty.class); - if (jsonProperty != null) { - jsonName = jsonProperty.value(); - } - } - } - } - - boolean isCollection = fieldClass != null && Collection.class.isAssignableFrom(fieldClass); - if (isCollection) { - if (deserialize != null && !deserialize.contentAs().equals(Void.class)) { - fieldClass = deserialize.contentAs(); - isObject = isObject(fieldClass); - } else if (isObject || isNestedObject) { - throw new ValueObjectMetadataException("Could not determine content type for collection field " - + "'" + fieldName + "' in class '" + clazz + "'. " - + "Please use the `@JsonDeserialize(contentAs= ...)` annotation on this field to set the " - + "content class."); - } - } - - List<String> path = ImmutableList.<String>builder().addAll(parentPath).add(fieldName).build(); - - if (jsonName == null) { - jsonName = fieldName; - } - List<String> jsonPath = ImmutableList.<String>builder().addAll(parentPath).add(jsonName).build(); - - Map<String, DocumentMetadata.Field> subFields = null; - if (isObject || isNestedObject) { - subFields = findDocumentFields(path, fieldClass); - } - - DocumentMetadata.Field field = new DocumentMetadata.Field( - path, jsonPath, fieldClass, isNestedObject, descriptor, subFields); - - // Index using java name - fields.put(fieldName, field); - - // Index using JSON name - fields.put(jsonName, field); - } - return fields; - } - - private static boolean isObject(Class<?> returnType) { - return !returnType.getName().startsWith("java.lang") && - !returnType.getName().startsWith("java.util"); - } - - /** - * Recursively search annotation on a method or on the parent class/interface - */ - private static <A extends Annotation> A recursivelyGetAnnotation(Method method, Class<A> annotationClass) { - A annotation = method.getAnnotation(annotationClass); - if (annotation != null) { - return annotation; - } - - Class<?> parentClass = method.getDeclaringClass(); - String name = method.getName(); - Class<?>[] param = method.getParameterTypes(); - - Method searchedMethod; - - // Search in parent interface - for (Class<?> parentInterface : parentClass.getInterfaces()) { - try { - searchedMethod = parentInterface.getMethod(name, param); - return recursivelyGetAnnotation(searchedMethod, annotationClass); - } catch (NoSuchMethodException ignored) { - } - } - - // Search in parent classes - for (; ; ) { - parentClass = parentClass.getSuperclass(); - if (parentClass == null) { - break; - } - try { - searchedMethod = parentClass.getMethod(name, param); - return recursivelyGetAnnotation(searchedMethod, annotationClass); - } catch (NoSuchMethodException ignored) { - } - } - - return null; - } - - public static class ValueObjectMetadataException extends RuntimeException { - ValueObjectMetadataException(String message) { - super(message); - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentMetadata.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentMetadata.java deleted file mode 100644 index a54e37e3c5023fcf8516a9d6e4b347ec628293da..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentMetadata.java +++ /dev/null @@ -1,124 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document; - -import com.google.common.collect.ImmutableList; - -import java.beans.PropertyDescriptor; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Metadata about an Elasticsearch document - * - * @author gcornut - */ -public class DocumentMetadata<VO> { - - private final String documentType; - private final String idField; - private final Class<VO> documentClass; - private final String[] includedFields; - private final String[] excludedFields; - private final Map<String, Field> fieldsByName; - private final Map<List<String>, Field> fieldByPath; - - public DocumentMetadata(String documentType, - String idField, - Class<VO> documentClass, - String[] includedFields, - String[] excludedFields, - Map<String, Field> fieldsByName) { - this.documentType = documentType; - this.idField = idField; - this.documentClass = documentClass; - this.includedFields = includedFields; - this.excludedFields = excludedFields; - this.fieldsByName = fieldsByName; - this.fieldByPath = flattenDocumentFieldTree(ImmutableList.<String>of(), fieldsByName); - } - - public String getDocumentType() { - return documentType; - } - - /** - * Flatten the document field paths into a single map indexed by document field path (java path or JSON path) - */ - private static Map<List<String>, Field> flattenDocumentFieldTree(List<String> path, Map<String, Field> values) { - Map<List<String>, Field> fieldByPath = new HashMap<>(); - - for (String name : values.keySet()) { - Field field = values.get(name); - List<String> newPath = ImmutableList.<String>builder().addAll(path).add(name).build(); - fieldByPath.put(newPath, field); - Map<String, Field> fieldsByName = field.fieldsByName; - if (fieldsByName != null) { - fieldByPath.putAll(flattenDocumentFieldTree(newPath, fieldsByName)); - } - } - return fieldByPath; - } - - public String getIdField() { - return idField; - } - - public String[] getIncludedFields() { - return includedFields; - } - - public String[] getExcludedFields() { - return excludedFields; - } - - public Class<VO> getDocumentClass() { - return documentClass; - } - - public Map<String, Field> getFieldsByName() { - return fieldsByName; - } - - public Field getByPath(List<String> documentFieldPath) { - return fieldByPath.get(documentFieldPath); - } - - public static class Field { - private final boolean nestedObject; - private final List<String> path; - private final List<String> jsonPath; - private final PropertyDescriptor descriptor; - private final Map<String, Field> fieldsByName; - private final Class<?> fieldClass; - - Field(List<String> path, List<String> jsonPath, Class<?> fieldClass, boolean nestedObject, PropertyDescriptor descriptor, - Map<String, Field> fieldsByName) { - this.jsonPath = jsonPath; - this.nestedObject = nestedObject; - this.path = path; - this.fieldClass = fieldClass; - this.descriptor = descriptor; - this.fieldsByName = fieldsByName; - } - - public Class<?> getFieldClass() { - return fieldClass; - } - - public boolean isNestedObject() { - return nestedObject; - } - - public List<String> getPath() { - return path; - } - - public List<String> getJsonPath() { - return jsonPath; - } - - public PropertyDescriptor getDescriptor() { - return descriptor; - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Document.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Document.java deleted file mode 100644 index 3d0585a459d0fe20a030a5b2a6e88d5217dee332..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Document.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author gcornut - */ -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Document { - String type(); - - String[] includedFields() default {}; - String[] excludedFields() default {}; -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Id.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Id.java deleted file mode 100644 index 61586c06b49d2797f1fc8301447d2a6f4d7081e0..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Id.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author gcornut - */ -@Target({ElementType.FIELD, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Id { - - /** - * Override the id field name - */ - String jsonName() default ""; -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Nested.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Nested.java deleted file mode 100644 index b0013750c9cd65251b84ce967bc9765d49f38a19..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/document/annotation/Nested.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author gcornut - */ -@Target({ElementType.FIELD, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Nested { -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/package-info.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/package-info.java deleted file mode 100644 index 5d1d1e807d6648d656bdad382492dba3197efadb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/package-info.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * This package provides generic query building and query execution for Elasticsearch - * <p> - * - the "document" package provides '@' annotations on document value objects that can be used to add metadata like the - * identifier field, nested objects and the document type. - * <p> - * - the "criteria" package provides '@' annotations on criteria value objects that can be used to map criterion to - * document field (and thus automatically generate Elasticsearch queries from criteria VO) - * <p> - * - the "query" package provides generic Elasticsearch query building from criteria VO based on the above utilities - * <p> - * - the "repository" package provides generic Elasticsearch repository interfaces and implementation based on the above - * utilities - * - * @author gcornut - */ -package fr.inra.urgi.faidare.elasticsearch; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/ESQueryFactory.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/ESQueryFactory.java deleted file mode 100644 index 4fccfa7c0093e145cd287d96e38bc51747f7db2d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/ESQueryFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.query; - -import org.elasticsearch.index.query.QueryBuilder; - -/** - * @author gcornut - */ -public interface ESQueryFactory<C> { - - /** - * Create query from the criteria - */ - QueryBuilder createQuery(C criteria); - - QueryBuilder createShouldFilterQuery(C criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactory.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactory.java deleted file mode 100644 index 77ad147e1dbd047c0437e6b01e602636530db782..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactory.java +++ /dev/null @@ -1,411 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.query.impl; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableSet; -import fr.inra.urgi.faidare.elasticsearch.criteria.AnnotatedCriteriaMapper; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingCriterion; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTree; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTreeNode; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.ESQueryFactory; -import org.apache.commons.lang3.NotImplementedException; -import org.apache.lucene.search.join.ScoreMode; -import org.elasticsearch.index.query.*; - -import java.util.*; - -import static org.elasticsearch.index.query.QueryBuilders.*; - -/** - * Generic Elasticsearch query generator for criteria mapped on value object via - * {@link DocumentPath} annotations - * - * @author gcornut, jdestin - */ -public class ESGenericQueryFactory<C> implements ESQueryFactory<C> { - - private static final Integer MAX_INNER_HIT_SIZE = 10000; - - /** - * Generate an ElasticSearch query from a criteria with fields that have been - * annotated with {@link DocumentPath} - * - * @param criteria the criteria from which to generate the query - * @return an ES QueryBuilder - * @throws ESQueryGenerationException when a reflective introspection failed on the criteria or the - * mapped value object - */ - @Override - public QueryBuilder createQuery(C criteria) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, null, null, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return andQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - @Override - public QueryBuilder createShouldFilterQuery(C criteria) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, null, null, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return germplasmFilterQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - /** - * Same as {@link ESGenericQueryFactory#createQuery(Object)} but with a list of document fields to exclude from query - */ - public QueryBuilder createQueryExcludingFields(C criteria, String... excludeDocumentFields) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - Set<String> excludedDocumentFields = ImmutableSet.copyOf(excludeDocumentFields); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, null, excludedDocumentFields, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return andQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - public QueryBuilder createEsShouldQueryExcludingFields(C criteria, String... excludeDocumentFields) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - Set<String> excludedDocumentFields = ImmutableSet.copyOf(excludeDocumentFields); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, null, excludedDocumentFields, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return germplasmFilterQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - /** - * Same as {@link ESGenericQueryFactory#createQuery(Object)} but with a list of document fields to include from query (excluding all others) - */ - public QueryBuilder createQueryIncludingFields(C criteria, String... includeDocumentFields) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - Set<String> includedDocumentFields = ImmutableSet.copyOf(includeDocumentFields); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, includedDocumentFields, null, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return andQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - public QueryBuilder createEsShouldQueryIncludingFields(C criteria, String... includeDocumentFields) { - try { - CriteriaMapping voMappingToCriteria = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - DocumentMetadata<?> documentMetadata = voMappingToCriteria.getDocumentMetadata(); - Set<String> includedDocumentFields = ImmutableSet.copyOf(includeDocumentFields); - - List<QueryBuilder> queries = createQueryFromMapping(criteria, includedDocumentFields, null, voMappingToCriteria, documentMetadata); - - if (!queries.isEmpty()) { - return germplasmFilterQueries(queries); - } else { - return matchAllQuery(); - } - } catch (Exception e) { - throw new ESQueryGenerationException(e); - } - } - - /** - * Generate a query from a criteria - */ - private List<QueryBuilder> createQueryFromMapping( - C criteria, - Set<String> includedDocumentFields, - Set<String> excludedDocumentFields, - CriteriaMappingTreeNode criteriaMapping, - DocumentMetadata<?> documentMetadata - ) throws Exception { - List<QueryBuilder> queries = new ArrayList<>(); - Class criteriaClass = criteria.getClass(); - - for (CriteriaMappingTree treeNode : criteriaMapping.getMappingTree().values()) { - List<String> documentFieldPath = treeNode.getDocumentFieldPath(); - String stringPath = Joiner.on(".").join(documentFieldPath); - - if (includedDocumentFields != null) { - boolean someStartWithPath = false; - for (String includedDocumentField : includedDocumentFields) { - if (includedDocumentField.startsWith(stringPath)) { - someStartWithPath = true; - } - } - if (!someStartWithPath) { - continue; - } - } - if (excludedDocumentFields != null && excludedDocumentFields.contains(stringPath)) { - continue; - } - - // Metadata on the current document field - DocumentMetadata.Field documentField = documentMetadata.getByPath(documentFieldPath); - - if (treeNode instanceof CriteriaMappingCriterion) { - // Current node is a leaf (an actual criterion from the criteria object) - CriteriaMappingCriterion criterion = (CriteriaMappingCriterion) treeNode; - - if (!criterion.isVirtualField() && documentField == null) { - // Document field should exist in document class (except if the field is virtual) - throw ESQueryGenerationException.couldNotFindDocumentField( - stringPath, - documentMetadata.getDocumentClass() - ); - } - - // Criterion value - Object criterionValue = criterion.getValue(criteria); - - // Ignore empty criteria - if (isBlank(criterionValue)) { - continue; - } - - List<QueryBuilder> subQueries = createQueriesFromField(stringPath, criteriaClass, criterion, criterionValue); - if (!subQueries.isEmpty()) { - queries.addAll(subQueries); - } - } - - if (treeNode instanceof CriteriaMappingTreeNode) { - CriteriaMappingTreeNode nodeWithChildren = (CriteriaMappingTreeNode) treeNode; - - // Generate queries for criteria mapped in the - List<QueryBuilder> subQueries = createQueryFromMapping( - criteria, includedDocumentFields, excludedDocumentFields, nodeWithChildren, - documentMetadata); - - if (!subQueries.isEmpty()) { - if (documentField.isNestedObject()) { - // Add nested query - InnerHitBuilder inner = new InnerHitBuilder().setSize(MAX_INNER_HIT_SIZE); - NestedQueryBuilder nested = nestedQuery(stringPath, andQueries(subQueries), ScoreMode.None).innerHit(inner); - queries.add(nested); - } else { - // Add nested query - queries.addAll(subQueries); - } - } - } - } - return queries; - } - - private boolean isBlank(Object object) { - return object == null || (object instanceof Collection && ((Collection) object).isEmpty()); - } - - /** - * Generate a query for a criteria field - */ - private List<QueryBuilder> createQueriesFromField( - String documentField, Class criteriaClass, CriteriaMappingCriterion criterion, Object value - ) throws ESQueryGenerationException { - Class<? extends QueryBuilder> queryType = criterion.getQueryType(); - String criterionName = criterion.getName(); - - // Range query - if (queryType == RangeQueryBuilder.class) { - if (!(value instanceof List) || ((List) value).size() > 2) { - throw ESQueryGenerationException.invalidRange(criterionName); - } - List valueList = (List) value; - RangeQueryBuilder range = rangeQuery(documentField) - .from(valueList.get(0)) - .to(valueList.get(1)); - return Collections.singletonList(range); - } - - // Term query - if (queryType == TermQueryBuilder.class || queryType == TermsQueryBuilder.class) { - if (value instanceof Collection) { - TermsQueryBuilder terms = termsQuery(documentField, (Collection) value); - return Collections.singletonList(terms); - } - - if (value instanceof String || value instanceof Number || value instanceof Boolean) { - TermQueryBuilder term = termQuery(documentField, value); - return Collections.singletonList(term); - } - } - - // Match phrase query - if (queryType == MatchPhraseQueryBuilder.class) { - if (value instanceof Collection) { - List<QueryBuilder> matches = new ArrayList<>(); - for (Object v : ((Collection) value)) { - matches.add(matchPhraseQuery(documentField, v)); - } - return matches; - } - if (value instanceof String) { - MatchPhraseQueryBuilder match = matchPhraseQuery(documentField, value); - return Collections.singletonList(match); - } - } - - throw ESQueryGenerationException.notImplemented(criterionName, criteriaClass, queryType, value); - } - - public static class ESQueryGenerationException extends RuntimeException { - ESQueryGenerationException(String message) { - super(message); - } - - ESQueryGenerationException(Throwable e) { - super(e); - } - - ESQueryGenerationException(String message, Throwable e) { - super(message, e); - } - - static ESQueryGenerationException couldNotGenerateQueryForField( - String criterionName, Class criteriaClass, Throwable e - ) { - return new ESQueryGenerationException( - "Could not generate ES query for criterion '" + criterionName + "' " + - "in criteria '" + criteriaClass.getSimpleName() + "'", e - ); - } - - static ESQueryGenerationException invalidRange(String criteriaName) { - return new ESQueryGenerationException( - "Range criteria " + criteriaName + " should be a list of 2 elements (lower bound and upper bound)"); - } - - static ESQueryGenerationException notImplemented( - String criterionName, Class criteriaClass, Class queryBuilder, Object value - ) { - Throwable notImplementedException = new NotImplementedException( - "No query generation implemented for query type '" + queryBuilder.getSimpleName() + "' " + - "and criteria value '" + value + "'" - ); - return ESQueryGenerationException.couldNotGenerateQueryForField( - criterionName, criteriaClass, notImplementedException - ); - } - - static ESQueryGenerationException couldNotFindDocumentField(String subPath, Class<?> documentClass) { - return new ESQueryGenerationException( - "Could not find field '" + subPath + "' in document class '" + documentClass + "'" - ); - } - } - - /** - * Combine queries into a bool must query - * - * @return null if not queries given; the first query if only one query is given; a bool query otherwise - */ - public static QueryBuilder andQueries(List<QueryBuilder> queries) { - if (queries == null || queries.isEmpty()) { - return null; - } else if (queries.size() == 1) { - return queries.get(0); - } else { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - for (QueryBuilder query : queries) { - boolQueryBuilder.must(query); - } - return boolQueryBuilder; - } - } - - public static QueryBuilder andQueries(QueryBuilder... queries) { - return andQueries(Arrays.asList(queries)); - } - - - /** - * Combine queries into a bool should query - * - * @return null if not queries given; the first query if only one query is given; a bool query otherwise - */ - public static QueryBuilder germplasmFilterQueries(List<QueryBuilder> queries) { - if (queries == null || queries.isEmpty()) { - return null; - } else if (queries.size() == 1) { - return queries.get(0); - } else { - // List of the criteria that will be use in should query part, the other criteria will be used as filter. - List<String> shouldCriterion = Arrays.asList("commonCropName", - "species", "germplasmGenus", "genusSpecies", "subtaxa", "genus", - "genusSpeciesSubtaxa", "taxonSynonyms", "taxonCommonNames", "panel", "collection", "population", - "germplasmName", "accessionNumber", "synonyms"); - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolShouldQueryBuilder = QueryBuilders.boolQuery(); - List<QueryBuilder> filterQueries = new ArrayList<>(); - for (QueryBuilder query : queries) { - boolean isShouldCriterion = stringContainsItemFromList(query.toString(), shouldCriterion); - if (isShouldCriterion){ - boolShouldQueryBuilder.should(query); - } else { - filterQueries.add(query); - } - } - boolQueryBuilder.must(boolShouldQueryBuilder); - for (QueryBuilder query: filterQueries) { - boolQueryBuilder.filter(query); - } - return boolQueryBuilder; - } - } - - public static boolean stringContainsItemFromList(String inputStr, List<String> items) - { - for(String item: items) - { - if(inputStr.contains(item)) - { - return true; - } - } - return false; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESFindRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESFindRepository.java deleted file mode 100644 index cf6ee6749314a1e98019d05824aae0b3d9026f05..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESFindRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; -import fr.inra.urgi.faidare.domain.response.PaginatedList; - -/** - * Interface representing an ElasticSearch repository providing a paginated - * document search based on a criteria. - * - * @author gcornut - */ -public interface ESFindRepository<C extends PaginationCriteria, VO> { - - /** - * Find ES documents using criteria - */ - PaginatedList<VO> find(C criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESGetByIdRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESGetByIdRepository.java deleted file mode 100644 index 9b9a223edf254778ce691e776780dcf3511d7c72..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESGetByIdRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository; - -/** - * Interface representing an ElasticSearch repository providing a get document - * by id method. - * - * @author gcornut - */ -public interface ESGetByIdRepository<VO> { - - /** - * Get ES document by identifier - */ - VO getById(String id); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESSuggestRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESSuggestRepository.java deleted file mode 100644 index cba7b91ced46ff8b2b7cdb2de3d4619068d02ae3..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/ESSuggestRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; - -import java.util.LinkedHashSet; - -/** - * Interface representing an ElasticSearch repository providing suggestion on a field values. - * - * @author gcornut - */ -public interface ESSuggestRepository<C extends PaginationCriteria> { - - /** - * Suggest field values - */ - LinkedHashSet<String> suggest(String field, String searchText, Integer fetchSize, C criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/BaseESRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/BaseESRepository.java deleted file mode 100644 index bce6728b9b4d902c29bb0fed2f5740fab06a2ff9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/BaseESRepository.java +++ /dev/null @@ -1,42 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository.impl; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; -import org.elasticsearch.client.RestHighLevelClient; - -/** - * Generic ElasticSearch repository of document providing a search and a get by id. - * - * @author gcornut - */ -public class BaseESRepository<C extends PaginationCriteria, VO> - implements ESGetByIdRepository<VO>, ESFindRepository<C, VO> { - - private final ESGetByIdRepository<VO> getByIdRepository; - private final ESFindRepository<C, VO> findRepository; - - public BaseESRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESResponseParser parser - ) { - getByIdRepository = new ESGenericGetByIdRepository<>(client, requestFactory, voClass, parser); - findRepository = new ESGenericFindRepository<>(client, requestFactory, voClass, parser); - } - - @Override - public VO getById(String id) { - return getByIdRepository.getById(id); - } - - @Override - public PaginatedList<VO> find(C criteria) { - return findRepository.find(criteria); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericFindRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericFindRepository.java deleted file mode 100644 index e1122d86108623783ca5bf7b8d01ce3739a71796..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericFindRepository.java +++ /dev/null @@ -1,132 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository.impl; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; -import fr.inra.urgi.faidare.domain.criteria.base.SortCriteria; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.domain.response.PaginationImpl; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.ESQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -/** - * Generic implementation of an ElasticSearch document repository which can find documents by criteria. - * - * @author gcornut - */ -public class ESGenericFindRepository<C extends PaginationCriteria, VO> implements ESFindRepository<C, VO> { - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final ESQueryFactory<C> queryFactory; - private final DocumentMetadata<VO> documentMetadata; - private final ESResponseParser parser; - - public ESGenericFindRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESQueryFactory<C> queryFactory, - ESResponseParser parser - ) { - this.client = client; - this.requestFactory = requestFactory; - this.queryFactory = queryFactory; - this.documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(voClass); - this.parser = parser; - } - - public ESGenericFindRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESResponseParser parser - ) { - this(client, requestFactory, voClass, new ESGenericQueryFactory<>(), parser); - } - - public static <C extends PaginationCriteria, D> SearchRequest prepareSearchRequest( - QueryBuilder query, C criteria, DocumentMetadata<D> documentMetadata, ESRequestFactory requestFactory - ) { - // Build query - int size = criteria.getPageSize().intValue(); - int from = criteria.getPage().intValue() * size; - - // Build request - String documentType = documentMetadata.getDocumentType(); - SearchRequest request = requestFactory.prepareSearch(documentType, query); - request.source() - .from(from) - .size(size); - - // Add sort if requested - if (criteria instanceof SortCriteria) { - SortCriteria sortCriteria = (SortCriteria) criteria; - String field = sortCriteria.getSortBy(); - if (field == null) { - // Default ES sort - field = "_doc"; - } - - String strOrder = sortCriteria.getSortOrder(); - SortOrder order = SortOrder.ASC; - if (strOrder != null) { - order = SortOrder.valueOf(strOrder.toUpperCase()); - } - request.source().sort(field, order); - } - - // Add included and excluded fields if requested - String[] includedFields = documentMetadata.getIncludedFields(); - String[] excludedFields = documentMetadata.getExcludedFields(); - if ((includedFields != null && includedFields.length >= 1) || (excludedFields != null && excludedFields.length >= 1)) { - request.source().fetchSource(includedFields, excludedFields); - } - - Logger logger = LoggerFactory.getLogger(ESGenericFindRepository.class); - if (logger.isDebugEnabled()) { - logger.debug(request.toString()); - } - return request; - } - - @Override - public PaginatedList<VO> find(C criteria) { - try { - QueryBuilder query = queryFactory.createQuery(criteria); - - SearchRequest request = prepareSearchRequest( - query, criteria, documentMetadata, requestFactory - ); - - // Execute request - SearchResponse result = client.search(request, RequestOptions.DEFAULT); - - // Prepare pagination info - Pagination pagination = PaginationImpl.create(criteria, parser.parseTotalHits(result)); - - // Parse result list - List<VO> resultList = parser.parseHits(result, documentMetadata.getDocumentClass()); - - // Return paginated list - return new PaginatedList<>(pagination, resultList); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericGetByIdRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericGetByIdRepository.java deleted file mode 100644 index 27d3bfda4b3574619b70dff731337dc6e2df5272..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericGetByIdRepository.java +++ /dev/null @@ -1,81 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository.impl; - -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -/** - * Generic implementation of an ElasticSearch query for document by its identifier - * - * @author gcornut - */ -public class ESGenericGetByIdRepository<VO> implements ESGetByIdRepository<VO> { - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final Class<VO> voClass; - private final ESResponseParser parser; - - private DocumentMetadata<VO> documentMetadata; - - private Logger logger = LoggerFactory.getLogger(getClass()); - - public ESGenericGetByIdRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESResponseParser parser - ) { - this.client = client; - this.requestFactory = requestFactory; - this.voClass = voClass; - this.parser = parser; - documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(voClass); - if (documentMetadata.getIdField() == null) { - throw new RuntimeException("Could not identify an identifier field on document " + voClass.getSimpleName()); - } - } - - @Override - public VO getById(String id) { - try { - String documentType = documentMetadata.getDocumentType(); - - // Build term id query - QueryBuilder query = QueryBuilders.termQuery(documentMetadata.getIdField(), id); - - // Build request - SearchRequest request = requestFactory.prepareSearch(documentType, query); - - // Execute request - SearchResponse result = client.search(request, RequestOptions.DEFAULT); - - // Parse result list - List<? extends VO> resultList = parser.parseHits(result, voClass); - if (resultList != null && !resultList.isEmpty()) { - if (resultList.size() > 1) { - // Should never happen - throw new RuntimeException("More than one document " + documentType + " for identifier '" + id + "'"); - } - - return resultList.get(0); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return null; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericSuggestRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericSuggestRepository.java deleted file mode 100644 index 9be7e0cec1f276323a35a94791bd00a8ba5aea79..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/elasticsearch/repository/impl/ESGenericSuggestRepository.java +++ /dev/null @@ -1,178 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.repository.impl; - -import fr.inra.urgi.faidare.domain.criteria.base.PaginationCriteria; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.criteria.AnnotatedCriteriaMapper; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingCriterion; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.ESQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.repository.ESSuggestRepository; -import org.apache.commons.lang3.StringUtils; -import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.MatchPhraseQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.util.*; - -import static org.elasticsearch.index.query.QueryBuilders.matchPhraseQuery; -import static org.elasticsearch.search.aggregations.AggregationBuilders.filter; -import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; - -/** - * Generic implementation of an ElasticSearch document repository which can suggest document field values - * - * @author gcornut - */ -public class ESGenericSuggestRepository<C extends PaginationCriteria, VO> implements ESSuggestRepository<C> { - - private final static Logger LOGGER = LoggerFactory.getLogger(ESGenericSuggestRepository.class); - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final ESQueryFactory<C> queryFactory; - private final DocumentMetadata<VO> documentMetadata; - private final ESResponseParser parser; - - public ESGenericSuggestRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESQueryFactory<C> queryFactory, - ESResponseParser parser - ) { - this.client = client; - this.requestFactory = requestFactory; - this.queryFactory = queryFactory; - this.documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(voClass); - this.parser = parser; - } - - public ESGenericSuggestRepository( - RestHighLevelClient client, - ESRequestFactory requestFactory, - Class<VO> voClass, - ESResponseParser parser) { - this(client, requestFactory, voClass, new ESGenericQueryFactory<C>(), parser); - } - - @Override - public LinkedHashSet<String> suggest(String field, String searchText, Integer fetchSize, C criteria) { - int size = fetchSize != null ? fetchSize : 10; - - QueryBuilder query = null; - if (criteria != null) { - removeCriterion(criteria, field); - query = queryFactory.createQuery(criteria); - } - - String documentType = documentMetadata.getDocumentType(); - List<String> aggregationPath = new ArrayList<>(); - - String termAggName = "termAgg"; - aggregationPath.add(0, termAggName); - AggregationBuilder agg = terms(termAggName).field(field).size(size); - - if (StringUtils.isNotBlank(searchText)) { - MatchPhraseQueryBuilder matchQuery = matchPhraseQuery(field + ".suggest", searchText); - if (query != null) { - query = ESGenericQueryFactory.andQueries(query, matchQuery); - } else { - query = matchQuery; - } - } - - if (query != null) { - String filterAggName = "filterAgg"; - aggregationPath.add(0, filterAggName); - agg = filter(filterAggName, query).subAggregation(agg); - } - - SearchRequest request = requestFactory.prepareSearch(documentType); - request.source().size(0); - request.source().aggregation(agg); - - LOGGER.debug(request.toString()); - - SearchResponse searchResponse = null; - try { - searchResponse = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - - List<String> terms = parser.parseTermAggKeys(searchResponse, aggregationPath); - if (terms == null) - return null; - return new LinkedHashSet<>(sortShortestMatch(terms, searchText)); - } - - - /** - * Remove criterion from criteria using field path from the document (ex: - * germplasm.search.cropName) - */ - private static <C> void removeCriterion(C criteria, String field) { - try { - CriteriaMapping mapping = AnnotatedCriteriaMapper.getMapping(criteria.getClass()); - List<String> path = Arrays.asList(field.split("\\.")); - CriteriaMappingCriterion criterion = mapping.getMapping(CriteriaMappingCriterion.class, path); - criterion.setValue(criteria, null); - } catch (InvocationTargetException | IllegalAccessException e) { - throw new ESGenericSuggestRepositoryException(e); - } - } - - - /** - * Sort by shortest match if possible and return a distinct list of terms - */ - private static List<String> sortShortestMatch(List<String> terms, final String searchText) { - if (StringUtils.isNotBlank(searchText)) { - final String flatSearchText = foldAndLower(searchText); - Collections.sort(terms, new Comparator<String>() { - @Override - public int compare(String o1, String o2) { - boolean inO1 = foldAndLower(o1).contains(flatSearchText); - boolean inO2 = foldAndLower(o2).contains(flatSearchText); - if (inO1 && inO2) { - return (o1.length() < o2.length()) ? -1 : 1; - } - return inO1 ? -1 : inO2 ? 1 : 0; - } - }); - } - return terms; - } - - /** - * Fold ascii & lower case string - */ - private static String foldAndLower(String input) { - int length = input.length(); - char[] output = new char[length * 4]; - ASCIIFoldingFilter.foldToASCII(input.toLowerCase().toCharArray(), 0, output, 0, length); - return new String(output).trim(); - } - - - public static class ESGenericSuggestRepositoryException extends RuntimeException { - - ESGenericSuggestRepositoryException(Throwable t) { - super(t); - } - - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepository.java deleted file mode 100644 index 3b4945be4c84469aaf9a3a699c677d5be62b3277..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteria; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; -import fr.inra.urgi.faidare.elasticsearch.repository.ESSuggestRepository; - -import java.util.LinkedHashSet; - -/** - * @author gcornut - */ -public interface DataDiscoveryRepository - extends ESSuggestRepository<DataDiscoveryCriteria> { - - /** - * Suggest term values contained in field - * - * @param field field name from the DataDiscoveryCriteria - * @param searchText the search text used to filter terms - * @param fetchSize size of the suggestion list - * @param criteria the criteria used to pre-filter terms - * @return - */ - @Override - LinkedHashSet<String> suggest(String field, String searchText, Integer fetchSize, DataDiscoveryCriteria criteria); - - DataDiscoveryResponse find(DataDiscoveryCriteria criteria); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryImpl.java deleted file mode 100644 index 559c71413eebe28b61b37e5a1dbdf533e3fb6dbc..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.api.faidare.v1.DataDiscoveryController; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteria; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteriaImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetTermImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.domain.response.PaginationImpl; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.criteria.AnnotatedCriteriaMapper; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.repository.ESSuggestRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericSuggestRepository; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; - -import static org.elasticsearch.search.aggregations.AggregationBuilders.filter; -import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; - -/** - * @author gcornut - */ -@Repository -public class DataDiscoveryRepositoryImpl implements DataDiscoveryRepository { - - private final static Logger LOGGER = LoggerFactory.getLogger(DataDiscoveryController.class); - - private final DocumentMetadata<DataDiscoveryDocument> documentMetadata; - private final CriteriaMapping criteriaMapping; - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final ESSuggestRepository<DataDiscoveryCriteria> suggestRepository; - private final ESGenericQueryFactory<DataDiscoveryCriteria> queryFactory; - private final ESResponseParser parser; - - @Autowired - public DataDiscoveryRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - this.client = client; - this.parser = parser; - Class<DataDiscoveryDocument> documentClass = DataDiscoveryDocument.class; - Class<DataDiscoveryCriteriaImpl> criteriaClass = DataDiscoveryCriteriaImpl.class; - - this.requestFactory = requestFactory; - this.documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(documentClass); - - this.criteriaMapping = AnnotatedCriteriaMapper.getMapping(criteriaClass); - this.queryFactory = new ESGenericQueryFactory<>(); - this.suggestRepository = new ESGenericSuggestRepository<>(client, requestFactory, documentClass, queryFactory, parser); - } - - @Override - public LinkedHashSet<String> suggest( - String criteriaField, String searchText, Integer fetchSize, DataDiscoveryCriteria criteria - ) { - String documentFieldPath = criteriaMapping.getDocumentPath(criteriaField, true); - return suggestRepository.suggest(documentFieldPath, searchText, fetchSize, criteria); - } - - @Override - public DataDiscoveryResponse find(DataDiscoveryCriteria criteria) { - try { - // Prepare search request - SearchRequest request = prepareSearchRequest(criteria); - - // Execute request - LOGGER.debug(request.toString()); - SearchResponse response = client.search(request, RequestOptions.DEFAULT); - - // Parse request result - return parseResponse(criteria, response); - } catch (Exception e) { - throw new DataDiscoveryRepositoryException(e); - } - } - - /** - * Generate Elasticsearch search request based on the data discovery criteria - */ - private SearchRequest prepareSearchRequest(DataDiscoveryCriteria criteria) { - List<String> facetFields = criteria.getFacetFields(); - String[] documentFieldsInFacets = criteriaFieldsToDocumentFields(facetFields); - - // Build search query (excluding document fields used in facets) - QueryBuilder query = queryFactory.createQueryExcludingFields(criteria, documentFieldsInFacets); - - // Prepare search request with query - SearchRequest request = ESGenericFindRepository.prepareSearchRequest( - query, criteria, documentMetadata, requestFactory); - - // Build facet aggregations - if (facetFields != null) { - for (String facetField : facetFields) { - String documentPath = criteriaMapping.getDocumentPath(facetField, true); - - String filterAggName = facetField + "Filter"; - - // Create facet term agg - TermsAggregationBuilder termAgg = terms(facetField) - .field(documentPath) - .size(ESRequestFactory.MAX_TERM_AGG_SIZE); - - // Create filter agg for this facet excluding it self - QueryBuilder facetFilter = queryFactory.createQueryExcludingFields(criteria, documentPath); - if (facetFilter == null) { - facetFilter = QueryBuilders.matchAllQuery(); - } - - request.source().aggregation( - filter(filterAggName, facetFilter).subAggregation(termAgg) - ); - } - } - - // Build post filter (including document fields used in facets) - QueryBuilder postFilter = queryFactory.createQueryIncludingFields(criteria, documentFieldsInFacets); - request.source().postFilter(postFilter); - - return request; - } - - /** - * Parse Elasticsearch search response into data discovery response - */ - private DataDiscoveryResponse parseResponse( - DataDiscoveryCriteria criteria, SearchResponse response - ) throws IOException, ReflectiveOperationException { - // Parse pagination - Pagination pagination = PaginationImpl.create(criteria, parser.parseTotalHits(response)); - - // Parse result list - List<DataDiscoveryDocument> resultList = parser.parseHits(response, - documentMetadata.getDocumentClass()); - - // Parse facet terms - List<String> facetFields = criteria.getFacetFields(); - List<FacetImpl> facets = null; - if (facetFields != null) { - facets = new ArrayList<>(); - for (String facetField : facetFields) { - String filterAggName = facetField + "Filter"; - List<FacetTermImpl> terms = parser.parseFacetTerms( - response, filterAggName, facetField - ); - facets.add(new FacetImpl(facetField, terms)); - } - } - - // Return paginated list - return ApiResponseFactory.createListResponseWithFacets(pagination, resultList, facets); - } - - public String[] criteriaFieldsToDocumentFields(List<String> criteriaFields) { - List<String> fields = new ArrayList<>(); - if (criteriaFields != null) { - for (String facetField : criteriaFields) { - fields.add(criteriaMapping.getDocumentPath(facetField, true)); - } - } - return fields.toArray(new String[]{}); - } - - public static class DataDiscoveryRepositoryException extends RuntimeException { - - DataDiscoveryRepositoryException(Throwable t) { - super(t); - } - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepository.java deleted file mode 100644 index 9674bb34d6dd7df5ace8e5bcffaca22a8e02e495..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.GermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; - -/** - * Breeding API germplasm attribute - * - * @author gcornut - */ -public interface GermplasmAttributeRepository - extends ESFindRepository<GermplasmAttributeCriteria, GermplasmAttributeValueListVO> { - - @Override - PaginatedList<GermplasmAttributeValueListVO> find(GermplasmAttributeCriteria criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryImpl.java deleted file mode 100644 index 2fee54cd23b397abe7caae2e4d3377d5eef481bb..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.GermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericFindRepository; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -/** - * @author gcornut - */ -@Repository -public class GermplasmAttributeRepositoryImpl - implements GermplasmAttributeRepository { - - private ESFindRepository<GermplasmAttributeCriteria, GermplasmAttributeValueListVO> findAttributeRepository; - - @Autowired - public GermplasmAttributeRepositoryImpl( - ESResponseParser parser, - RestHighLevelClient client, - ESRequestFactory requestFactory - ) { - Class<GermplasmAttributeValueListVO> voClass = GermplasmAttributeValueListVO.class; - findAttributeRepository = new ESGenericFindRepository<>(client, requestFactory, voClass, parser); - } - - @Override - public PaginatedList<GermplasmAttributeValueListVO> find(GermplasmAttributeCriteria criteria) { - return findAttributeRepository.find(criteria); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepository.java deleted file mode 100644 index 8fbd47d1273fcd733a96d6c0543bc5b1d6a133d1..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepository.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.FaidareGermplasmPOSTShearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.ProgenyVO; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; - -import java.util.Iterator; -import java.util.Set; - -public interface GermplasmRepository - extends ESFindRepository<GermplasmSearchCriteria, GermplasmVO> { - - /** - * Find germplasm by criteria with pagination. - */ - @Override - PaginatedList<GermplasmVO> find(GermplasmSearchCriteria criteria); - - /** - * Find germplasm by criteria with pagination with a should query. - */ - GermplasmSearchResponse germplasmFind(FaidareGermplasmPOSTShearchCriteria germSearCrit); - - /** - * Get germplasm by id. - */ - GermplasmVO getById(String germplasmDbId); - - /** - * Scroll through all germplasms, using the given fetch size - */ - Iterator<GermplasmSitemapVO> scrollAllForSitemap(int fetchSize); - - /** - * Scroll through all germplasm matching the given criteria. - */ - Iterator<GermplasmVO> scrollAll(GermplasmSearchCriteria criteria); - - /** - * Scroll through all germplasm matching the given FAIDARE search criteria. - */ - Iterator<GermplasmVO> scrollAllGermplasm(FaidareGermplasmPOSTShearchCriteria criteria); - - /** - * Scroll through all germplasmMcpd matching the given FAIDARE search criteria. - */ - Iterator<GermplasmMcpdVO> scrollAllGermplasmMcpd(FaidareGermplasmPOSTShearchCriteria criteria); - - /** - * Scroll through all germplasmMcpd having one of the given IDs. - */ - Iterator<GermplasmMcpdVO> scrollGermplasmMcpdsByIds(Set<String> ids, int fetchSize); - - /** - * Scroll through all germplasm having one of the given IDs. - */ - Iterator<GermplasmVO> scrollGermplasmsByIds(Set<String> ids, int fetchSize); - - /** - * Find pedigree for germplasm by id. - */ - PedigreeVO findPedigree(String germplasmDbId); - - /** - * Find progeny for germplasm by id. - */ - ProgenyVO findProgeny(String germplasmDbId); - - /** - * Find germplasm mcpd by id. - */ - GermplasmMcpdVO getAsMcpdById(String germplasmDbId); - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryImpl.java deleted file mode 100644 index 2fb0677c49fe6e7d1533cf77e45efa131307df8f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryImpl.java +++ /dev/null @@ -1,315 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.domain.criteria.FaidareGermplasmPOSTShearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.ProgenyVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetTermImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import fr.inra.urgi.faidare.domain.response.ApiResponseFactory; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.domain.response.PaginationImpl; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.ESScrollIterator; -import fr.inra.urgi.faidare.elasticsearch.criteria.AnnotatedCriteriaMapper; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericGetByIdRepository; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import static org.elasticsearch.search.aggregations.AggregationBuilders.filter; -import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; - -@Repository -public class GermplasmRepositoryImpl implements GermplasmRepository { - - private static final Logger LOGGER = LoggerFactory.getLogger(GermplasmRepositoryImpl.class); - - private final DocumentMetadata<GermplasmVO> documentMetadata; - private final CriteriaMapping criteriaMapping; - - private final RestHighLevelClient client; - private final ObjectMapper mapper; - private final ESRequestFactory requestFactory; - private final ESResponseParser parser; - - private final ESFindRepository<GermplasmSearchCriteria, GermplasmVO> findRepository; - private final ESGetByIdRepository<GermplasmVO> getByIdRepository; - private final ESGenericQueryFactory<GermplasmSearchCriteria> queryFactory; - private final ESGetByIdRepository<GermplasmMcpdVO> getMcpdByIdRepository; - - @Autowired - public GermplasmRepositoryImpl( - RestHighLevelClient client, - ObjectMapper mapper, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - this.client = client; - this.requestFactory = requestFactory; - this.mapper = mapper; - this.parser = parser; - Class<GermplasmVO> voClass = GermplasmVO.class; - Class<GermplasmMcpdVO> voMcpdClass = GermplasmMcpdVO.class; - - this.queryFactory = new ESGenericQueryFactory<>(); - this.findRepository = new ESGenericFindRepository<>(client, requestFactory, voClass, this.parser); - this.getByIdRepository = new ESGenericGetByIdRepository<>(client, requestFactory, voClass, this.parser); - this.getMcpdByIdRepository = new ESGenericGetByIdRepository<>(client, requestFactory, voMcpdClass, this.parser); - Class<GermplasmVO> documentClass = GermplasmVO.class; - Class<FaidareGermplasmPOSTShearchCriteria> criteriaClass = FaidareGermplasmPOSTShearchCriteria.class; - this.documentMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(documentClass); - this.criteriaMapping = AnnotatedCriteriaMapper.getMapping(criteriaClass); - } - - @Override - public Iterator<GermplasmSitemapVO> scrollAllForSitemap(int fetchSize) { - QueryBuilder query = QueryBuilders.matchAllQuery(); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmSitemapVO.class, query, fetchSize); - } - - @Override - public Iterator<GermplasmVO> scrollAll(GermplasmSearchCriteria criteria) { - QueryBuilder query = queryFactory.createQuery(criteria); - int fetchSize = criteria.getPageSize().intValue(); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmVO.class, query, fetchSize); - } - - @Override - public Iterator<GermplasmVO> scrollAllGermplasm(FaidareGermplasmPOSTShearchCriteria criteria) { - QueryBuilder query = queryFactory.createShouldFilterQuery(criteria); - int fetchSize = criteria.getPageSize().intValue(); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmVO.class, query, fetchSize); - } - - @Override - public Iterator<GermplasmMcpdVO> scrollAllGermplasmMcpd(FaidareGermplasmPOSTShearchCriteria criteria) { - QueryBuilder query = queryFactory.createShouldFilterQuery(criteria); - int fetchSize = criteria.getPageSize().intValue(); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmMcpdVO.class, query, fetchSize); - } - - @Override - public Iterator<GermplasmMcpdVO> scrollGermplasmMcpdsByIds(Set<String> ids, int fetchSize) { - QueryBuilder query = QueryBuilders.termsQuery("germplasmDbId", ids); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmMcpdVO.class, query, fetchSize); - } - - @Override - public Iterator<GermplasmVO> scrollGermplasmsByIds(Set<String> ids, - int fetchSize) { - QueryBuilder query = QueryBuilders.termsQuery("germplasmDbId", ids); - return new ESScrollIterator<>(client, requestFactory, parser, GermplasmVO.class, query, fetchSize); - } - - @Override - public GermplasmVO getById(String germplasmDbId) { - //TODO getting byid is not reliable, should move to get by germplasmDbId - return getByIdRepository.getById(germplasmDbId); - } - - @Override - public PaginatedList<GermplasmVO> find(GermplasmSearchCriteria criteria) { - return findRepository.find(criteria); - } - - @Override - public GermplasmSearchResponse germplasmFind(FaidareGermplasmPOSTShearchCriteria germplasmSearchCriteria) { - try { - - // Prepare search request - SearchRequest request = prepareSearchRequest(germplasmSearchCriteria); - - // Execute request - LOGGER.debug(request.toString()); - SearchResponse response = client.search(request, RequestOptions.DEFAULT); - - // Return paginated list - return parseResponse (germplasmSearchCriteria, response); - - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public GermplasmMcpdVO getAsMcpdById(String germplasmDbId) { - return getMcpdByIdRepository.getById(germplasmDbId); - } - - - @Override - public PedigreeVO findPedigree(String germplasmDbId) { - QueryBuilder termQuery = QueryBuilders.termQuery("germplasmDbId", germplasmDbId); - SearchRequest request = requestFactory.prepareSearch("germplasmPedigree", termQuery); - SearchResponse response; - try { - response = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - PedigreeVO pedigreeVO = null; - final SearchHits hits = response.getHits(); - - LOGGER.debug("\n\nQuery from findPedigree :\n" + termQuery.toString() + "\n\n"); - - if (hits.getTotalHits().value == 1) { - // result found! \o/ - SearchHit hit = hits.getAt(0); - String source = hit.getSourceAsString(); - try { - pedigreeVO = mapper.readValue(source, PedigreeVO.class); - } catch (IOException e) { - LOGGER.error("Error occured when converting ES response to PedigreeVO: " + e.getMessage(), e); - } - } else if (hits.getTotalHits().value > 1) { - throw new IllegalStateException("Expected only 1 result for pedigree with germplasmDbId: " + germplasmDbId); - } - return pedigreeVO; - } - - @Override - public ProgenyVO findProgeny(String germplasmDbId) { - QueryBuilder termQuery = QueryBuilders.termQuery("germplasmDbId", germplasmDbId); - SearchRequest request = requestFactory.prepareSearch("germplasmProgeny", termQuery); - SearchResponse response; - try { - response = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - ProgenyVO progenyVO = null; - final SearchHits hits = response.getHits(); - LOGGER.debug("\n\nQuery from findProgeny :\n" + termQuery.toString() + "\n\n"); - - if (hits.getTotalHits().value == 1) { - SearchHit hit = hits.getAt(0); - String source = hit.getSourceAsString(); - try { - progenyVO = mapper.readValue(source, ProgenyVO.class); - } catch (IOException e) { - LOGGER.error("Error occured when converting ES response to ProgenyVO: " + e.getMessage(), e); - } - } else if (hits.getTotalHits().value > 1) { - throw new IllegalStateException("Expected only 1 result for progeny with germplasmDbId: " + germplasmDbId); - } - return progenyVO; - } - - - - - - private SearchRequest prepareSearchRequest(FaidareGermplasmPOSTShearchCriteria criteria) { - List<String> facetFields = criteria.getFacetFields(); - String[] documentFieldsInFacets = criteriaFieldsToDocumentFields(facetFields); - - // Build search query (excluding document fields used in facets) - QueryBuilder query = queryFactory.createEsShouldQueryExcludingFields(criteria, documentFieldsInFacets); - - // Prepare search request with query - SearchRequest request = ESGenericFindRepository.prepareSearchRequest( - query, criteria, documentMetadata, requestFactory); - - // Build facet aggregations - if (facetFields != null) { - for (String facetField : facetFields) { - String documentPath = criteriaMapping.getDocumentPath(facetField, true); - - String filterAggName = facetField + "Filter"; - - // Create facet term agg - TermsAggregationBuilder termAgg = terms(facetField) - .field(documentPath) - .size(ESRequestFactory.MAX_TERM_AGG_SIZE); - - // Create filter agg for this facet excluding it self - QueryBuilder facetFilter = queryFactory.createEsShouldQueryExcludingFields(criteria, documentPath); - if (facetFilter == null) { - facetFilter = QueryBuilders.matchAllQuery(); - } - - request.source().aggregation( - filter(filterAggName, facetFilter).subAggregation(termAgg) - ); - } - } - - // Build post filter (including document fields used in facets) - QueryBuilder postFilter = queryFactory.createQueryIncludingFields(criteria, documentFieldsInFacets); - request.source().postFilter(postFilter); - - return request; - } - - private String[] criteriaFieldsToDocumentFields(List<String> criteriaFields) { - List<String> fields = new ArrayList<>(); - if (criteriaFields != null) { - for (String facetField : criteriaFields) { - fields.add(criteriaMapping.getDocumentPath(facetField, true)); - } - } - return fields.toArray(new String[]{}); - } - - /** - * Parse Elasticsearch search response into data discovery response - */ - private GermplasmSearchResponse parseResponse( - FaidareGermplasmPOSTShearchCriteria criteria, SearchResponse response - ) throws IOException, ReflectiveOperationException { - // Parse pagination - Pagination pagination = PaginationImpl.create(criteria, parser.parseTotalHits(response)); - - // Parse result list - List<GermplasmVO> resultList = parser.parseHits(response, - documentMetadata.getDocumentClass()); - - // Parse facet terms - List<String> facetFields = criteria.getFacetFields(); - List<FacetImpl> facets = null; - if (facetFields != null) { - facets = new ArrayList<>(); - for (String facetField : facetFields) { - String filterAggName = facetField + "Filter"; - List<FacetTermImpl> terms = parser.parseFacetTerms( - response, filterAggName, facetField - ); - facets.add(new FacetImpl(facetField, terms)); - } - } - - // Return paginated list - return ApiResponseFactory.createGermplasmListResponseWithFacets(pagination, resultList, facets); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepository.java deleted file mode 100644 index 93e65b549079430cd2a2cfbbad8d2bb0676dd544..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import java.util.Iterator; - -import fr.inra.urgi.faidare.domain.criteria.LocationCriteria; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; - -/** - * Breeding API location - * - * @author gcornut - */ -public interface LocationRepository - extends ESFindRepository<LocationCriteria, LocationVO>, - ESGetByIdRepository<LocationVO> { - - @Override - LocationVO getById(String id); - - @Override - PaginatedList<LocationVO> find(LocationCriteria criteria); - - Iterator<LocationSitemapVO> scrollAllForSitemap(int fetchSize); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryImpl.java deleted file mode 100644 index 0a1133d75f654527a74a2bad73bc21a83763e52c..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import java.util.Iterator; - -import fr.inra.urgi.faidare.domain.criteria.LocationCriteria; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.ESScrollIterator; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.BaseESRepository; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -/** - * @author gcornut - */ -@Repository -public class LocationRepositoryImpl - extends BaseESRepository<LocationCriteria, LocationVO> - implements LocationRepository { - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - private final ESResponseParser parser; - - @Autowired - public LocationRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - super(client, requestFactory, LocationVO.class, parser); - this.client = client; - this.requestFactory = requestFactory; - this.parser = parser; - } - - @Override - public Iterator<LocationSitemapVO> scrollAllForSitemap(int fetchSize) { - QueryBuilder query = QueryBuilders.matchAllQuery(); - return new ESScrollIterator<>(client, requestFactory, parser, LocationSitemapVO.class, query, fetchSize); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepository.java deleted file mode 100644 index 4595edfcc70542f547ef6310f164d13f5dd51f3b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.ObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; - -/** - * Breeding API observation unit - * - * @author gcornut - */ -public interface ObservationUnitRepository - extends ESFindRepository<ObservationUnitCriteria, ObservationUnitVO> { - - @Override - PaginatedList<ObservationUnitVO> find(ObservationUnitCriteria criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryImpl.java deleted file mode 100644 index 90260aae3e60f87b6c2f5503ce1547b301227b88..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.ObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.BaseESRepository; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -/** - * @author gcornut - */ -@Repository -public class ObservationUnitRepositoryImpl - extends BaseESRepository<ObservationUnitCriteria, ObservationUnitVO> - implements ObservationUnitRepository { - - @Autowired - public ObservationUnitRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - super(client, requestFactory, ObservationUnitVO.class, parser); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepository.java deleted file mode 100644 index 093b014dcaffa26c68b8a3c77aed4bf526609f0f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.ProgramCriteria; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; - -/** - * Breeding API programs - * - * @author gcornut - */ -public interface ProgramRepository - extends ESFindRepository<ProgramCriteria, ProgramVO>, - ESGetByIdRepository<ProgramVO> { - - @Override - ProgramVO getById(String id); - - @Override - PaginatedList<ProgramVO> find(ProgramCriteria criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryImpl.java deleted file mode 100644 index aa7b91a5c036e8d720fee1665078b296bdbad9d5..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.ProgramCriteria; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.BaseESRepository; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -/** - * @author gcornut - */ -@Repository -public class ProgramRepositoryImpl extends BaseESRepository<ProgramCriteria, ProgramVO> - implements ProgramRepository { - - @Autowired - public ProgramRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - super(client, requestFactory, ProgramVO.class, parser); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepository.java deleted file mode 100644 index 8831a8c1ff66f6a31aeac3825d690651da10c27b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.StudyCriteria; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; - -import java.util.Iterator; -import java.util.Set; - -/** - * Breeding API study - * - * @author gcornut - */ -public interface StudyRepository - extends ESGetByIdRepository<StudyDetailVO>, - ESFindRepository<StudyCriteria, StudySummaryVO> { - - @Override - StudyDetailVO getById(String id); - - @Override - PaginatedList<StudySummaryVO> find(StudyCriteria criteria); - - /** - * List study observation variable ids - */ - Set<String> getVariableIds(String studyDbId); - - Iterator<StudySitemapVO> scrollAllForSitemap(int fetchSize); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryImpl.java deleted file mode 100644 index 46b0b71248b4a5498a9d24bedb3f854ce756af6f..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiLocation; -import fr.inra.urgi.faidare.domain.criteria.StudyCriteria; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.ESScrollIterator; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentMetadata; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.ESGenericGetByIdRepository; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; -import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; -import static org.elasticsearch.search.aggregations.AggregationBuilders.filter; -import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; - -/** - * @author gcornut - */ -@Repository -public class StudyRepositoryImpl - implements StudyRepository { - - private final RestHighLevelClient client; - private final ESRequestFactory requestFactory; - - private final ESGetByIdRepository<StudyDetailVO> getByIdRepository; - private final ESFindRepository<StudyCriteria, StudySummaryVO> findRepository; - private final DocumentMetadata<StudySummaryVO> studySummaryMetadata; - private final ESResponseParser parser; - private final LocationRepository locationRepository; - - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired - public StudyRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser, - LocationRepository locationRepository - ) { - this.client = client; - this.requestFactory = requestFactory; - this.parser = parser; - this.locationRepository = locationRepository; - - this.getByIdRepository = new ESGenericGetByIdRepository<>(client, requestFactory, StudyDetailVO.class, this.parser); - - Class<StudySummaryVO> voClass = StudySummaryVO.class; - this.studySummaryMetadata = DocumentAnnotationUtil.getDocumentObjectMetadata(voClass); - - ESGenericQueryFactory<StudyCriteria> queryFactory = new ESGenericQueryFactory<>(); - this.findRepository = new ESGenericFindRepository<>(this.client, requestFactory, voClass, queryFactory, this.parser); - - } - - @Override - public StudyDetailVO getById(String id) { - StudyDetailVO study = getByIdRepository.getById(id); - if (study != null) { - BrapiLocation location = study.getLocation(); - if (location != null) { - // Replace location with complete detail - LocationVO locationDetail = locationRepository.getById(location.getLocationDbId()); - study.setLocation(locationDetail); - } - } - return study; - } - - @Override - public PaginatedList<StudySummaryVO> find(StudyCriteria criteria) { - return findRepository.find(criteria); - } - - @Override - public Set<String> getVariableIds(String studyDbId) { - String documentType = studySummaryMetadata.getDocumentType(); - - String termAggName = "termAgg"; - TermsAggregationBuilder termAgg = terms(termAggName) - .field("observationVariableDbIds") - .size(ESRequestFactory.MAX_TERM_AGG_SIZE); - - String filterAggName = "filterAgg"; - FilterAggregationBuilder filterAgg = filter(filterAggName, termQuery(studySummaryMetadata.getIdField(), studyDbId)) - .subAggregation(termAgg); - - SearchRequest request = requestFactory - .prepareSearch(documentType); - request.source().size(0).aggregation(filterAgg); - - logger.debug(request.toString()); - - SearchResponse searchResponse; - try { - searchResponse = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - - List<String> aggregationPath = Arrays.asList(filterAggName, termAggName); - List<String> ids = parser.parseTermAggKeys(searchResponse, aggregationPath); - if (ids == null) { - return null; - } - return new LinkedHashSet<>(ids); - } - - @Override - public Iterator<StudySitemapVO> scrollAllForSitemap(int fetchSize) { - QueryBuilder query = QueryBuilders.matchAllQuery(); - return new ESScrollIterator<>(client, requestFactory, parser, StudySitemapVO.class, query, fetchSize); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepository.java deleted file mode 100644 index 77b91b6cfb6cf21b234ab7a5448b3c1e2e6ccca7..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.TrialCriteria; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; -import fr.inra.urgi.faidare.elasticsearch.repository.ESGetByIdRepository; - -/** - * Breeding API trial - * - * @author gcornut - */ -public interface TrialRepository - extends ESFindRepository<TrialCriteria, TrialVO>, - ESGetByIdRepository<TrialVO> { - - @Override - TrialVO getById(String id); - - @Override - PaginatedList<TrialVO> find(TrialCriteria criteria); - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryImpl.java deleted file mode 100644 index fc0ecd21b6fea54c6f82c7a6f6b3446ed8a9a21d..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.criteria.TrialCriteria; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.elasticsearch.ESRequestFactory; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.repository.impl.BaseESRepository; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -/** - * @author gcornut - */ -@Repository -public class TrialRepositoryImpl - extends BaseESRepository<TrialCriteria, TrialVO> - implements TrialRepository { - - @Autowired - public TrialRepositoryImpl( - RestHighLevelClient client, - ESRequestFactory requestFactory, - ESResponseParser parser - ) { - super(client, requestFactory, TrialVO.class, parser); - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepository.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepository.java deleted file mode 100644 index d5a1d0f605672b3e341e1171dc8c6302099adfa7..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.elasticsearch.repository.ESFindRepository; - -public interface XRefDocumentRepository extends ESFindRepository<XRefDocumentSearchCriteria, XRefDocumentVO> { - @Override - PaginatedList<XRefDocumentVO> find(XRefDocumentSearchCriteria criteria); -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java deleted file mode 100644 index 60be4c1c3aad50e71597c9f1e9c9a0e69d734335..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.domain.response.PaginationImpl; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; -import fr.inra.urgi.faidare.repository.http.UserGroupsResourceClient; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.util.List; - -/** - * Imported and adapted from unified-interface legacy - */ -@Repository -public class XRefDocumentRepositoryImpl implements XRefDocumentRepository { - - private static final Logger LOGGER = LoggerFactory.getLogger(XRefDocumentRepositoryImpl.class); - - private final FaidareProperties properties; - private final RestHighLevelClient client; - private final ESResponseParser parser; - private final UserGroupsResourceClient userGroupsResourceClient; - private final ESGenericQueryFactory<XRefDocumentSearchCriteria> queryFactory; - - @Autowired - public XRefDocumentRepositoryImpl( - FaidareProperties properties, - RestHighLevelClient client, - ESResponseParser parser, - UserGroupsResourceClient userGroupsResourceClient - ) { - this.properties = properties; - this.client = client; - this.parser = parser; - this.userGroupsResourceClient = userGroupsResourceClient; - this.queryFactory = new ESGenericQueryFactory<>(); - } - - @Override - public PaginatedList<XRefDocumentVO> find(XRefDocumentSearchCriteria criteria) { - try { - List<Integer> userGroups = userGroupsResourceClient.getUserGroups(); - String baseIndex = properties.getElasticsearchXrefIndexName(); - String[] aliases = getGroupAliases(baseIndex, userGroups); - - QueryBuilder query = queryFactory.createQuery(criteria); - - int size = criteria.getPageSize().intValue(); - int from = criteria.getPage().intValue() * size; - - SearchSourceBuilder source = new SearchSourceBuilder() - .query(query).from(from).size(size); - - LOGGER.debug("Search Xref aliases: " + String.join(",", aliases)); - LOGGER.debug("Query:\n " + source.toString()); - - SearchRequest searchRequest = new SearchRequest() - .indices(aliases) - .source(source) - .indicesOptions(IndicesOptions.fromOptions(true, false, false, false)); - - SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); - - List<XRefDocumentVO> documents = parser.parseHits(response, XRefDocumentVO.class); - Pagination pagination = PaginationImpl.create(criteria, parser.parseTotalHits(response)); - return new PaginatedList<>(pagination, documents); - } catch (IOException | ReflectiveOperationException e) { - throw new RuntimeException(e); - } - } - - public static String[] getGroupAliases(String baseIndex, List<? extends Number> userGroups) { - String[] aliases = new String[userGroups.size()]; - for (int i = 0; i < userGroups.size(); i++) { - Number groupId = userGroups.get(i); - aliases[i] = baseIndex + "-group" + groupId; - } - return aliases; - } - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmService.java b/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmService.java deleted file mode 100644 index 5194804f1231959c8d6151a858e418094fe644a9..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmService.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.service.es; - -import fr.inra.urgi.faidare.domain.criteria.FaidareGermplasmPOSTShearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.ProgenyVO; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import fr.inra.urgi.faidare.domain.response.PaginatedList; - -import java.io.File; - - -public interface GermplasmService { - - GermplasmVO getById(String germplasmDbId); - - PaginatedList<GermplasmVO> find(GermplasmSearchCriteria criteria); - - GermplasmSearchResponse germplasmFind(FaidareGermplasmPOSTShearchCriteria criteria); - - /*LinkedHashSet<String> suggest( - String criteriaField, String searchText, Integer fetchSize, FaidareGermplasmPOSTShearchCriteria criteria - );*/ - - File exportCSV(GermplasmSearchCriteria criteria); - - File exportListGermplasmCSV(FaidareGermplasmPOSTShearchCriteria criteria); - - PedigreeVO getPedigree(String germplasmDbId); - - ProgenyVO getProgeny(String germplasmDbId); - - GermplasmMcpdVO getAsMcpdById(String germplasmDbId); - - File exportGermplasmMcpd(FaidareGermplasmPOSTShearchCriteria criteria); - - -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmServiceImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmServiceImpl.java deleted file mode 100644 index 0ebb89291ce8f4b690464a6e063eb2330a03cfce..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/service/es/GermplasmServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package fr.inra.urgi.faidare.service.es; - -import com.opencsv.CSVWriter; -import fr.inra.urgi.faidare.api.faidare.v1.GnpISGermplasmController; -import fr.inra.urgi.faidare.domain.criteria.FaidareGermplasmPOSTShearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.*; -import fr.inra.urgi.faidare.domain.datadiscovery.response.GermplasmSearchResponse; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author cpommier, gcornut, jdestin - */ -@Service("germplasmService") -public class GermplasmServiceImpl implements GermplasmService { - - private final static Logger LOGGER = LoggerFactory.getLogger(GnpISGermplasmController.class); - - @Resource - GermplasmRepository germplasmRepository; - - @Override - public File exportCSV(GermplasmSearchCriteria criteria) { - try { - Iterator<GermplasmVO> allGermplasm = germplasmRepository.scrollAll(criteria); - Path tmpDirPath = Files.createTempDirectory("germplasm"); - Path tmpFile = Files.createTempFile(tmpDirPath, "germplasm_", ".csv"); - writeToCSV(tmpFile, allGermplasm); - return tmpFile.toFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public File exportListGermplasmCSV(FaidareGermplasmPOSTShearchCriteria criteria) { - try { - Iterator<GermplasmVO> allGermplasm = germplasmRepository.scrollAllGermplasm(criteria); - Path tmpDirPath = Files.createTempDirectory("germplasm"); - Path tmpFile = Files.createTempFile(tmpDirPath, "germplasm_", ".csv"); - writeToCSV(tmpFile, allGermplasm); - return tmpFile.toFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public GermplasmMcpdVO getAsMcpdById(String germplasmDbId) { - return germplasmRepository.getAsMcpdById(germplasmDbId); - } - - @Override - public File exportGermplasmMcpd(FaidareGermplasmPOSTShearchCriteria criteria) { - try { - Iterator<GermplasmMcpdVO> allGermplasm = germplasmRepository.scrollAllGermplasmMcpd(criteria); - Path tmpDirPath = Files.createTempDirectory("germplasm"); - Path tmpFile = Files.createTempFile(tmpDirPath, "germplasm_", ".csv"); - writeMcpdToCSV(tmpFile, allGermplasm); - return tmpFile.toFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - - private void writeToCSV(Path tmpFile, Iterator<GermplasmVO> germplasms) throws IOException { - Writer fileStream = new OutputStreamWriter(new FileOutputStream(tmpFile.toFile()), StandardCharsets.UTF_8); - CSVWriter csvWriter = new CSVWriter(fileStream, ';', '"', '\\', "\n"); - String[] header = new String[]{ - "DOI", "AccessionNumber", "AccessionName", "TaxonGroup", "HoldingInstitution", - "LotName", "LotSynonym", "CollectionName", "CollectionType", "PanelName", "PanelSize"}; - csvWriter.writeNext(header); - - while (germplasms.hasNext()) { - List<String> collectionNames = new ArrayList<>(); - List<String> panelNames = new ArrayList<>(); - GermplasmVO germplasmVO = germplasms.next(); - - if (germplasmVO.getCollection() != null) { - for (CollPopVO collection : germplasmVO.getCollection()) { - collectionNames.add(collection.getName()); - } - } - - if (germplasmVO.getPanel() != null) { - for (CollPopVO panel : germplasmVO.getPanel()) { - panelNames.add(panel.getName()); - } - } - - String[] line = new String[header.length]; - line[0] = germplasmVO.getGermplasmPUI(); - line[1] = germplasmVO.getAccessionNumber(); - line[2] = germplasmVO.getGermplasmName(); - line[3] = germplasmVO.getCommonCropName(); - line[4] = germplasmVO.getInstituteName(); - line[7] = (collectionNames != null) ? String.join(", ", collectionNames) : ""; - line[9] = (panelNames != null) ? String.join(", ", panelNames) : ""; - csvWriter.writeNext(line); - } - csvWriter.close(); - } - - - - - private void writeMcpdToCSV(Path tmpFile, Iterator<GermplasmMcpdVO> germplasms) throws IOException { - Writer fileStream = new OutputStreamWriter(new FileOutputStream(tmpFile.toFile()), StandardCharsets.UTF_8); - CSVWriter csvWriter = new CSVWriter(fileStream, ';', '"', '\\', "\n"); - String[] header = new String[]{ - "PUID", "INSTCODE", "ACCENUMB", "COLLNUMB", "COLLCODE", "COLLNAME", - "COLLINSTADDRESS", "COLLMISSID", "GENUS", "SPECIES", "SPAUTHOR", "SUBTAXA", - "SUBTAUTHOR", "CROPNAME", "ACCENAME", "ACQDATE", "ORIGCTY", "COLLSITE", - "DECLATITUDE", "LATITUDE", "DECLONGITUDE", "LONGITUDE", "COORDUNCERT", - "COORDDATUM", "GEOREFMETH", "ELEVATION", "COLLDATE", "BREDCODE", - "BREDNAME", "SAMPSTAT", "ANCEST","COLLSRC", "DONORCODE", "DONORNAME", - "DONORNUMB", "OTHERNUMB", "DUPLSITE", "DUPLINSTNAME", "STORAGE", "MLSSTAT", "REMARKS", - }; - csvWriter.writeNext(header); - - while (germplasms.hasNext()) { - List<String> collectionNames = new ArrayList<>(); - List<String> panelNames = new ArrayList<>(); - GermplasmMcpdVO germplasmMcpdVO = germplasms.next(); - - - String[] line = new String[header.length]; - line[0] = germplasmMcpdVO.getGermplasmPUI(); - line[1] = germplasmMcpdVO.getInstituteCode(); - line[2] = germplasmMcpdVO.getAccessionNumber(); - line[3] = germplasmMcpdVO.getCollectingInfo().getCollectingNumber(); - line[4] = germplasmMcpdVO.getCollectingInfo().getCollectingInstitutes().stream() - .map(InstituteVO::getInstituteCode).collect(Collectors.joining(";")); - line[5] = germplasmMcpdVO.getCollectingInfo().getCollectingInstitutes().stream() - .map(InstituteVO::getInstituteName).collect(Collectors.joining(";")); - line[6] = germplasmMcpdVO.getCollectingInfo().getCollectingInstitutes().stream() - .map(InstituteVO::getAddress).collect(Collectors.joining(";")); - line[7] = germplasmMcpdVO.getCollectingInfo().getCollectingMissionIdentifier(); - line[8] = germplasmMcpdVO.getGenus(); - line[9] = germplasmMcpdVO.getSpecies(); - line[10] = germplasmMcpdVO.getSpeciesAuthority(); - line[11] = germplasmMcpdVO.getSubtaxon(); - line[12] = germplasmMcpdVO.getSubtaxonAuthority(); - line[13] = germplasmMcpdVO.getCommonCropName(); - line[14] = String.join(";",germplasmMcpdVO.getAccessionNames()); - line[15] = germplasmMcpdVO.getAcquisitionDate(); - line[16] = germplasmMcpdVO.getCountryOfOriginCode(); - line[18] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getSiteName(); - line[19] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getLatitudeDecimal(); - line[20] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getLatitudeDegrees(); - line[21] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getLongitudeDecimal(); - line[22] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getLongitudeDegrees(); - line[23] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getCoordinateUncertainty(); - line[24] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getSpatialReferenceSystem(); - line[25] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getGeoreferencingMethod(); - line[26] = germplasmMcpdVO.getCollectingInfo().getCollectingSite().getElevation(); - line[27] = germplasmMcpdVO.getCollectingInfo().getCollectingDate(); - line[28] = germplasmMcpdVO.getBreedingInstitutes().stream() - .map(InstituteVO::getInstituteCode).collect(Collectors.joining(";")); - line[29] = germplasmMcpdVO.getBreedingInstitutes().stream() - .map(InstituteVO::getInstituteName).collect(Collectors.joining(";")); - line[30] = germplasmMcpdVO.getBiologicalStatusOfAccessionCode(); - line[31] = germplasmMcpdVO.getAncestralData(); - line[32] = germplasmMcpdVO.getAcquisitionSourceCode(); - line[33] = germplasmMcpdVO.getDonorInfo().stream() - .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteCode()).collect(Collectors.joining(";")); - line[34] = germplasmMcpdVO.getDonorInfo().stream() - .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteName()).collect(Collectors.joining(";")); - line[35] = germplasmMcpdVO.getDonorInfo().stream() - .map(DonorInfoVO::getDonorAccessionNumber).collect(Collectors.joining(";")); - line[36] = String.join(";", germplasmMcpdVO.getAlternateIDs()); - line[37] = germplasmMcpdVO.getSafetyDuplicateInstitutes().stream() - .map(InstituteVO::getInstituteName).collect(Collectors.joining(";")); - line[38] = String.join(";", germplasmMcpdVO.getStorageTypeCodes()); - line[39] = germplasmMcpdVO.getMlsStatus(); - line[40] = germplasmMcpdVO.getRemarks(); - csvWriter.writeNext(line); - } - csvWriter.close(); - } - - - - - - @Override - public GermplasmVO getById(String germplasmDbId) { - return germplasmRepository.getById(germplasmDbId); - } - - @Override - public PaginatedList<GermplasmVO> find(GermplasmSearchCriteria sCrit) { - return germplasmRepository.find(sCrit); - } - - @Override - public GermplasmSearchResponse germplasmFind(FaidareGermplasmPOSTShearchCriteria germplasmSearchCriteria) { - return germplasmRepository.germplasmFind(germplasmSearchCriteria); - } - - @Override - public PedigreeVO getPedigree(String germplasmDbId) { - return germplasmRepository.findPedigree(germplasmDbId); - } - - @Override - public ProgenyVO getProgeny(String germplasmDbId) { - return germplasmRepository.findProgeny(germplasmDbId); - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/utils/StringFunctions.java b/backend/src/main/java/fr/inra/urgi/faidare/utils/StringFunctions.java deleted file mode 100644 index bbe36507429ea6d856ec758751c2dba41f4bdf91..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/utils/StringFunctions.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.inra.urgi.faidare.utils; - -import java.nio.charset.StandardCharsets; - -/** - * @author gcornut - * <p> - * Copyright INRA-URGI 2019 - */ -public final class StringFunctions { - - /** - * Fixes identifier encoding (in case we have accents in it) - */ - public static String asUTF8(String string) { - if (string == null) { - return null; - } - return new String(string.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); - } -} - diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java b/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java deleted file mode 100644 index 3861ab09c032bb186258c09ed05e3a40086a515b..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java +++ /dev/null @@ -1,167 +0,0 @@ -package fr.inra.urgi.faidare.web.germplasm; - -import static fr.inra.urgi.faidare.web.germplasm.GermplasmMcpdExportableField.*; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -import com.opencsv.CSVWriter; -import fr.inra.urgi.faidare.domain.data.germplasm.DonorInfoVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.InstituteVO; -import org.springframework.stereotype.Component; - -/** - * Service allowing to export germplasm MCPDs as CSV - * @author JB Nizet - */ -@Component -public class GermplasmMcpdExportService { - - private final Map<GermplasmMcpdExportableField, GermplasmMcpdExportableFieldDescriptor> descriptors; - - public GermplasmMcpdExportService() { - Map<GermplasmMcpdExportableField, GermplasmMcpdExportableFieldDescriptor> map = new HashMap<>(); - - map.put(PUID, withFieldAsHeader(PUID, vo -> vo.getGermplasmPUI())); - map.put(INSTCODE, withFieldAsHeader(INSTCODE, vo -> vo.getInstituteCode())); - map.put(ACCENUMB, withFieldAsHeader(ACCENUMB, vo -> vo.getAccessionNumber())); - map.put(COLLNUMB, withFieldAsHeader(COLLNUMB, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingNumber())); - map.put(COLLCODE, withFieldAsHeader(COLLCODE, vo -> (vo.getCollectingInfo() == null)? null : - vo.getCollectingInfo() - .getCollectingInstitutes() - .stream() - .map(InstituteVO::getInstituteCode).collect(Collectors.joining(";")))); - map.put(COLLNAME, withFieldAsHeader(COLLNAME, vo -> (vo.getCollectingInfo() == null)? null : - vo.getCollectingInfo() - .getCollectingInstitutes() - .stream() - .map(InstituteVO::getInstituteName) - .collect(Collectors.joining(";")))); - map.put(COLLINSTADDRESS, withFieldAsHeader(COLLINSTADDRESS, vo -> (vo.getCollectingInfo() == null || vo.getCollectingInfo().getCollectingInstitutes() == null)? null : - vo.getCollectingInfo() - .getCollectingInstitutes() - .stream() - .map(InstituteVO::getAddress) - .collect(Collectors.joining(";")))); - map.put(COLLMISSID, withFieldAsHeader(COLLMISSID, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingMissionIdentifier())); - map.put(GENUS, withFieldAsHeader(GENUS, vo -> vo.getGenus())); - map.put(SPECIES, withFieldAsHeader(SPECIES, vo -> vo.getSpecies())); - map.put(SPAUTHOR, withFieldAsHeader(SPAUTHOR, vo -> vo.getSpeciesAuthority())); - map.put(SUBTAXA, withFieldAsHeader(SUBTAXA, vo -> vo.getSubtaxon())); - map.put(SUBTAUTHOR, withFieldAsHeader(SUBTAUTHOR, vo -> vo.getSubtaxonAuthority())); - map.put(CROPNAME, withFieldAsHeader(CROPNAME, vo -> vo.getCommonCropName())); - map.put(ACCENAME, withFieldAsHeader(ACCENAME, vo -> String.join(";", vo.getAccessionNames()))); - map.put(ACQDATE, withFieldAsHeader(ACQDATE, vo -> vo.getAcquisitionDate())); - map.put(ORIGCTY, withFieldAsHeader(ORIGCTY, vo -> vo.getCountryOfOriginCode())); - map.put(COLLSITE, withFieldAsHeader(COLLSITE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getSiteName())); - map.put(DECLATITUDE, withFieldAsHeader(DECLATITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLatitudeDecimal())); - map.put(LATITUDE, withFieldAsHeader(LATITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLatitudeDegrees())); - map.put(DECLONGITUDE, withFieldAsHeader(DECLONGITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLongitudeDecimal())); - map.put(LONGITUDE, withFieldAsHeader(LONGITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLongitudeDegrees())); - map.put(COORDUNCERT, withFieldAsHeader(COORDUNCERT, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getCoordinateUncertainty())); - map.put(COORDDATUM, withFieldAsHeader(COORDDATUM, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getSpatialReferenceSystem())); - map.put(GEOREFMETH, withFieldAsHeader(GEOREFMETH, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getGeoreferencingMethod())); - map.put(ELEVATION, withFieldAsHeader(ELEVATION, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getElevation())); - map.put(COLLDATE, withFieldAsHeader(COLLDATE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingDate())); - map.put(BREDCODE, withFieldAsHeader(BREDCODE, vo -> (vo.getBreedingInstitutes() == null)? null : - vo.getBreedingInstitutes() - .stream() - .map(InstituteVO::getInstituteCode) - .collect(Collectors.joining(";")))); - map.put(BREDNAME, withFieldAsHeader(BREDNAME, vo -> (vo.getBreedingInstitutes() == null)? null : - vo.getBreedingInstitutes() - .stream() - .map(InstituteVO::getInstituteName) - .collect(Collectors.joining(";")))); - map.put(SAMPSTAT, withFieldAsHeader(SAMPSTAT, vo -> vo.getBiologicalStatusOfAccessionCode())); - map.put(ANCEST, withFieldAsHeader(ANCEST, vo -> vo.getAncestralData())); - map.put(COLLSRC, withFieldAsHeader(COLLSRC, vo -> vo.getAcquisitionSourceCode())); - map.put(DONORCODE, withFieldAsHeader(DONORCODE, vo -> (vo.getDonorInfo() == null )? null : - vo.getDonorInfo() - .stream() - .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteCode()) - .collect(Collectors.joining(";")))); - map.put(DONORNAME, withFieldAsHeader(DONORNAME, vo -> (vo.getDonorInfo() == null)? null : - vo.getDonorInfo() - .stream() - .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteName()) - .collect(Collectors.joining(";")))); - map.put(DONORNUMB, withFieldAsHeader(DONORNUMB, vo -> (vo.getDonorInfo() == null )? null : - vo.getDonorInfo() - .stream() - .map(DonorInfoVO::getDonorAccessionNumber) - .collect(Collectors.joining(";")))); - map.put(OTHERNUMB, withFieldAsHeader(OTHERNUMB, vo -> String.join(";", vo.getAlternateIDs()))); - map.put(MLSSTAT, withFieldAsHeader(MLSSTAT, vo -> vo.getMlsStatus())); - map.put(REMARKS, withFieldAsHeader(REMARKS, vo -> vo.getRemarks())); - - this.descriptors = Collections.unmodifiableMap(map); - - /* if (map.size() != GermplasmMcpdExportableField.values().length) { - throw new IllegalStateException("Missing field descriptor"); - }*/ - } - - public void export(OutputStream out, Iterator<GermplasmMcpdVO> germplasms, List<GermplasmMcpdExportableField> fields) { - try { - CSVWriter csvWriter = new CSVWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)), ';', '"', '\\', "\n"); - String[] header = fields.stream() - .map(descriptors::get) - .map(GermplasmMcpdExportableFieldDescriptor::getHeader) - .toArray(String[]::new); - csvWriter.writeNext(header); - - while (germplasms.hasNext()) { - GermplasmMcpdVO vo = germplasms.next(); - String[] line = - fields.stream() - .map(descriptors::get) - .map(descriptor -> descriptor.export(vo)) - .toArray(String[]::new); - csvWriter.writeNext(line); - } - csvWriter.flush(); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private GermplasmMcpdExportableFieldDescriptor withFieldAsHeader( - GermplasmMcpdExportableField field, - Function<GermplasmMcpdVO, String> exporter) { - return new GermplasmMcpdExportableFieldDescriptor(field.name(), exporter); - } - - private static class GermplasmMcpdExportableFieldDescriptor { - private final String header; - private final Function<GermplasmMcpdVO, String> exporter; - - public GermplasmMcpdExportableFieldDescriptor(String header, - Function<GermplasmMcpdVO, String> exporter) { - this.header = header; - this.exporter = exporter; - } - - public String getHeader() { - return this.header; - } - - public String export(GermplasmMcpdVO germplasm) { - return this.exporter.apply(germplasm); - } - } -} - - diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/NavbarEntry.java b/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/NavbarEntry.java deleted file mode 100644 index 8925aec060762927cf87328c2e40164e5bb7e589..0000000000000000000000000000000000000000 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/NavbarEntry.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.inra.urgi.faidare.web.thymeleaf; - -import java.util.Collections; -import java.util.List; - -/** - * A navbar link - * @author JB Nizet - */ -public final class NavbarEntry { - private final String label; - private final String url; - private final List<NavbarEntry> subMenu; - - private NavbarEntry(String label, String url, List<NavbarEntry> subMenu) { - this.label = label; - this.url = url; - this.subMenu = subMenu; - } - - public static NavbarEntry link(String label, String url) { - return new NavbarEntry(label, url, Collections.emptyList()); - } - - public static NavbarEntry menu(String label, List<NavbarEntry> subMenu) { - return new NavbarEntry(label, null, subMenu); - } - - public String getLabel() { - return label; - } - - public String getUrl() { - return url; - } - - public List<NavbarEntry> getSubMenu() { - return subMenu; - } -} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/Application.java b/backend/src/main/java/fr/inrae/urgi/faidare/Application.java similarity index 86% rename from backend/src/main/java/fr/inra/urgi/faidare/Application.java rename to backend/src/main/java/fr/inrae/urgi/faidare/Application.java index 75c1b74a4f90825eaa8175d679ad51e63267cea1..1e3c8ce11a18f3128205aa07facdf0a8c8c86942 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/Application.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/Application.java @@ -1,6 +1,6 @@ -package fr.inra.urgi.faidare; +package fr.inrae.urgi.faidare; -import fr.inra.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.config.FaidareProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/BadRequestException.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/BadRequestException.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/api/BadRequestException.java rename to backend/src/main/java/fr/inrae/urgi/faidare/api/BadRequestException.java index cd0991dc2c9fd2cc7435cf4c4d9f556a0b4167ec..8d3bf2c1cb564db4db4f93c43952f792569fdeff 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/BadRequestException.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/BadRequestException.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.api; +package fr.inrae.urgi.faidare.api; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/api/NotFoundException.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/NotFoundException.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/api/NotFoundException.java rename to backend/src/main/java/fr/inrae/urgi/faidare/api/NotFoundException.java index a6a49f20cc9970c455f99af49148fd4e97cfdeeb..e3f0f3aaed1174f607aae605231c3b006fb6d183 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/api/NotFoundException.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/NotFoundException.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.api; +package fr.inrae.urgi.faidare.api; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1Controller.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..a588f437be7abc217a5da4deccb854ced07c0030 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1Controller.java @@ -0,0 +1,74 @@ +package fr.inrae.urgi.faidare.api.brapi.v1; + + +import java.io.IOException; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiSingleResponse; +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.dao.v2.CollectionV2Dao; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +//@Tag(name = "Breeding API", description = "BrAPI endpoint") +@RestController +@RequestMapping({"/brapi/v1"}) +public class GermplasmV1Controller { + private final GermplasmV1Dao germplasmDao; + private final CollectionV2Dao collectionDao; + + + public GermplasmV1Controller(GermplasmV1Dao germplasmDao, CollectionV2Dao collectionDao) { + this.germplasmDao = germplasmDao; + this.collectionDao = collectionDao; + } + + + + + @Value("classpath:calls.json") + Resource serverInfoFile; + + @GetMapping("/calls") + public @ResponseBody JsonNode calls() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readTree(serverInfoFile.getInputStream()); + } + + @GetMapping("/germplasm/{germplasmDbId}") + public BrapiSingleResponse<GermplasmV1VO> byGermplasmDbId(@PathVariable String germplasmDbId) throws Exception { + + GermplasmV1VO gVo = germplasmDao.getByGermplasmDbId(germplasmDbId); + return BrapiSingleResponse.brapiResponseOf(gVo, Pageable.ofSize(1)); + } + + @GetMapping("/germplasm") + public BrapiListResponse<GermplasmV1VO> allGermplasms(@RequestParam(required = false, defaultValue = "0") Integer page, + @RequestParam(required = false, defaultValue = "10") Integer pageSize) throws Exception { + + + Page<GermplasmV1VO> gVos = germplasmDao.findAll(Pageable.ofSize(pageSize).withPage(page)); + return BrapiListResponse.brapiResponseForPageOf(gVos); + } + + //GemplasmMCPD is assumed to be broken/not loaded and not used in curent FAIDARE cards + + @GetMapping("/collection") + public BrapiListResponse<CollPopVO> getAllCollections(){ + return collectionDao.getAllCollections(); + } + + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiListResponse.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiListResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..d7f45613d82030b7765b6e2fed8f0c520644a180 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiListResponse.java @@ -0,0 +1,78 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + +import static fr.inrae.urgi.faidare.api.brapi.v2.BrapiMetadata.setPagination; + +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.SearchHitSupport; +import org.springframework.data.elasticsearch.core.SearchHits; + +public class BrapiListResponse<T> implements BrapiResponse { + Result result; + private BrapiMetadata metadata; + + public BrapiListResponse(BrapiMetadata brapiMetadata, List<T> result) { + this.metadata = brapiMetadata; + + this.getResult().data = result; + } + + + public BrapiListResponse() { + this.metadata = new BrapiMetadata(); + this.result = new Result(); + } + + public static <T> BrapiListResponse<T> brapiResponseForPageOf(SearchHits<T> searchHits, Pageable pageable){ + BrapiListResponse<T> brapiResponse = new BrapiListResponse<T>(); + List<T> vos = (List<T>) SearchHitSupport.unwrapSearchHits(searchHits) ; + brapiResponse.getResult().setData(vos); + setPagination(searchHits.getTotalHits(), pageable, brapiResponse); + return brapiResponse; + } + + public static <T> BrapiListResponse<T> brapiResponseForPageOf(Page<T> searchPage){ + BrapiListResponse<T> brapiResponse = new BrapiListResponse<T>(); + Page<T> vos = (Page<T>) SearchHitSupport.unwrapSearchHits(searchPage) ; + brapiResponse.getResult().setData(vos.getContent()); + setPagination(searchPage.getTotalElements(), searchPage.getPageable(), brapiResponse); + return brapiResponse; + } + + + + + public BrapiMetadata getMetadata() { + return metadata; + } + + public void setMetadata(BrapiMetadata metadata) { + this.metadata = metadata; + } + + public Result getResult() { + return result; + } + + public void setResult(Result result) { + this.result = result; + } + + public class Result{ + public Result(){ + this.data = List.of(); + } + private List<T> data; + + public List<T> getData() { + return data; + } + + public void setData(List<T> data) { + this.data = data; + } + } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiMetadata.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..2d339f54d449a692a814dfe5be4d3bd57467f1d7 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiMetadata.java @@ -0,0 +1,92 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Pageable; + +public class BrapiMetadata { + + private List<Map<String, String>> status; + private List<Map<String, String>> datafiles; + private BrapiPagination pagination; + + public BrapiMetadata() { + this.pagination = new BrapiPagination(); + this.datafiles = new ArrayList<Map<String, String>>(); + this.status = new ArrayList<Map<String, String>>(); + } + + + static <T> void setPagination(long totalHits, Pageable pageable, BrapiResponse<T> brapiResponse) { + brapiResponse.getMetadata().getPagination().setCurrentPage(pageable.getPageNumber()); + brapiResponse.getMetadata().getPagination().setPageSize(pageable.getPageSize()); + brapiResponse.getMetadata().getPagination().setTotalCount(totalHits); + brapiResponse.getMetadata().getPagination().setTotalPages(totalHits / pageable.getPageSize()); + } + public List<Map<String, String>> getDatafiles() { + return datafiles; + } + + public void setDatafiles(List<Map<String, String>> datafiles) { + this.datafiles = datafiles; + } + + public BrapiPagination getPagination() { + return pagination; + } + + public void setPagination(BrapiPagination pagination) { + this.pagination = pagination; + } + + public List<Map<String, String>> getStatus() { + return status; + } + + public void setStatus(List<Map<String, String>> status) { + this.status = status; + } + + + public class BrapiPagination { + private long totalCount; + private long pageSize; + private long totalPages; + private long currentPage; + + public long getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(long currentPage) { + this.currentPage = currentPage; + } + + public long getPageSize() { + return pageSize; + } + + public void setPageSize(long pageSize) { + this.pageSize = pageSize; + } + + public long getTotalCount() { + return totalCount; + } + + public void setTotalCount(long totalCount) { + this.totalCount = totalCount; + } + + public long getTotalPages() { + return totalPages; + } + + public void setTotalPages(long totalPages) { + this.totalPages = totalPages; + } + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiResponse.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..0d252595678216dbf6264109a56d393a8288c4bb --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiResponse.java @@ -0,0 +1,5 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + +public interface BrapiResponse<T> { + BrapiMetadata getMetadata(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiSingleResponse.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiSingleResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..144736aae0760768122f7eb176aec989b1047705 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/BrapiSingleResponse.java @@ -0,0 +1,44 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + +import static fr.inrae.urgi.faidare.api.brapi.v2.BrapiMetadata.setPagination; + +import org.springframework.data.domain.Pageable; + +public class BrapiSingleResponse<T> implements BrapiResponse<T>{ + + + private BrapiMetadata metadata; + private T result; + + public BrapiSingleResponse() { + this.metadata = new BrapiMetadata(); + this.result = null; + } + + public static <T> BrapiSingleResponse<T> brapiResponseOf(T hit, Pageable pageable) throws Exception { + BrapiSingleResponse<T> brapiResponse = new BrapiSingleResponse<T>(); + + brapiResponse.setResult(hit); + + + setPagination(hit == null ? 0 : 1, pageable, brapiResponse); + return brapiResponse; + } + + @Override + public BrapiMetadata getMetadata() { + return metadata; + } + + public void setMetadata(BrapiMetadata metadata) { + this.metadata = metadata; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2Controller.java b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..59efba8199aa7c0b2428df88999760dc2ce40c6a --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2Controller.java @@ -0,0 +1,142 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + + +import java.io.IOException; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.inrae.urgi.faidare.dao.v2.CollectionV2Dao; +import fr.inrae.urgi.faidare.dao.v2.GermplasmCriteria; +import fr.inrae.urgi.faidare.dao.v2.GermplasmMcpdDao; +import fr.inrae.urgi.faidare.dao.v2.GermplasmV2Dao; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.data.domain.Pageable; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "Breeding API", description = "BrAPI endpoint") +@RestController +@RequestMapping({"/brapi/v2"}) +public class GermplasmV2Controller { + + private final GermplasmV2Dao germplasmDao; + + private final CollectionV2Dao collectionDao; + + private final GermplasmMcpdDao germplasmMcpdDao; + + public GermplasmV2Controller(GermplasmV2Dao germplasmDao, CollectionV2Dao collectionDao, GermplasmMcpdDao germplasmMcpdDao) { + this.germplasmDao = germplasmDao; + this.collectionDao = collectionDao; + this.germplasmMcpdDao = germplasmMcpdDao; + } + + + + + @Value("classpath:serverinfo.json") + Resource serverInfoFile; + + @GetMapping("/serverinfo") + public @ResponseBody JsonNode serverinfo() throws IOException { + + + ObjectMapper mapper = new ObjectMapper(); + JsonNode response = mapper.readTree(serverInfoFile.getInputStream()); + //JsonNode response = mapper.readTree(serverInfoFile.getFile()); + return response; + } + + @GetMapping("/germplasm") + public BrapiListResponse<GermplasmV2VO> germplasm( + @RequestParam MultiValueMap<String, String> parameters){ + //TODO: this could be replaced with @RequestParam GermplasmCriteria gCrit) to be adjusted/tested + GermplasmCriteria gCrit = new GermplasmCriteria(); + if (parameters.get("accessionNumber") != null ){ gCrit.setAccessionNumber(parameters.get("accessionNumber")); } + if (parameters.get("binomialName") != null ){ gCrit.setAccessionNumber(parameters.get("binomialName")); } + if (parameters.get("genus") != null ){ gCrit.setAccessionNumber(parameters.get("genus")); } + if (parameters.get("species") != null ){ gCrit.setAccessionNumber(parameters.get("species")); } + if (parameters.get("synonym") != null ){ gCrit.setAccessionNumber(parameters.get("synonym")); } + if (parameters.get("parentDbId") != null ){ gCrit.setAccessionNumber(parameters.get("parentDbId")); } + if (parameters.get("progenyDbIb") != null ){ gCrit.setAccessionNumber(parameters.get("progenyDbIb")); } + if (parameters.get("commonCropName") != null ){ gCrit.setAccessionNumber(parameters.get("commonCropName")); } + if (parameters.get("programDbId") != null ){ gCrit.setAccessionNumber(parameters.get("programDbId")); } + if (parameters.get("trialDbId") != null ){ gCrit.setAccessionNumber(parameters.get("trialDbId")); } + if (parameters.get("studyDbId") != null ){ gCrit.setAccessionNumber(parameters.get("studyDbId")); } + if (parameters.get("germplasmDbId") != null ){ gCrit.setAccessionNumber(parameters.get("germplasmDbId")); } + if (parameters.get("germplasmName") != null ){ gCrit.setAccessionNumber(parameters.get("germplasmName")); } + if (parameters.get("germplasmPUI") != null ){ gCrit.setAccessionNumber(parameters.get("germplasmPUI")); } + if (parameters.get("externalReferenceID") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceID")); } + if (parameters.get("externalReferenceId") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceId")); } + if (parameters.get("externalReferenceSource") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceSource")); } + + if (parameters.get("page") != null ){ gCrit.setPage(Integer.valueOf(parameters.get("page").get(0))); } + if (parameters.get("pageSize") != null ){ gCrit.setPageSize(Integer.valueOf(parameters.get("pageSize").get(0))); } + BrapiListResponse<GermplasmV2VO> germplasmV2VOs = germplasmDao.findGermplasmsByCriteria(gCrit); + + return germplasmV2VOs; + } + + @PostMapping(value = "/search/germplasm", consumes = "application/json", produces = "application/json") + public BrapiListResponse<GermplasmV2VO> searchGermplasm(@RequestBody GermplasmCriteria gCrit){ + + return germplasmDao.findGermplasmsByCriteria(gCrit); + } + + @GetMapping("/germplasm/{germplasmDbId}") + public BrapiSingleResponse<GermplasmV2VO> byGermplasmDbId(@PathVariable String germplasmDbId) throws Exception { + + GermplasmV2VO gV2Vo = germplasmDao.getByGermplasmDbId(germplasmDbId); + return BrapiSingleResponse.brapiResponseOf(gV2Vo, Pageable.ofSize(1)); + //return gV2Vo; + } + + + + @GetMapping("/collection") + public BrapiListResponse<CollPopVO> getCollections(){ + return collectionDao.getAllCollections(); + + } + /* + @GetMapping("/germplasmAttribute") + public List<SearchHit<GermplasmAttributeV2VO>> germplasmAttribute(@RequestParam(value = "attributeValueDbId", defaultValue = "") String attributeValueDbId, + @RequestParam(value = "attributeDbId", defaultValue = "") String attributeDbId, + @RequestParam(value = "attributeName", defaultValue = "") String attributeName, + @RequestParam(value = "commonCropName", defaultValue = "") String commonCropName, + @RequestParam(value = "programDbId", defaultValue = "") String programDbId, + @RequestParam(value = "germplasmDbId", defaultValue = "") String germplasmDbId, + @RequestParam(value = "externalReferenceID", defaultValue = "") String externalReferenceID, + @RequestParam(value = "externalReferenceId", defaultValue = "") String externalReferenceId, + @RequestParam(value = "externalReferenceSource", defaultValue = "") String externalReferenceSource, + @RequestParam MultiValueMap<String, String> parameters){ + + GermplasmCriteria gCrit = new GermplasmCriteria(); + if (parameters.get("attributeValueDbId") != null ){ gCrit.setAccessionNumber(parameters.get("attributeValueDbId").get(0)); } + if (parameters.get("attributeDbId") != null ){ gCrit.setAccessionNumber(parameters.get("attributeDbId").get(0)); } + if (parameters.get("attributeName") != null ){ gCrit.setAccessionNumber(parameters.get("attributeName").get(0)); } + if (parameters.get("commonCropName") != null ){ gCrit.setAccessionNumber(parameters.get("commonCropName").get(0)); } + if (parameters.get("programDbId") != null ){ gCrit.setAccessionNumber(parameters.get("programDbId").get(0)); } + if (parameters.get("germplasmDbId") != null ){ gCrit.setAccessionNumber(parameters.get("germplasmDbId").get(0)); } + if (parameters.get("externalReferenceID") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceID").get(0)); } + if (parameters.get("externalReferenceId") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceId").get(0)); } + if (parameters.get("externalReferenceSource") != null ){ gCrit.setAccessionNumber(parameters.get("externalReferenceSource").get(0)); } + + SearchPage<GermplasmAttributeV2VO> germplasmAttribute = germplasmDao.findGermplasmsByCriteria(gCrit); + + return germplasmAttribute.getContent(); + } + */ +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/config/DataSource.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/DataSource.java new file mode 100644 index 0000000000000000000000000000000000000000..0e5e9535da77ab0013114d4d5a1d3ba4fa8a75f7 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/DataSource.java @@ -0,0 +1,37 @@ +package fr.inrae.urgi.faidare.config; + +import java.util.List; + + +/** + * @author gcornut + */ +public class DataSource { + private String uri; + private String name; + private String url; + private String image; + + public DataSource(String uri, String name, String url, String image) { + this.uri = uri; + this.name = name; + this.url = url; + this.image = image; + } + + public String getName() { + return name; + } + + public String getUri() { + return uri; + } + + public String getUrl() { + return url; + } + + public String getImage() { + return image; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/ElasticSearchConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/ElasticSearchConfig.java similarity index 97% rename from backend/src/main/java/fr/inra/urgi/faidare/config/ElasticSearchConfig.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/ElasticSearchConfig.java index eee4827dca3792b60e65899368bff6232a46304b..d16bf44c531935e61a75f3f43d385517ac21f175 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/ElasticSearchConfig.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/ElasticSearchConfig.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; import org.apache.http.HttpHost; import org.apache.http.impl.nio.reactor.IOReactorConfig; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/FaidareProperties.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/FaidareProperties.java similarity index 65% rename from backend/src/main/java/fr/inra/urgi/faidare/config/FaidareProperties.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/FaidareProperties.java index ea790cf2a731e625f6ccf9b0843b7afd9ba4132a..32b7bf02b5101e19fb49e7a35c681bf77295e68d 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/FaidareProperties.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/FaidareProperties.java @@ -1,13 +1,12 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSourceImpl; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.List; +import jakarta.validation.constraints.NotBlank; + +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * Properties class holding the properties of the application (typically stored in application.yml) * @@ -15,12 +14,19 @@ import java.util.List; */ @ConfigurationProperties(prefix = "faidare") public class FaidareProperties { + private String securityUserGroupWsUrl; + private String securityUserGroupWsToken; + + /** + * The URL used by the germplasm card to generate links to the faidare search application + * (i.e. the faidare flavor of data-discovery). + */ @NotBlank private String elasticsearchIndexingTemplate; @NotBlank - private String elasticsearchXrefIndexName; + private String searchUrl; @NotBlank private String cropOntologyRepositoryUrl; @@ -28,17 +34,23 @@ public class FaidareProperties { @NotBlank private String cropOntologyPortalLink; - private String securityUserGroupWsUrl; - private String securityUserGroupWsToken; + private List<DataSource> dataSources = new ArrayList<>(); - /** - * The URL used by the germplasm card to generate links to the faidare search application - * (i.e. the faidare flavor of data-discovery). - */ - @NotBlank - private String searchUrl; + public void setSecurityUserGroupWsUrl(String securityUserGroupWsUrl) { + this.securityUserGroupWsUrl = securityUserGroupWsUrl; + } + + public String getSecurityUserGroupWsUrl() { + return securityUserGroupWsUrl; + } + + public String getSecurityUserGroupWsToken() { + return securityUserGroupWsToken; + } - private List<DataSourceImpl> dataSources = new ArrayList<>(); + public void setSecurityUserGroupWsToken(String securityUserGroupWsToken) { + this.securityUserGroupWsToken = securityUserGroupWsToken; + } public String getElasticsearchIndexingTemplate() { return elasticsearchIndexingTemplate; @@ -48,12 +60,12 @@ public class FaidareProperties { this.elasticsearchIndexingTemplate = elasticsearchIndexingTemplate; } - public String getElasticsearchXrefIndexName() { - return elasticsearchXrefIndexName; + public String getSearchUrl() { + return searchUrl; } - public void setElasticsearchXrefIndexName(String elasticsearchXrefIndexName) { - this.elasticsearchXrefIndexName = elasticsearchXrefIndexName; + public void setSearchUrl(String searchUrl) { + this.searchUrl = searchUrl; } public String getCropOntologyRepositoryUrl() { @@ -64,22 +76,6 @@ public class FaidareProperties { this.cropOntologyRepositoryUrl = cropOntologyRepositoryUrl; } - public String getSecurityUserGroupWsUrl() { - return securityUserGroupWsUrl; - } - - public void setSecurityUserGroupWsUrl(String securityUserGroupWsUrl) { - this.securityUserGroupWsUrl = securityUserGroupWsUrl; - } - - public String getSecurityUserGroupWsToken() { - return securityUserGroupWsToken; - } - - public void setSecurityUserGroupWsToken(String securityUserGroupWsToken) { - this.securityUserGroupWsToken = securityUserGroupWsToken; - } - public String getCropOntologyPortalLink() { return cropOntologyPortalLink; } @@ -88,16 +84,16 @@ public class FaidareProperties { this.cropOntologyPortalLink = cropOntologyPortalLink; } - public List<DataSourceImpl> getDataSources() { + public List<DataSource> getDataSources() { return dataSources; } - public void setDataSources(List<DataSourceImpl> dataSources) { + public void setDataSources(List<DataSource> dataSources) { this.dataSources = dataSources; } public DataSource getByUri(String uri) { - for (DataSourceImpl dataSource : getDataSources()) { + for (DataSource dataSource : getDataSources()) { if (dataSource.getUri().equals(uri)) { return dataSource; } @@ -106,30 +102,15 @@ public class FaidareProperties { } /** - * Get ElasticSearch alias name using the template property, the document type and the group id + * Get Elasticearch alias name using the template property, the document type and the group id */ - public String getAliasName(String documentType, long groupId) { + public String getAliasName (String documentType, long groupId) { return getBaseIndexName(documentType) + "-group" + groupId; } - /** - * Get ElasticSearch index name using the template property, the document type and the index creation timestamp - */ - public String getIndexName(String documentType, long startInstant) { - return getBaseIndexName(documentType) + "-d" + startInstant; - } - public String getBaseIndexName(String documentType) { + private String getBaseIndexName(String documentType) { documentType = documentType.replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(); - return elasticsearchIndexingTemplate - .replace("{documentType}", documentType.toLowerCase()); - } - - public String getSearchUrl() { - return searchUrl; - } - - public void setSearchUrl(String searchUrl) { - this.searchUrl = searchUrl; + return elasticsearchIndexingTemplate.replace("{documentType}", documentType); } } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/config/I18nConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/I18nConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..aa66d71c4103109d08f49c533d2d7f51699098f2 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/I18nConfig.java @@ -0,0 +1,27 @@ +package fr.inrae.urgi.faidare.config; + + +import java.util.Arrays; +import java.util.Locale; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; + +/** + * Configuration class for i18n. It uses the locale from the accept-language header, but defaults to English, + * and only supports a fixed set of locales. + * It implements WebMvcConfigurer in order to be automatically included in MVC tests. + * @author JB Nizet + */ +@Configuration +public class I18nConfig implements WebMvcConfigurer { + @Bean + public LocaleResolver localeResolver() { + AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver(); + resolver.setSupportedLocales(Arrays.asList(Locale.FRENCH, Locale.ENGLISH)); + return resolver; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/JSONConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/JSONConfig.java similarity index 53% rename from backend/src/main/java/fr/inra/urgi/faidare/config/JSONConfig.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/JSONConfig.java index 458bec1da50ff19b1d3eac10675dc3c327966ed9..8f882deacdc9c77a7a1f7c30a90cd9b48109e4cb 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/JSONConfig.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/JSONConfig.java @@ -1,8 +1,9 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; @@ -22,13 +23,13 @@ public class JSONConfig { @Bean public ObjectMapper permissiveMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES); - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - mapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE); - mapper.disable(DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS); - mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); - mapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); - return mapper; + return JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE) + .disable(DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS) + .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) + .build(); } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/MimeMappingServletCustomizer.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/MimeMappingServletCustomizer.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/config/MimeMappingServletCustomizer.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/MimeMappingServletCustomizer.java index 184cc1e9597ed814782b8d81e1a890cf21e54729..d1500e05015be85ee7e3f50fc2ad9ff707dad483 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/MimeMappingServletCustomizer.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/MimeMappingServletCustomizer.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.MimeMappings; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/RestClientConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/RestClientConfig.java similarity index 97% rename from backend/src/main/java/fr/inra/urgi/faidare/config/RestClientConfig.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/RestClientConfig.java index 51fc54031b6555d58a3dc188f90841deebeb7028..777f5a5d379ab82b438c50568c07b3a6c7a152f3 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/RestClientConfig.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/RestClientConfig.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/config/SecurityConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/SecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..042350e9505ab22e3f77557fa0337eb2066d3397 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/SecurityConfig.java @@ -0,0 +1,38 @@ +package fr.inrae.urgi.faidare.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.security.web.util.matcher.RegexRequestMatcher; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Security configuration. It makes sure the actuator endpoints are only accessible to + * authenticated users + * + * @author JB Nizet + */ +@Configuration +public class SecurityConfig implements WebMvcConfigurer { + + @Bean + public SecurityFilterChain httpSecurityFilterChain(HttpSecurity http) throws Exception { + return http + .authorizeHttpRequests( + registry -> registry.requestMatchers(AntPathRequestMatcher.antMatcher("/actuator**")).authenticated() + ) + .httpBasic(configurer -> {}) + .csrf(configurer -> configurer.disable()) + .sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .build(); + } + + @Bean + public WebSecurityCustomizer ignoringActuatorWebSecurityCustomizer() { + return web -> web.ignoring().requestMatchers(RegexRequestMatcher.regexMatcher("^((?!\\/actuator).)*$")); + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/config/SwaggerConfig.java b/backend/src/main/java/fr/inrae/urgi/faidare/config/SwaggerConfig.java similarity index 91% rename from backend/src/main/java/fr/inra/urgi/faidare/config/SwaggerConfig.java rename to backend/src/main/java/fr/inrae/urgi/faidare/config/SwaggerConfig.java index 97173a1b3b4abb768df6548cffccf952b887e2de..94cdc7a1b3aed44357cc4d62c3755e013a85b930 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/config/SwaggerConfig.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/config/SwaggerConfig.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.config; +package fr.inrae.urgi.faidare.config; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/DocumentDao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/DocumentDao.java new file mode 100644 index 0000000000000000000000000000000000000000..fdaf2cba96eceda5e6bac735d37e1ea95ea1ca5a --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/DocumentDao.java @@ -0,0 +1,10 @@ +package fr.inrae.urgi.faidare.dao; + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import org.springframework.data.repository.NoRepositoryBean; + + +@NoRepositoryBean +public interface DocumentDao<D> extends ElasticsearchRepository<D, String> { + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/XRefDocumentDao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/XRefDocumentDao.java new file mode 100644 index 0000000000000000000000000000000000000000..cbec752976beb793671896233bd1b154082cada9 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/XRefDocumentDao.java @@ -0,0 +1,12 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; + +import java.util.List; + + +public interface XRefDocumentDao extends DocumentDao<XRefDocumentVO> { + + List<XRefDocumentVO> findByLinkedResourcesID(String linkedResourcesID); + +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepository.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepository.java similarity index 79% rename from backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepository.java rename to backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepository.java index dd2514321070a863d41b3b919544926138f9d13e..ebe3e7e30c6081768d923f390492f01ee6305761 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepository.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepository.java @@ -1,11 +1,11 @@ -package fr.inra.urgi.faidare.repository.file; - -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.data.variable.OntologyVO; +package fr.inrae.urgi.faidare.dao.file; import java.util.List; import java.util.Set; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.domain.variable.OntologyVO; + /** * @author gcornut */ diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepositoryImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepositoryImpl.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepositoryImpl.java rename to backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepositoryImpl.java index c7175db985ec8820f7d913a29187f2b064be477f..91f07da3b774303ce20e225d494504378bc4a97f 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/file/CropOntologyRepositoryImpl.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/file/CropOntologyRepositoryImpl.java @@ -1,17 +1,4 @@ -package fr.inra.urgi.faidare.repository.file; - -import com.google.common.base.Strings; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.Lists; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrait; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.data.variable.OntologyVO; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Repository; -import org.springframework.web.client.RestTemplate; +package fr.inrae.urgi.faidare.dao.file; import java.util.ArrayList; import java.util.Arrays; @@ -22,12 +9,25 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import com.google.common.base.Strings; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.Lists; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.domain.variable.BrapiTrait; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.domain.variable.OntologyVO; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + /** * CropOntology variable ontology repository * * @author gcornut */ -@Repository +@Service public class CropOntologyRepositoryImpl implements CropOntologyRepository { private final Logger logger = Logger.getLogger(this.getClass().getSimpleName()); diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..612a5791f1a1150326f3e22c1bbc291b6f35708b --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeV1Dao.java @@ -0,0 +1,11 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeValueV1VO; + +import java.util.List; + +public interface GermplasmAttributeV1Dao extends DocumentDao<GermplasmAttributeV1VO> { + GermplasmAttributeV1VO getByGermplasmDbId(String germplasmDbId); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmPedigreeV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmPedigreeV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..f7022931184ce5d823bc0eeb40730a06f050c63f --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmPedigreeV1Dao.java @@ -0,0 +1,8 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmPedigreeV1VO; + +public interface GermplasmPedigreeV1Dao extends DocumentDao<GermplasmPedigreeV1VO> { + GermplasmPedigreeV1VO getByGermplasmDbId(String germplasmDbId); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..908404268eabb45733939b04a1b4ecf039836cdc --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1Dao.java @@ -0,0 +1,17 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; + +import java.util.Set; +import java.util.stream.Stream; + +public interface GermplasmV1Dao extends DocumentDao<GermplasmV1VO>, GermplasmV1DaoCustom { + + + GermplasmV1VO getByGermplasmDbId(String germplasmDbId); + + GermplasmV1VO getByGermplasmPUI(String germplasmPUI); + + Stream<GermplasmV1VO> findByGermplasmDbIdIn(Set<String> ids); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..e164bdaa81b2207e8a83e74bf49cef010565b61e --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustom.java @@ -0,0 +1,13 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.domain.brapi.GermplasmSitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import org.springframework.data.elasticsearch.core.SearchHitsIterator; + +import java.util.Set; +import java.util.stream.Stream; + +public interface GermplasmV1DaoCustom { + SearchHitsIterator<GermplasmV1VO> scrollGermplasmsByGermplasmDbIds(Set<String> germplasmDbIds, int fetchSize); + Stream<GermplasmSitemapVO> findAllForSitemap(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..30d55ef04105c739d96e8835991f1fc9bf835d86 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/GermplasmV1DaoCustomImpl.java @@ -0,0 +1,45 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.domain.brapi.GermplasmSitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.client.elc.NativeQuery; +import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder; +import org.springframework.data.elasticsearch.client.elc.Queries; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.data.elasticsearch.core.SearchHitsIterator; +import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.elasticsearch.core.query.CriteriaQueryBuilder; +import org.springframework.data.elasticsearch.core.query.FetchSourceFilterBuilder; + +import java.util.Set; +import java.util.stream.Stream; + +public class GermplasmV1DaoCustomImpl implements GermplasmV1DaoCustom{ + + @Autowired + private ElasticsearchOperations elasticsearchOperations; + + @Override + public SearchHitsIterator<GermplasmV1VO> scrollGermplasmsByGermplasmDbIds(Set<String> germplasmDbIds, int fetchSize) { + Criteria esCrit = new Criteria("germplasmDbId").in(germplasmDbIds); + CriteriaQuery criteriaQuery = new CriteriaQueryBuilder(esCrit).build(); + SearchHitsIterator<GermplasmV1VO> stream = elasticsearchOperations.searchForStream(criteriaQuery, GermplasmV1VO.class); + return stream; + } + + @Override + public Stream<GermplasmSitemapVO> findAllForSitemap() { + NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder(); + NativeQuery query = nativeQueryBuilder + .withQuery(builder -> builder.matchAll(Queries.matchAllQuery())) + .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("germplasmDbId").build()) + .build(); + return elasticsearchOperations.searchForStream(query, GermplasmSitemapVO.class, IndexCoordinates.of(GermplasmV1VO.INDEX_NAME)) + .stream() + .map(SearchHit::getContent); + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..64faa1157400402166cd941df66235b66edf2ea2 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1Dao.java @@ -0,0 +1,8 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.LocationVO; + +public interface LocationV1Dao extends DocumentDao<LocationVO>, LocationV1DaoCustom { + LocationVO getByLocationDbId(String locationDbId); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..b373b744bd3e96dc4288bcd9451227784aef02b5 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustom.java @@ -0,0 +1,13 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.domain.brapi.LocationSitemapVO; + +import java.util.stream.Stream; + +/** + * Custom methods of {@link LocationV1Dao} + * @author JB Nizet + */ +public interface LocationV1DaoCustom { + Stream<LocationSitemapVO> findAllForSitemap(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..978ce22a99f70986ec83739fcb27d0228aeca8f8 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/LocationV1DaoCustomImpl.java @@ -0,0 +1,32 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.brapi.LocationSitemapVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.client.elc.NativeQuery; +import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder; +import org.springframework.data.elasticsearch.client.elc.Queries; +import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; +import org.springframework.data.elasticsearch.core.query.FetchSourceFilterBuilder; + +import java.util.stream.Stream; + +public class LocationV1DaoCustomImpl implements LocationV1DaoCustom { + + @Autowired + private ElasticsearchTemplate esTemplate; + + @Override + public Stream<LocationSitemapVO> findAllForSitemap() { + NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder(); + NativeQuery query = nativeQueryBuilder + .withQuery(builder -> builder.matchAll(Queries.matchAllQuery())) + .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("locationDbId").build()) + .build(); + return esTemplate.searchForStream(query, LocationSitemapVO.class, IndexCoordinates.of(LocationVO.INDEX_NAME)) + .stream() + .map(SearchHit::getContent); + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..a7c58442287bea94c692e59186a9518c82059872 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1Dao.java @@ -0,0 +1,9 @@ +package fr.inrae.urgi.faidare.dao.v1; +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; + +public interface StudyV1Dao extends DocumentDao<StudyV1VO>, StudyV1DaoCustom { + + StudyV1VO getByStudyDbId(String studyDbId); + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..1a8024fa11215c158be96c2118351bfd45b5a931 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustom.java @@ -0,0 +1,16 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.v2.StudyCriteria; +import fr.inrae.urgi.faidare.domain.brapi.StudySitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import org.springframework.data.elasticsearch.core.SearchHits; + +import java.util.stream.Stream; + + +public interface StudyV1DaoCustom { + + SearchHits<StudyV2VO> findStudiesByCriteria(StudyCriteria studyCriteria); + + Stream<StudySitemapVO> findAllForSitemap(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5683d3eff4f540156fbc165c11a08d61a9122b74 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/StudyV1DaoCustomImpl.java @@ -0,0 +1,160 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.v2.StudyCriteria; +import fr.inrae.urgi.faidare.domain.brapi.StudySitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.client.elc.NativeQuery; +import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder; +import org.springframework.data.elasticsearch.client.elc.Queries; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.elasticsearch.core.query.CriteriaQueryBuilder; +import org.springframework.data.elasticsearch.core.query.FetchSourceFilterBuilder; + +import java.util.stream.Stream; + +public class StudyV1DaoCustomImpl implements StudyV1DaoCustom { + + @Autowired + private ElasticsearchTemplate esTemplate; + @Autowired + private ElasticsearchOperations elasticsearchOperations; + + @Override + public SearchHits<StudyV2VO> findStudiesByCriteria(StudyCriteria studyCriteria) { + + Criteria esCrit = new Criteria(); + + if (studyCriteria.getCommonCropNames() != null + && !studyCriteria.getCommonCropNames().isEmpty()) { + esCrit.and(new Criteria("commonCropName").in(studyCriteria.getCommonCropNames())); + } + + if (studyCriteria.getExternalReferenceIDs() != null + && !studyCriteria.getExternalReferenceIDs().isEmpty()) { + esCrit.and(new Criteria("externalReferenceIDs").in(studyCriteria.getExternalReferenceIDs())); + } + + if (studyCriteria.getExternalReferenceSources() != null + && !studyCriteria.getExternalReferenceSources().isEmpty()) { + esCrit.and(new Criteria("externalReferenceSources").in(studyCriteria.getExternalReferenceSources())); + } + + if (studyCriteria.getGermplasmDbIds() != null + && !studyCriteria.getGermplasmDbIds().isEmpty()) { + esCrit.and(new Criteria("germplasmDbIds").in(studyCriteria.getGermplasmDbIds())); + } + + if (studyCriteria.getGermplasmNames() != null + && !studyCriteria.getGermplasmNames().isEmpty()) { + esCrit.and(new Criteria("germplasmNames").in(studyCriteria.getGermplasmNames())); + } + + if (studyCriteria.getLocationDbIds() != null + && !studyCriteria.getLocationDbIds().isEmpty()) { + esCrit.and(new Criteria("locationDbIds").in(studyCriteria.getLocationDbIds())); + } + + if (studyCriteria.getLocationNames() != null + && !studyCriteria.getLocationNames().isEmpty()) { + esCrit.and(new Criteria("locationNames").in(studyCriteria.getLocationNames())); + } + + if (studyCriteria.getObservationVariableDbIds() != null + && !studyCriteria.getObservationVariableDbIds().isEmpty()) { + esCrit.and(new Criteria("observationVariableDbIds").in(studyCriteria.getObservationVariableDbIds())); + } + + if (studyCriteria.getObservationVariableNames() != null + && !studyCriteria.getObservationVariableNames().isEmpty()) { + esCrit.and(new Criteria("observationVariableNames").in(studyCriteria.getObservationVariableNames())); + } + + if (studyCriteria.getObservationVariablePUIs() != null + && !studyCriteria.getObservationVariablePUIs().isEmpty()) { + esCrit.and(new Criteria("observationVariablePUIs").in(studyCriteria.getObservationVariablePUIs())); + } + + if (studyCriteria.getProgramDbIds() != null + && !studyCriteria.getProgramDbIds().isEmpty()) { + esCrit.and(new Criteria("programDbIds").in(studyCriteria.getProgramDbIds())); + } + + if (studyCriteria.getProgramNames() != null + && !studyCriteria.getProgramNames().isEmpty()) { + esCrit.and(new Criteria("programNames").in(studyCriteria.getProgramNames())); + } + + if (studyCriteria.getSeasonDbIds() != null + && !studyCriteria.getSeasonDbIds().isEmpty()) { + esCrit.and(new Criteria("seasonDbIds").in(studyCriteria.getSeasonDbIds())); + } + + if (studyCriteria.getSortBy() != null + && !studyCriteria.getSortBy().isEmpty()) { + esCrit.and(new Criteria("sortBy").in(studyCriteria.getSortBy())); + } + + if (studyCriteria.getSortOrder() != null + && !studyCriteria.getSortOrder().isEmpty()) { + esCrit.and(new Criteria("sortOrder").in(studyCriteria.getSortOrder())); + } + + if (studyCriteria.getStudyCodes() != null + && !studyCriteria.getStudyCodes().isEmpty()) { + esCrit.and(new Criteria("studyCodes").in(studyCriteria.getStudyCodes())); + } + + if (studyCriteria.getStudyDbIds() != null + && !studyCriteria.getStudyDbIds().isEmpty()) { + esCrit.and(new Criteria("studyDbIds").in(studyCriteria.getStudyDbIds())); + } + + if (studyCriteria.getStudyNames() != null + && !studyCriteria.getStudyNames().isEmpty()) { + esCrit.and(new Criteria("studyNames").in(studyCriteria.getStudyNames())); + } + + if (studyCriteria.getStudyPUIs() != null + && !studyCriteria.getStudyPUIs().isEmpty()) { + esCrit.and(new Criteria("studyPUIs").in(studyCriteria.getStudyPUIs())); + } + + if (studyCriteria.getStudyTypes() != null + && !studyCriteria.getStudyTypes().isEmpty()) { + esCrit.and(new Criteria("studyTypes").in(studyCriteria.getStudyTypes())); + } + + if (studyCriteria.getTrialDbIds() != null + && !studyCriteria.getTrialDbIds().isEmpty()) { + esCrit.and(new Criteria("trialDbIds").in(studyCriteria.getTrialDbIds())); + } + + if (studyCriteria.getTrialNames() != null + && !studyCriteria.getTrialNames().isEmpty()) { + esCrit.and(new Criteria("trialNames").in(studyCriteria.getTrialNames())); + } + + CriteriaQuery criteriaQuery = new CriteriaQueryBuilder(esCrit).build(); + return esTemplate.search(criteriaQuery, StudyV2VO.class); + } + + @Override + public Stream<StudySitemapVO> findAllForSitemap() { + NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder(); + NativeQuery query = nativeQueryBuilder + .withQuery(builder -> builder.matchAll(Queries.matchAllQuery())) + .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("studyDbId").build()) + .build(); + return esTemplate.searchForStream(query, StudySitemapVO.class, IndexCoordinates.of(StudyV1VO.INDEX_NAME)) + .stream() + .map(SearchHit::getContent); + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/TrialV1Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/TrialV1Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..63254b9056316d184a478befbe937609029ed816 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v1/TrialV1Dao.java @@ -0,0 +1,8 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v1.TrialV1VO; + +public interface TrialV1Dao extends DocumentDao<TrialV1VO> { + TrialV1VO getByTrialDbId(String trialDbId); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..722b8eb70efdf857a1f2598d74a3857e02e10396 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2Dao.java @@ -0,0 +1,7 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.CollPopVO; + +public interface CollectionV2Dao extends DocumentDao<CollPopVO>, CollectionV2DaoCustom { +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..bc01248873e4e2252d1c4b1e9ec0a6b31e92172b --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustom.java @@ -0,0 +1,8 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.domain.CollPopVO; + +public interface CollectionV2DaoCustom { + BrapiListResponse<CollPopVO> getAllCollections(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..2a8ea951bfad5de2fa7e4f2ed127ab02172fb571 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/CollectionV2DaoCustomImpl.java @@ -0,0 +1,44 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import co.elastic.clients.elasticsearch._types.aggregations.Aggregation; +import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket; +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregation; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.client.elc.NativeQuery; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.Query; + +import java.util.ArrayList; +import java.util.List; + +public class CollectionV2DaoCustomImpl implements CollectionV2DaoCustom{ + @Autowired + private ElasticsearchTemplate esTemplate; + @Override + /** + * Mcok implementation, to be replaced with a real call to callPop index + */ + public BrapiListResponse<CollPopVO> getAllCollections() { + Query query= esTemplate.matchAllQuery(); + Query q = NativeQuery.builder() + .withAggregation("collection_name", Aggregation.of(a -> a.terms(ta -> ta.field("collection.name").size(10000)))) + //.withQuery(QueryBuilders.matchAllQueryAsQuery()) + .withMaxResults(0) + .build(); + SearchHits<GermplasmV2VO> sHits = esTemplate.search(q, GermplasmV2VO.class); + List<ElasticsearchAggregation> collPopAggregations = (List<ElasticsearchAggregation>) sHits.getAggregations().aggregations(); + + List<StringTermsBucket> b = collPopAggregations.get(0).aggregation().getAggregate().sterms().buckets().array(); + + BrapiListResponse<CollPopVO> response = new BrapiListResponse<CollPopVO>(); + List<CollPopVO> resultList = new ArrayList<CollPopVO>(); + b.forEach(collName -> resultList.add(new CollPopVO(collName.key().stringValue(), collName.key().stringValue()))); + response.getResult().setData(resultList); + response.getMetadata().getPagination().setTotalCount((resultList.size())); + return response; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmCriteria.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmCriteria.java new file mode 100644 index 0000000000000000000000000000000000000000..c0a0c2441b8503acefb48d121ae684a5bf441f65 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmCriteria.java @@ -0,0 +1,138 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import java.util.List; + +public class GermplasmCriteria { + + private List<String> accessionNumber; + private List<String> binomialNames; + private List<String> collections; + private List<String> commonCropNames; + private List<String> externalReferenceIDs; + private List<String> externalReferenceIds; + private List<String> externalReferenceSources; + private List<String> familyCodes; + private List<String> genus; + private List<String> germplasmDbIds; + private List<String> germplasmName; + private List<String> germplasmPUIs; + private List<String> instituteCodes; + private Integer page; + private Integer pageSize; + private List<String> parentDbIds; + private List<String> progenyDbIds; + private List<String> programDbIds; + private List<String> programNames; + private List<String> species; + private List<String> studyDbIds; + private List<String> studyNames; + private List<String> synonyms; + private List<String> trialDbIds; + private List<String> trialNames; + + + public List<String> getAccessionNumber() { return accessionNumber; } + + public void setAccessionNumber(List<String> accessionNumber) { this.accessionNumber = accessionNumber; } + + public List<String> getBinomialNames() { return binomialNames; } + + public void setBinomialNames(List<String> binomialNames) { this.binomialNames = binomialNames; } + + public List<String> getCollections() { return collections; } + + public void setCollections(List<String> collections) { this.collections = collections; } + + public List<String> getCommonCropNames() { return commonCropNames; } + + public void setCommonCropNames(List<String> commonCropNames) { this.commonCropNames = commonCropNames; } + + public List<String> getExternalReferenceIDs() { return externalReferenceIDs; } + + public void setExternalReferenceIDs(List<String> externalReferenceIDs) { this.externalReferenceIDs = externalReferenceIDs; } + + public List<String> getExternalReferenceIds() { return externalReferenceIds; } + + public void setExternalReferenceIds(List<String> externalReferenceIds) { this.externalReferenceIds = externalReferenceIds; } + + public List<String> getExternalReferenceSources() { return externalReferenceSources; } + + public void setExternalReferenceSources(List<String> externalReferenceSources) { this.externalReferenceSources = externalReferenceSources; } + + public List<String> getFamilyCodes() { return familyCodes; } + + public void setFamilyCodes(List<String> familyCodes) { this.familyCodes = familyCodes; } + + public List<String> getGenus() { return genus; } + + public void setGenus(List<String> genus) { this.genus = genus; } + + public List<String> getGermplasmDbIds() { return germplasmDbIds; } + + public void setGermplasmDbIds(List<String> germplasmDbIds) { this.germplasmDbIds = germplasmDbIds; } + + public List<String> getGermplasmName() { + return germplasmName; + } + + public void setGermplasmName(List<String> germplasmName) { + this.germplasmName = germplasmName; + } + + public List<String> getGermplasmPUIs() { return germplasmPUIs; } + + public void setGermplasmPUIs(List<String> germplasmPUIs) { this.germplasmPUIs = germplasmPUIs; } + + public List<String> getInstituteCodes() { return instituteCodes; } + + public void setInstituteCodes(List<String> instituteCodes) { this.instituteCodes = instituteCodes; } + + public Integer getPage() { return page; } + + public void setPage(Integer page) { this.page = page; } + + public Integer getPageSize() { return pageSize; } + + public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } + + public List<String> getParentDbIds() { return parentDbIds; } + + public void setParentDbIds(List<String> parentDbIds) { this.parentDbIds = parentDbIds; } + + public List<String> getProgenyDbIds() { return progenyDbIds; } + + public void setProgenyDbIds(List<String> progenyDbIds) { this.progenyDbIds = progenyDbIds; } + + public List<String> getProgramDbIds() { return programDbIds; } + + public void setProgramDbIds(List<String> programDbIds) { this.programDbIds = programDbIds; } + + public List<String> getProgramNames() { return programNames; } + + public void setProgramNames(List<String> programNames) { this.programNames = programNames; } + + public List<String> getSpecies() { return species; } + + public void setSpecies(List<String> species) { this.species = species; } + + public List<String> getStudyDbIds() { return studyDbIds; } + + public void setStudyDbIds(List<String> studyDbIds) { this.studyDbIds = studyDbIds; } + + public List<String> getStudyNames() { return studyNames; } + + public void setStudyNames(List<String> studyNames) { this.studyNames = studyNames; } + + public List<String> getSynonyms() { return synonyms; } + + public void setSynonyms(List<String> synonyms) { this.synonyms = synonyms; } + + public List<String> getTrialDbIds() { return trialDbIds; } + + public void setTrialDbIds(List<String> trialDbIds) { this.trialDbIds = trialDbIds; } + + public List<String> getTrialNames() { return trialNames; } + + public void setTrialNames(List<String> trialNames) { this.trialNames = trialNames; } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmMcpdDao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmMcpdDao.java new file mode 100644 index 0000000000000000000000000000000000000000..c2043f70d7d2a29216f0cc47327619b0013c9fdf --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmMcpdDao.java @@ -0,0 +1,20 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.GermplasmMcpdVO; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.Set; +import java.util.stream.Stream; + +public interface GermplasmMcpdDao extends DocumentDao<GermplasmMcpdVO> { + + Page<GermplasmMcpdVO> findByGermplasmDbId(String germplasmDbId, Pageable pageable); + + GermplasmMcpdVO getByGermplasmDbId(String germplasmDbId); + + GermplasmMcpdVO getByPUID(String germplasmPUI); + + Stream<GermplasmMcpdVO> findByGermplasmDbIdIn(Set<String> ids); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..09980ac0b51988f6ebffa640e7e090e7cfaa682d --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2Dao.java @@ -0,0 +1,13 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; + +public interface GermplasmV2Dao extends DocumentDao<GermplasmV2VO>, GermplasmV2DaoCustom { + + + GermplasmV2VO getByGermplasmDbId(String germplasmDbId); + + GermplasmV2VO getByGermplasmPUI(String germplasmPUI); + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..d9c25e69a7f4c72b8b7556a5b70a12f798beb995 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustom.java @@ -0,0 +1,9 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; + +public interface GermplasmV2DaoCustom { + BrapiListResponse<GermplasmV2VO> findGermplasmsByCriteria(GermplasmCriteria germplasmCriteria); + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9059d778b5424520c5cdd526a4d3c9187d7e81fe --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/GermplasmV2DaoCustomImpl.java @@ -0,0 +1,160 @@ +package fr.inrae.urgi.faidare.dao.v2; +//https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/searching.html +//https://www.baeldung.com/spring-data-criteria-queries +//https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.single-repository-behavior +//https://www.baeldung.com/spring-data-elasticsearch-queries + +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.elasticsearch.core.query.CriteriaQueryBuilder; + + +public class GermplasmV2DaoCustomImpl implements GermplasmV2DaoCustom { + + @Autowired + private ElasticsearchTemplate esTemplate; + + @Override + public BrapiListResponse<GermplasmV2VO> findGermplasmsByCriteria(GermplasmCriteria germplasmCriteria) { + + Criteria esCrit = new Criteria(); + + //TODO Dull and oververbose test, should find a lib or a java 11 method here + if(germplasmCriteria.getAccessionNumber() != null + && !germplasmCriteria.getAccessionNumber().isEmpty()){ + esCrit.and(new Criteria("accessionNumber").in(germplasmCriteria.getAccessionNumber())); + } + + if(germplasmCriteria.getBinomialNames() != null + && !germplasmCriteria.getBinomialNames().isEmpty()){ + esCrit.and(new Criteria("genusSpecies").in(germplasmCriteria.getBinomialNames())); + } + + if(germplasmCriteria.getCollections() != null + && !germplasmCriteria.getCollections().isEmpty()){ + Criteria collPopCrit = new Criteria(); + Criteria panelCrit = new Criteria("panel.name").in(germplasmCriteria.getCollections()); + Criteria popCrit = new Criteria("population.name").in(germplasmCriteria.getCollections()); + Criteria collCrit = new Criteria("collection.name").in(germplasmCriteria.getCollections()); + collPopCrit.or("panel.name").in(germplasmCriteria.getCollections()); + esCrit.subCriteria(popCrit.or(panelCrit).or(collCrit)); + } + + if(germplasmCriteria.getCommonCropNames() != null + && !germplasmCriteria.getCommonCropNames().isEmpty()){ + esCrit.and(new Criteria("commonCropName").in(germplasmCriteria.getCommonCropNames())); + } + + if(germplasmCriteria.getExternalReferenceIDs() != null + && !germplasmCriteria.getExternalReferenceIDs().isEmpty()){ + esCrit.and(new Criteria("externalReferenceIDs").in(germplasmCriteria.getExternalReferenceIDs())); + } + + if(germplasmCriteria.getExternalReferenceIds() != null + && !germplasmCriteria.getExternalReferenceIds().isEmpty()){ + esCrit.and(new Criteria("externalReferenceIds").in(germplasmCriteria.getExternalReferenceIds())); + } + + if(germplasmCriteria.getExternalReferenceSources() != null + && !germplasmCriteria.getExternalReferenceSources().isEmpty()){ + esCrit.and(new Criteria("externalReferenceSources").in(germplasmCriteria.getExternalReferenceSources())); + } + + if(germplasmCriteria.getFamilyCodes() != null + && !germplasmCriteria.getFamilyCodes().isEmpty()){ + esCrit.and(new Criteria("familyCodes").in(germplasmCriteria.getFamilyCodes())); + } + + if(germplasmCriteria.getGenus() != null + && !germplasmCriteria.getGenus().isEmpty()){ + esCrit.and(new Criteria("genus").in(germplasmCriteria.getGenus())); + } + + if(germplasmCriteria.getGermplasmDbIds() != null + && !germplasmCriteria.getGermplasmDbIds().isEmpty()){ + esCrit.and(new Criteria("germplasmDbId").in(germplasmCriteria.getGermplasmDbIds())); + } + + if(germplasmCriteria.getGermplasmName() != null + && !germplasmCriteria.getGermplasmName().isEmpty()){ + esCrit.and(new Criteria("germplasmName").in(germplasmCriteria.getGermplasmName())); + } + + if(germplasmCriteria.getGermplasmPUIs() != null + && !germplasmCriteria.getGermplasmPUIs().isEmpty()){ + esCrit.and(new Criteria("germplasmPUI").in(germplasmCriteria.getGermplasmPUIs())); + } + + if(germplasmCriteria.getInstituteCodes() != null + && !germplasmCriteria.getInstituteCodes().isEmpty()){ + esCrit.and(new Criteria("instituteCode").in(germplasmCriteria.getInstituteCodes())); + } + + if(germplasmCriteria.getParentDbIds() != null + && !germplasmCriteria.getParentDbIds().isEmpty()){ + esCrit.and(new Criteria("parentDbIds").in(germplasmCriteria.getParentDbIds())); + } + + if(germplasmCriteria.getProgenyDbIds() != null + && !germplasmCriteria.getProgenyDbIds().isEmpty()){ + esCrit.and(new Criteria("progenyDbIds").in(germplasmCriteria.getProgenyDbIds())); + } + + if(germplasmCriteria.getProgramDbIds() != null + && !germplasmCriteria.getProgramDbIds().isEmpty()){ + esCrit.and(new Criteria("programDbIds").in(germplasmCriteria.getProgramDbIds())); + } + + if(germplasmCriteria.getProgramNames() != null + && !germplasmCriteria.getProgramNames().isEmpty()){ + esCrit.and(new Criteria("programNames").in(germplasmCriteria.getProgramNames())); + } + + if(germplasmCriteria.getSpecies() != null + && !germplasmCriteria.getSpecies().isEmpty()){ + esCrit.and(new Criteria("species").in(germplasmCriteria.getSpecies())); + } + + if(germplasmCriteria.getStudyDbIds() != null + && !germplasmCriteria.getStudyDbIds().isEmpty()){ + esCrit.and(new Criteria("studyDbIds").in(germplasmCriteria.getStudyDbIds())); + } + + if(germplasmCriteria.getStudyNames() != null + && !germplasmCriteria.getStudyNames().isEmpty()){ + esCrit.and(new Criteria("studyNames").in(germplasmCriteria.getStudyNames())); + } + + if(germplasmCriteria.getSynonyms() != null + && !germplasmCriteria.getSynonyms().isEmpty()){ + esCrit.and(new Criteria("synonyms").in(germplasmCriteria.getSynonyms())); + } + + if(germplasmCriteria.getTrialDbIds() != null + && !germplasmCriteria.getTrialDbIds().isEmpty()){ + esCrit.and(new Criteria("trialDbIds").in(germplasmCriteria.getTrialDbIds())); + } + + if(germplasmCriteria.getTrialNames() != null + && !germplasmCriteria.getTrialNames().isEmpty()){ + esCrit.and(new Criteria("trialNames").in(germplasmCriteria.getTrialNames())); + } + + + CriteriaQuery criteriaQuery = new CriteriaQueryBuilder(esCrit).build(); + + criteriaQuery.setPageable(PageRequest.of(germplasmCriteria.getPage() !=null ? germplasmCriteria.getPage() : 0, + germplasmCriteria.getPageSize() !=null ? germplasmCriteria.getPageSize() : 10)); + SearchHits<GermplasmV2VO> searchHits = esTemplate.search(criteriaQuery, GermplasmV2VO.class); + return BrapiListResponse.brapiResponseForPageOf(searchHits, criteriaQuery.getPageable()); + + } + + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyCriteria.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyCriteria.java new file mode 100644 index 0000000000000000000000000000000000000000..3ff9d6d5083db1aff94647a05ca35897b0bd0dc0 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyCriteria.java @@ -0,0 +1,118 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import java.util.List; + +public class StudyCriteria { + + private List<String> commonCropNames; + private List<String> externalReferenceIDs; + private List<String> externalReferenceSources; + private List<String> germplasmDbIds; + private List<String> germplasmNames; + private List<String> locationDbIds; + private List<String> locationNames; + private List<String> observationVariableDbIds; + private List<String> observationVariableNames; + private List<String> observationVariablePUIs; + private List<String> programDbIds; + private List<String> programNames; + private List<String> seasonDbIds; + private List<String> sortBy; + private List<String> sortOrder; + private List<String> studyCodes; + private List<String> studyDbIds; + private List<String> studyNames; + private List<String> studyPUIs; + private List<String> studyTypes; + private List<String> trialDbIds; + private List<String> trialNames; + + + public List<String> getCommonCropNames() { return commonCropNames; } + + public void setCommonCropNames(List<String> commonCropNames) { this.commonCropNames = commonCropNames; } + + public List<String> getExternalReferenceIDs() { return externalReferenceIDs; } + + public void setExternalReferenceIDs(List<String> externalReferenceIDs) { this.externalReferenceIDs = externalReferenceIDs; } + + public List<String> getExternalReferenceSources() { return externalReferenceSources; } + + public void setExternalReferenceSources(List<String> externalReferenceSources) { this.externalReferenceSources = externalReferenceSources; } + + public List<String> getGermplasmDbIds() { return germplasmDbIds; } + + public void setGermplasmDbIds(List<String> germplasmDbIds) { this.germplasmDbIds = germplasmDbIds; } + + public List<String> getGermplasmNames() { return germplasmNames; } + + public void setGermplasmNames(List<String> germplasmNames) { this.germplasmNames = germplasmNames; } + + public List<String> getLocationDbIds() { return locationDbIds; } + + public void setLocationDbIds(List<String> locationDbIds) { this.locationDbIds = locationDbIds; } + + public List<String> getLocationNames() { return locationNames; } + + public void setLocationNames(List<String> locationNames) { this.locationNames = locationNames; } + + public List<String> getObservationVariableDbIds() { return observationVariableDbIds; } + + public void setObservationVariableDbIds(List<String> observationVariableDbIds) { this.observationVariableDbIds = observationVariableDbIds; } + + public List<String> getObservationVariableNames() { return observationVariableNames; } + + public void setObservationVariableNames(List<String> observationVariableNames) { this.observationVariableNames = observationVariableNames; } + + public List<String> getObservationVariablePUIs() { return observationVariablePUIs; } + + public void setObservationVariablePUIs(List<String> observationVariablePUIs) { this.observationVariablePUIs = observationVariablePUIs; } + + public List<String> getProgramDbIds() { return programDbIds; } + + public void setProgramDbIds(List<String> programDbIds) { this.programDbIds = programDbIds; } + + public List<String> getProgramNames() { return programNames; } + + public void setProgramNames(List<String> programNames) { this.programNames = programNames; } + + public List<String> getSeasonDbIds() { return seasonDbIds; } + + public void setSeasonDbIds(List<String> seasonDbIds) { this.seasonDbIds = seasonDbIds; } + + public List<String> getSortBy() { return sortBy; } + + public void setSortBy(List<String> sortBy) { this.sortBy = sortBy; } + + public List<String> getSortOrder() { return sortOrder; } + + public void setSortOrder(List<String> sortOrder) { this.sortOrder = sortOrder; } + + public List<String> getStudyCodes() { return studyCodes; } + + public void setStudyCodes(List<String> studyCodes) { this.studyCodes = studyCodes; } + + public List<String> getStudyDbIds() { return studyDbIds; } + + public void setStudyDbIds(List<String> studyDbIds) { this.studyDbIds = studyDbIds; } + + public List<String> getStudyNames() { return studyNames; } + + public void setStudyNames(List<String> studyNames) { this.studyNames = studyNames; } + + public List<String> getStudyPUIs() { return studyPUIs; } + + public void setStudyPUIs(List<String> studyPUIs) { this.studyPUIs = studyPUIs; } + + public List<String> getStudyTypes() { return studyTypes; } + + public void setStudyTypes(List<String> studyTypes) { this.studyTypes = studyTypes; } + + public List<String> getTrialDbIds() { return trialDbIds; } + + public void setTrialDbIds(List<String> trialDbIds) { this.trialDbIds = trialDbIds; } + + public List<String> getTrialNames() { return trialNames; } + + public void setTrialNames(List<String> trialNames) { this.trialNames = trialNames; } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2Dao.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2Dao.java new file mode 100644 index 0000000000000000000000000000000000000000..5139089d01f9dd538f0e3eab13953bbf283ff2ba --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2Dao.java @@ -0,0 +1,9 @@ +package fr.inrae.urgi.faidare.dao.v2; +import fr.inrae.urgi.faidare.dao.DocumentDao; +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; + +public interface StudyV2Dao extends DocumentDao<StudyV2VO>, StudyV2DaoCustom { + + StudyV2VO getByStudyDbId(String studyDbId); + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustom.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..cfb9a7416d338ba2c8f6221cfa67db0c82d63715 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustom.java @@ -0,0 +1,10 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import org.springframework.data.elasticsearch.core.SearchHits; + + +public interface StudyV2DaoCustom { + + SearchHits<StudyV2VO> findStudiesByCriteria(StudyCriteria studyCriteria); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustomImpl.java b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustomImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b9b2e319213e0ce6d80ce610c063f549baceed45 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/dao/v2/StudyV2DaoCustomImpl.java @@ -0,0 +1,135 @@ +package fr.inrae.urgi.faidare.dao.v2; + +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.Criteria; +import org.springframework.data.elasticsearch.core.query.CriteriaQuery; +import org.springframework.data.elasticsearch.core.query.CriteriaQueryBuilder; + +public class StudyV2DaoCustomImpl implements StudyV2DaoCustom { + + @Autowired + private ElasticsearchTemplate esTemplate; + + @Override + public SearchHits<StudyV2VO> findStudiesByCriteria(StudyCriteria studyCriteria) { + + Criteria esCrit = new Criteria(); + + if (studyCriteria.getCommonCropNames() != null + && !studyCriteria.getCommonCropNames().isEmpty()) { + esCrit.and(new Criteria("commonCropName").in(studyCriteria.getCommonCropNames())); + } + + if (studyCriteria.getExternalReferenceIDs() != null + && !studyCriteria.getExternalReferenceIDs().isEmpty()) { + esCrit.and(new Criteria("externalReferenceIDs").in(studyCriteria.getExternalReferenceIDs())); + } + + if (studyCriteria.getExternalReferenceSources() != null + && !studyCriteria.getExternalReferenceSources().isEmpty()) { + esCrit.and(new Criteria("externalReferenceSources").in(studyCriteria.getExternalReferenceSources())); + } + + if (studyCriteria.getGermplasmDbIds() != null + && !studyCriteria.getGermplasmDbIds().isEmpty()) { + esCrit.and(new Criteria("germplasmDbIds").in(studyCriteria.getGermplasmDbIds())); + } + + if (studyCriteria.getGermplasmNames() != null + && !studyCriteria.getGermplasmNames().isEmpty()) { + esCrit.and(new Criteria("germplasmNames").in(studyCriteria.getGermplasmNames())); + } + + if (studyCriteria.getLocationDbIds() != null + && !studyCriteria.getLocationDbIds().isEmpty()) { + esCrit.and(new Criteria("locationDbId").in(studyCriteria.getLocationDbIds())); + } + + if (studyCriteria.getLocationNames() != null + && !studyCriteria.getLocationNames().isEmpty()) { + esCrit.and(new Criteria("locationName").in(studyCriteria.getLocationNames())); + } + + if (studyCriteria.getObservationVariableDbIds() != null + && !studyCriteria.getObservationVariableDbIds().isEmpty()) { + esCrit.and(new Criteria("observationVariableDbIds").in(studyCriteria.getObservationVariableDbIds())); + } + + if (studyCriteria.getObservationVariableNames() != null + && !studyCriteria.getObservationVariableNames().isEmpty()) { + esCrit.and(new Criteria("observationVariableNames").in(studyCriteria.getObservationVariableNames())); + } + + if (studyCriteria.getObservationVariablePUIs() != null + && !studyCriteria.getObservationVariablePUIs().isEmpty()) { + esCrit.and(new Criteria("observationVariablePUIs").in(studyCriteria.getObservationVariablePUIs())); + } + + if (studyCriteria.getProgramDbIds() != null + && !studyCriteria.getProgramDbIds().isEmpty()) { + esCrit.and(new Criteria("programDbId").in(studyCriteria.getProgramDbIds())); + } + + if (studyCriteria.getProgramNames() != null + && !studyCriteria.getProgramNames().isEmpty()) { + esCrit.and(new Criteria("programName").in(studyCriteria.getProgramNames())); + } + + if (studyCriteria.getSeasonDbIds() != null + && !studyCriteria.getSeasonDbIds().isEmpty()) { + esCrit.and(new Criteria("seasonDbIds").in(studyCriteria.getSeasonDbIds())); + } + + if (studyCriteria.getSortBy() != null + && !studyCriteria.getSortBy().isEmpty()) { + esCrit.and(new Criteria("sortBy").in(studyCriteria.getSortBy())); + } + + if (studyCriteria.getSortOrder() != null + && !studyCriteria.getSortOrder().isEmpty()) { + esCrit.and(new Criteria("sortOrder").in(studyCriteria.getSortOrder())); + } + + if (studyCriteria.getStudyCodes() != null + && !studyCriteria.getStudyCodes().isEmpty()) { + esCrit.and(new Criteria("studyCode").in(studyCriteria.getStudyCodes())); + } + + if (studyCriteria.getStudyDbIds() != null + && !studyCriteria.getStudyDbIds().isEmpty()) { + esCrit.and(new Criteria("studyDbId").in(studyCriteria.getStudyDbIds())); + } + + if (studyCriteria.getStudyNames() != null + && !studyCriteria.getStudyNames().isEmpty()) { + esCrit.and(new Criteria("studyName").in(studyCriteria.getStudyNames())); + } + + if (studyCriteria.getStudyPUIs() != null + && !studyCriteria.getStudyPUIs().isEmpty()) { + esCrit.and(new Criteria("studyPUI").in(studyCriteria.getStudyPUIs())); + } + + if (studyCriteria.getStudyTypes() != null + && !studyCriteria.getStudyTypes().isEmpty()) { + esCrit.and(new Criteria("studyType").in(studyCriteria.getStudyTypes())); + } + + if (studyCriteria.getTrialDbIds() != null + && !studyCriteria.getTrialDbIds().isEmpty()) { + esCrit.and(new Criteria("trialDbId").in(studyCriteria.getTrialDbIds())); + } + + if (studyCriteria.getTrialNames() != null + && !studyCriteria.getTrialNames().isEmpty()) { + esCrit.and(new Criteria("trialName").in(studyCriteria.getTrialNames())); + } + + CriteriaQuery criteriaQuery = new CriteriaQueryBuilder(esCrit).build(); + return esTemplate.search(criteriaQuery, StudyV2VO.class); + } + +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPopVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/CollPopVO.java similarity index 61% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPopVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/CollPopVO.java index 4b62dfc16a6b50117134d15e4b63740a335e6b81..b76386e2fd19cd3150dec43ad6569b13c54d26da 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollPopVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/CollPopVO.java @@ -1,30 +1,54 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import java.io.Serializable; +import org.springframework.data.elasticsearch.annotations.Document; -/** - * @author C. Michotey - */ -public class CollPopVO implements Serializable, CollPop { +@Document( + indexName = "faidare_germplasm_dev-group0", + //indexName = "faidare_germplasm_beta-group0", + createIndex = false +) +public class CollPopVO { - private static final long serialVersionUID = 4254257487619614493L; + private Integer germplasmCount; + + private PuiNameValueVO germplasmRef; + + private String id; - private Long id; private String name; + private String type; - private Integer germplasmCount; - private PuiNameValueVO germplasmRef; - @Override - public Long getId() { + public CollPopVO(String name, String id) { + this.name = name; + this.id = id; + } + + + public Integer getGermplasmCount() { + return germplasmCount; + } + + public void setGermplasmCount(Integer germplasmCount) { + this.germplasmCount = germplasmCount; + } + + public PuiNameValueVO getGermplasmRef() { + return germplasmRef; + } + + public void setGermplasmRef(PuiNameValueVO germplasmRef) { + this.germplasmRef = germplasmRef; + } + + public String getId() { return id; } - public void setId(Long id) { + public void setId(String id) { this.id = id; } - @Override public String getName() { return name; } @@ -33,7 +57,6 @@ public class CollPopVO implements Serializable, CollPop { this.name = name; } - @Override public String getType() { return type; } @@ -41,23 +64,4 @@ public class CollPopVO implements Serializable, CollPop { public void setType(String type) { this.type = type; } - - @Override - public PuiNameValueVO getGermplasmRef() { - return germplasmRef; - } - - public void setGermplasmRef(PuiNameValueVO germplasmRef) { - this.germplasmRef = germplasmRef; - } - - @Override - public Integer getGermplasmCount() { - return germplasmCount; - } - - public void setGermplasmCount(Integer germplasmCount) { - this.germplasmCount = germplasmCount; - } - } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/ContactVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ContactVO.java similarity index 74% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/ContactVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/ContactVO.java index dc381f5c433910f0f37673a6d108ab9dcd6514e3..e06a01a30762d9d40901be6fddb1536756d0a67f 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/ContactVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ContactVO.java @@ -1,71 +1,66 @@ -package fr.inra.urgi.faidare.domain.data; +package fr.inrae.urgi.faidare.domain; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiContact; - -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public class ContactVO implements BrapiContact { +public class ContactVO { private String contactDbId; - private String name; + private String email; - private String type; + private String instituteName; + + private String name; + private String orcid; - @Override + private String type; + + public String getContactDbId() { return contactDbId; } - @Override - public String getName() { - return name; + public void setContactDbId(String contactDbId) { + this.contactDbId = contactDbId; } - @Override public String getEmail() { return email; } - @Override - public String getType() { - return type; + public void setEmail(String email) { + this.email = email; } - @Override public String getInstituteName() { return instituteName; } - @Override - public String getOrcid() { - return orcid; + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; } - public void setContactDbId(String contactDbId) { - this.contactDbId = contactDbId; + public String getName() { + return name; } public void setName(String name) { this.name = name; } - public void setEmail(String email) { - this.email = email; + public String getOrcid() { + return orcid; } - public void setType(String type) { - this.type = type; + public void setOrcid(String orcid) { + this.orcid = orcid; } - public void setInstituteName(String instituteName) { - this.instituteName = instituteName; + public String getType() { + return type; } - public void setOrcid(String orcid) { - this.orcid = orcid; + public void setType(String type) { + this.type = type; } + } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/CoordinatesVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/CoordinatesVO.java new file mode 100644 index 0000000000000000000000000000000000000000..29469de8cca18dcb2690e6f4a20b84285971f7ba --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/CoordinatesVO.java @@ -0,0 +1,25 @@ +package fr.inrae.urgi.faidare.domain; + +public class CoordinatesVO { + + private String geometry; // A geometry as defined by GeoJSON + + private String type; + + + public String getGeometry() { + return geometry; + } + + public void setGeometry(String geometry) { + this.geometry = geometry; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/DataLinksVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DataLinksVO.java new file mode 100644 index 0000000000000000000000000000000000000000..898afa7112ff8ef756ab8b050e1ec2b257d07726 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DataLinksVO.java @@ -0,0 +1,85 @@ +package fr.inrae.urgi.faidare.domain; + +public class DataLinksVO { + + private String dataFormat; + + private String description; + + private String fileFormat; + + private String name; + + private String provenance; + + private String scientificType; + + private String url; + + private String version; + + + public String getDataFormat() { + return dataFormat; + } + + public void setDataFormat(String dataFormat) { + this.dataFormat = dataFormat; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFileFormat() { + return fileFormat; + } + + public void setFileFormat(String fileFormat) { + this.fileFormat = fileFormat; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProvenance() { + return provenance; + } + + public void setProvenance(String provenance) { + this.provenance = provenance; + } + + public String getScientificType() { + return scientificType; + } + + public void setScientificType(String scientificType) { + this.scientificType = scientificType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorInfoVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorInfoVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ab94c49c83cd4e7e4bb336e4ac59be5c85d9e10f --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorInfoVO.java @@ -0,0 +1,4 @@ +package fr.inrae.urgi.faidare.domain; + +public interface DonorInfoVO { +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorVO.java similarity index 71% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorVO.java index 9c8af10982aef2bed5ba882772e26803cc39e5b5..6f7f1fae22d146e7949e5ebf2ee89c8fff906758 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/DonorVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/DonorVO.java @@ -1,30 +1,26 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmDonor; +public class DonorVO { -import java.io.Serializable; + private Integer donationDate; //GnpIS -public class DonorVO implements Serializable, BrapiGermplasmDonor { + private String donorAccessionNumber; - private static final long serialVersionUID = 7976964107440923573L; + private String donorGermplasmPUI; //GnpIS + + private InstituteVO donorInstitute; //GnpIS - private String donorGermplasmPUI; - private String donorAccessionNumber; private String donorInstituteCode; - private Integer donationDate; - private InstituteVO donorInstitute; - @Override - public String getDonorGermplasmPUI() { - return donorGermplasmPUI; + public Integer getDonationDate() { + return donationDate; } - public void setDonorGermplasmPUI(String donorGermplasmPUI) { - this.donorGermplasmPUI = donorGermplasmPUI; + public void setDonationDate(Integer donationDate) { + this.donationDate = donationDate; } - @Override public String getDonorAccessionNumber() { return donorAccessionNumber; } @@ -33,16 +29,14 @@ public class DonorVO implements Serializable, BrapiGermplasmDonor { this.donorAccessionNumber = donorAccessionNumber; } - @Override - public String getDonorInstituteCode() { - return donorInstituteCode; + public String getDonorGermplasmPUI() { + return donorGermplasmPUI; } - public void setDonorInstituteCode(String donorInstituteCode) { - this.donorInstituteCode = donorInstituteCode; + public void setDonorGermplasmPUI(String donorGermplasmPUI) { + this.donorGermplasmPUI = donorGermplasmPUI; } - public InstituteVO getDonorInstitute() { return donorInstitute; } @@ -51,14 +45,12 @@ public class DonorVO implements Serializable, BrapiGermplasmDonor { this.donorInstitute = donorInstitute; } - - public Integer getDonationDate() { - return donationDate; + public String getDonorInstituteCode() { + return donorInstituteCode; } - public void setDonationDate(Integer donationDate) { - this.donationDate = donationDate; + public void setDonorInstituteCode(String donorInstituteCode) { + this.donorInstituteCode = donorInstituteCode; } - } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/EnvironmentParametersVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/EnvironmentParametersVO.java new file mode 100644 index 0000000000000000000000000000000000000000..38ddc18c89bd2a463d63b6971ad68f6a6ebaf3c2 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/EnvironmentParametersVO.java @@ -0,0 +1,75 @@ +package fr.inrae.urgi.faidare.domain; + +public class EnvironmentParametersVO { + + private String description; + + private String parameterName; + + private String parameterPUI; + + private String unit; + + private String unitPUI; + + private String value; + + private String valuePUI; + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getParameterName() { + return parameterName; + } + + public void setParameterName(String parameterName) { + this.parameterName = parameterName; + } + + public String getParameterPUI() { + return parameterPUI; + } + + public void setParameterPUI(String parameterPUI) { + this.parameterPUI = parameterPUI; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public String getUnitPUI() { + return unitPUI; + } + + public void setUnitPUI(String unitPUI) { + this.unitPUI = unitPUI; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getValuePUI() { + return valuePUI; + } + + public void setValuePUI(String valuePUI) { + this.valuePUI = valuePUI; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/ExternalReferencesVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ExternalReferencesVO.java new file mode 100644 index 0000000000000000000000000000000000000000..47be6e519f264b9d363c839a9f52ba42e5d2866e --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ExternalReferencesVO.java @@ -0,0 +1,26 @@ +package fr.inrae.urgi.faidare.domain; + +public class ExternalReferencesVO { + + private String referenceId; + + private String referenceSource; + + + public String getReferenceId() { + return referenceId; + } + + public void setReferenceId(String referenceId) { + this.referenceId = referenceId; + } + + public String getReferenceSource() { + return referenceSource; + } + + public void setReferenceSource(String referenceSource) { + this.referenceSource = referenceSource; + } + +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GenealogyVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GenealogyVO.java similarity index 80% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GenealogyVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/GenealogyVO.java index 4b4dcfa868af2540f51cace3756d7413fd8d0061..af3548eeefb78bb5d877ce65c1597ca7529f3807 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GenealogyVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GenealogyVO.java @@ -1,29 +1,29 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - +package fr.inrae.urgi.faidare.domain; import java.util.List; -/** - * @author C. Michotey - */ -public class GenealogyVO implements java.io.Serializable, Genealogy { - - private static final long serialVersionUID = 1875115652278653927L; +public class GenealogyVO { private String crossingPlan; + private String crossingYear; + private String familyCode; private String firstParentName; + private String firstParentPUI; + private String firstParentType; private String secondParentName; + private String secondParentPUI; + private String secondParentType; - private List<PuiNameValueVO> sibblings; // puid + name + private List<PuiNameValueVO> sibblings; + - @Override public String getCrossingPlan() { return crossingPlan; } @@ -32,7 +32,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.crossingPlan = crossingPlan; } - @Override public String getCrossingYear() { return crossingYear; } @@ -41,7 +40,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.crossingYear = crossingYear; } - @Override public String getFamilyCode() { return familyCode; } @@ -50,7 +48,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.familyCode = familyCode; } - @Override public String getFirstParentName() { return firstParentName; } @@ -59,16 +56,14 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.firstParentName = firstParentName; } - @Override public String getFirstParentPUI() { return firstParentPUI; } - public void setFirstParentPUI(String fisrtParentPUI) { - this.firstParentPUI = fisrtParentPUI; + public void setFirstParentPUI(String firstParentPUI) { + this.firstParentPUI = firstParentPUI; } - @Override public String getFirstParentType() { return firstParentType; } @@ -77,7 +72,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.firstParentType = firstParentType; } - @Override public String getSecondParentName() { return secondParentName; } @@ -86,7 +80,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.secondParentName = secondParentName; } - @Override public String getSecondParentPUI() { return secondParentPUI; } @@ -95,7 +88,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.secondParentPUI = secondParentPUI; } - @Override public String getSecondParentType() { return secondParentType; } @@ -104,7 +96,6 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { this.secondParentType = secondParentType; } - @Override public List<PuiNameValueVO> getSibblings() { return sibblings; } @@ -112,5 +103,4 @@ public class GenealogyVO implements java.io.Serializable, Genealogy { public void setSibblings(List<PuiNameValueVO> sibblings) { this.sibblings = sibblings; } - } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingInfo.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..e3732fcaf5dbe61da975f36ab00db81a1fb63294 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingInfo.java @@ -0,0 +1,13 @@ +package fr.inrae.urgi.faidare.domain; + +import java.util.List; + +public interface GermplasmCollectingInfo { + List<? extends GermplasmInstitute> getCollectingInstitutes(); + + String getCollectingMissionIdentifier(); + + String getCollectingNumber(); + + GermplasmCollectingSite getCollectingSite(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingSite.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingSite.java new file mode 100644 index 0000000000000000000000000000000000000000..5a5a59d41aee881e2356c81ef43fe6e0cac826e5 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmCollectingSite.java @@ -0,0 +1,30 @@ +package fr.inrae.urgi.faidare.domain; + +public interface GermplasmCollectingSite { + + String getCoordinateUncertainty(); + + + String getElevation(); + + + String getGeoreferencingMethod(); + + + String getLatitudeDecimal(); + + + String getLatitudeDegrees(); + + + String getLocationDescription(); + + + String getLongitudeDecimal(); + + + String getLongitudeDegrees(); + + + String getSpatialReferenceSystem(); +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmDonor.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmDonor.java new file mode 100644 index 0000000000000000000000000000000000000000..b5836ea0de53ee5b73799d22c6e50765176cb9bb --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmDonor.java @@ -0,0 +1,4 @@ +package fr.inrae.urgi.faidare.domain; + +public interface GermplasmDonor { +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstitute.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstitute.java new file mode 100644 index 0000000000000000000000000000000000000000..61eea3769ade0576d18641c98c2b6518fe982459 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstitute.java @@ -0,0 +1,7 @@ +package fr.inrae.urgi.faidare.domain; + +public interface GermplasmInstitute { + String getInstituteName(); + + String getInstituteCode(); +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstituteVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstituteVO.java similarity index 81% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstituteVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstituteVO.java index 33d5be7f049c37f17965bc367c123f5166671685..21d3b3a761e352673009c436c7c75425f99de3ed 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmInstituteVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmInstituteVO.java @@ -1,56 +1,26 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import java.io.Serializable; +public class GermplasmInstituteVO { -/** - * @author C. Michotey - */ -public class GermplasmInstituteVO implements Serializable, GermplasmInstitute { - - private static final long serialVersionUID = 7976964107440923573L; - - public static long getSerialVersionUID() { - return serialVersionUID; - } + private Integer accessionCreationDate; - private InstituteVO institute; - private String germplasmPUI; private String accessionNumber; - private Integer accessionCreationDate; - private String materialType; + private String collectors; - private Integer registrationYear; + private Integer deregistrationYear; - private String distributionStatus; - @Override - public InstituteVO getInstitute() { - return institute; - } + private String distributionStatus; - public void setInstitute(InstituteVO institute) { - this.institute = institute; - } + private String germplasmPUI; - @Override - public String getGermplasmPUI() { - return germplasmPUI; - } + private InstituteVO institute; - public void setGermplasmPUI(String germplasmPUI) { - this.germplasmPUI = germplasmPUI; - } + private String materialType; - @Override - public String getAccessionNumber() { - return accessionNumber; - } + private Integer registrationYear; - public void setAccessionNumber(String accessionNumber) { - this.accessionNumber = accessionNumber; - } - @Override public Integer getAccessionCreationDate() { return accessionCreationDate; } @@ -59,16 +29,14 @@ public class GermplasmInstituteVO implements Serializable, GermplasmInstitute { this.accessionCreationDate = accessionCreationDate; } - @Override - public String getMaterialType() { - return materialType; + public String getAccessionNumber() { + return accessionNumber; } - public void setMaterialType(String materialType) { - this.materialType = materialType; + public void setAccessionNumber(String accessionNumber) { + this.accessionNumber = accessionNumber; } - @Override public String getCollectors() { return collectors; } @@ -77,16 +45,6 @@ public class GermplasmInstituteVO implements Serializable, GermplasmInstitute { this.collectors = collectors; } - @Override - public Integer getRegistrationYear() { - return registrationYear; - } - - public void setRegistrationYear(Integer registrationYear) { - this.registrationYear = registrationYear; - } - - @Override public Integer getDeregistrationYear() { return deregistrationYear; } @@ -95,7 +53,6 @@ public class GermplasmInstituteVO implements Serializable, GermplasmInstitute { this.deregistrationYear = deregistrationYear; } - @Override public String getDistributionStatus() { return distributionStatus; } @@ -104,4 +61,35 @@ public class GermplasmInstituteVO implements Serializable, GermplasmInstitute { this.distributionStatus = distributionStatus; } + public String getGermplasmPUI() { + return germplasmPUI; + } + + public void setGermplasmPUI(String germplasmPUI) { + this.germplasmPUI = germplasmPUI; + } + + public InstituteVO getInstitute() { + return institute; + } + + public void setInstitute(InstituteVO institute) { + this.institute = institute; + } + + public String getMaterialType() { + return materialType; + } + + public void setMaterialType(String materialType) { + this.materialType = materialType; + } + + public Integer getRegistrationYear() { + return registrationYear; + } + + public void setRegistrationYear(Integer registrationYear) { + this.registrationYear = registrationYear; + } } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmMcpdVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmMcpdVO.java new file mode 100644 index 0000000000000000000000000000000000000000..6cee46630ad35b29cf0ad256cff64137dcaad6f7 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmMcpdVO.java @@ -0,0 +1,382 @@ +package fr.inrae.urgi.faidare.domain; + +import java.util.List; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +//indexName = "#{@dataDiscoveryProperties.getElasticsearchPrefix}resource-alias" +@Document( + indexName = "faidare_germplasm_dev-group0", + //indexName = "faidare_germplasm_beta-group0", + createIndex = false +) +//@Mapping(mappingPath = "fr/inra/urgi/datadiscovery/domain/faidare/FaidareGeneticResource.mapping.json") +public final class GermplasmMcpdVO { + + private List<String> accessionNames; + + private String accessionNumber; + + private String acquisitionDate; + + private String acquisitionSourceCode; + + private List<String> alternateIDs; + + + + @Field(name="germplasmName") //for POC validation, totally fake + private String ancestralData; + + @Field(name="germplasmPUI") + private String PUID; + + //private String biologicalStatusOfAccessionCode; + + //private List<GermplasmInstitute> breedingInstitutes; + + //private GermplasmCollectingInfo collectingInfo; + + //private String commonCropName; + + private String countryOfOriginCode; + + //private String defaultDisplayName; + + private String documentationURL; + + //private List<DonorInfoVO> donorInfo; + + //private List<GermplasmDonor> donors; + + private String genus; + + + //@Field(type=FieldType.Text) + //@Id + private String germplasmDbId; + + @JsonProperty("@id") + @Field(name="germplasmPUI")//TODO : should take germpalsmURI as it is always fed in the new transformer + private String id; + + @Id + private String _id; + //private String germplasmName; + + //private String germplasmPUI; + + private String instituteCode; + + private String instituteName; + + private String mlsStatus; + + private String pedigree; + + private String remarks; + + //private List<GermplasmInstitute> safetyDuplicateInstitutes; + + //private String seedSource; + + private String species; + + private String speciesAuthority; + + //private List<String> storageTypeCodes; + + //To demonstrate that an existing field in ES can safely be ignored in the VO + // private String subtaxa; + + //private String subtaxaAuthority; + + // private String subtaxon; + + //private String subtaxonAuthority; + + //private List<String> synonyms; + + //private List<TaxonSource> taxonIds; + + //private List<String> typeOfGermplasmStorageCode; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmMcpdVO that = (GermplasmMcpdVO) o; + return Objects.equals(accessionNames, that.accessionNames) && Objects.equals(accessionNumber, that.accessionNumber) && Objects.equals(acquisitionDate, that.acquisitionDate) && Objects.equals(acquisitionSourceCode, that.acquisitionSourceCode) && Objects.equals(alternateIDs, that.alternateIDs) && Objects.equals(ancestralData, that.ancestralData) && PUID.equals(that.PUID) && Objects.equals(countryOfOriginCode, that.countryOfOriginCode) && Objects.equals(documentationURL, that.documentationURL) && Objects.equals(genus, that.genus) && germplasmDbId.equals(that.germplasmDbId) && Objects.equals(instituteCode, that.instituteCode) && Objects.equals(instituteName, that.instituteName) && Objects.equals(mlsStatus, that.mlsStatus) && Objects.equals(pedigree, that.pedigree) && Objects.equals(remarks, that.remarks) && Objects.equals(species, that.species) && Objects.equals(speciesAuthority, that.speciesAuthority); + } + + @Override + public int hashCode() { + return Objects.hash(accessionNames, accessionNumber, acquisitionDate, acquisitionSourceCode, alternateIDs, ancestralData, PUID, countryOfOriginCode, documentationURL, genus, germplasmDbId, instituteCode, instituteName, mlsStatus, pedigree, remarks, species, speciesAuthority); + } + + public List<String> getAccessionNames() { + return accessionNames; + } + + public void setAccessionNames(List<String> accessionNames) { + this.accessionNames = accessionNames; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAccessionNumber() { + return accessionNumber; + } + + public void setAccessionNumber(String accessionNumber) { + this.accessionNumber = accessionNumber; + } + + public String getAcquisitionDate() { + return acquisitionDate; + } + + public void setAcquisitionDate(String acquisitionDate) { + this.acquisitionDate = acquisitionDate; + } + + public String getAcquisitionSourceCode() { + return acquisitionSourceCode; + } + + public void setAcquisitionSourceCode(String acquisitionSourceCode) { + this.acquisitionSourceCode = acquisitionSourceCode; + } + + public List<String> getAlternateIDs() { + return alternateIDs; + } + + public void setAlternateIDs(List<String> alternateIDs) { + this.alternateIDs = alternateIDs; + } + + public String getAncestralData() { + return ancestralData; + } + + public void setAncestralData(String ancestralData) { + this.ancestralData = ancestralData; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getPUID() { + return PUID; + } + + public void setPUID(String PUID) { + this.PUID = PUID; + } + + public String getCountryOfOriginCode() { + return countryOfOriginCode; + } + + public void setCountryOfOriginCode(String countryOfOriginCode) { + this.countryOfOriginCode = countryOfOriginCode; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public String getGenus() { + return genus; + } + + public void setGenus(String genus) { + this.genus = genus; + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + public String getInstituteCode() { + return instituteCode; + } + + public void setInstituteCode(String instituteCode) { + this.instituteCode = instituteCode; + } + + public String getInstituteName() { + return instituteName; + } + + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; + } + + public String getMlsStatus() { + return mlsStatus; + } + + public void setMlsStatus(String mlsStatus) { + this.mlsStatus = mlsStatus; + } + + public String getPedigree() { + return pedigree; + } + + public void setPedigree(String pedigree) { + this.pedigree = pedigree; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSpecies() { + return species; + } + + public void setSpecies(String species) { + this.species = species; + } + + public String getSpeciesAuthority() { + return speciesAuthority; + } + + public void setSpeciesAuthority(String speciesAuthority) { + this.speciesAuthority = speciesAuthority; + } + + @Override + public String toString() { + return "GermplasmMcpdVO{" + + "accessionNames=" + accessionNames + + ", accessionNumber='" + accessionNumber + '\'' + + ", acquisitionDate='" + acquisitionDate + '\'' + + ", acquisitionSourceCode='" + acquisitionSourceCode + '\'' + + ", alternateIDs=" + alternateIDs + + ", ancestralData='" + ancestralData + '\'' + + ", PUID='" + PUID + '\'' + + ", countryOfOriginCode='" + countryOfOriginCode + '\'' + + ", documentationURL='" + documentationURL + '\'' + + ", genus='" + genus + '\'' + + ", germplasmDbId='" + germplasmDbId + '\'' + + ", instituteCode='" + instituteCode + '\'' + + ", instituteName='" + instituteName + '\'' + + ", mlsStatus='" + mlsStatus + '\'' + + ", pedigree='" + pedigree + '\'' + + ", remarks='" + remarks + '\'' + + ", species='" + species + '\'' + + ", speciesAuthority='" + speciesAuthority + '\'' + + '}'; + } +} + + +/* +List<String> getAccessionNames(); + + String getAccessionNumber(); + + String getAcquisitionDate(); + + String getAcquisitionSourceCode(); + + List<String> getAlternateIDs(); + + String getAncestralData(); + + String getBiologicalStatusOfAccessionCode(); + + List<GermplasmInstitute> getBreedingInstitutes(); + + GermplasmCollectingInfo getCollectingInfo(); + + String getCommonCropName(); + + String getCountryOfOriginCode(); + + String getDefaultDisplayName(); + + String getDocumentationURL(); + + List<DonorInfoVO> getDonorInfo(); + + List<GermplasmDonor> getDonors(); + + String getGenus(); + + String getGermplasmDbId(); + + String getGermplasmName(); + + String getGermplasmPUI(); + + String getInstituteCode(); + + String getInstituteName(); + + String getMlsStatus(); + + String getPedigree(); + + String getRemarks(); + + List<GermplasmInstitute> getSafetyDuplicateInstitutes(); + + String getSeedSource(); + + String getSpecies(); + + String getSpeciesAuthority(); + + List<String> getStorageTypeCodes(); + + String getSubtaxa(); + + String getSubtaxaAuthority(); + + String getSubtaxon(); + + String getSubtaxonAuthority(); + + List<String> getSynonyms(); + + List<TaxonSource> getTaxonIds(); + + List<String> getTypeOfGermplasmStorageCode(); + +*/ diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmOriginVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmOriginVO.java new file mode 100644 index 0000000000000000000000000000000000000000..5ca9d6a8e59d45cc169348bcb3005f70707dd4e8 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/GermplasmOriginVO.java @@ -0,0 +1,25 @@ +package fr.inrae.urgi.faidare.domain; + +public class GermplasmOriginVO { + + private String coordinateUncertainty; + + private CoordinatesVO coordinates; + + + public String getCoordinateUncertainty() { + return coordinateUncertainty; + } + + public void setCoordinateUncertainty(String coordinateUncertainty) { + this.coordinateUncertainty = coordinateUncertainty; + } + + public CoordinatesVO getCoordinates() { + return coordinates; + } + + public void setCoordinates(CoordinatesVO coordinates) { + this.coordinates = coordinates; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/InstituteVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/InstituteVO.java similarity index 78% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/InstituteVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/InstituteVO.java index d7bf01506020434e797effd206173f505dec902e..19829128afaa7ba2f6a96f6f9d9b054f8d09e285 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/InstituteVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/InstituteVO.java @@ -1,56 +1,56 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmInstitute; -import java.io.Serializable; +package fr.inrae.urgi.faidare.domain; -public class InstituteVO implements Serializable, BrapiGermplasmInstitute, ExtendedInstitute { - private static final long serialVersionUID = -680211100453576319L; +public class InstituteVO { - private String instituteName; - private String instituteCode; private String acronym; - private String organisation; - private String instituteType; - private String webSite; + private String address; + + private String instituteCode; + + private String instituteName; + + private String instituteType; + private String logo; - @Override - public String getInstituteName() { - return instituteName; + private String organisation; + + private String webSite; + + + public String getAcronym() { + return acronym; } - public void setInstituteName(String instituteName) { - this.instituteName = instituteName; + public void setAcronym(String acronym) { + this.acronym = acronym; } - @Override - public String getInstituteCode() { - return instituteCode; + public String getAddress() { + return address; } - public void setInstituteCode(String instituteCode) { - this.instituteCode = instituteCode; + public void setAddress(String address) { + this.address = address; } - @Override - public String getAcronym() { - return acronym; + public String getInstituteCode() { + return instituteCode; } - public void setAcronym(String acronym) { - this.acronym = acronym; + public void setInstituteCode(String instituteCode) { + this.instituteCode = instituteCode; } - @Override - public String getOrganisation() { - return organisation; + public String getInstituteName() { + return instituteName; } - public void setOrganisation(String organisation) { - this.organisation = organisation; + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; } - @Override public String getInstituteType() { return instituteType; } @@ -59,31 +59,28 @@ public class InstituteVO implements Serializable, BrapiGermplasmInstitute, Exten this.instituteType = instituteType; } - @Override - public String getWebSite() { - return webSite; + public String getLogo() { + return logo; } - public void setWebSite(String webSite) { - this.webSite = webSite; + public void setLogo(String logo) { + this.logo = logo; } - @Override - public String getAddress() { - return address; + public String getOrganisation() { + return organisation; } - public void setAddress(String address) { - this.address = address; + public void setOrganisation(String organisation) { + this.organisation = organisation; } - @Override - public String getLogo() { - return logo; + public String getWebSite() { + return webSite; } - public void setLogo(String logo) { - this.logo = logo; + public void setWebSite(String webSite) { + this.webSite = webSite; } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/JSONView.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/JSONView.java similarity index 70% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/JSONView.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/JSONView.java index 37a643806a2e094a31e265c2d0231ff1f30196b8..4f24620826f7705c7e990d3daff51ef08a976dd3 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/JSONView.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/JSONView.java @@ -1,7 +1,6 @@ -package fr.inra.urgi.faidare.domain; +package fr.inrae.urgi.faidare.domain; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.elasticsearch.ESResponseParser; /** * Collection of Jack JSON views used to annotate Java bean properties using {@link JsonView} @@ -40,11 +39,4 @@ public interface JSONView { interface GnpISAPI extends JSONLDFields, GnpISFields, BrapiFields { } - /** - * Jackson json view used for internal properties that should not be exposed. - * Used in {@link ESResponseParser} to deserialize internal properties from Elasticsearch. - */ - interface Internal extends GnpISAPI { - } - } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyLastUpdateVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/LastUpdateVO.java similarity index 52% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyLastUpdateVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/LastUpdateVO.java index 9ded3ea343e831247205d2178d8df8381a71997a..8bb389a5490d52ff518d438366b599b34e4777c3 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/study/StudyLastUpdateVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/LastUpdateVO.java @@ -1,30 +1,25 @@ -package fr.inra.urgi.faidare.domain.data.study; +package fr.inrae.urgi.faidare.domain; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudyLastUpdate; +public class LastUpdateVO { -/** - * @author gcornut - * @link https://github.com/plantbreeding/API/blob/master/Specification/Studies/StudyDetails.md - */ -public class StudyLastUpdateVO implements BrapiStudyLastUpdate { - private String version; private String timestamp; - @Override - public String getVersion() { - return version; - } + private String version; + - @Override public String getTimestamp() { return timestamp; } - public void setVersion(String version) { - this.version = version; - } - public void setTimestamp(String timestamp) { this.timestamp = timestamp; } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/LocationVO.java similarity index 59% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/LocationVO.java index f392d6f9627c2b5f0c2e7f2811a737da08c984c9..597dc355c8cd9fd37221f59d866973ab501f3759 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/LocationVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/LocationVO.java @@ -1,232 +1,194 @@ -package fr.inra.urgi.faidare.domain.data; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiLocation; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - +package fr.inrae.urgi.faidare.domain; import java.util.List; +import java.util.Objects; -/** - * LocationVO extending the official BreedingAPI specs with specific fields - * - * @author gcornut - */ -@Document(type = "location") -public class LocationVO implements GnpISInternal, BrapiLocation, HasURI, HasURL, IncludedInDataCatalog { +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; - @Id - private String locationDbId; +@Document( + indexName = LocationVO.INDEX_NAME, + createIndex = false +) - private String locationName; +public class LocationVO { + + public static final String INDEX_NAME = "faidare_location_dev-group0"; - private String locationType; private String abbreviation; + //private ... additionalInfo; + + private Double altitude; + private String countryCode; + private String countryName; + private Long groupId; + private String instituteAddress; + private String instituteName; - private Double altitude; private Double latitude; - private Double longitude; - - private BrapiAdditionalInfo additionalInfo; - // GnpIS specific fields + @Id + private String _id; + private String locationDbId; + private String locationName; + private String locationType; + private Double longitude; + private String sourceUri; private List<Long> speciesGroup; - private Long groupId; - - // JSON-LD fields - private String url; private String uri; - private String sourceUri; - - @Override - public String getUri() { - return this.uri; - } - - public void setUri(String uri) { - this.uri = uri; - } + private String url; @Override - public String getSourceUri() { - return this.sourceUri; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LocationVO that = (LocationVO) o; + return Objects.equals(abbreviation, that.abbreviation) && Objects.equals(altitude, that.altitude) && Objects.equals(countryCode, that.countryCode) && Objects.equals(countryName, that.countryName) && Objects.equals(groupId, that.groupId) && Objects.equals(instituteAddress, that.instituteAddress) && Objects.equals(instituteName, that.instituteName) && Objects.equals(latitude, that.latitude) && Objects.equals(_id, that._id) && Objects.equals(locationDbId, that.locationDbId) && Objects.equals(locationName, that.locationName) && Objects.equals(locationType, that.locationType) && Objects.equals(longitude, that.longitude) && Objects.equals(sourceUri, that.sourceUri) && Objects.equals(speciesGroup, that.speciesGroup) && Objects.equals(uri, that.uri) && Objects.equals(url, that.url); } - public void setSourceUri(String sourceUri) { - this.sourceUri = sourceUri; + public String getAbbreviation() { + return abbreviation; } - - @Override - public String getUrl() { - return this.url; + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; } - public void setUrl(String url) { - this.url = url; + public Double getAltitude() { + return altitude; } - @Override - public String getLocationName() { - return locationName; + public void setAltitude(Double altitude) { + this.altitude = altitude; } - public void setLocationName(String locationName) { - this.locationName = locationName; + public String getCountryCode() { + return countryCode; } - @Override - public String getAbbreviation() { - return abbreviation; + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; } - @Deprecated - @Override - public String getAbreviation() { - return abbreviation; + public String getCountryName() { + return countryName; } - @Override - public Double getAltitude() { - return altitude; + public void setCountryName(String countryName) { + this.countryName = countryName; } - @Override - public String getCountryCode() { - return countryCode; + public Long getGroupId() { + return groupId; } - @Override - public String getCountryName() { - return countryName; + public void setGroupId(Long groupId) { + this.groupId = groupId; } - @Override public String getInstituteAddress() { return instituteAddress; } - @Deprecated - @Override - public String getInstituteAdress() { - return instituteAddress; + public void setInstituteAddress(String instituteAddress) { + this.instituteAddress = instituteAddress; } - @Override public String getInstituteName() { return instituteName; } - @Override + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; + } + public Double getLatitude() { return latitude; } - @Override - public String getLocationDbId() { - return locationDbId; + public void setLatitude(Double latitude) { + this.latitude = latitude; } - @Override - public String getLocationType() { - return locationType; + public String getLocationDbId() { + return locationDbId; } - @Override - public Double getLongitude() { - return longitude; + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; } - @Override - public String getName() { + public String getLocationName() { return locationName; } - @Override - public BrapiAdditionalInfo getAdditionalInfo() { - return additionalInfo; - } - - public void setName(String name) { - this.locationName = name; + public void setLocationName(String locationName) { + this.locationName = locationName; } - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; + public String getLocationType() { + return locationType; } public void setLocationType(String locationType) { this.locationType = locationType; } - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } - - public void setAbreviation(String abreviation) { - this.abbreviation = abreviation; + public Double getLongitude() { + return longitude; } - public void setCountryCode(String countryCode) { - this.countryCode = countryCode; + public void setLongitude(Double longitude) { + this.longitude = longitude; } - public void setCountryName(String countryName) { - this.countryName = countryName; + public String getSourceUri() { + return sourceUri; } - public void setInstituteAddress(String instituteAddress) { - this.instituteAddress = instituteAddress; + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; } - public void setInstituteAdress(String instituteAdress) { - this.instituteAddress = instituteAdress; + public List<Long> getSpeciesGroup() { + return speciesGroup; } - public void setInstituteName(String instituteName) { - this.instituteName = instituteName; + public void setSpeciesGroup(List<Long> speciesGroup) { + this.speciesGroup = speciesGroup; } - public void setAltitude(Double altitude) { - this.altitude = altitude; + public String getUri() { + return uri; } - public void setLatitude(Double latitude) { - this.latitude = latitude; + public void setUri(String uri) { + this.uri = uri; } - public void setLongitude(Double longitude) { - this.longitude = longitude; + public String getUrl() { + return url; } - public void setAdditionalInfo(BrapiAdditionalInfo additionalInfo) { - this.additionalInfo = additionalInfo; + public void setUrl(String url) { + this.url = url; } - @Override - public Long getGroupId() { - return groupId; + public String get_id() { + return _id; } - public void setGroupId(Long groupId) { - this.groupId = groupId; + public void set_id(String _id) { + this._id = _id; } @Override - public String getDocumentationURL() { - return url; - } - - public void setDocumentationURL(String documentationURL) { - this.url = documentationURL; + public int hashCode() { + return Objects.hash(abbreviation, altitude, countryCode, countryName, groupId, instituteAddress, instituteName, latitude, _id, locationDbId, locationName, locationType, longitude, sourceUri, speciesGroup, uri, url); } } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/ObservationLevelsVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ObservationLevelsVO.java new file mode 100644 index 0000000000000000000000000000000000000000..e7f4e6bc7c3fe0e30d87daec4f41ca6a3a1f419a --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/ObservationLevelsVO.java @@ -0,0 +1,25 @@ +package fr.inrae.urgi.faidare.domain; + +public class ObservationLevelsVO { + + private String levelName; + + private String levelOrder; + + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLevelOrder() { + return levelOrder; + } + + public void setLevelOrder(String levelOrder) { + this.levelOrder = levelOrder; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PhotoVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PhotoVO.java similarity index 77% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PhotoVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/PhotoVO.java index c37cf60e2fd81699493d82b283d9e1bd8220a7c4..42fdc9bccb9b3845dddfef0934d91de3fce9a112 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/PhotoVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PhotoVO.java @@ -1,60 +1,55 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import java.io.Serializable; +public class PhotoVO { -public class PhotoVO implements Serializable, Photo { + private String copyright; - private static final long serialVersionUID = -4993890419772211643L; + private String description; private String file; - private String thumbnailFile; + private String photoName; - private String description; - private String copyright; - @Override - public String getFile() { - return file; - } + private String thumbnailFile; - public void setFile(String file) { - this.file = file; + + public String getCopyright() { + return copyright; } - @Override - public String getThumbnailFile() { - return thumbnailFile; + public void setCopyright(String copyright) { + this.copyright = copyright; } - public void setThumbnailFile(String thumbnailFile) { - this.thumbnailFile = thumbnailFile; + public String getDescription() { + return description; } - @Override - public String getPhotoName() { - return photoName; + public void setDescription(String description) { + this.description = description; } - public void setPhotoName(String photoName) { - this.photoName = photoName; + public String getFile() { + return file; } - @Override - public String getDescription() { - return description; + public void setFile(String file) { + this.file = file; } - public void setDescription(String description) { - this.description = description; + public String getPhotoName() { + return photoName; } - @Override - public String getCopyright() { - return copyright; + public void setPhotoName(String photoName) { + this.photoName = photoName; } - public void setCopyright(String copyright) { - this.copyright = copyright; + public String getThumbnailFile() { + return thumbnailFile; } + public void setThumbnailFile(String thumbnailFile) { + this.thumbnailFile = thumbnailFile; + } } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiDescriptionVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiDescriptionVO.java new file mode 100644 index 0000000000000000000000000000000000000000..626240ebce4e7c90299ab7b208e91f3984ee78e5 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiDescriptionVO.java @@ -0,0 +1,25 @@ +package fr.inrae.urgi.faidare.domain; + +public class PuiDescriptionVO { + + private String PUI; + + private String description; + + + public String getPUI() { + return PUI; + } + + public void setPUI(String PUI) { + this.PUI = PUI; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SimpleVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiNameValueVO.java similarity index 54% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SimpleVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiNameValueVO.java index 6e9fcd028d30f099f27487bbce0ddf3932080af6..18c670dccb89eda6f248044c0fe18e35ba845b26 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/SimpleVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/PuiNameValueVO.java @@ -1,28 +1,24 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import java.io.Serializable; +import java.util.Objects; -/** - * @author C. Michotey - */ -public class SimpleVO implements Serializable, PuiNameValue { +public class PuiNameValueVO { - private static final long serialVersionUID = 3440255005695104200L; + private String name; private String pui; - private String name; + private String value; - public SimpleVO() { + + public String getName() { + return name; } - public SimpleVO(String pui, String name, String value) { - this.pui = pui; + public void setName(String name) { this.name = name; - this.value = value; } - @Override public String getPui() { return pui; } @@ -31,16 +27,6 @@ public class SimpleVO implements Serializable, PuiNameValue { this.pui = pui; } - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override public String getValue() { return value; } @@ -49,4 +35,16 @@ public class SimpleVO implements Serializable, PuiNameValue { this.value = value; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PuiNameValueVO that = (PuiNameValueVO) o; + return Objects.equals(pui, that.pui); + } + + @Override + public int hashCode() { + return Objects.hash(pui); + } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingSiteVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/SiteVO.java similarity index 58% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingSiteVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/SiteVO.java index 13adda7b27bb5e7c58d262b60262291ee523fcd1..376e6832ba2a3708c27a0a160332216c6b6fbb99 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/CollectingSiteVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/SiteVO.java @@ -1,127 +1,157 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmCollectingSite; +import java.util.Objects; -public class CollectingSiteVO implements BrapiGermplasmCollectingSite, ExtendedCollectingSite { +public class SiteVO { private String locationDbId; - private String siteName; - private String siteType; private String coordinateUncertainty; private String elevation; private String georeferencingMethod; + private Double latitude; + + private Double longitude; private String latitudeDecimal; private String latitudeDegrees; private String locationDescription; private String longitudeDecimal; private String longitudeDegrees; private String spatialReferenceSystem; + private String siteId; + private String siteName; + private String siteType; @Override - public String getLocationDbId() { - return locationDbId; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SiteVO siteVO = (SiteVO) o; + return Objects.equals(locationDbId, siteVO.locationDbId) && Objects.equals(coordinateUncertainty, siteVO.coordinateUncertainty) && Objects.equals(elevation, siteVO.elevation) && Objects.equals(georeferencingMethod, siteVO.georeferencingMethod) && Objects.equals(latitude, siteVO.latitude) && Objects.equals(longitude, siteVO.longitude) && Objects.equals(latitudeDecimal, siteVO.latitudeDecimal) && Objects.equals(latitudeDegrees, siteVO.latitudeDegrees) && Objects.equals(locationDescription, siteVO.locationDescription) && Objects.equals(longitudeDecimal, siteVO.longitudeDecimal) && Objects.equals(longitudeDegrees, siteVO.longitudeDegrees) && Objects.equals(spatialReferenceSystem, siteVO.spatialReferenceSystem) && Objects.equals(siteId, siteVO.siteId) && Objects.equals(siteName, siteVO.siteName) && Objects.equals(siteType, siteVO.siteType); } - public void setLocationDbId(String locationDbId) { - this.locationDbId = locationDbId; + public String getCoordinateUncertainty() { + return coordinateUncertainty; } - public String getSiteName() { - return siteName; + public void setCoordinateUncertainty(String coordinateUncertainty) { + this.coordinateUncertainty = coordinateUncertainty; } - public void setSiteName(String siteName) { - this.siteName = siteName; + public String getElevation() { + return elevation; } - - public String getSiteType() { - return siteType; + public void setElevation(String elevation) { + this.elevation = elevation; } - public void setSiteType(String siteType) { - this.siteType = siteType; + public String getGeoreferencingMethod() { + return georeferencingMethod; } - @Override - public String getCoordinateUncertainty() { - return coordinateUncertainty; + public void setGeoreferencingMethod(String georeferencingMethod) { + this.georeferencingMethod = georeferencingMethod; } - @Override - public String getElevation() { - return elevation; + public Double getLatitude() { + return latitude; } - @Override - public String getGeoreferencingMethod() { - return georeferencingMethod; + public void setLatitude(Double latitude) { + this.latitude = latitude; } - @Override public String getLatitudeDecimal() { return latitudeDecimal; } - @Override + public void setLatitudeDecimal(String latitudeDecimal) { + this.latitudeDecimal = latitudeDecimal; + } + public String getLatitudeDegrees() { return latitudeDegrees; } - @Override + public void setLatitudeDegrees(String latitudeDegrees) { + this.latitudeDegrees = latitudeDegrees; + } + + public String getLocationDbId() { + return locationDbId; + } + + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; + } + public String getLocationDescription() { return locationDescription; } - @Override + public void setLocationDescription(String locationDescription) { + this.locationDescription = locationDescription; + } + + public Double getLongitude() { + return longitude; + } + + public void setLongitude(Double longitude) { + this.longitude = longitude; + } + public String getLongitudeDecimal() { return longitudeDecimal; } - @Override + public void setLongitudeDecimal(String longitudeDecimal) { + this.longitudeDecimal = longitudeDecimal; + } + public String getLongitudeDegrees() { return longitudeDegrees; } - @Override - public String getSpatialReferenceSystem() { - return spatialReferenceSystem; + public void setLongitudeDegrees(String longitudeDegrees) { + this.longitudeDegrees = longitudeDegrees; } - - public void setCoordinateUncertainty(String coordinateUncertainty) { - this.coordinateUncertainty = coordinateUncertainty; + public String getSiteId() { + return siteId; } - public void setElevation(String elevation) { - this.elevation = elevation; + public void setSiteId(String siteId) { + this.siteId = siteId; } - public void setGeoreferencingMethod(String georeferencingMethod) { - this.georeferencingMethod = georeferencingMethod; - } - - public void setLatitudeDecimal(String latitudeDecimal) { - this.latitudeDecimal = latitudeDecimal; + public String getSiteName() { + return siteName; } - public void setLatitudeDegrees(String latitudeDegrees) { - this.latitudeDegrees = latitudeDegrees; + public void setSiteName(String siteName) { + this.siteName = siteName; } - public void setLocationDescription(String locationDescription) { - this.locationDescription = locationDescription; + public String getSiteType() { + return siteType; } - public void setLongitudeDecimal(String longitudeDecimal) { - this.longitudeDecimal = longitudeDecimal; + public void setSiteType(String siteType) { + this.siteType = siteType; } - public void setLongitudeDegrees(String longitudeDegrees) { - this.longitudeDegrees = longitudeDegrees; + public String getSpatialReferenceSystem() { + return spatialReferenceSystem; } public void setSpatialReferenceSystem(String spatialReferenceSystem) { this.spatialReferenceSystem = spatialReferenceSystem; } + + @Override + public int hashCode() { + return Objects.hash(locationDbId, coordinateUncertainty, elevation, georeferencingMethod, latitude, longitude, latitudeDecimal, latitudeDegrees, locationDescription, longitudeDecimal, longitudeDegrees, spatialReferenceSystem, siteId, siteName, siteType); + } + } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/StorageTypesVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/StorageTypesVO.java new file mode 100644 index 0000000000000000000000000000000000000000..4bff7abf99c5c515118fe5d5ede98f77d8003bda --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/StorageTypesVO.java @@ -0,0 +1,25 @@ +package fr.inrae.urgi.faidare.domain; + +public class StorageTypesVO { + + private String code; + + private String description; + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSource.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSource.java new file mode 100644 index 0000000000000000000000000000000000000000..7dfb23c3c05b2b1cf22522d7722df1e30e3919c2 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSource.java @@ -0,0 +1,4 @@ +package fr.inrae.urgi.faidare.domain; + +public interface TaxonSource { +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/TaxonSourceVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSourceVO.java similarity index 50% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/TaxonSourceVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSourceVO.java index 13cb28018fbd4c7b6769430bfd437444f9aebef3..ba13db5a904d8562bf95e5fa307030d10b7e3b67 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/TaxonSourceVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/TaxonSourceVO.java @@ -1,29 +1,12 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmTaxonSource; +public class TaxonSourceVO { -import java.io.Serializable; - -/** - * @author C. Michotey - */ -public class TaxonSourceVO implements Serializable, BrapiGermplasmTaxonSource { - - private static final long serialVersionUID = 3440255005695104200L; - - private String taxonId; private String sourceName; - @Override - public String getTaxonId() { - return taxonId; - } + private String taxonId; - public void setTaxonId(String taxonId) { - this.taxonId = taxonId; - } - @Override public String getSourceName() { return sourceName; } @@ -32,4 +15,11 @@ public class TaxonSourceVO implements Serializable, BrapiGermplasmTaxonSource { this.sourceName = sourceName; } + public String getTaxonId() { + return taxonId; + } + + public void setTaxonId(String taxonId) { + this.taxonId = taxonId; + } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/XRefDocumentVO.java similarity index 57% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/XRefDocumentVO.java index 9279936feda6dfa58266654667f15190c28dfafc..03774ce4f7d79ab598e1bb387570bb5e6907ca03 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/xref/XRefDocumentVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/XRefDocumentVO.java @@ -1,52 +1,52 @@ -package fr.inra.urgi.faidare.domain.xref; - -import com.fasterxml.jackson.annotation.JsonProperty; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; +package fr.inrae.urgi.faidare.domain; import java.util.List; +import java.util.Objects; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; -/** - * Imported and adapted from unified-interface legacy - * Model taken from transplant document fields - * - * @author fphilippe - */ -@Document(type = "xref") +@Document( + indexName = "faidare_xref_dev-group0", + //indexName = "faidare_xref_beta-group0", + createIndex = false +) public class XRefDocumentVO { - @JsonProperty("groupId") + @Id + private String _id; private String groupId; - - @JsonProperty("entryType") private String entryType; - - @JsonProperty("databaseName") private String databaseName; - - @JsonProperty("identifier") private String identifier; - - @JsonProperty("name") private String name; - - @JsonProperty("description") private String description; - - @JsonProperty("url") private String url; - - @JsonProperty("species") private List<String> species; - - //@JsonProperty("linkedResourcesID") private List<String> linkedResourcesID; - public String getGroupId() { - return groupId; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + XRefDocumentVO that = (XRefDocumentVO) o; + return Objects.equals(_id, that._id) && Objects.equals(groupId, that.groupId) && Objects.equals(entryType, that.entryType) && Objects.equals(databaseName, that.databaseName) && Objects.equals(identifier, that.identifier) && Objects.equals(name, that.name) && Objects.equals(description, that.description) && Objects.equals(url, that.url) && Objects.equals(species, that.species) && Objects.equals(linkedResourcesID, that.linkedResourcesID); } - public void setGroupId(String groupId) { - this.groupId = groupId; + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; } public String getEntryType() { @@ -57,12 +57,12 @@ public class XRefDocumentVO { this.entryType = entryType; } - public String getDatabaseName() { - return databaseName; + public String getGroupId() { + return groupId; } - public void setDatabaseName(String databaseName) { - this.databaseName = databaseName; + public void setGroupId(String groupId) { + this.groupId = groupId; } public String getIdentifier() { @@ -73,6 +73,14 @@ public class XRefDocumentVO { this.identifier = identifier; } + public List<String> getLinkedResourcesID() { + return linkedResourcesID; + } + + public void setLinkedResourcesID(List<String> linkedResourcesID) { + this.linkedResourcesID = linkedResourcesID; + } + public String getName() { return name; } @@ -81,12 +89,12 @@ public class XRefDocumentVO { this.name = name; } - public String getDescription() { - return description; + public List<String> getSpecies() { + return species; } - public void setDescription(String description) { - this.description = description; + public void setSpecies(List<String> species) { + this.species = species; } public String getUrl() { @@ -97,20 +105,16 @@ public class XRefDocumentVO { this.url = url; } - public List<String> getSpecies() { - return species; + public String get_id() { + return _id; } - public void setSpecies(List<String> species) { - this.species = species; + public void set_id(String _id) { + this._id = _id; } - public List<String> getLinkedResourcesID() { - return linkedResourcesID; + @Override + public int hashCode() { + return Objects.hash(_id, groupId, entryType, databaseName, identifier, name, description, url, species, linkedResourcesID); } - - public void setLinkedResourcesID(List<String> linkedResourcesID) { - this.linkedResourcesID = linkedResourcesID; - } - } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/GermplasmSitemapVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/GermplasmSitemapVO.java new file mode 100644 index 0000000000000000000000000000000000000000..a4598d213458a1beb4621be96f315ac2b241457b --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/GermplasmSitemapVO.java @@ -0,0 +1,41 @@ +package fr.inrae.urgi.faidare.domain.brapi; + +import org.springframework.data.annotation.Id; + +import java.util.Objects; + +public final class GermplasmSitemapVO { + + @Id + private String _id; + private String germplasmDbId; + + public GermplasmSitemapVO() { + } + + public GermplasmSitemapVO(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmSitemapVO that = (GermplasmSitemapVO) o; + return Objects.equals(germplasmDbId, that.germplasmDbId); + } + + @Override + public int hashCode() { + return Objects.hash(germplasmDbId); + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } +} + diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/LocationSitemapVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/LocationSitemapVO.java new file mode 100644 index 0000000000000000000000000000000000000000..afda5007190525bceb9dabefb8588f12aeccfaa4 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/LocationSitemapVO.java @@ -0,0 +1,29 @@ +package fr.inrae.urgi.faidare.domain.brapi; + +import org.springframework.data.annotation.Id; + +/** + * A minimal view of a location containing only its ID, used to generate sitemaps + */ +public class LocationSitemapVO { + + @Id + private String _id; + + private String locationDbId; + + public LocationSitemapVO() { + } + + public LocationSitemapVO(String locationDbId) { + this.locationDbId = locationDbId; + } + + public String getLocationDbId() { + return locationDbId; + } + + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/StudySitemapVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/StudySitemapVO.java new file mode 100644 index 0000000000000000000000000000000000000000..bfdc5c8658cd5f1a9386e7b2c9bc2c73e62fb464 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/StudySitemapVO.java @@ -0,0 +1,41 @@ +package fr.inrae.urgi.faidare.domain.brapi; + +import org.springframework.data.annotation.Id; + +import java.util.Objects; + +public final class StudySitemapVO { + + @Id + private String _id; + private String studyDbId; + + public StudySitemapVO() { + } + + public StudySitemapVO(String studyDbId) { + this.studyDbId = studyDbId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StudySitemapVO that = (StudySitemapVO) o; + return Objects.equals(studyDbId, that.studyDbId); + } + + @Override + public int hashCode() { + return Objects.hash(studyDbId); + } + + public String getStudyDbId() { + return studyDbId; + } + + public void setStudyDbId(String studyDbId) { + this.studyDbId = studyDbId; + } +} + diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeV1VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeV1VO.java new file mode 100644 index 0000000000000000000000000000000000000000..e490ae7359a1d8406e165774f53e3757a49377d7 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeV1VO.java @@ -0,0 +1,84 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +import java.util.List; +import java.util.Objects; + +@Document( + indexName = "faidare_germplasm-attribute_dev-group0", + createIndex = false +) +public class GermplasmAttributeV1VO { + + @Id + private String _id; + + private String germplasmAttributeDbId; + private String germplasmDbId; + private String germplasmURI; + private String germplasmAttributeURI; + private List<GermplasmAttributeValueV1VO> data; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmAttributeV1VO that = (GermplasmAttributeV1VO) o; + return Objects.equals(_id, that._id) && Objects.equals(germplasmAttributeDbId, that.germplasmAttributeDbId) && Objects.equals(germplasmDbId, that.germplasmDbId) && Objects.equals(germplasmURI, that.germplasmURI); + } + + @Override + public int hashCode() { + return Objects.hash(_id, germplasmAttributeDbId, germplasmDbId, germplasmURI); + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getGermplasmAttributeDbId() { + return germplasmAttributeDbId; + } + + public void setGermplasmAttributeDbId(String germplasmAttributeDbId) { + this.germplasmAttributeDbId = germplasmAttributeDbId; + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + public String getGermplasmURI() { + return germplasmURI; + } + + public void setGermplasmURI(String germplasmURI) { + this.germplasmURI = germplasmURI; + } + + public String getGermplasmAttributeURI() { + return germplasmAttributeURI; + } + + public void setGermplasmAttributeURI(String germplasmAttributeURI) { + this.germplasmAttributeURI = germplasmAttributeURI; + } + + public List<GermplasmAttributeValueV1VO> getData() { + return data; + } + + public void setData(List<GermplasmAttributeValueV1VO> data) { + this.data = data; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeValueV1VO.java similarity index 59% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeValueV1VO.java index 66d125986c1c7e3598b92f968154a8fdd640aa43..6ad1310ec2548735dbb33b825590a8dfbdd71cfa 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/GermplasmAttributeValueVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmAttributeValueV1VO.java @@ -1,13 +1,11 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValue; +package fr.inrae.urgi.faidare.domain.brapi.v1; import java.util.Date; +import java.util.Objects; + + +public class GermplasmAttributeValueV1VO { -/** - * @author gcornut - */ -public class GermplasmAttributeValueVO implements BrapiGermplasmAttributeValue { private String attributeDbId; private String attributeName; @@ -15,7 +13,14 @@ public class GermplasmAttributeValueVO implements BrapiGermplasmAttributeValue { private String value; private Date determinedDate; - @Override + public String getAttributeCode() { + return attributeCode; + } + + public void setAttributeCode(String attributeCode) { + this.attributeCode = attributeCode; + } + public String getAttributeDbId() { return attributeDbId; } @@ -24,7 +29,6 @@ public class GermplasmAttributeValueVO implements BrapiGermplasmAttributeValue { this.attributeDbId = attributeDbId; } - @Override public String getAttributeName() { return attributeName; } @@ -33,16 +37,14 @@ public class GermplasmAttributeValueVO implements BrapiGermplasmAttributeValue { this.attributeName = attributeName; } - @Override - public String getAttributeCode() { - return attributeCode; + public Date getDeterminedDate() { + return determinedDate; } - public void setAttributeCode(String attributeCode) { - this.attributeCode = attributeCode; + public void setDeterminedDate(Date determinedDate) { + this.determinedDate = determinedDate; } - @Override public String getValue() { return value; } @@ -52,12 +54,15 @@ public class GermplasmAttributeValueVO implements BrapiGermplasmAttributeValue { } @Override - public Date getDeterminedDate() { - return determinedDate; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmAttributeValueV1VO that = (GermplasmAttributeValueV1VO) o; + return Objects.equals(attributeDbId, that.attributeDbId) && Objects.equals(attributeName, that.attributeName) && Objects.equals(attributeCode, that.attributeCode) && Objects.equals(value, that.value) && Objects.equals(determinedDate, that.determinedDate); } - public void setDeterminedDate(Date determinedDate) { - this.determinedDate = determinedDate; + @Override + public int hashCode() { + return Objects.hash(attributeDbId, attributeName, attributeCode, value, determinedDate); } - } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmPedigreeV1VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmPedigreeV1VO.java new file mode 100644 index 0000000000000000000000000000000000000000..dffb7eadc0285096f967d099a78e57310d63831a --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmPedigreeV1VO.java @@ -0,0 +1,237 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Objects; + +//indexName = "#{@dataDiscoveryProperties.getElasticsearchPrefix}resource-alias" +@Document( + indexName = "faidare_germplasm-pedigree_dev-group0", + //indexName = "faidare_pedigree_beta-group0", + createIndex = false +) +//@Mapping(mappingPath = "fr/inra/urgi/datadiscovery/domain/faidare/FaidareGeneticResource.mapping.json") +public final class GermplasmPedigreeV1VO { + + @Id + private String _id; + @JsonProperty("@id") + @Field(name="@id")//TODO : should take germpalsmURI as it is always fed in the new transformer + private String id; + private String germplasmDbId; + + private String germplasmPedigreeDbId; + private String defaultDisplayName; + private String pedigree; + private Long groupId; + private String crossingPlan; + private String crossingYear; + private String familyCode; + private String parent1DbId; + private String parent1Name; + private String parent1Type; + private String parent2DbId; + private String parent2Name; + private String parent2Type; + private List<SiblingV1VO> siblings; + private String germplasmURI; + + private String germplasmPedigreeURI; + private String parent1URI; + private String parent2URI; + @JsonProperty("@type") + private String type = "germplasmPedigree"; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmPedigreeV1VO that = (GermplasmPedigreeV1VO) o; + return Objects.equals(_id, that._id) && Objects.equals(germplasmDbId, that.germplasmDbId) && Objects.equals(defaultDisplayName, that.defaultDisplayName) && Objects.equals(pedigree, that.pedigree) && Objects.equals(groupId, that.groupId) && Objects.equals(crossingPlan, that.crossingPlan) && Objects.equals(crossingYear, that.crossingYear) && Objects.equals(familyCode, that.familyCode) && Objects.equals(parent1DbId, that.parent1DbId) && Objects.equals(parent1Name, that.parent1Name) && Objects.equals(parent1Type, that.parent1Type) && Objects.equals(parent2DbId, that.parent2DbId) && Objects.equals(parent2Name, that.parent2Name) && Objects.equals(parent2Type, that.parent2Type) && Objects.equals(siblings, that.siblings) && Objects.equals(germplasmURI, that.germplasmURI) && Objects.equals(parent1URI, that.parent1URI) && Objects.equals(parent2URI, that.parent2URI); + } + + public String getCrossingPlan() { + return crossingPlan; + } + + public String getGermplasmPedigreeURI() { + return germplasmPedigreeURI; + } + + public void setGermplasmPedigreeURI(String germplasmPedigreeURI) { + this.germplasmPedigreeURI = germplasmPedigreeURI; + } + + public void setCrossingPlan(String crossingPlan) { + this.crossingPlan = crossingPlan; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getGermplasmPedigreeDbId() { + return germplasmPedigreeDbId; + } + + public void setGermplasmPedigreeDbId(String germplasmPedigreeDbId) { + this.germplasmPedigreeDbId = germplasmPedigreeDbId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getCrossingYear() { + return crossingYear; + } + + public void setCrossingYear(String crossingYear) { + this.crossingYear = crossingYear; + } + + public String getDefaultDisplayName() { + return defaultDisplayName; + } + + public void setDefaultDisplayName(String defaultDisplayName) { + this.defaultDisplayName = defaultDisplayName; + } + + public String getFamilyCode() { + return familyCode; + } + + public void setFamilyCode(String familyCode) { + this.familyCode = familyCode; + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + public String getGermplasmURI() { + return germplasmURI; + } + + public void setGermplasmURI(String germplasmURI) { + this.germplasmURI = germplasmURI; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getParent1DbId() { + return parent1DbId; + } + + public void setParent1DbId(String parent1DbId) { + this.parent1DbId = parent1DbId; + } + + public String getParent1Name() { + return parent1Name; + } + + public void setParent1Name(String parent1Name) { + this.parent1Name = parent1Name; + } + + public String getParent1Type() { + return parent1Type; + } + + public void setParent1Type(String parent1Type) { + this.parent1Type = parent1Type; + } + + public String getParent1URI() { + return parent1URI; + } + + public void setParent1URI(String parent1URI) { + this.parent1URI = parent1URI; + } + + public String getParent2DbId() { + return parent2DbId; + } + + public void setParent2DbId(String parent2DbId) { + this.parent2DbId = parent2DbId; + } + + public String getParent2Name() { + return parent2Name; + } + + public void setParent2Name(String parent2Name) { + this.parent2Name = parent2Name; + } + + public String getParent2Type() { + return parent2Type; + } + + public void setParent2Type(String parent2Type) { + this.parent2Type = parent2Type; + } + + public String getParent2URI() { + return parent2URI; + } + + public void setParent2URI(String parent2URI) { + this.parent2URI = parent2URI; + } + + public String getPedigree() { + return pedigree; + } + + public void setPedigree(String pedigree) { + this.pedigree = pedigree; + } + + public List<SiblingV1VO> getSiblings() { + return siblings; + } + + public void setSiblings(List<SiblingV1VO> siblings) { + this.siblings = siblings; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + @Override + public int hashCode() { + return Objects.hash(_id, germplasmDbId, defaultDisplayName, pedigree, groupId, crossingPlan, crossingYear, familyCode, parent1DbId, parent1Name, parent1Type, parent2DbId, parent2Name, parent2Type, siblings, germplasmURI, parent1URI, parent2URI); + } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmV1VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmV1VO.java new file mode 100644 index 0000000000000000000000000000000000000000..1f0f7628a30e8c7a6c649bfb1df901d19fa7f0ce --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/GermplasmV1VO.java @@ -0,0 +1,632 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import com.fasterxml.jackson.annotation.JsonProperty; +import fr.inrae.urgi.faidare.domain.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Objects; + +@Document( + indexName = GermplasmV1VO.INDEX_NAME, + createIndex = false +) +public final class GermplasmV1VO { + public static final String INDEX_NAME = "faidare_germplasm_dev-group0"; + + private List<String> accessionNames; + private String accessionNumber; + private String acquisitionDate; + private String acquisitionSourceCode; + private List<String> alternateIDs; + private String ancestralData; + private String biologicalStatusOfAccessionCode; + private GermplasmInstituteVO breeder; + private List<GenealogyVO> children; + private SiteVO collectingSite; //GnpIS + private List<CollPopVO> collection; + private GermplasmInstituteVO collector; + private String commonCropName; + private String countryOfOriginCode; + private List<GermplasmInstituteVO> distributors; + //private List<GermplasmInstitute> breedingInstitutes; + //private GermplasmCollectingInfo collectingInfo; + private String defaultDisplayName; + private String documentationURL; + private List<DonorVO> donors; + private List<SiteVO> evaluationSites; //GnpIS + private String genus; + private String genusSpecies; //GnpIS + private String genusSpeciesSubtaxa; //GnpIS + private String germplasmDbId; + //private List<DonorInfoVO> donorInfo; TODO activate + private String germplasmName; + private String germplasmPUI; + private Long groupId; //GnpIS + @Field(name="germplasmPUI") + private String germplasmURI; + @JsonProperty("@id") + @Field(name="germplasmPUI")//TODO : should take germpalsmURI as it is always fed in the new transformer + private String id; + private InstituteVO holdingInstitute; //GnpIS + private InstituteVO holdingGenbank; //GnpIS + @Id + private String _id; + private String instituteCode; + private String instituteName; + private String mlsStatus; + private SiteVO originSite; //GnpIS + private List<CollPopVO> panel; //GnpIS + private String pedigree; + private PhotoVO photo; //GnpIS + private List<CollPopVO> population; //GnpIS + private String presenceStatus; //GnpIS + private String remarks; + @JsonProperty("schema:name") + @Field("schema:name") + private String schemaName; + @JsonProperty("schema:identifier") + @Field("schema:identifier") + private String schemaId; + @JsonProperty("schema:includedInDataCatalog") + @Field("schema:includedInDataCatalog") + private String schemaCatalog; + private String seedSource; + @Field("schema:includedInDataCatalog") + private String sourceUri; + private String species; + //private List<GermplasmInstitute> safetyDuplicateInstitutes; + private String speciesAuthority; + private List<String> storageTypeCodes; + private List<String> studyDbIds; + private List<String> studyURIs; + private String subtaxa; + private String subtaxaAuthority; + private String subtaxon; + private String subtaxonAuthority; + private List<String> synonyms; + private List<String> taxonCommonNames; + private List<String> typeOfGermplasmStorageCode; + @JsonProperty("@type") + private String type = "germplasm"; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmV1VO that = (GermplasmV1VO) o; + return Objects.equals(accessionNames, that.accessionNames) && Objects.equals(accessionNumber, that.accessionNumber) && Objects.equals(acquisitionDate, that.acquisitionDate) && Objects.equals(acquisitionSourceCode, that.acquisitionSourceCode) && Objects.equals(alternateIDs, that.alternateIDs) && Objects.equals(ancestralData, that.ancestralData) && Objects.equals(biologicalStatusOfAccessionCode, that.biologicalStatusOfAccessionCode) && Objects.equals(collection, that.collection) && Objects.equals(commonCropName, that.commonCropName) && Objects.equals(countryOfOriginCode, that.countryOfOriginCode) && Objects.equals(defaultDisplayName, that.defaultDisplayName) && Objects.equals(documentationURL, that.documentationURL) && Objects.equals(genus, that.genus) && Objects.equals(genusSpecies, that.genusSpecies) && Objects.equals(genusSpeciesSubtaxa, that.genusSpeciesSubtaxa) && Objects.equals(germplasmDbId, that.germplasmDbId) && Objects.equals(donors, that.donors) && Objects.equals(evaluationSites, that.evaluationSites) && Objects.equals(germplasmName, that.germplasmName) && Objects.equals(germplasmPUI, that.germplasmPUI) && Objects.equals(groupId, that.groupId) && Objects.equals(germplasmURI, that.germplasmURI) && Objects.equals(id, that.id) && Objects.equals(holdingInstitute, that.holdingInstitute) && Objects.equals(holdingGenbank, that.holdingGenbank) && Objects.equals(_id, that._id) && Objects.equals(instituteCode, that.instituteCode) && Objects.equals(instituteName, that.instituteName) && Objects.equals(mlsStatus, that.mlsStatus) && Objects.equals(originSite, that.originSite) && Objects.equals(panel, that.panel) && Objects.equals(pedigree, that.pedigree) && Objects.equals(photo, that.photo) && Objects.equals(population, that.population) && Objects.equals(presenceStatus, that.presenceStatus) && Objects.equals(remarks, that.remarks) && Objects.equals(schemaName, that.schemaName) && Objects.equals(schemaId, that.schemaId) && Objects.equals(schemaCatalog, that.schemaCatalog) && Objects.equals(seedSource, that.seedSource) && Objects.equals(sourceUri, that.sourceUri) && Objects.equals(species, that.species) && Objects.equals(speciesAuthority, that.speciesAuthority) && Objects.equals(storageTypeCodes, that.storageTypeCodes) && Objects.equals(studyDbIds, that.studyDbIds) && Objects.equals(studyURIs, that.studyURIs) && Objects.equals(subtaxa, that.subtaxa) && Objects.equals(subtaxaAuthority, that.subtaxaAuthority) && Objects.equals(subtaxon, that.subtaxon) && Objects.equals(subtaxonAuthority, that.subtaxonAuthority) && Objects.equals(synonyms, that.synonyms) && Objects.equals(taxonCommonNames, that.taxonCommonNames) && Objects.equals(typeOfGermplasmStorageCode, that.typeOfGermplasmStorageCode) && Objects.equals(type, that.type); + } + + public List<String> getAccessionNames() { + return accessionNames; + } + + public void setAccessionNames(List<String> accessionNames) { + this.accessionNames = accessionNames; + } + + public String getAccessionNumber() { + return accessionNumber; + } + + public void setAccessionNumber(String accessionNumber) { + this.accessionNumber = accessionNumber; + } + + public String getAcquisitionDate() { + return acquisitionDate; + } + + public void setAcquisitionDate(String acquisitionDate) { + this.acquisitionDate = acquisitionDate; + } + + public String getAcquisitionSourceCode() { + return acquisitionSourceCode; + } + + public void setAcquisitionSourceCode(String acquisitionSourceCode) { + this.acquisitionSourceCode = acquisitionSourceCode; + } + + public List<String> getAlternateIDs() { + return alternateIDs; + } + + public void setAlternateIDs(List<String> alternateIDs) { + this.alternateIDs = alternateIDs; + } + + public String getAncestralData() { + return ancestralData; + } + + public void setAncestralData(String ancestralData) { + this.ancestralData = ancestralData; + } + + public String getBiologicalStatusOfAccessionCode() { + return biologicalStatusOfAccessionCode; + } + + public void setBiologicalStatusOfAccessionCode(String biologicalStatusOfAccessionCode) { + this.biologicalStatusOfAccessionCode = biologicalStatusOfAccessionCode; + } + + public GermplasmInstituteVO getBreeder() { + return breeder; + } + + public void setBreeder(GermplasmInstituteVO breeder) { + this.breeder = breeder; + } + + public List<GenealogyVO> getChildren() { + return children; + } + + public void setChildren(List<GenealogyVO> children) { + this.children = children; + } + + public SiteVO getCollectingSite() { + return collectingSite; + } + + public void setCollectingSite(SiteVO collectingSite) { + this.collectingSite = collectingSite; + } + + public List<CollPopVO> getCollection() { + return collection; + } + + public void setCollection(List<CollPopVO> collection) { + this.collection = collection; + } + + public GermplasmInstituteVO getCollector() { + return collector; + } + + public void setCollector(GermplasmInstituteVO collector) { + this.collector = collector; + } + + public String getCommonCropName() { + return commonCropName; + } + + public void setCommonCropName(String commonCropName) { + this.commonCropName = commonCropName; + } + + public String getCountryOfOriginCode() { + return countryOfOriginCode; + } + + public void setCountryOfOriginCode(String countryOfOriginCode) { + this.countryOfOriginCode = countryOfOriginCode; + } + + public String getDefaultDisplayName() { + return defaultDisplayName; + } + + public void setDefaultDisplayName(String defaultDisplayName) { + this.defaultDisplayName = defaultDisplayName; + } + + public List<GermplasmInstituteVO> getDistributors() { + return distributors; + } + + public void setDistributors(List<GermplasmInstituteVO> distributors) { + this.distributors = distributors; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public List<DonorVO> getDonors() { + return donors; + } + + public void setDonors(List<DonorVO> donors) { + this.donors = donors; + } + + public List<SiteVO> getEvaluationSites() { + return evaluationSites; + } + + public void setEvaluationSites(List<SiteVO> evaluationSites) { + this.evaluationSites = evaluationSites; + } + + public String getGenus() { + return genus; + } + + public void setGenus(String genus) { + this.genus = genus; + } + + public String getGenusSpecies() { + return genusSpecies; + } + + public void setGenusSpecies(String genusSpecies) { + this.genusSpecies = genusSpecies; + } + + public String getGenusSpeciesSubtaxa() { + return genusSpeciesSubtaxa; + } + + public void setGenusSpeciesSubtaxa(String genusSpeciesSubtaxa) { + this.genusSpeciesSubtaxa = genusSpeciesSubtaxa; + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + public String getGermplasmName() { + return germplasmName; + } + + public void setGermplasmName(String germplasmName) { + this.germplasmName = germplasmName; + } + + public String getGermplasmPUI() { + return germplasmPUI; + } + + public void setGermplasmPUI(String germplasmPUI) { + this.germplasmPUI = germplasmPUI; + } + + public String getGermplasmURI() { + return germplasmURI; + } + + public void setGermplasmURI(String germplasmURI) { + this.germplasmURI = germplasmURI; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + //private List<TaxonSource> taxonIds; TODO activate Taxonsource OK + + public InstituteVO getHoldingGenbank() { + return holdingGenbank; + } + + public void setHoldingGenbank(InstituteVO holdingGenbank) { + this.holdingGenbank = holdingGenbank; + } + + public InstituteVO getHoldingInstitute() { + return holdingInstitute; + } + + public void setHoldingInstitute(InstituteVO holdingInstitute) { + this.holdingInstitute = holdingInstitute; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstituteCode() { + return instituteCode; + } + + public void setInstituteCode(String instituteCode) { + this.instituteCode = instituteCode; + } + + public String getInstituteName() { + return instituteName; + } + + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; + } + + public String getMlsStatus() { + return mlsStatus; + } + + public void setMlsStatus(String mlsStatus) { + this.mlsStatus = mlsStatus; + } + + public SiteVO getOriginSite() { + return originSite; + } + + public void setOriginSite(SiteVO originSite) { + this.originSite = originSite; + } + + public List<CollPopVO> getPanel() { + return panel; + } + + public void setPanel(List<CollPopVO> panel) { + this.panel = panel; + } + + public String getPedigree() { + return pedigree; + } + + public void setPedigree(String pedigree) { + this.pedigree = pedigree; + } + + public PhotoVO getPhoto() { + return photo; + } + + public void setPhoto(PhotoVO photo) { + this.photo = photo; + } + + public List<CollPopVO> getPopulation() { + return population; + } + + public void setPopulation(List<CollPopVO> population) { + this.population = population; + } + + public String getPresenceStatus() { + return presenceStatus; + } + + public void setPresenceStatus(String presenceStatus) { + this.presenceStatus = presenceStatus; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSchemaCatalog() { + return schemaCatalog; + } + + public void setSchemaCatalog(String schemaCatalog) { + this.schemaCatalog = schemaCatalog; + } + + public String getSchemaId() { + return schemaId; + } + + public void setSchemaId(String schemaId) { + this.schemaId = schemaId; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + public String getSeedSource() { + return seedSource; + } + + public void setSeedSource(String seedSource) { + this.seedSource = seedSource; + } + + public String getSourceUri() { + return sourceUri; + } + + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; + } + + public String getSpecies() { + return species; + } + + public void setSpecies(String species) { + this.species = species; + } + + public String getSpeciesAuthority() { + return speciesAuthority; + } + + public void setSpeciesAuthority(String speciesAuthority) { + this.speciesAuthority = speciesAuthority; + } + + public List<String> getStorageTypeCodes() { + return storageTypeCodes; + } + + public void setStorageTypeCodes(List<String> storageTypeCodes) { + this.storageTypeCodes = storageTypeCodes; + } + + public List<String> getStudyDbIds() { + return studyDbIds; + } + + public void setStudyDbIds(List<String> studyDbIds) { + this.studyDbIds = studyDbIds; + } + + public List<String> getStudyURIs() { + return studyURIs; + } + + public void setStudyURIs(List<String> studyURIs) { + this.studyURIs = studyURIs; + } + + public String getSubtaxa() { + return subtaxa; + } + + public void setSubtaxa(String subtaxa) { + this.subtaxa = subtaxa; + } + + public String getSubtaxaAuthority() { + return subtaxaAuthority; + } + + public void setSubtaxaAuthority(String subtaxaAuthority) { + this.subtaxaAuthority = subtaxaAuthority; + } + + public String getSubtaxon() { + return subtaxon; + } + + public void setSubtaxon(String subtaxon) { + this.subtaxon = subtaxon; + } + + public String getSubtaxonAuthority() { + return subtaxonAuthority; + } + + public void setSubtaxonAuthority(String subtaxonAuthority) { + this.subtaxonAuthority = subtaxonAuthority; + } + + public List<String> getSynonyms() { + return synonyms; + } + + public void setSynonyms(List<String> synonyms) { + this.synonyms = synonyms; + } + + public List<String> getTaxonCommonNames() { + return taxonCommonNames; + } + + public void setTaxonCommonNames(List<String> taxonCommonNames) { + this.taxonCommonNames = taxonCommonNames; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List<String> getTypeOfGermplasmStorageCode() { + return typeOfGermplasmStorageCode; + } + + public void setTypeOfGermplasmStorageCode(List<String> typeOfGermplasmStorageCode) { + this.typeOfGermplasmStorageCode = typeOfGermplasmStorageCode; + } + + @Override + public int hashCode() { + return Objects.hash(accessionNames, accessionNumber, acquisitionDate, acquisitionSourceCode, alternateIDs, ancestralData, biologicalStatusOfAccessionCode, collection, commonCropName, countryOfOriginCode, defaultDisplayName, documentationURL, genus, genusSpecies, genusSpeciesSubtaxa, germplasmDbId, donors, evaluationSites, germplasmName, germplasmPUI, groupId, germplasmURI, id, holdingInstitute, holdingGenbank, _id, instituteCode, instituteName, mlsStatus, originSite, panel, pedigree, photo, population, presenceStatus, remarks, schemaName, schemaId, schemaCatalog, seedSource, sourceUri, species, speciesAuthority, storageTypeCodes, studyDbIds, studyURIs, subtaxa, subtaxaAuthority, subtaxon, subtaxonAuthority, synonyms, taxonCommonNames, typeOfGermplasmStorageCode, type); + } + + @Override + public String toString() { + return "GermplasmV1VO{" + + "accessionNames=" + accessionNames + + ", accessionNumber='" + accessionNumber + '\'' + + ", acquisitionDate='" + acquisitionDate + '\'' + + ", acquisitionSourceCode='" + acquisitionSourceCode + '\'' + + ", alternateIDs=" + alternateIDs + + ", ancestralData='" + ancestralData + '\'' + + ", biologicalStatusOfAccessionCode='" + biologicalStatusOfAccessionCode + '\'' + + ", collection=" + collection + + ", commonCropName='" + commonCropName + '\'' + + ", countryOfOriginCode='" + countryOfOriginCode + '\'' + + ", defaultDisplayName='" + defaultDisplayName + '\'' + + ", documentationURL='" + documentationURL + '\'' + + ", genus='" + genus + '\'' + + ", genusSpecies='" + genusSpecies + '\'' + + ", genusSpeciesSubtaxa='" + genusSpeciesSubtaxa + '\'' + + ", germplasmDbId='" + germplasmDbId + '\'' + + ", donors=" + donors + + ", evaluationSites=" + evaluationSites + + ", germplasmName='" + germplasmName + '\'' + + ", germplasmPUI='" + germplasmPUI + '\'' + + ", groupId=" + groupId + + ", germplasmURI='" + germplasmURI + '\'' + + ", id='" + id + '\'' + + ", holdingInstitute=" + holdingInstitute + + ", holdingGenbank=" + holdingGenbank + + ", _id='" + _id + '\'' + + ", instituteCode='" + instituteCode + '\'' + + ", instituteName='" + instituteName + '\'' + + ", mlsStatus='" + mlsStatus + '\'' + + ", originSite=" + originSite + + ", panel=" + panel + + ", pedigree='" + pedigree + '\'' + + ", photo=" + photo + + ", population=" + population + + ", presenceStatus='" + presenceStatus + '\'' + + ", remarks='" + remarks + '\'' + + ", schemaName='" + schemaName + '\'' + + ", schemaId='" + schemaId + '\'' + + ", schemaCatalog='" + schemaCatalog + '\'' + + ", seedSource='" + seedSource + '\'' + + ", species='" + species + '\'' + + ", speciesAuthority='" + speciesAuthority + '\'' + + ", storageTypeCodes=" + storageTypeCodes + + ", studyDbIds=" + studyDbIds + + ", studyURIs=" + studyURIs + + ", subtaxa='" + subtaxa + '\'' + + ", subtaxaAuthority='" + subtaxaAuthority + '\'' + + ", subtaxon='" + subtaxon + '\'' + + ", subtaxonAuthority='" + subtaxonAuthority + '\'' + + ", synonyms=" + synonyms + + ", taxonCommonNames=" + taxonCommonNames + + ", typeOfGermplasmStorageCode=" + typeOfGermplasmStorageCode + + ", type='" + type + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ParentProgenyVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/SiblingV1VO.java similarity index 50% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ParentProgenyVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/SiblingV1VO.java index e4a3df6560673c0ff5715c443761567af9ca42cb..2034a124ec4ea1de98890c610cf53e5a682779f2 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/germplasm/ParentProgenyVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/SiblingV1VO.java @@ -1,42 +1,38 @@ -package fr.inra.urgi.faidare.domain.data.germplasm; +package fr.inrae.urgi.faidare.domain.brapi.v1; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiParentProgeny; +import java.util.Objects; -import java.io.Serializable; - - -public class ParentProgenyVO implements Serializable, BrapiParentProgeny { - - private static final long serialVersionUID = -915154032692086323L; +public class SiblingV1VO { private String germplasmDbId; private String defaultDisplayName; - private String parentType; @Override - public String getGermplasmDbId() { - return germplasmDbId; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SiblingV1VO that = (SiblingV1VO) o; + return Objects.equals(germplasmDbId, that.germplasmDbId) && Objects.equals(defaultDisplayName, that.defaultDisplayName); } - @Override public String getDefaultDisplayName() { return defaultDisplayName; } - @Override - public String getParentType() { - return parentType; + public void setDefaultDisplayName(String defaultDisplayName) { + this.defaultDisplayName = defaultDisplayName; } - public void setGermplasmDbId(String germplasmDbId) { - this.germplasmDbId = germplasmDbId; + public String getGermplasmDbId() { + return germplasmDbId; } - public void setDefaultDisplayName(String defaultDisplayName) { - this.defaultDisplayName = defaultDisplayName; + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; } - public void setParentType(String parentType) { - this.parentType = parentType; + @Override + public int hashCode() { + return Objects.hash(germplasmDbId, defaultDisplayName); } } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1VO.java new file mode 100644 index 0000000000000000000000000000000000000000..19719422a7bb4ce949fc1ce4dea0398accecba06 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1VO.java @@ -0,0 +1,360 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import fr.inrae.urgi.faidare.domain.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Set; + + +@Document( + indexName = StudyV1VO.INDEX_NAME, + createIndex = false +) +public final class StudyV1VO { + + public static final String INDEX_NAME = "faidare_study_dev-group0"; + + private boolean active; + + // private additionalInfo; + + private String commonCropName; + + private List<ContactVO> contact; + + private String culturalPractices; + + private List<DataLinksVO> dataLinks; + + private String documentationURL; + + private String endDate; + + private List<EnvironmentParametersVO> environmentParameters; + + private PuiDescriptionVO experimentalDesign; + + private List<ExternalReferencesVO> externalReferences; + + private List<String> germplasmDbIds; + + private Long groupId; + + private PuiDescriptionVO growthFacility; + + private LastUpdateVO lastUpdate; + + private String license; + + private LocationVO location; + + private String locationDbId; + + private String locationName; + + private List<ObservationLevelsVO> ObservationLevels; + + private String observationUnitsDescription; + + private List<String> observationVariableDbIds; + + private String programDbId; + + private String programName; + + private List<String> seasons; + + @Field("schema:includedInDataCatalog") + private String sourceUri; + + private String startDate; + + private String studyCode; + + @Id + private String _id; + private String studyDbId; + private String studyDescription; + private String studyName; + private String studyPUI; + private String studyType; + private String trialDbId; + private Set<String> trialsDbIds; + private String trialName; + + public String getCommonCropName() { + return commonCropName; + } + + public void setCommonCropName(String commonCropName) { + this.commonCropName = commonCropName; + } + + public List<ContactVO> getContact() { + return contact; + } + + public void setContact(List<ContactVO> contact) { + this.contact = contact; + } + + public String getCulturalPractices() { + return culturalPractices; + } + + public void setCulturalPractices(String culturalPractices) { + this.culturalPractices = culturalPractices; + } + + public List<DataLinksVO> getDataLinks() { + return dataLinks; + } + + public void setDataLinks(List<DataLinksVO> dataLinks) { + this.dataLinks = dataLinks; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public String getEndDate() { return endDate; } + + public void setEndDate(String endDate) { this.endDate = endDate; } + + public List<EnvironmentParametersVO> getEnvironmentParameters() { + return environmentParameters; + } + + public void setEnvironmentParameters(List<EnvironmentParametersVO> environmentParameters) { this.environmentParameters = environmentParameters; } + + public PuiDescriptionVO getExperimentalDesign() { + return experimentalDesign; + } + + public void setExperimentalDesign(PuiDescriptionVO experimentalDesign) { this.experimentalDesign = experimentalDesign; } + + public List<ExternalReferencesVO> getExternalReferences() { + return externalReferences; + } + + public void setExternalReferences(List<ExternalReferencesVO> externalReferences) { this.externalReferences = externalReferences; } + + public List<String> getGermplasmDbIds() { + return germplasmDbIds; + } + + public void setGermplasmDbIds(List<String> germplasmDbIds) { + this.germplasmDbIds = germplasmDbIds; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public PuiDescriptionVO getGrowthFacility() { + return growthFacility; + } + + public void setGrowthFacility(PuiDescriptionVO growthFacility) { + this.growthFacility = growthFacility; + } + + public LastUpdateVO getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(LastUpdateVO lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public LocationVO getLocation() { + return location; + } + + public void setLocation(LocationVO location) { + this.location = location; + } + + public String getLocationDbId() { + return locationDbId; + } + + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; + } + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public List<ObservationLevelsVO> getObservationLevels() { + return ObservationLevels; + } + + public void setObservationLevels(List<ObservationLevelsVO> observationLevels) { ObservationLevels = observationLevels; } + + public String getObservationUnitsDescription() { + return observationUnitsDescription; + } + + public void setObservationUnitsDescription(String observationUnitsDescription) { this.observationUnitsDescription = observationUnitsDescription; } + + public List<String> getObservationVariableDbIds() { + return observationVariableDbIds; + } + + public void setObservationVariableDbIds(List<String> observationVariableDbIds) { this.observationVariableDbIds = observationVariableDbIds; } + + public String getProgramDbId() { + return programDbId; + } + + public void setProgramDbId(String programDbId) { + this.programDbId = programDbId; + } + + public String getProgramName() { + return programName; + } + + public void setProgramName(String programName) { + this.programName = programName; + } + + public List<String> getSeasons() { + return seasons; + } + + public void setSeasons(List<String> seasons) { + this.seasons = seasons; + } + + public String getSourceUri() { + return sourceUri; + } + + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getStudyCode() { + return studyCode; + } + + public void setStudyCode(String studyCode) { + this.studyCode = studyCode; + } + + public String getStudyDbId() { + return studyDbId; + } + + public void setStudyDbId(String studyDbId) { + this.studyDbId = studyDbId; + } + + public String getStudyDescription() { + return studyDescription; + } + + public void setStudyDescription(String studyDescription) { + this.studyDescription = studyDescription; + } + + public String getStudyName() { + return studyName; + } + + public void setStudyName(String studyName) { + this.studyName = studyName; + } + + public String getStudyPUI() { + return studyPUI; + } + + public void setStudyPUI(String studyPUI) { + this.studyPUI = studyPUI; + } + + public String getStudyType() { + return studyType; + } + + public void setStudyType(String studyType) { + this.studyType = studyType; + } + + public String getTrialDbId() { + return trialDbId; + } + + public void setTrialDbId(String trialDbId) { + this.trialDbId = trialDbId; + } + + public String getTrialName() { + return trialName; + } + + public void setTrialName(String trialName) { + this.trialName = trialName; + } + + public Set<String> getTrialsDbIds() { + return trialsDbIds; + } + + public void setTrialsDbIds(Set<String> trialsDbIds) { + this.trialsDbIds = trialsDbIds; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1miniVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1miniVO.java new file mode 100644 index 0000000000000000000000000000000000000000..391f6ac6571685aacd9ce62e039900f725084436 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/StudyV1miniVO.java @@ -0,0 +1,96 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +import java.util.Objects; + + +@Document( + indexName = "faidare_study_dev-group0", + //indexName = "faidare_study_beta-group0", + createIndex = false +) +public final class StudyV1miniVO { + + + + private String locationDbId; + + private String locationName; + @Id + private String _id; + private String studyDbId; + private String studyName; + private String studyPUI; + private String studyURI; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StudyV1miniVO that = (StudyV1miniVO) o; + return Objects.equals(locationDbId, that.locationDbId) && Objects.equals(locationName, that.locationName) && Objects.equals(_id, that._id) && Objects.equals(studyDbId, that.studyDbId) && Objects.equals(studyName, that.studyName) && Objects.equals(studyPUI, that.studyPUI) && Objects.equals(studyURI, that.studyURI); + } + + @Override + public int hashCode() { + return Objects.hash(locationDbId, locationName, _id, studyDbId, studyName, studyPUI, studyURI); + } + + public String getLocationDbId() { + return locationDbId; + } + + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; + } + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getStudyDbId() { + return studyDbId; + } + + public void setStudyDbId(String studyDbId) { + this.studyDbId = studyDbId; + } + + public String getStudyName() { + return studyName; + } + + public void setStudyName(String studyName) { + this.studyName = studyName; + } + + public String getStudyPUI() { + return studyPUI; + } + + public void setStudyPUI(String studyPUI) { + this.studyPUI = studyPUI; + } + + public String getStudyURI() { + return studyURI; + } + + public void setStudyURI(String studyURI) { + this.studyURI = studyURI; + } +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/TrialV1VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/TrialV1VO.java new file mode 100644 index 0000000000000000000000000000000000000000..fb0a6eacc75ed94f31656ef7f29a1dfd1b35c423 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v1/TrialV1VO.java @@ -0,0 +1,200 @@ +package fr.inrae.urgi.faidare.domain.brapi.v1; + +import fr.inrae.urgi.faidare.domain.ContactVO; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Objects; + +@Document( + indexName = "faidare_trial_dev-group0", + //indexName = "faidare_trial_beta-group0", + createIndex = false +) + +public class TrialV1VO { + + private Boolean active; + + private String additionalInfo; + private String trialDbId; + private String trialName; + private Long groupId; + private String trialType; + private String instituteName; + private String endDate; + @Id + private String _id; + private String programDbId; + private String programName; + private String dataSetAuthorship; + + @Field("schema:includedInDataCatalog") + private String sourceUri; + + private String startDate; + private List<ContactVO> contact; + private List<String> studyDbIds; + private List<StudyV1miniVO> studies; + private String documentationURL; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TrialV1VO trialV1VO = (TrialV1VO) o; + return Objects.equals(active, trialV1VO.active) && Objects.equals(additionalInfo, trialV1VO.additionalInfo) && Objects.equals(trialDbId, trialV1VO.trialDbId) && Objects.equals(trialName, trialV1VO.trialName) && Objects.equals(groupId, trialV1VO.groupId) && Objects.equals(trialType, trialV1VO.trialType) && Objects.equals(instituteName, trialV1VO.instituteName) && Objects.equals(endDate, trialV1VO.endDate) && Objects.equals(_id, trialV1VO._id) && Objects.equals(programDbId, trialV1VO.programDbId) && Objects.equals(programName, trialV1VO.programName) && Objects.equals(dataSetAuthorship, trialV1VO.dataSetAuthorship) && Objects.equals(startDate, trialV1VO.startDate) && Objects.equals(contact, trialV1VO.contact) && Objects.equals(studyDbIds, trialV1VO.studyDbIds) && Objects.equals(studies, trialV1VO.studies) && Objects.equals(documentationURL, trialV1VO.documentationURL); + } + + public Boolean getActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } + + public String getAdditionalInfo() { + return additionalInfo; + } + + public void setAdditionalInfo(String additionalInfo) { + this.additionalInfo = additionalInfo; + } + + public List<ContactVO> getContact() { + return contact; + } + + public void setContact(List<ContactVO> contact) { + this.contact = contact; + } + + public String getDataSetAuthorship() { + return dataSetAuthorship; + } + + public void setDataSetAuthorship(String dataSetAuthorship) { + this.dataSetAuthorship = dataSetAuthorship; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getInstituteName() { + return instituteName; + } + + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; + } + + public String getProgramDbId() { + return programDbId; + } + + public void setProgramDbId(String programDbId) { + this.programDbId = programDbId; + } + + public String getProgramName() { + return programName; + } + + public void setProgramName(String programName) { + this.programName = programName; + } + + public String getSourceUri() { + return sourceUri; + } + + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public List<StudyV1miniVO> getStudies() { + return studies; + } + + public void setStudies(List<StudyV1miniVO> studies) { + this.studies = studies; + } + + public List<String> getStudyDbIds() { + return studyDbIds; + } + + public void setStudyDbIds(List<String> studyDbIds) { + this.studyDbIds = studyDbIds; + } + + public String getTrialDbId() { + return trialDbId; + } + + public void setTrialDbId(String trialDbId) { + this.trialDbId = trialDbId; + } + + public String getTrialName() { + return trialName; + } + + public void setTrialName(String trialName) { + this.trialName = trialName; + } + + public String getTrialType() { + return trialType; + } + + public void setTrialType(String trialType) { + this.trialType = trialType; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + @Override + public int hashCode() { + return Objects.hash(active, additionalInfo, trialDbId, trialName, groupId, trialType, instituteName, endDate, _id, programDbId, programName, dataSetAuthorship, startDate, contact, studyDbIds, studies, documentationURL); + } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/GermplasmV2VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/GermplasmV2VO.java new file mode 100644 index 0000000000000000000000000000000000000000..30231702295094fbcef5b7e7d981523473c9bb03 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/GermplasmV2VO.java @@ -0,0 +1,670 @@ +package fr.inrae.urgi.faidare.domain.brapi.v2; + +import fr.inrae.urgi.faidare.domain.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Objects; + +@Document( + indexName = "#{@faidareProperties.getAliasName('germplasm', 0L)}", + createIndex = false +) +public class GermplasmV2VO { + + + //public static final String INDEX_NAME = "faidare_germplasm_dev-group0"; + + private String accessionNumber; + + private String acquisitionDate; + + // private ... additionalInfo; + + private String biologicalStatusOfAccessionCode; + + private String biologicalStatusOfAccessionDescription; + + private List<GermplasmInstituteVO> breeder; + + private String breedingMethodDbId; + + private String breedingMethodName; + + private List<GenealogyVO> children; // GnpIS + + private SiteVO collectingSite; //GnpIS + + private List<CollPopVO> collection; + + private GermplasmInstituteVO collector; //GnpIS + + private String comment; //GnpIS + + private String commonCropName; + + private String countryOfOriginCode; + + private String defaultDisplayName; + + private List<PuiNameValueVO> descriptors; //GnpIS + + private List<GermplasmInstituteVO> distributors; //GnpIS + + private String documentationURL; + + private List<DonorVO> donors; + + private List<SiteVO> evaluationSites; //GnpIS + + private List<ExternalReferencesVO> externalReferences; + + private GenealogyVO genealogy; //GnpIS + + private String geneticNature; //GnpIS + + private String genus; + + private String genusSpecies; //GnpIS + + private String genusSpeciesSubtaxa; //GnpIS + + private String germplasmDbId; + + private String germplasmName; + + private List<GermplasmOriginVO> germplasmOrigin; + + private String germplasmPUI; + + private String germplasmPreprocessing; + + private Long groupId; //GnpIS + + private InstituteVO holdingInstitute; //GnpIS + + private InstituteVO holdingGenbank; //GnpIS + + @Id + private String _id; + + private String instituteCode; + + private String instituteName; + + private SiteVO originSite; //GnpIS + + private List<CollPopVO> panel; //GnpIS + + private PhotoVO photo; //GnpIS + + private List<CollPopVO> population; //GnpIS + + private String presenceStatus; //GnpIS + + private String seedSource; + + private String seedSourceDescription; + + private String source; + + @Field("schema:includedInDataCatalog") + private String sourceUri; + + private String species; + + private String speciesAuthority; + + private List<StorageTypesVO> storageTypes; + + private List<String> studyDbIds; + + private String subtaxa; + + private String subtaxaAuthority; + + private List<String> synonyms; + + private String taxonComment; //GnpIS + + private List<String> taxonCommonNames; //GnpIS + + private List<TaxonSourceVO> taxonIds; + + private List<String> taxonSynonyms; //GnpIS + + private List<String> typeOfGermplasmStorageCode; //GnpIS + + + public String getAccessionNumber() { + return accessionNumber; + } + + public void setAccessionNumber(String accessionNumber) { + this.accessionNumber = accessionNumber; + } + + public String getAcquisitionDate() { + return acquisitionDate; + } + + public void setAcquisitionDate(String acquisitionDate) { + this.acquisitionDate = acquisitionDate; + } + + public String getBiologicalStatusOfAccessionCode() { + return biologicalStatusOfAccessionCode; + } + + public void setBiologicalStatusOfAccessionCode(String biologicalStatusOfAccessionCode) { + this.biologicalStatusOfAccessionCode = biologicalStatusOfAccessionCode; + } + + public String getBiologicalStatusOfAccessionDescription() { + return biologicalStatusOfAccessionDescription; + } + + public void setBiologicalStatusOfAccessionDescription(String biologicalStatusOfAccessionDescription) { + this.biologicalStatusOfAccessionDescription = biologicalStatusOfAccessionDescription; + } + + public List<GermplasmInstituteVO> getBreeder() { + return breeder; + } + + public void setBreeder(List<GermplasmInstituteVO> breeder) { + this.breeder = breeder; + } + + public String getBreedingMethodDbId() { + return breedingMethodDbId; + } + + public void setBreedingMethodDbId(String breedingMethodDbId) { + this.breedingMethodDbId = breedingMethodDbId; + } + + public String getBreedingMethodName() { + return breedingMethodName; + } + + public void setBreedingMethodName(String breedingMethodName) { + this.breedingMethodName = breedingMethodName; + } + + public List<GenealogyVO> getChildren() { + return children; + } + + public void setChildren(List<GenealogyVO> children) { + this.children = children; + } + + public SiteVO getCollectingSite() { + return collectingSite; + } + + public void setCollectingSite(SiteVO collectingSite) { + this.collectingSite = collectingSite; + } + + public List<CollPopVO> getCollection() { + return collection; + } + + public void setCollection(List<CollPopVO> collection) { + this.collection = collection; + } + + public GermplasmInstituteVO getCollector() { + return collector; + } + + public void setCollector(GermplasmInstituteVO collector) { + this.collector = collector; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getCommonCropName() { + return commonCropName; + } + + public void setCommonCropName(String commonCropName) { + this.commonCropName = commonCropName; + } + + public String getCountryOfOriginCode() { + return countryOfOriginCode; + } + + public void setCountryOfOriginCode(String countryOfOriginCode) { + this.countryOfOriginCode = countryOfOriginCode; + } + + public String getDefaultDisplayName() { + return defaultDisplayName; + } + + public void setDefaultDisplayName(String defaultDisplayName) { + this.defaultDisplayName = defaultDisplayName; + } + + public List<PuiNameValueVO> getDescriptors() { + return descriptors; + } + + public void setDescriptors(List<PuiNameValueVO> descriptors) { + this.descriptors = descriptors; + } + + public List<GermplasmInstituteVO> getDistributors() { + return distributors; + } + + public void setDistributors(List<GermplasmInstituteVO> distributors) { + this.distributors = distributors; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public List<DonorVO> getDonors() { + return donors; + } + + public void setDonors(List<DonorVO> donors) { + this.donors = donors; + } + + public List<SiteVO> getEvaluationSites() { + return evaluationSites; + } + + public void setEvaluationSites(List<SiteVO> evaluationSites) { + this.evaluationSites = evaluationSites; + } + + public List<ExternalReferencesVO> getExternalReferences() { + return externalReferences; + } + + public void setExternalReferences(List<ExternalReferencesVO> externalReferences) { + this.externalReferences = externalReferences; + } + + public GenealogyVO getGenealogy() { + return genealogy; + } + + public void setGenealogy(GenealogyVO genealogy) { + this.genealogy = genealogy; + } + + public String getGeneticNature() { + return geneticNature; + } + + public void setGeneticNature(String geneticNature) { + this.geneticNature = geneticNature; + } + + public String getGenus() { return genus; } + + public void setGenus(String genus) { this.genus = genus; } + + public String getGenusSpecies() { + return genusSpecies; + } + + public void setGenusSpecies(String genusSpecies) { + this.genusSpecies = genusSpecies; + } + + public String getGenusSpeciesSubtaxa() { + return genusSpeciesSubtaxa; + } + + public void setGenusSpeciesSubtaxa(String genusSpeciesSubtaxa) { + this.genusSpeciesSubtaxa = genusSpeciesSubtaxa; + } + + public String getGermplasmDbId() { + return germplasmDbId; + } + + public void setGermplasmDbId(String germplasmDbId) { + this.germplasmDbId = germplasmDbId; + } + + public String getGermplasmName() { + return germplasmName; + } + + public void setGermplasmName(String germplasmName) { + this.germplasmName = germplasmName; + } + + public List<GermplasmOriginVO> getGermplasmOrigin() { + return germplasmOrigin; + } + + public void setGermplasmOrigin(List<GermplasmOriginVO> germplasmOrigin) { + this.germplasmOrigin = germplasmOrigin; + } + + public String getGermplasmPUI() { + return germplasmPUI; + } + + public void setGermplasmPUI(String germplasmPUI) { + this.germplasmPUI = germplasmPUI; + } + + public String getGermplasmPreprocessing() { + return germplasmPreprocessing; + } + + public void setGermplasmPreprocessing(String germplasmPreprocessing) { this.germplasmPreprocessing = germplasmPreprocessing; } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public InstituteVO getHoldingInstitute() { + return holdingInstitute; + } + + public void setHoldingInstitute(InstituteVO holdingInstitute) { + this.holdingInstitute = holdingInstitute; + } + + public InstituteVO getHoldingGenbank() { + return holdingGenbank; + } + + public void setHoldingGenbank(InstituteVO holdingGenbank) { + this.holdingGenbank = holdingGenbank; + } + + public String get_id() { return _id; } + + public void set_id(String _id) { this._id = _id; } + + public String getInstituteCode() { + return instituteCode; + } + + public void setInstituteCode(String instituteCode) { + this.instituteCode = instituteCode; + } + + public String getInstituteName() { + return instituteName; + } + + public void setInstituteName(String instituteName) { + this.instituteName = instituteName; + } + + public SiteVO getOriginSite() { + return originSite; + } + + public void setOriginSite(SiteVO originSite) { + this.originSite = originSite; + } + + public List<CollPopVO> getPanel() { + return panel; + } + + public void setPanel(List<CollPopVO> panel) { + this.panel = panel; + } + + public PhotoVO getPhoto() { + return photo; + } + + public void setPhoto(PhotoVO photo) { + this.photo = photo; + } + + public List<CollPopVO> getPopulation() { + return population; + } + + public void setPopulation(List<CollPopVO> population) { + this.population = population; + } + + public String getPresenceStatus() { + return presenceStatus; + } + + public void setPresenceStatus(String presenceStatus) { + this.presenceStatus = presenceStatus; + } + + public String getSeedSource() { + return seedSource; + } + + public void setSeedSource(String seedSource) { + this.seedSource = seedSource; + } + + public String getSeedSourceDescription() { + return seedSourceDescription; + } + + public void setSeedSourceDescription(String seedSourceDescription) { + this.seedSourceDescription = seedSourceDescription; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getSourceUri() { + return sourceUri; + } + + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; + } + + public String getSpecies() { + return species; + } + + public void setSpecies(String species) { + this.species = species; + } + + public String getSpeciesAuthority() { + return speciesAuthority; + } + + public void setSpeciesAuthority(String speciesAuthority) { + this.speciesAuthority = speciesAuthority; + } + + public List<StorageTypesVO> getStorageTypes() { + return storageTypes; + } + + public void setStorageTypes(List<StorageTypesVO> storageTypes) { + this.storageTypes = storageTypes; + } + + public List<String> getStudyDbIds() { + return studyDbIds; + } + + public void setStudyDbIds(List<String> studyDbIds) { + this.studyDbIds = studyDbIds; + } + + public String getSubtaxa() { + return subtaxa; + } + + public void setSubtaxa(String subtaxa) { + this.subtaxa = subtaxa; + } + + public String getSubtaxaAuthority() { + return subtaxaAuthority; + } + + public void setSubtaxaAuthority(String subtaxaAuthority) { + this.subtaxaAuthority = subtaxaAuthority; + } + + public List<String> getSynonyms() { + return synonyms; + } + + public void setSynonyms(List<String> synonyms) { + this.synonyms = synonyms; + } + + public String getTaxonComment() { + return taxonComment; + } + + public void setTaxonComment(String taxonComment) { + this.taxonComment = taxonComment; + } + + public List<String> getTaxonCommonNames() { + return taxonCommonNames; + } + + public void setTaxonCommonNames(List<String> taxonCommonNames) { + this.taxonCommonNames = taxonCommonNames; + } + + public List<TaxonSourceVO> getTaxonIds() { + return taxonIds; + } + + public void setTaxonIds(List<TaxonSourceVO> taxonIds) { + this.taxonIds = taxonIds; + } + + public List<String> getTaxonSynonyms() { + return taxonSynonyms; + } + + public void setTaxonSynonyms(List<String> taxonSynonyms) { + this.taxonSynonyms = taxonSynonyms; + } + + public List<String> getTypeOfGermplasmStorageCode() { + return typeOfGermplasmStorageCode; + } + + public void setTypeOfGermplasmStorageCode(List<String> typeOfGermplasmStorageCode) { + this.typeOfGermplasmStorageCode = typeOfGermplasmStorageCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GermplasmV2VO that = (GermplasmV2VO) o; + return Objects.equals(accessionNumber, that.accessionNumber) && Objects.equals(acquisitionDate, that.acquisitionDate) && Objects.equals(biologicalStatusOfAccessionCode, that.biologicalStatusOfAccessionCode) && Objects.equals(biologicalStatusOfAccessionDescription, that.biologicalStatusOfAccessionDescription) && Objects.equals(breeder, that.breeder) && Objects.equals(breedingMethodDbId, that.breedingMethodDbId) && Objects.equals(breedingMethodName, that.breedingMethodName) && Objects.equals(children, that.children) && Objects.equals(collectingSite, that.collectingSite) && Objects.equals(collection, that.collection) && Objects.equals(collector, that.collector) && Objects.equals(comment, that.comment) && Objects.equals(commonCropName, that.commonCropName) && Objects.equals(countryOfOriginCode, that.countryOfOriginCode) && Objects.equals(defaultDisplayName, that.defaultDisplayName) && Objects.equals(descriptors, that.descriptors) && Objects.equals(distributors, that.distributors) && Objects.equals(documentationURL, that.documentationURL) && Objects.equals(donors, that.donors) && Objects.equals(evaluationSites, that.evaluationSites) && Objects.equals(externalReferences, that.externalReferences) && Objects.equals(genealogy, that.genealogy) && Objects.equals(geneticNature, that.geneticNature) && Objects.equals(genusSpecies, that.genusSpecies) && Objects.equals(genusSpeciesSubtaxa, that.genusSpeciesSubtaxa) && Objects.equals(germplasmDbId, that.germplasmDbId) && Objects.equals(germplasmName, that.germplasmName) && Objects.equals(germplasmOrigin, that.germplasmOrigin) && Objects.equals(germplasmPUI, that.germplasmPUI) && Objects.equals(germplasmPreprocessing, that.germplasmPreprocessing) && Objects.equals(groupId, that.groupId) && Objects.equals(holdingInstitute, that.holdingInstitute) && Objects.equals(holdingGenbank, that.holdingGenbank) && Objects.equals(instituteCode, that.instituteCode) && Objects.equals(instituteName, that.instituteName) && Objects.equals(originSite, that.originSite) && Objects.equals(panel, that.panel) && Objects.equals(photo, that.photo) && Objects.equals(population, that.population) && Objects.equals(presenceStatus, that.presenceStatus) && Objects.equals(seedSource, that.seedSource) && Objects.equals(seedSourceDescription, that.seedSourceDescription) && Objects.equals(source, that.source) && Objects.equals(sourceUri, that.sourceUri) && Objects.equals(species, that.species) && Objects.equals(speciesAuthority, that.speciesAuthority) && Objects.equals(storageTypes, that.storageTypes) && Objects.equals(studyDbIds, that.studyDbIds) && Objects.equals(subtaxa, that.subtaxa) && Objects.equals(subtaxaAuthority, that.subtaxaAuthority) && Objects.equals(synonyms, that.synonyms) && Objects.equals(taxonComment, that.taxonComment) && Objects.equals(taxonCommonNames, that.taxonCommonNames) && Objects.equals(taxonIds, that.taxonIds) && Objects.equals(taxonSynonyms, that.taxonSynonyms) && Objects.equals(typeOfGermplasmStorageCode, that.typeOfGermplasmStorageCode); + } + + @Override + public int hashCode() { + return Objects.hash(accessionNumber, acquisitionDate, biologicalStatusOfAccessionCode, biologicalStatusOfAccessionDescription, breeder, breedingMethodDbId, breedingMethodName, children, collectingSite, collection, collector, comment, commonCropName, countryOfOriginCode, defaultDisplayName, descriptors, distributors, documentationURL, donors, evaluationSites, externalReferences, genealogy, geneticNature, genusSpecies, genusSpeciesSubtaxa, germplasmDbId, germplasmName, germplasmOrigin, germplasmPUI, germplasmPreprocessing, groupId, holdingInstitute, holdingGenbank, instituteCode, instituteName, originSite, panel, photo, population, presenceStatus, seedSource, seedSourceDescription, source, sourceUri, species, speciesAuthority, storageTypes, studyDbIds, subtaxa, subtaxaAuthority, synonyms, taxonComment, taxonCommonNames, taxonIds, taxonSynonyms, typeOfGermplasmStorageCode); + } + + @Override + public String toString() { + return "GermplasmV2VO{" + + "accessionNumber='" + accessionNumber + '\'' + + ", acquisitionDate='" + acquisitionDate + '\'' + + ", biologicalStatusOfAccessionCode='" + biologicalStatusOfAccessionCode + '\'' + + ", biologicalStatusOfAccessionDescription='" + biologicalStatusOfAccessionDescription + '\'' + + ", breeder=" + breeder + + ", breedingMethodDbId='" + breedingMethodDbId + '\'' + + ", breedingMethodName='" + breedingMethodName + '\'' + + ", children=" + children + + ", collectingSite=" + collectingSite + + ", collection=" + collection + + ", collector=" + collector + + ", comment='" + comment + '\'' + + ", commonCropName='" + commonCropName + '\'' + + ", countryOfOriginCode='" + countryOfOriginCode + '\'' + + ", defaultDisplayName='" + defaultDisplayName + '\'' + + ", descriptors=" + descriptors + + ", distributors=" + distributors + + ", documentationURL='" + documentationURL + '\'' + + ", donors=" + donors + + ", evaluationSites=" + evaluationSites + + ", externalReferences=" + externalReferences + + ", genealogy=" + genealogy + + ", geneticNature='" + geneticNature + '\'' + + ", genusSpecies='" + genusSpecies + '\'' + + ", genusSpeciesSubtaxa='" + genusSpeciesSubtaxa + '\'' + + ", germplasmDbId='" + germplasmDbId + '\'' + + ", germplasmName='" + germplasmName + '\'' + + ", germplasmOrigin=" + germplasmOrigin + + ", germplasmPUI='" + germplasmPUI + '\'' + + ", germplasmPreprocessing='" + germplasmPreprocessing + '\'' + + ", groupId=" + groupId + + ", holdingInstitute=" + holdingInstitute + + ", holdingGenbank=" + holdingGenbank + + ", instituteCode='" + instituteCode + '\'' + + ", instituteName='" + instituteName + '\'' + + ", originSite=" + originSite + + ", panel=" + panel + + ", photo=" + photo + + ", population=" + population + + ", presenceStatus='" + presenceStatus + '\'' + + ", seedSource='" + seedSource + '\'' + + ", seedSourceDescription='" + seedSourceDescription + '\'' + + ", source='" + source + '\'' + + ", sourceUri='" + sourceUri + '\'' + + ", species='" + species + '\'' + + ", speciesAuthority='" + speciesAuthority + '\'' + + ", storageTypes=" + storageTypes + + ", studyDbIds=" + studyDbIds + + ", subtaxa='" + subtaxa + '\'' + + ", subtaxaAuthority='" + subtaxaAuthority + '\'' + + ", synonyms=" + synonyms + + ", taxonComment='" + taxonComment + '\'' + + ", taxonCommonNames=" + taxonCommonNames + + ", taxonIds=" + taxonIds + + ", taxonSynonyms=" + taxonSynonyms + + ", typeOfGermplasmStorageCode=" + typeOfGermplasmStorageCode + + '}'; + } + +} diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/StudyV2VO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/StudyV2VO.java new file mode 100644 index 0000000000000000000000000000000000000000..9e0e490fa7e7ea23ef5d853dd46ba3c2ebf4f65a --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/brapi/v2/StudyV2VO.java @@ -0,0 +1,368 @@ +package fr.inrae.urgi.faidare.domain.brapi.v2; + +import fr.inrae.urgi.faidare.domain.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import java.util.List; +import java.util.Set; + + +@Document( + indexName = StudyV2VO.INDEX_NAME, + createIndex = false +) +public final class StudyV2VO { + + public static final String INDEX_NAME = "faidare_study_dev-group0"; + + private boolean active; + + // private additionalInfo; + + private String commonCropName; + + private List<ContactVO> contact; + + private String culturalPractices; + + private List<DataLinksVO> dataLinks; + + private String documentationURL; + + private String endDate; + + private List<EnvironmentParametersVO> environmentParameters; + + private PuiDescriptionVO experimentalDesign; + + private List<ExternalReferencesVO> externalReferences; + + private List<String> germplasmDbIds; + + private Long groupId; + + private PuiDescriptionVO growthFacility; + + private LastUpdateVO lastUpdate; + + private String license; + + private LocationVO location; + + private String locationDbId; + + private String locationName; + + private List<ObservationLevelsVO> ObservationLevels; + + private String observationUnitsDescription; + + private List<String> observationVariableDbIds; + + private String programDbId; + + private String programName; + + private List<String> seasons; + + private String startDate; + + private String studyCode; + + @Id + private String _id; + + private String studyDbId; + + private String studyDescription; + + private String studyName; + + @Field("schema:includedInDataCatalog") + private String sourceUri; + + private String studyPUI; + + private String studyType; + + private String trialDbId; + + private Set<String> trialsDbIds; + + private String trialName; + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public String getCommonCropName() { + return commonCropName; + } + + public void setCommonCropName(String commonCropName) { + this.commonCropName = commonCropName; + } + + public List<ContactVO> getContact() { + return contact; + } + + public void setContact(List<ContactVO> contact) { + this.contact = contact; + } + + public String getCulturalPractices() { + return culturalPractices; + } + + public void setCulturalPractices(String culturalPractices) { + this.culturalPractices = culturalPractices; + } + + public List<DataLinksVO> getDataLinks() { + return dataLinks; + } + + public void setDataLinks(List<DataLinksVO> dataLinks) { + this.dataLinks = dataLinks; + } + + public String getDocumentationURL() { + return documentationURL; + } + + public void setDocumentationURL(String documentationURL) { + this.documentationURL = documentationURL; + } + + public String getEndDate() { return endDate; } + + public void setEndDate(String endDate) { this.endDate = endDate; } + + public List<EnvironmentParametersVO> getEnvironmentParameters() { + return environmentParameters; + } + + public void setEnvironmentParameters(List<EnvironmentParametersVO> environmentParameters) { this.environmentParameters = environmentParameters; } + + public PuiDescriptionVO getExperimentalDesign() { + return experimentalDesign; + } + + public void setExperimentalDesign(PuiDescriptionVO experimentalDesign) { this.experimentalDesign = experimentalDesign; } + + public List<ExternalReferencesVO> getExternalReferences() { + return externalReferences; + } + + public void setExternalReferences(List<ExternalReferencesVO> externalReferences) { this.externalReferences = externalReferences; } + + public List<String> getGermplasmDbIds() { + return germplasmDbIds; + } + + public void setGermplasmDbIds(List<String> germplasmDbIds) { + this.germplasmDbIds = germplasmDbIds; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public PuiDescriptionVO getGrowthFacility() { + return growthFacility; + } + + public void setGrowthFacility(PuiDescriptionVO growthFacility) { + this.growthFacility = growthFacility; + } + + public LastUpdateVO getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(LastUpdateVO lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public LocationVO getLocation() { + return location; + } + + public void setLocation(LocationVO location) { + this.location = location; + } + + public String getLocationDbId() { + return locationDbId; + } + + public void setLocationDbId(String locationDbId) { + this.locationDbId = locationDbId; + } + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public List<ObservationLevelsVO> getObservationLevels() { + return ObservationLevels; + } + + public void setObservationLevels(List<ObservationLevelsVO> observationLevels) { ObservationLevels = observationLevels; } + + public String getObservationUnitsDescription() { + return observationUnitsDescription; + } + + public void setObservationUnitsDescription(String observationUnitsDescription) { this.observationUnitsDescription = observationUnitsDescription; } + + public List<String> getObservationVariableDbIds() { + return observationVariableDbIds; + } + + public void setObservationVariableDbIds(List<String> observationVariableDbIds) { this.observationVariableDbIds = observationVariableDbIds; } + + public String getProgramDbId() { + return programDbId; + } + + public void setProgramDbId(String programDbId) { + this.programDbId = programDbId; + } + + public String getProgramName() { + return programName; + } + + public void setProgramName(String programName) { + this.programName = programName; + } + + public List<String> getSeasons() { + return seasons; + } + + public void setSeasons(List<String> seasons) { + this.seasons = seasons; + } + + public String getSourceUri() { + return sourceUri; + } + + public void setSourceUri(String sourceUri) { + this.sourceUri = sourceUri; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getStudyCode() { + return studyCode; + } + + public void setStudyCode(String studyCode) { + this.studyCode = studyCode; + } + + public String getStudyDbId() { + return studyDbId; + } + + public void setStudyDbId(String studyDbId) { + this.studyDbId = studyDbId; + } + + public String getStudyDescription() { + return studyDescription; + } + + public void setStudyDescription(String studyDescription) { + this.studyDescription = studyDescription; + } + + public String getStudyName() { + return studyName; + } + + public void setStudyName(String studyName) { + this.studyName = studyName; + } + + public String getStudyPUI() { + return studyPUI; + } + + public void setStudyPUI(String studyPUI) { + this.studyPUI = studyPUI; + } + + public String getStudyType() { + return studyType; + } + + public void setStudyType(String studyType) { + this.studyType = studyType; + } + + public String getTrialDbId() { + return trialDbId; + } + + public void setTrialDbId(String trialDbId) { + this.trialDbId = trialDbId; + } + + public Set<String> getTrialsDbIds() { + return trialsDbIds; + } + + public void setTrialsDbIds(Set<String> trialsDbIds) { + this.trialsDbIds = trialsDbIds; + } + + public String getTrialName() { + return trialName; + } + + public void setTrialName(String trialName) { + this.trialName = trialName; + } + +} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Context.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Context.java similarity index 89% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Context.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Context.java index 03a4374e2b960c6af8483faaa69c994eb850ee6e..0d1acc9a66f245b04233ced175df0b30c6c9328c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Context.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Context.java @@ -1,9 +1,9 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.io.Serializable; import java.util.HashMap; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/DataCatalog.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/DataCatalog.java similarity index 89% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/DataCatalog.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/DataCatalog.java index 6b3558b9b6e6c2000667798e3456bb5c6e4257ee..de668d7b08eb4c740c70aab53b14143d9d8b2c2c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/DataCatalog.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/DataCatalog.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * {@see http://schema.org/DataCatalog} as JSON-LD properties diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Dataset.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Dataset.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Dataset.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Dataset.java index 363b5b1ab08f26bca38d1a081f019e2f421748c9..19fa697537ab47224b3552a12dc3d11c66822fc7 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/Dataset.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/Dataset.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * {@see http://schema.org/Dataset} as JSON-LD properties diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasContext.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasContext.java similarity index 73% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasContext.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasContext.java index 43e04ca2844868bacf8828686dc893ad7d34072e..95ae6ea4f1a6a55c8a33538dbefa10bff324636c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasContext.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasContext.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasGraph.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasGraph.java similarity index 75% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasGraph.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasGraph.java index 2c0583b2a14b91a410fe6a318a879990197e20ef..d774b7ef095f01c9bf3c3740b183e21dd85aacba 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasGraph.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasGraph.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasType.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasType.java similarity index 76% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasType.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasType.java index c8f29b7c242215e3d891e2bcc24f443a7c850803..edf693829cf4abfd256acda2d5c4648cbfccbf6e 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasType.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasType.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURI.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURI.java similarity index 74% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURI.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURI.java index 80dcbe97920e248f75d2af31d14e7ca4abe9caf7..216f5c9b33b3724202bce969b286225985a5a8fe 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURI.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURI.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURL.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURL.java similarity index 74% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURL.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURL.java index 964372b09e03aabd4eaa5af475f4c0e46ce1682b..c119104332168d4e0dddc8a604000abe295796ae 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/HasURL.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/HasURL.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java similarity index 79% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java index b26fc198d6e832205f15e1409f8da8a4576295e6..d619f2d9efd54edc7e92a6f98da16140e7e837ee 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/IncludedInDataCatalog.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/JSONLD.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/JSONLD.java similarity index 68% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/JSONLD.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/JSONLD.java index 7aeca7dbf20277f0b5ea1dfbe7bb6176127b14fd..ac2f2e2a5c05f679149ea4721c2c1db6d85a602e 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/JSONLD.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/JSONLD.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; /** * Base JSON-LD properties diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/package-info.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/package-info.java similarity index 71% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/package-info.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/package-info.java index 21ab6d9be67c4f7e3fde6ee512f5c023a7acdab5..18034057f6f5bf9f02c46f5d98d5bec6f905354e 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/jsonld/data/package-info.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/jsonld/data/package-info.java @@ -3,4 +3,4 @@ * * @author gcornut */ -package fr.inra.urgi.faidare.domain.jsonld.data; +package fr.inrae.urgi.faidare.domain.jsonld.data; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiMethod.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiMethod.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiMethod.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiMethod.java index c00d9dbd0691f4b2373b53d9441e52d9b1f51cd3..f436219ffd7b5c900df502f2dcd06f28ac12c29e 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiMethod.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiMethod.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationVariable.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiObservationVariable.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationVariable.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiObservationVariable.java index 7a5753dd950302567976150212a55da1382f4d0c..38cfb5d9ffc680ca3df9d6c71266a393dcff7145 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiObservationVariable.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiObservationVariable.java @@ -1,10 +1,10 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; - -import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +package fr.inrae.urgi.faidare.domain.variable; import java.util.List; +import com.fasterxml.jackson.annotation.JsonView; +import fr.inrae.urgi.faidare.domain.JSONView; + /** * @author gcornut * @link https://github.com/plantbreeding/API/blob/master/Specification/ObservationVariables/VariableDetails.md diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntology.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntology.java similarity index 88% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntology.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntology.java index 0f1c8186a297b8512517885887620042c2681884..8b092689fdfd60c703c521e9826536690332ee40 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntology.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntology.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntologyLink.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntologyLink.java similarity index 79% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntologyLink.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntologyLink.java index 2ac55f317f1fa402cbed80f952dda3aba320de43..59cbc751327c802fddf0ca2e62aa692c2bab53df 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiOntologyLink.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiOntologyLink.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScale.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScale.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScale.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScale.java index 3376e2e3bcea1a4513a6fadb9a6af76940f4b58c..2e61e71f0f52a679c23e4d9a2b38b475e91b8624 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScale.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScale.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScaleValidValue.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScaleValidValue.java similarity index 87% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScaleValidValue.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScaleValidValue.java index e38ed0fcc45f871a5a38b3080dce7d1b98f8eef4..0bf228de77d4fd932849b501631e9fb07edd4012 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiScaleValidValue.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiScaleValidValue.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrait.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiTrait.java similarity index 94% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrait.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiTrait.java index 9473924c19c0d75c03c6b5304153b6165c8ab77b..1e69a072820a969d9a32a53d1b34aed72ffd73ca 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/BrapiTrait.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/BrapiTrait.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/HasBrapiDocumentationURL.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/HasBrapiDocumentationURL.java similarity index 72% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/HasBrapiDocumentationURL.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/HasBrapiDocumentationURL.java index bb0379891d47010c8c835e2c935d9d4fb8721728..e8a1a6c3865c6cc190e04ddab555e5555263a9f4 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/brapi/v1/data/HasBrapiDocumentationURL.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/HasBrapiDocumentationURL.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.domain.brapi.v1.data; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.annotation.JsonView; -import fr.inra.urgi.faidare.domain.JSONView; +import fr.inrae.urgi.faidare.domain.JSONView; /** * Has BrAPI v1.3 documentationUrl field diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/MethodVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/MethodVO.java similarity index 91% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/MethodVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/MethodVO.java index 231b75641f6bb4c0aebe257eb60401fd4dd0bf38..4b488ea891e9c145012e13f45ba06e39761e8e21 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/MethodVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/MethodVO.java @@ -1,6 +1,4 @@ -package fr.inra.urgi.faidare.domain.data.variable; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiMethod; +package fr.inrae.urgi.faidare.domain.variable; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ObservationVariableVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ObservationVariableVO.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ObservationVariableVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ObservationVariableVO.java index e18964d7fbcc92d8755c76dd9ba2f75f875ebf88..174d561966fac1ac5144910fd02dceaef1126bb2 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ObservationVariableVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ObservationVariableVO.java @@ -1,16 +1,12 @@ -package fr.inra.urgi.faidare.domain.data.variable; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiMethod; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiObservationVariable; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiScale; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrait; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; -import fr.inra.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; +package fr.inrae.urgi.faidare.domain.variable; import java.util.List; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import fr.inrae.urgi.faidare.domain.jsonld.data.HasURI; +import fr.inrae.urgi.faidare.domain.jsonld.data.HasURL; +import fr.inrae.urgi.faidare.domain.jsonld.data.IncludedInDataCatalog; + /** * @author gcornut */ diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyLinkVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyLinkVO.java similarity index 80% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyLinkVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyLinkVO.java index a8e5224e29f0e8423578df00f431a0f512fbebbb..974dcdd7c75649549141410d90092306e3ccc884 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyLinkVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyLinkVO.java @@ -1,6 +1,4 @@ -package fr.inra.urgi.faidare.domain.data.variable; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiOntologyLink; +package fr.inrae.urgi.faidare.domain.variable; /** * Generic link reference inspired by HATEOS (used to list download links for the ontology) diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyVO.java similarity index 89% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyVO.java index f17c75e042d70871d3b14d6d83defb90061945a6..52bde1d45c587798d1d7f1f2242cdf1271380b84 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/OntologyVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/OntologyVO.java @@ -1,14 +1,12 @@ -package fr.inra.urgi.faidare.domain.data.variable; +package fr.inrae.urgi.faidare.domain.variable; + +import java.util.List; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiOntology; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiOntologyLink; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURI; -import fr.inra.urgi.faidare.domain.jsonld.data.HasURL; - -import java.util.List; +import fr.inrae.urgi.faidare.domain.jsonld.data.HasURI; +import fr.inrae.urgi.faidare.domain.jsonld.data.HasURL; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleVO.java similarity index 88% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleVO.java index e20a0d0b9fe2e7c54b5831ac8915b50763527a88..2525d5e881c2d77aefab678504ee596e0b158512 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleVO.java @@ -1,8 +1,6 @@ -package fr.inra.urgi.faidare.domain.data.variable; +package fr.inrae.urgi.faidare.domain.variable; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiScale; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiScaleValidValue; /** * @author gcornut diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleValidValueVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleValidValueVO.java similarity index 84% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleValidValueVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleValidValueVO.java index a2c1c8d900642fdcc48b399a2cd5f69dc56ec702..b1f3adfc88ec39029ce58f6a74a8be0d824dbfd8 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/ScaleValidValueVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/ScaleValidValueVO.java @@ -1,6 +1,4 @@ -package fr.inra.urgi.faidare.domain.data.variable; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiScaleValidValue; +package fr.inrae.urgi.faidare.domain.variable; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/TraitVO.java b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/TraitVO.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/TraitVO.java rename to backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/TraitVO.java index 063d61f40b9ec3bbec45d22ffadf2992d930b729..01261894072a4a6823d584ab58207caf2b0fc285 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/domain/data/variable/TraitVO.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/domain/variable/TraitVO.java @@ -1,6 +1,4 @@ -package fr.inra.urgi.faidare.domain.data.variable; - -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrait; +package fr.inrae.urgi.faidare.domain.variable; import java.util.List; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationFilter.java b/backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationFilter.java similarity index 91% rename from backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationFilter.java rename to backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationFilter.java index 30b384e7753a3d493ac480009e500ac7a34b3deb..b1f5d70dbbf7cd3caab78d185167be2f5fac10f3 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationFilter.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationFilter.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.filter; +package fr.inrae.urgi.faidare.filter; import com.google.common.base.Charsets; import com.google.common.io.BaseEncoding; @@ -6,9 +6,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationStore.java b/backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationStore.java similarity index 80% rename from backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationStore.java rename to backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationStore.java index d2a08b081bf1814f761ff2f87ff6ff2da35bf7f3..0564891702e4b9456b078c3c7d6d3985ffd49d75 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/filter/AuthenticationStore.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/filter/AuthenticationStore.java @@ -1,6 +1,6 @@ -package fr.inra.urgi.faidare.filter; +package fr.inrae.urgi.faidare.filter; -import fr.inra.urgi.faidare.repository.http.UserGroupsResourceClient; +import fr.inrae.urgi.faidare.repository.http.UserGroupsResourceClient; /** * Store user authentication (later use in {@link UserGroupsResourceClient}) diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClient.java b/backend/src/main/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClient.java similarity index 94% rename from backend/src/main/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClient.java rename to backend/src/main/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClient.java index 0cc2dd7481f4d69976563446da2e70b7454793f9..75286fd1b85e2d7afe699eae63f8da5e0cc09e43 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClient.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClient.java @@ -1,10 +1,10 @@ -package fr.inra.urgi.faidare.repository.http; +package fr.inrae.urgi.faidare.repository.http; import com.google.common.base.Strings; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.filter.AuthenticationStore; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.filter.AuthenticationStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/utils/Sitemaps.java b/backend/src/main/java/fr/inrae/urgi/faidare/utils/Sitemaps.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/utils/Sitemaps.java rename to backend/src/main/java/fr/inrae/urgi/faidare/utils/Sitemaps.java index ba32b8cf286c1c04b589e50a4338addae9df2e78..6d04755f80cdd7ed8e4c5cd31a127599df2598f6 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/utils/Sitemaps.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/utils/Sitemaps.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.utils; +package fr.inrae.urgi.faidare.utils; import java.io.BufferedWriter; import java.io.IOException; @@ -29,14 +29,12 @@ public class Sitemaps { public static <T> void generateSitemap(String sitemapPath, OutputStream out, - Iterator<T> entryIterator, + Stream<T> entries, Predicate<T> entryPredicate, Function<T, String> entryToPath) { SanityChecker sanityChecker = new SanityChecker(sitemapPath); Writer writer = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)); - Stream<T> entries = - StreamSupport.stream(Spliterators.spliteratorUnknownSize(entryIterator, 0), false); entries.filter(entryPredicate) .map(entryToPath) .map(entryPath -> Sitemaps.generateSitemapUrl(entryPath) + '\n') diff --git a/backend/src/main/java/fr/inra/urgi/faidare/utils/Sites.java b/backend/src/main/java/fr/inrae/urgi/faidare/utils/Sites.java similarity index 90% rename from backend/src/main/java/fr/inra/urgi/faidare/utils/Sites.java rename to backend/src/main/java/fr/inrae/urgi/faidare/utils/Sites.java index 1cab28c4502f53fa7774f8ac2f4d3eca477b8fa8..641094047cce6fe89559a11d913bb7fe83365203 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/utils/Sites.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/utils/Sites.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.utils; +package fr.inrae.urgi.faidare.utils; import java.nio.charset.StandardCharsets; import java.util.Base64; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/HomeController.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/HomeController.java similarity index 93% rename from backend/src/main/java/fr/inra/urgi/faidare/web/HomeController.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/HomeController.java index 6734b6aa97a2ae445af4eb61be86a07883b2a58a..74b015d9d5fd66faa909f4a2504b1b925aff51d2 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/HomeController.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/HomeController.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web; +package fr.inrae.urgi.faidare.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmController.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmController.java similarity index 59% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmController.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmController.java index cc3b1b85cccec18f4c32149885acbffe0ba690dc..c181b44164dd4b3db7740adf5d33d443b38be833 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmController.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmController.java @@ -1,42 +1,35 @@ -package fr.inra.urgi.faidare.web.germplasm; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValue; -import fr.inra.urgi.faidare.domain.criteria.GermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.GermplasmAttributeRepository; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.utils.Sitemaps; +package fr.inrae.urgi.faidare.web.germplasm; + +import fr.inrae.urgi.faidare.api.NotFoundException; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmAttributeV1Dao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmPedigreeV1Dao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.dao.v2.GermplasmMcpdDao; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.GermplasmMcpdVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.GermplasmSitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeValueV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmPedigreeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.utils.Sitemaps; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * Controller used to display a germplasm card based on its ID. * Note that this controller is mapped to the /germplasm path in addition to @@ -48,20 +41,26 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo @RequestMapping({"/germplasms", "/germplasm"}) public class GermplasmController { - private final GermplasmRepository germplasmRepository; + private final GermplasmV1Dao germplasmRepository; + private final GermplasmMcpdDao germplasmMcpdRepository; + private final GermplasmPedigreeV1Dao germplasmPedigreeRepository; private final FaidareProperties faidareProperties; - private final XRefDocumentRepository xRefDocumentRepository; - private final GermplasmAttributeRepository germplasmAttributeRepository; + private final XRefDocumentDao xRefDocumentRepository; + private final GermplasmAttributeV1Dao germplasmAttributeRepository; private final GermplasmMcpdExportService germplasmMcpdExportService; private final GermplasmExportService germplasmExportService; - public GermplasmController(GermplasmRepository germplasmRepository, + public GermplasmController(GermplasmV1Dao germplasmRepository, + GermplasmMcpdDao germplasmMcpdRepository, + GermplasmPedigreeV1Dao germplasmPedigreeRepository, FaidareProperties faidareProperties, - XRefDocumentRepository xRefDocumentRepository, - GermplasmAttributeRepository germplasmAttributeRepository, + XRefDocumentDao xRefDocumentRepository, + GermplasmAttributeV1Dao germplasmAttributeRepository, GermplasmMcpdExportService germplasmMcpdExportService, GermplasmExportService germplasmExportService) { this.germplasmRepository = germplasmRepository; + this.germplasmMcpdRepository = germplasmMcpdRepository; + this.germplasmPedigreeRepository = germplasmPedigreeRepository; this.faidareProperties = faidareProperties; this.xRefDocumentRepository = xRefDocumentRepository; this.germplasmAttributeRepository = germplasmAttributeRepository; @@ -71,7 +70,7 @@ public class GermplasmController { @GetMapping("/{germplasmId}") public ModelAndView get(@PathVariable("germplasmId") String germplasmId) { - GermplasmVO germplasm = germplasmRepository.getById(germplasmId); + GermplasmV1VO germplasm = germplasmRepository.getByGermplasmDbId(germplasmId); if (germplasm == null) { throw new NotFoundException("Germplasm with ID " + germplasmId + " not found"); @@ -82,7 +81,7 @@ public class GermplasmController { @GetMapping(params = "id") public ModelAndView getById(@RequestParam("id") String germplasmId) { - GermplasmVO germplasm = germplasmRepository.getById(germplasmId); + GermplasmV1VO germplasm = germplasmRepository.getByGermplasmDbId(germplasmId); if (germplasm == null) { throw new NotFoundException("Germplasm with ID " + germplasmId + " not found"); @@ -93,14 +92,13 @@ public class GermplasmController { @GetMapping(params = "pui") public ModelAndView getByPui(@RequestParam("pui") String pui) { - GermplasmGETSearchCriteria criteria = new GermplasmGETSearchCriteria(); - criteria.setGermplasmPUI(Collections.singletonList(pui)); - List<GermplasmVO> germplasms = germplasmRepository.find(criteria); - if (germplasms.size() != 1) { + GermplasmV1VO germplasm = germplasmRepository.getByGermplasmPUI(pui); + + if (germplasm == null) { throw new NotFoundException("Germplasm with PUI " + pui + " not found"); } - return toModelAndView(germplasms.get(0)); + return toModelAndView(germplasm); } @PostMapping("/exports/mcpd") @@ -109,8 +107,9 @@ public class GermplasmController { List<GermplasmMcpdExportableField> fields = getFieldsToExport(command); StreamingResponseBody body = out -> { - Iterator<GermplasmMcpdVO> iterator = germplasmRepository.scrollGermplasmMcpdsByIds(command.getIds(), 1000); - germplasmMcpdExportService.export(out, iterator, fields); + try (Stream<GermplasmMcpdVO> stream = germplasmMcpdRepository.findByGermplasmDbIdIn(command.getIds())) { + germplasmMcpdExportService.export(out, stream, fields); + } }; return ResponseEntity.ok().contentType(MediaType.parseMediaType("text/csv")).body(body); } @@ -121,8 +120,9 @@ public class GermplasmController { List<GermplasmExportableField> fields = getFieldsToExport(command); StreamingResponseBody body = out -> { - Iterator<GermplasmVO> iterator = germplasmRepository.scrollGermplasmsByIds(command.getIds(), 1000); - germplasmExportService.export(out, iterator, fields); + try (Stream<GermplasmV1VO> stream = germplasmRepository.findByGermplasmDbIdIn(command.getIds())) { + germplasmExportService.export(out, stream, fields); + } }; return ResponseEntity.ok().contentType(MediaType.parseMediaType("text/csv")).body(body); } @@ -134,25 +134,26 @@ public class GermplasmController { throw new NotFoundException("no sitemap for this index"); } StreamingResponseBody body = out -> { - Iterator<GermplasmSitemapVO> iterator = germplasmRepository.scrollAllForSitemap(1000); - Sitemaps.generateSitemap( - "/germplasms/sitemap-" + index + ".txt", - out, - iterator, - vo -> Math.floorMod(vo.getGermplasmDbId().hashCode(), Sitemaps.BUCKET_COUNT) == index, - vo -> "/germplasms/" + vo.getGermplasmDbId() - ); + try (Stream<GermplasmSitemapVO> stream = germplasmRepository.findAllForSitemap()) { + Sitemaps.generateSitemap( + "/germplasms/sitemap-" + index + ".txt", + out, + stream, + vo -> Math.floorMod(vo.getGermplasmDbId().hashCode(), + Sitemaps.BUCKET_COUNT) == index, + vo -> "/germplasms/" + vo.getGermplasmDbId() + ); + } }; return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(body); } - private ModelAndView toModelAndView(GermplasmVO germplasm) { - List<BrapiGermplasmAttributeValue> attributes = getAttributes(germplasm); - PedigreeVO pedigree = getPedigree(germplasm); + private ModelAndView toModelAndView(GermplasmV1VO germplasm) { + List<GermplasmAttributeValueV1VO> attributes = getAttributes(germplasm); + GermplasmPedigreeV1VO pedigree = getPedigree(germplasm); - List<XRefDocumentVO> crossReferences = xRefDocumentRepository.find( - XRefDocumentSearchCriteria.forXRefId(germplasm.getGermplasmDbId()) - ); + List<XRefDocumentVO> crossReferences = + xRefDocumentRepository.findByLinkedResourcesID(germplasm.getGermplasmDbId()); sortDonors(germplasm); sortPopulations(germplasm); @@ -169,7 +170,7 @@ public class GermplasmController { ); } - private void sortPopulations(GermplasmVO germplasm) { + private void sortPopulations(GermplasmV1VO germplasm) { if (germplasm.getPopulation() != null) { germplasm.setPopulation(germplasm.getPopulation() .stream() @@ -179,7 +180,7 @@ public class GermplasmController { } } - private void sortCollections(GermplasmVO germplasm) { + private void sortCollections(GermplasmV1VO germplasm) { if (germplasm.getCollection() != null) { germplasm.setCollection(germplasm.getCollection() .stream() @@ -188,7 +189,7 @@ public class GermplasmController { } } - private void sortPanels(GermplasmVO germplasm) { + private void sortPanels(GermplasmV1VO germplasm) { if (germplasm.getPanel() != null) { germplasm.setPanel(germplasm.getPanel() .stream() @@ -197,7 +198,7 @@ public class GermplasmController { } } - private void sortDonors(GermplasmVO germplasm) { + private void sortDonors(GermplasmV1VO germplasm) { if (germplasm.getDonors() != null) { germplasm.setDonors(germplasm.getDonors() .stream() @@ -207,18 +208,20 @@ public class GermplasmController { } } - private List<BrapiGermplasmAttributeValue> getAttributes(GermplasmVO germplasm) { - GermplasmAttributeCriteria criteria = new GermplasmAttributeCriteria(); - criteria.setGermplasmDbId(germplasm.getGermplasmDbId()); - return germplasmAttributeRepository.find(criteria) + private List<GermplasmAttributeValueV1VO> getAttributes(GermplasmV1VO germplasm) { + GermplasmAttributeV1VO attribute = germplasmAttributeRepository.getByGermplasmDbId(germplasm.getGermplasmDbId()); + if (attribute == null) { + return List.of(); + } + return attribute + .getData() .stream() - .flatMap(vo -> vo.getData().stream()) - .sorted(Comparator.comparing(BrapiGermplasmAttributeValue::getAttributeName)) + .sorted(Comparator.comparing(GermplasmAttributeValueV1VO::getAttributeName)) .collect(Collectors.toList()); } - private PedigreeVO getPedigree(GermplasmVO germplasm) { - return germplasmRepository.findPedigree(germplasm.getGermplasmDbId()); + private GermplasmPedigreeV1VO getPedigree(GermplasmV1VO germplasm) { + return germplasmPedigreeRepository.getByGermplasmDbId(germplasm.getGermplasmDbId()); } private List<GermplasmMcpdExportableField> getFieldsToExport( diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportCommand.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportCommand.java similarity index 91% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportCommand.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportCommand.java index 2ae02bdf4f7fdab3a8bf66ef35d583b863ef39f0..c093ab2df8cc19641ebf68ed2503916b10c2474a 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportCommand.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportCommand.java @@ -1,9 +1,9 @@ -package fr.inra.urgi.faidare.web.germplasm; +package fr.inrae.urgi.faidare.web.germplasm; import java.util.Collections; import java.util.List; import java.util.Set; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotEmpty; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportService.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportService.java similarity index 81% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportService.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportService.java index cf0919015e97a6336f422e4ab7a145766cf5157d..26bfb55fdd4d157d80bb904e8a7ea1bc2ac3d4e7 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportService.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportService.java @@ -1,26 +1,21 @@ -package fr.inra.urgi.faidare.web.germplasm; +package fr.inrae.urgi.faidare.web.germplasm; -import static fr.inra.urgi.faidare.web.germplasm.GermplasmExportableField.*; +import com.opencsv.CSVWriter; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import org.springframework.stereotype.Component; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.UncheckedIOException; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; -import com.opencsv.CSVWriter; -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import org.springframework.stereotype.Component; +import static fr.inrae.urgi.faidare.web.germplasm.GermplasmExportableField.*; /** * Service allowing to export germplasms as CSV @@ -54,7 +49,7 @@ public class GermplasmExportService { } } - public void export(OutputStream out, Iterator<GermplasmVO> germplasms, List<GermplasmExportableField> fields) { + public void export(OutputStream out, Stream<GermplasmV1VO> germplasms, List<GermplasmExportableField> fields) { try { CSVWriter csvWriter = new CSVWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)), ';', '"', '\\', "\n"); String[] header = fields.stream() @@ -63,15 +58,14 @@ public class GermplasmExportService { .toArray(String[]::new); csvWriter.writeNext(header); - while (germplasms.hasNext()) { - GermplasmVO vo = germplasms.next(); + germplasms.forEach(vo -> { String[] line = fields.stream() .map(descriptors::get) .map(descriptor -> descriptor.export(vo)) .toArray(String[]::new); csvWriter.writeNext(line); - } + }); csvWriter.flush(); } catch (IOException e) { throw new UncheckedIOException(e); @@ -80,10 +74,10 @@ public class GermplasmExportService { private static class GermplasmExportableFieldDescriptor { private final String header; - private final Function<GermplasmVO, String> exporter; + private final Function<GermplasmV1VO, String> exporter; public GermplasmExportableFieldDescriptor(String header, - Function<GermplasmVO, String> exporter) { + Function<GermplasmV1VO, String> exporter) { this.header = header; this.exporter = exporter; } @@ -92,7 +86,7 @@ public class GermplasmExportService { return this.header; } - public String export(GermplasmVO germplasm) { + public String export(GermplasmV1VO germplasm) { return this.exporter.apply(germplasm); } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportableField.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportableField.java similarity index 87% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportableField.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportableField.java index ecda40cbcdd5fb14532d9b4d9f37eb09b85d90ae..3a02ef6fae3d1f1fdde76fa0e2b1b84c94792a87 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmExportableField.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmExportableField.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web.germplasm; +package fr.inrae.urgi.faidare.web.germplasm; /** * The fields of a germplasm that can be exported diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java similarity index 91% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java index deefb113622f13aa13c55187b2f61a16b96ac041..508888953df407cb19e17206df3d74d7bcf883a2 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportCommand.java @@ -1,9 +1,9 @@ -package fr.inra.urgi.faidare.web.germplasm; +package fr.inrae.urgi.faidare.web.germplasm; import java.util.Collections; import java.util.List; import java.util.Set; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotEmpty; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java new file mode 100644 index 0000000000000000000000000000000000000000..d30711e0264288f410d3fae4a96231d699202c96 --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportService.java @@ -0,0 +1,202 @@ +package fr.inrae.urgi.faidare.web.germplasm; + +import static fr.inrae.urgi.faidare.web.germplasm.GermplasmMcpdExportableField.*; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.opencsv.CSVWriter; +import fr.inrae.urgi.faidare.domain.GermplasmMcpdVO; +import org.springframework.stereotype.Component; + +/** + * Service allowing to export germplasm MCPDs as CSV + * @author JB Nizet + */ +@Component +public class GermplasmMcpdExportService { + + private final Map<GermplasmMcpdExportableField, GermplasmMcpdExportableFieldDescriptor> descriptors; + + public GermplasmMcpdExportService() { + Map<GermplasmMcpdExportableField, GermplasmMcpdExportableFieldDescriptor> map = new HashMap<>(); + + map.put(PUID, withFieldAsHeader(PUID, vo -> vo.getPUID())); + map.put(INSTCODE, withFieldAsHeader(INSTCODE, vo -> vo.getInstituteCode())); + map.put(ACCENUMB, withFieldAsHeader(ACCENUMB, vo -> vo.getAccessionNumber())); + // FIXME JBN uncomment this once germplasm mcpd has a collecting info +// map.put(COLLNUMB, withFieldAsHeader(COLLNUMB, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingNumber())); +// map.put(COLLCODE, withFieldAsHeader(COLLCODE, vo -> (vo.getCollectingInfo() == null)? null : +// vo.getCollectingInfo() +// .getCollectingInstitutes() +// .stream() +// .map(InstituteVO::getInstituteCode).collect(Collectors.joining(";")))); +// map.put(COLLNAME, withFieldAsHeader(COLLNAME, vo -> (vo.getCollectingInfo() == null)? null : +// vo.getCollectingInfo() +// .getCollectingInstitutes() +// .stream() +// .map(InstituteVO::getInstituteName) +// .collect(Collectors.joining(";")))); +// map.put(COLLINSTADDRESS, withFieldAsHeader(COLLINSTADDRESS, vo -> (vo.getCollectingInfo() == null || vo.getCollectingInfo().getCollectingInstitutes() == null)? null : +// vo.getCollectingInfo() +// .getCollectingInstitutes() +// .stream() +// .map(InstituteVO::getAddress) +// .collect(Collectors.joining(";")))); +// map.put(COLLMISSID, withFieldAsHeader(COLLMISSID, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingMissionIdentifier())); + map.put(COLLNUMB, withFieldAsHeader(COLLNUMB, vo -> null)); + map.put(COLLCODE, withFieldAsHeader(COLLCODE, vo -> null)); + map.put(COLLNAME, withFieldAsHeader(COLLNAME, vo -> null)); + map.put(COLLINSTADDRESS, withFieldAsHeader(COLLINSTADDRESS, vo -> null)); + + map.put(GENUS, withFieldAsHeader(GENUS, vo -> vo.getGenus())); + map.put(SPECIES, withFieldAsHeader(SPECIES, vo -> vo.getSpecies())); + map.put(SPAUTHOR, withFieldAsHeader(SPAUTHOR, vo -> vo.getSpeciesAuthority())); + + // FIXME JBN uncomment this once germplasm mcpd has a subTaxon + // map.put(SUBTAXA, withFieldAsHeader(SUBTAXA, vo -> vo.getSubtaxon())); + map.put(SUBTAXA, withFieldAsHeader(SUBTAXA, vo -> null)); + + // FIXME JBN uncomment this once germplasm mcpd has a subTaxonAuthority + // map.put(SUBTAUTHOR, withFieldAsHeader(SUBTAUTHOR, vo -> vo.getSubtaxonAuthority())); + map.put(SUBTAUTHOR, withFieldAsHeader(SUBTAUTHOR, vo -> null)); + + // FIXME JBN uncomment this once germplasm mcpd has a commonCropName + // map.put(CROPNAME, withFieldAsHeader(CROPNAME, vo -> vo.getCommonCropName())); + map.put(CROPNAME, withFieldAsHeader(CROPNAME, vo -> null)); + + map.put(ACCENAME, withFieldAsHeader(ACCENAME, vo -> String.join(";", vo.getAccessionNames()))); + map.put(ACQDATE, withFieldAsHeader(ACQDATE, vo -> vo.getAcquisitionDate())); + map.put(ORIGCTY, withFieldAsHeader(ORIGCTY, vo -> vo.getCountryOfOriginCode())); + + // FIXME JBN uncomment this once germplasm mcpd has a collecting info +// map.put(COLLSITE, withFieldAsHeader(COLLSITE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getSiteName())); +// map.put(DECLATITUDE, withFieldAsHeader(DECLATITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLatitudeDecimal())); +// map.put(LATITUDE, withFieldAsHeader(LATITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLatitudeDegrees())); +// map.put(DECLONGITUDE, withFieldAsHeader(DECLONGITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLongitudeDecimal())); +// map.put(LONGITUDE, withFieldAsHeader(LONGITUDE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getLongitudeDegrees())); +// map.put(COORDUNCERT, withFieldAsHeader(COORDUNCERT, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getCoordinateUncertainty())); +// map.put(COORDDATUM, withFieldAsHeader(COORDDATUM, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getSpatialReferenceSystem())); +// map.put(GEOREFMETH, withFieldAsHeader(GEOREFMETH, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getGeoreferencingMethod())); +// map.put(ELEVATION, withFieldAsHeader(ELEVATION, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingSite().getElevation())); +// map.put(COLLDATE, withFieldAsHeader(COLLDATE, vo -> (vo.getCollectingInfo() == null)? null : vo.getCollectingInfo().getCollectingDate())); + map.put(COLLSITE, withFieldAsHeader(COLLSITE, vo ->null)); + map.put(DECLATITUDE, withFieldAsHeader(DECLATITUDE, vo ->null)); + map.put(LATITUDE, withFieldAsHeader(LATITUDE, vo ->null)); + map.put(DECLONGITUDE, withFieldAsHeader(DECLONGITUDE, vo ->null)); + map.put(LONGITUDE, withFieldAsHeader(LONGITUDE, vo ->null)); + map.put(COORDUNCERT, withFieldAsHeader(COORDUNCERT, vo ->null)); + map.put(COORDDATUM, withFieldAsHeader(COORDDATUM, vo ->null)); + map.put(GEOREFMETH, withFieldAsHeader(GEOREFMETH, vo ->null)); + map.put(ELEVATION, withFieldAsHeader(ELEVATION, vo ->null)); + map.put(COLLDATE, withFieldAsHeader(COLLDATE, vo ->null)); + + // FIXME JBN uncomment this once germplasm mcpd has breedingInstitutes +// map.put(BREDCODE, withFieldAsHeader(BREDCODE, vo -> (vo.getBreedingInstitutes() == null)? null : +// vo.getBreedingInstitutes() +// .stream() +// .map(InstituteVO::getInstituteCode) +// .collect(Collectors.joining(";")))); +// map.put(BREDNAME, withFieldAsHeader(BREDNAME, vo -> (vo.getBreedingInstitutes() == null)? null : +// vo.getBreedingInstitutes() +// .stream() +// .map(InstituteVO::getInstituteName) +// .collect(Collectors.joining(";")))); + map.put(BREDCODE, withFieldAsHeader(BREDCODE, vo ->null)); + map.put(BREDNAME, withFieldAsHeader(BREDNAME, vo ->null)); + + // FIXME JBN uncomment this once germplasm mcpd has biologicalStatusOfAccessionCode + // map.put(SAMPSTAT, withFieldAsHeader(SAMPSTAT, vo -> vo.getBiologicalStatusOfAccessionCode())); + map.put(SAMPSTAT, withFieldAsHeader(SAMPSTAT, vo -> null)); + + map.put(ANCEST, withFieldAsHeader(ANCEST, vo -> vo.getAncestralData())); + map.put(COLLSRC, withFieldAsHeader(COLLSRC, vo -> vo.getAcquisitionSourceCode())); + + // FIXME JBN uncomment this once germplasm mcpd has donorInfo +// map.put(DONORCODE, withFieldAsHeader(DONORCODE, vo -> (vo.getDonorInfo() == null )? null : +// vo.getDonorInfo() +// .stream() +// .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteCode()) +// .collect(Collectors.joining(";")))); +// map.put(DONORNAME, withFieldAsHeader(DONORNAME, vo -> (vo.getDonorInfo() == null)? null : +// vo.getDonorInfo() +// .stream() +// .map(donorInfoVO -> donorInfoVO.getDonorInstitute().getInstituteName()) +// .collect(Collectors.joining(";")))); +// map.put(DONORNUMB, withFieldAsHeader(DONORNUMB, vo -> (vo.getDonorInfo() == null )? null : +// vo.getDonorInfo() +// .stream() +// .map(DonorInfoVO::getDonorAccessionNumber) +// .collect(Collectors.joining(";")))); + map.put(DONORCODE, withFieldAsHeader(DONORCODE, null)); + map.put(DONORNAME, withFieldAsHeader(COLLSRC, vo -> null)); + map.put(DONORNUMB, withFieldAsHeader(COLLSRC, vo -> null)); + + map.put(OTHERNUMB, withFieldAsHeader(OTHERNUMB, vo -> String.join(";", vo.getAlternateIDs()))); + map.put(MLSSTAT, withFieldAsHeader(MLSSTAT, vo -> vo.getMlsStatus())); + map.put(REMARKS, withFieldAsHeader(REMARKS, vo -> vo.getRemarks())); + + this.descriptors = Collections.unmodifiableMap(map); + } + + public void export(OutputStream out, Stream<GermplasmMcpdVO> germplasms, List<GermplasmMcpdExportableField> fields) { + try { + CSVWriter csvWriter = new CSVWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)), ';', '"', '\\', "\n"); + String[] header = fields.stream() + .map(descriptors::get) + .map(GermplasmMcpdExportableFieldDescriptor::getHeader) + .toArray(String[]::new); + csvWriter.writeNext(header); + + germplasms.forEach(vo -> { + String[] line = + fields.stream() + .map(descriptors::get) + .map(descriptor -> descriptor.export(vo)) + .toArray(String[]::new); + csvWriter.writeNext(line); + }); + csvWriter.flush(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private GermplasmMcpdExportableFieldDescriptor withFieldAsHeader( + GermplasmMcpdExportableField field, + Function<GermplasmMcpdVO, String> exporter) { + return new GermplasmMcpdExportableFieldDescriptor(field.name(), exporter); + } + + private static class GermplasmMcpdExportableFieldDescriptor { + private final String header; + private final Function<GermplasmMcpdVO, String> exporter; + + public GermplasmMcpdExportableFieldDescriptor(String header, + Function<GermplasmMcpdVO, String> exporter) { + this.header = header; + this.exporter = exporter; + } + + public String getHeader() { + return this.header; + } + + public String export(GermplasmMcpdVO germplasm) { + return this.exporter.apply(germplasm); + } + } +} + + diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java similarity index 87% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java index eda85e1fa243ffc71a05c449dc9c7e153b19f97a..f9b701e3b26dd4d82e74be037d441d5c7750568a 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmMcpdExportableField.java @@ -1,6 +1,4 @@ -package fr.inra.urgi.faidare.web.germplasm; - -import com.fasterxml.jackson.annotation.JsonValue; +package fr.inrae.urgi.faidare.web.germplasm; /** * The fields of a germplasm MCPD that can be exported diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmModel.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmModel.java similarity index 84% rename from backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmModel.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmModel.java index da82e8097c1ef1b52949ffe3def70b3d8ea41f16..342540bd2a69fb9ac807851b3d9b0e74a714291b 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmModel.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmModel.java @@ -1,33 +1,33 @@ -package fr.inra.urgi.faidare.web.germplasm; +package fr.inrae.urgi.faidare.web.germplasm; + +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.domain.GermplasmInstituteVO; +import fr.inrae.urgi.faidare.domain.SiteVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeValueV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmPedigreeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.web.site.MapLocation; +import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValue; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmInstituteVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.SiteVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.web.site.MapLocation; -import org.springframework.util.StringUtils; - /** * The model used by the germplasm page * @author JB Nizet */ public final class GermplasmModel { - private final GermplasmVO germplasm; + private final GermplasmV1VO germplasm; private final DataSource source; - private final List<BrapiGermplasmAttributeValue> attributes; - private final PedigreeVO pedigree; + private final List<GermplasmAttributeValueV1VO> attributes; + private final GermplasmPedigreeV1VO pedigree; private final List<XRefDocumentVO> crossReferences; - public GermplasmModel(GermplasmVO germplasm, + public GermplasmModel(GermplasmV1VO germplasm, DataSource source, - List<BrapiGermplasmAttributeValue> attributes, - PedigreeVO pedigree, + List<GermplasmAttributeValueV1VO> attributes, + GermplasmPedigreeV1VO pedigree, List<XRefDocumentVO> crossReferences) { this.germplasm = germplasm; this.source = source; @@ -36,7 +36,7 @@ public final class GermplasmModel { this.crossReferences = crossReferences; } - public GermplasmVO getGermplasm() { + public GermplasmV1VO getGermplasm() { return germplasm; } @@ -44,11 +44,11 @@ public final class GermplasmModel { return source; } - public List<BrapiGermplasmAttributeValue> getAttributes() { + public List<GermplasmAttributeValueV1VO> getAttributes() { return attributes; } - public PedigreeVO getPedigree() { + public GermplasmPedigreeV1VO getPedigree() { return pedigree; } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/site/MapLocation.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/MapLocation.java similarity index 92% rename from backend/src/main/java/fr/inra/urgi/faidare/web/site/MapLocation.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/site/MapLocation.java index 3b096853cfff4a467d7a277f9fb4b41e65b2ad01..ba6b9e999bde65dd2d9f2aa7147cbb45def6bbb7 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/site/MapLocation.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/MapLocation.java @@ -1,11 +1,11 @@ -package fr.inra.urgi.faidare.web.site; +package fr.inrae.urgi.faidare.web.site; import java.util.List; import java.util.stream.Collectors; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.germplasm.SiteVO; -import fr.inra.urgi.faidare.utils.Sites; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.SiteVO; +import fr.inrae.urgi.faidare.utils.Sites; /** * An object that can be serialized to JSON to serve as a map marker. diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteController.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteController.java similarity index 57% rename from backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteController.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteController.java index 645b8fbf84d678e49f1586d32fcc389fba0f5ba3..e507d7dd9cf6035eee3abda8bce997824f09677c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteController.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteController.java @@ -1,17 +1,14 @@ -package fr.inra.urgi.faidare.web.site; +package fr.inrae.urgi.faidare.web.site; -import java.util.Iterator; -import java.util.List; - -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.utils.Sitemaps; +import fr.inrae.urgi.faidare.api.NotFoundException; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.v1.LocationV1Dao; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.LocationSitemapVO; +import fr.inrae.urgi.faidare.utils.Sitemaps; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -22,6 +19,9 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; +import java.util.List; +import java.util.stream.Stream; + /** * Controller used to display a site card based on its ID. * @author JB Nizet @@ -30,36 +30,35 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo @RequestMapping("/sites") public class SiteController { - private final LocationRepository locationRepository; + private final LocationV1Dao locationRepository; private final FaidareProperties faidareProperties; - private final XRefDocumentRepository xRefDocumentRepository; + private final XRefDocumentDao xRefDocumentRepository; - public SiteController(LocationRepository locationRepository, + public SiteController(LocationV1Dao locationRepository, FaidareProperties faidareProperties, - XRefDocumentRepository xRefDocumentRepository) { + XRefDocumentDao xRefDocumentRepository) { this.locationRepository = locationRepository; this.faidareProperties = faidareProperties; this.xRefDocumentRepository = xRefDocumentRepository; } @GetMapping("/{siteId}") - public ModelAndView get(@PathVariable("siteId") String siteId) { - LocationVO site = locationRepository.getById(siteId); + public ModelAndView get(@PathVariable("siteId") String siteId, HttpServletRequest request) { + LocationVO site = locationRepository.getByLocationDbId(siteId); if (site == null) { throw new NotFoundException("Site with ID " + siteId + " not found"); } - List<XRefDocumentVO> crossReferences = xRefDocumentRepository.find( - XRefDocumentSearchCriteria.forXRefId(site.getLocationDbId()) - ); + List<XRefDocumentVO> crossReferences = xRefDocumentRepository.findByLinkedResourcesID(site.getLocationDbId()); return new ModelAndView("site", "model", new SiteModel( site, faidareProperties.getByUri(site.getSourceUri()), - crossReferences + crossReferences, + request.getContextPath() ) ); } @@ -71,14 +70,16 @@ public class SiteController { throw new NotFoundException("no sitemap for this index"); } StreamingResponseBody body = out -> { - Iterator<LocationSitemapVO> iterator = locationRepository.scrollAllForSitemap(1000); - Sitemaps.generateSitemap( - "/sites/sitemap-" + index + ".txt", - out, - iterator, - vo -> Math.floorMod(vo.getLocationDbId().hashCode(), Sitemaps.BUCKET_COUNT) == index, - vo -> "/sites/" + vo.getLocationDbId() - ); + try (Stream<LocationSitemapVO> stream = locationRepository.findAllForSitemap()) { + Sitemaps.generateSitemap( + "/sites/sitemap-" + index + ".txt", + out, + stream, + vo -> Math.floorMod(vo.getLocationDbId().hashCode(), + Sitemaps.BUCKET_COUNT) == index, + vo -> "/sites/" + vo.getLocationDbId() + ); + } }; return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(body); } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteModel.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteModel.java similarity index 82% rename from backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteModel.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteModel.java index cd8f7bb80bbb6cad8d29a9c76c3b6e1a39dce06f..9facf3a24d29982901fda829bba860dc4c1c446b 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/site/SiteModel.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/site/SiteModel.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web.site; +package fr.inrae.urgi.faidare.web.site; import java.util.Arrays; import java.util.Collections; @@ -8,9 +8,9 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; /** * The model used by the site page @@ -34,13 +34,17 @@ public final class SiteModel { private final Map<String, Object> additionalInfo; private final List<XRefDocumentVO> crossReferences; private final List<Map.Entry<String, Object>> additionalInfoProperties; + private final String contextPath; public SiteModel(LocationVO site, DataSource source, - List<XRefDocumentVO> crossReferences) { + List<XRefDocumentVO> crossReferences, + String contextPath) { this.site = site; this.source = source; - this.additionalInfo = site.getAdditionalInfo() == null ? Collections.emptyMap() : site.getAdditionalInfo().getProperties(); + // FIXME JBN uncomment once LocationVO has additionalInfo + // this.additionalInfo = site.getAdditionalInfo() == null ? Collections.emptyMap() : site.getAdditionalInfo().getProperties(); + this.additionalInfo = Collections.emptyMap(); this.crossReferences = crossReferences; this.additionalInfoProperties = this.additionalInfo @@ -50,6 +54,7 @@ public final class SiteModel { .filter(entry -> entry.getValue() != null && !entry.getValue().toString().isEmpty()) .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toList()); + this.contextPath = contextPath; } public LocationVO getSite() { @@ -115,4 +120,8 @@ public final class SiteModel { public List<MapLocation> getMapLocations() { return MapLocation.locationsToDisplayableMapLocations(Collections.singletonList(this.site)); } + + public String getContextPath() { + return contextPath; + } } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexController.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexController.java similarity index 96% rename from backend/src/main/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexController.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexController.java index f80d9e364075a59323f97273847fcd89e5b9df29..ec77dcda145fea99796134381fcf5703a8fb7c9c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexController.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexController.java @@ -1,8 +1,8 @@ -package fr.inra.urgi.faidare.web.sitemap; +package fr.inrae.urgi.faidare.web.sitemap; import java.nio.charset.StandardCharsets; -import fr.inra.urgi.faidare.utils.Sitemaps; +import fr.inrae.urgi.faidare.utils.Sitemaps; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyController.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyController.java similarity index 65% rename from backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyController.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyController.java index 989b9a498d271c071e041c46bb3a34f01ac650d0..32b8cd8db3a1394fabfb18c0d611058b8e4c08bf 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyController.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyController.java @@ -1,34 +1,21 @@ -package fr.inra.urgi.faidare.web.study; - -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import com.google.common.collect.Lists; -import fr.inra.urgi.faidare.api.NotFoundException; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import fr.inra.urgi.faidare.repository.es.StudyRepository; -import fr.inra.urgi.faidare.repository.es.TrialRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import fr.inra.urgi.faidare.utils.Sitemaps; +package fr.inrae.urgi.faidare.web.study; + +import fr.inrae.urgi.faidare.api.NotFoundException; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.file.CropOntologyRepository; +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.dao.v1.LocationV1Dao; +import fr.inrae.urgi.faidare.dao.v1.StudyV1Dao; +import fr.inrae.urgi.faidare.dao.v1.TrialV1Dao; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.StudySitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.TrialV1VO; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.utils.Sitemaps; import org.apache.logging.log4j.util.Strings; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -41,6 +28,10 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * Controller used to display a study card based on its ID. * @author JB Nizet @@ -49,21 +40,21 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo @RequestMapping("/studies") public class StudyController { - private final StudyRepository studyRepository; + private final StudyV1Dao studyRepository; private final FaidareProperties faidareProperties; - private final XRefDocumentRepository xRefDocumentRepository; - private final GermplasmRepository germplasmRepository; + private final XRefDocumentDao xRefDocumentRepository; + private final GermplasmV1Dao germplasmRepository; private final CropOntologyRepository cropOntologyRepository; - private final TrialRepository trialRepository; - private final LocationRepository locationRepository; + private final TrialV1Dao trialRepository; + private final LocationV1Dao locationRepository; - public StudyController(StudyRepository studyRepository, + public StudyController(StudyV1Dao studyRepository, FaidareProperties faidareProperties, - XRefDocumentRepository xRefDocumentRepository, - GermplasmRepository germplasmRepository, + XRefDocumentDao xRefDocumentRepository, + GermplasmV1Dao germplasmRepository, CropOntologyRepository cropOntologyRepository, - TrialRepository trialRepository, - LocationRepository locationRepository) { + TrialV1Dao trialRepository, + LocationV1Dao locationRepository) { this.studyRepository = studyRepository; this.faidareProperties = faidareProperties; this.xRefDocumentRepository = xRefDocumentRepository; @@ -75,19 +66,17 @@ public class StudyController { @GetMapping("/{studyId}") public ModelAndView get(@PathVariable("studyId") String studyId, Locale locale) { - StudyDetailVO study = studyRepository.getById(studyId); + StudyV1VO study = studyRepository.getByStudyDbId(studyId); if (study == null) { throw new NotFoundException("Study with ID " + studyId + " not found"); } - List<XRefDocumentVO> crossReferences = xRefDocumentRepository.find( - XRefDocumentSearchCriteria.forXRefId(study.getStudyDbId()) - ); + List<XRefDocumentVO> crossReferences = xRefDocumentRepository.findByLinkedResourcesID(study.getStudyDbId()); - List<GermplasmVO> germplasms = getGermplasms(study); + List<GermplasmV1VO> germplasms = getGermplasms(study); List<ObservationVariableVO> variables = getVariables(study, locale); - List<TrialVO> trials = getTrials(study); + List<TrialV1VO> trials = getTrials(study); LocationVO location = getLocation(study); return new ModelAndView("study", @@ -111,39 +100,41 @@ public class StudyController { throw new NotFoundException("no sitemap for this index"); } StreamingResponseBody body = out -> { - Iterator<StudySitemapVO> iterator = studyRepository.scrollAllForSitemap(1000); - Sitemaps.generateSitemap( - "/sudies/sitemap-" + index + ".txt", - out, - iterator, - vo -> Math.floorMod(vo.getStudyDbId().hashCode(), Sitemaps.BUCKET_COUNT) == index, - vo -> "/studies/" + vo.getStudyDbId()); + try (Stream<StudySitemapVO> stream = studyRepository.findAllForSitemap()) { + Sitemaps.generateSitemap( + "/sudies/sitemap-" + index + ".txt", + out, + stream, + vo -> Math.floorMod(vo.getStudyDbId().hashCode(), + Sitemaps.BUCKET_COUNT) == index, + vo -> "/studies/" + vo.getStudyDbId()); + } }; return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(body); } - private LocationVO getLocation(StudyDetailVO study) { + private LocationVO getLocation(StudyV1VO study) { if (Strings.isBlank(study.getLocationDbId())) { return null; } - return locationRepository.getById(study.getLocationDbId()); + return locationRepository.getByLocationDbId(study.getLocationDbId()); } - private List<GermplasmVO> getGermplasms(StudyDetailVO study) { + private List<GermplasmV1VO> getGermplasms(StudyV1VO study) { if (study.getGermplasmDbIds() == null || study.getGermplasmDbIds().isEmpty()) { return Collections.emptyList(); } else { - GermplasmPOSTSearchCriteria germplasmCriteria = new GermplasmPOSTSearchCriteria(); - germplasmCriteria.setGermplasmDbIds(Lists.newArrayList(study.getGermplasmDbIds())); - return germplasmRepository.find(germplasmCriteria) - .stream() - .sorted(Comparator.comparing(GermplasmVO::getGermplasmName)) + return germplasmRepository.findByGermplasmDbIdIn(Set.copyOf(study.getGermplasmDbIds())) + .sorted(Comparator.comparing(GermplasmV1VO::getGermplasmName)) .collect(Collectors.toList()); } } - private List<ObservationVariableVO> getVariables(StudyDetailVO study, Locale locale) { - Set<String> variableIds = studyRepository.getVariableIds(study.getStudyDbId()); + private List<ObservationVariableVO> getVariables(StudyV1VO study, Locale locale) { + // FIXME JBN uncomment this line once StudyV1Dao has a getVariableIds() method + // Set<String> variableIds = studyRepository.getVariableIds(study.getStudyDbId()); + Set<String> variableIds = Set.of(); + List<ObservationVariableVO> variables = cropOntologyRepository.getVariableByIds(variableIds); return filterVariablesForLocale(variables, locale) .sorted(Comparator.comparing(ObservationVariableVO::getObservationVariableDbId)) @@ -165,7 +156,7 @@ public class StudyController { */ private Stream<ObservationVariableVO> filterVariablesForLocale(List<ObservationVariableVO> variables, Locale locale) { if (variables.isEmpty()) { - return variables.stream(); + return Stream.empty(); } String requestedLanguage = locale.getLanguage(); @@ -214,15 +205,15 @@ public class StudyController { return languageInLowerCase; } - private List<TrialVO> getTrials(StudyDetailVO study) { - if (study.getTrialDbIds() == null || study.getTrialDbIds().isEmpty()) { + private List<TrialV1VO> getTrials(StudyV1VO study) { + if (study.getTrialsDbIds() == null || study.getTrialsDbIds().isEmpty()) { return Collections.emptyList(); } - return study.getTrialDbIds() + return study.getTrialsDbIds() .stream() .sorted(Comparator.naturalOrder()) - .map(trialRepository::getById) + .map(trialRepository::getByTrialDbId) .filter(Objects::nonNull) .collect(Collectors.toList()); } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyModel.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyModel.java similarity index 60% rename from backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyModel.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyModel.java index bc77dfc3d9b9fdb7da63dd7b47afb15ab1e3bff6..e2f81a6b4b2780d834ddf5fcc549819dc652c09a 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/study/StudyModel.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/study/StudyModel.java @@ -1,38 +1,40 @@ -package fr.inra.urgi.faidare.web.study; +package fr.inrae.urgi.faidare.web.study; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.web.site.MapLocation; +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.TrialV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.web.site.MapLocation; /** * The model used by the study page * @author JB Nizet */ public final class StudyModel { - private final StudyDetailVO study; + private final StudyV1VO study; private final DataSource source; - private final List<GermplasmVO> germplasms; + private final List<GermplasmV1VO> germplasms; private final List<ObservationVariableVO> variables; - private final List<TrialVO> trials; + private final List<TrialV1VO> trials; private final List<XRefDocumentVO> crossReferences; private final LocationVO location; private final List<Map.Entry<String, Object>> additionalInfoProperties; - public StudyModel(StudyDetailVO study, + public StudyModel(StudyV1VO study, DataSource source, - List<GermplasmVO> germplasms, + List<GermplasmV1VO> germplasms, List<ObservationVariableVO> variables, - List<TrialVO> trials, + List<TrialV1VO> trials, List<XRefDocumentVO> crossReferences, LocationVO location) { this.study = study; @@ -43,8 +45,10 @@ public final class StudyModel { this.crossReferences = crossReferences; this.location = location; - Map<String, Object> additionalInfo = - study.getAdditionalInfo() == null ? Collections.emptyMap() : study.getAdditionalInfo().getProperties(); + // FIXME JBN uncomment this once study has additionalInfo +// Map<String, Object> additionalInfo = +// study.getAdditionalInfo() == null ? Collections.emptyMap() : study.getAdditionalInfo().getProperties(); + Map<String, Object> additionalInfo = Collections.emptyMap(); this.additionalInfoProperties = additionalInfo.entrySet() .stream() @@ -53,7 +57,7 @@ public final class StudyModel { .collect(Collectors.toList()); } - public StudyDetailVO getStudy() { + public StudyV1VO getStudy() { return study; } @@ -65,7 +69,7 @@ public final class StudyModel { return crossReferences; } - public List<GermplasmVO> getGermplasms() { + public List<GermplasmV1VO> getGermplasms() { return germplasms; } @@ -73,7 +77,7 @@ public final class StudyModel { return variables; } - public List<TrialVO> getTrials() { + public List<TrialV1VO> getTrials() { return trials; } diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/Coordinates.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/Coordinates.java similarity index 97% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/Coordinates.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/Coordinates.java index 554929b11d88e103093f808be0ba969118c47772..36d908feff0aad9689c087f304034dffc3e97d03 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/Coordinates.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/Coordinates.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; import java.text.DecimalFormat; import java.util.Locale; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesDialect.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesDialect.java similarity index 83% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesDialect.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesDialect.java index d443e589ca1c8e82c00960faeb9f15733db0e102..9f425c7059c29176c8301db2445fc4b6e252734d 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesDialect.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesDialect.java @@ -1,11 +1,9 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; import org.springframework.stereotype.Component; import org.thymeleaf.dialect.AbstractDialect; -import org.thymeleaf.dialect.IDialect; import org.thymeleaf.dialect.IExpressionObjectDialect; import org.thymeleaf.expression.IExpressionObjectFactory; -import org.thymeleaf.extras.java8time.dialect.Java8TimeExpressionFactory; /** * A thymeleaf dialect allowing to transform coordinates (latitude and longitude) diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java similarity index 85% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java index e3c25cc8577aae0cac73a894915d6c33edd6d8ca..cef99c2e21265678eec54d66c24bc84ad58b2a4a 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/CoordinatesExpressionFactory.java @@ -1,13 +1,10 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; -import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.Set; import org.thymeleaf.context.IExpressionContext; import org.thymeleaf.expression.IExpressionObjectFactory; -import org.thymeleaf.extras.java8time.expression.Temporals; /** * The object factory for the {@link CoordinatesDialect} diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareDialect.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareDialect.java similarity index 89% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareDialect.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareDialect.java index 26bfc5611683c9a854efbe84084a2164827c57f6..900f08d540964436af67f2dbcb95bd13da1b71ca 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareDialect.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareDialect.java @@ -1,6 +1,6 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; -import fr.inra.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.config.FaidareProperties; import org.springframework.stereotype.Component; import org.thymeleaf.dialect.AbstractDialect; import org.thymeleaf.dialect.IExpressionObjectDialect; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java similarity index 95% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java index 8ccd5fe9aadb56f9799d230e153b37c3525d37bd..754bf9542b6670703fd101339ddb4320f22feb26 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressionFactory.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; import java.util.Collections; import java.util.Set; diff --git a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressions.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressions.java similarity index 67% rename from backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressions.java rename to backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressions.java index a88283830f9c0fb1408a3b59423bd74456933db8..54fd4e8cb5fb9276bf46f5f3fd7c92dfc6b7d951 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/web/thymeleaf/FaidareExpressions.java +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/FaidareExpressions.java @@ -1,9 +1,6 @@ -package fr.inra.urgi.faidare.web.thymeleaf; +package fr.inrae.urgi.faidare.web.thymeleaf; -import java.nio.charset.StandardCharsets; -import java.text.DecimalFormat; import java.util.Arrays; -import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -11,11 +8,9 @@ import java.util.Locale; import java.util.Map; import java.util.function.Function; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.TaxonSourceVO; -import fr.inra.urgi.faidare.utils.Sites; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.TaxonSourceVO; +import fr.inrae.urgi.faidare.utils.Sites; import org.apache.logging.log4j.util.Strings; /** @@ -41,18 +36,17 @@ public class FaidareExpressions { private static List<NavbarEntry> createNavbarEntries() { return Arrays.asList( - NavbarEntry.menu("URGI", Arrays.asList( - NavbarEntry.link("Home", "https://urgi.versailles.inrae.fr"), - NavbarEntry.link("News", "https://urgi.versailles.inrae.fr/About-us/News"), - NavbarEntry.link("About us", "https://urgi.versailles.inrae.fr/About-us") + NavbarEntry.menu("navbar.urgi", Arrays.asList( + NavbarEntry.link("navbar.urgi.home", "https://urgi.versailles.inrae.fr"), + NavbarEntry.link("navbar.urgi.news", "https://urgi.versailles.inrae.fr/About-us/News"), + NavbarEntry.link("navbar.urgi.about-us", "https://urgi.versailles.inrae.fr/About-us") )), - NavbarEntry.menu("More...", Arrays.asList( - NavbarEntry.link("About", "https://urgi.versailles.inrae.fr/faidare/about"), - NavbarEntry.link("Join us", "https://urgi.versailles.inrae.fr/faidare/join"), - NavbarEntry.link("Terms of use", "https://urgi.versailles.inrae.fr/faidare/legal"), - NavbarEntry.link("Help", "https://urgi.versailles.inrae.fr/faidare/help"), - NavbarEntry.link("News/Perspectives", "https://urgi.versailles.inrae.fr/faidare/news") - )) + NavbarEntry.link("navbar.about", "https://urgi.versailles.inrae.fr/faidare/about"), + NavbarEntry.link("navbar.join-us", "https://urgi.versailles.inrae.fr/faidare/join"), + NavbarEntry.link("navbar.terms-of-use", "https://urgi.versailles.inrae.fr/faidare/legal"), + NavbarEntry.link("navbar.help", "https://urgi.versailles.inrae.fr/faidare/help"), + NavbarEntry.link("navbar.news-perspectives", "https://urgi.versailles.inrae.fr/faidare/news"), + NavbarEntry.link("navbar.web-services", "https://urgi.versailles.inrae.fr/faidare/swagger-ui/index.html") ); } diff --git a/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/NavbarEntry.java b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/NavbarEntry.java new file mode 100644 index 0000000000000000000000000000000000000000..24acf65d9b82310586d60081c73d12eb2b3601ab --- /dev/null +++ b/backend/src/main/java/fr/inrae/urgi/faidare/web/thymeleaf/NavbarEntry.java @@ -0,0 +1,40 @@ +package fr.inrae.urgi.faidare.web.thymeleaf; + +import java.util.Collections; +import java.util.List; + +/** + * A navbar link + * @author JB Nizet + */ +public final class NavbarEntry { + private final String labelKey; + private final String url; + private final List<NavbarEntry> subMenu; + + private NavbarEntry(String labelKey, String url, List<NavbarEntry> subMenu) { + this.labelKey = labelKey; + this.url = url; + this.subMenu = subMenu; + } + + public static NavbarEntry link(String labelKey, String url) { + return new NavbarEntry(labelKey, url, Collections.emptyList()); + } + + public static NavbarEntry menu(String labelKey, List<NavbarEntry> subMenu) { + return new NavbarEntry(labelKey, null, subMenu); + } + + public String getLabelKey() { + return labelKey; + } + + public String getUrl() { + return url; + } + + public List<NavbarEntry> getSubMenu() { + return subMenu; + } +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 9cce0f6a869386f51c7b4fd726c61079791de4ba..ba082dc3fa741e30ac2de172a7af80ee8049d85c 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -8,6 +8,8 @@ spring: config: name: faidare-cards uri: ${SPRING_CONFIG_URI:http://localhost:8888} + messages: + fallback-to-system-locale: false data: elasticsearch: @@ -29,7 +31,7 @@ logging: org.springframework: boot.web.embedded.tomcat.TomcatWebServer: INFO web.client.RestTemplate: DEBUG - fr.inra: DEBUG + fr.inrae: DEBUG faidare: elasticsearch-indexing-template: @@ -106,11 +108,13 @@ server: context-path: /faidare-dev springdoc: - packagesToScan: fr.inra.urgi.faidare.api - pathsToMatch: /faidare/**, /brapi/** + packagesToScan: fr.inrae.urgi.faidare.api + pathsToMatch: /brapi/** swagger-ui: operationsSorter: alpha tagsSorter: alpha + path: /swagger-ui.html + doc-expansion: none --- spring: diff --git a/backend/src/main/resources/calls.json b/backend/src/main/resources/calls.json new file mode 100644 index 0000000000000000000000000000000000000000..99c98acd2c1b3d68894c413ed7cfa9f8e63c838b --- /dev/null +++ b/backend/src/main/resources/calls.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://brapi.org/jsonld/context/metadata.jsonld" + ], + "metadata": { + "datafiles": [], + "pagination": { + "currentPage": 0, + "pageSize": 1000, + "totalCount": 10, + "totalPages": 1 + }, + "status": [ + ] + }, + "result": { + "data": [ + { + "call": "allelematrices", + "dataTypes": [ + "application/json" + ], + "datatypes": [ + "application/json" + ], + "methods": [ + "GET" + ], + "versions": [ + "1.0", + "1.1", + "1.2", + "1.3" + ] + } + ] + } +} \ No newline at end of file diff --git a/backend/src/main/resources/messages.properties b/backend/src/main/resources/messages.properties new file mode 100644 index 0000000000000000000000000000000000000000..de511241f2c543badc06b7b58b7fc3de0a54eeff --- /dev/null +++ b/backend/src/main/resources/messages.properties @@ -0,0 +1,10 @@ +navbar.urgi=URGI +navbar.urgi.home=Home +navbar.urgi.news=News +navbar.urgi.about-us=About us +navbar.about=About +navbar.join-us=Join us +navbar.terms-of-use=Terms of use +navbar.help=Help +navbar.news-perspectives=News/Perspectives +navbar.web-services=Web services diff --git a/backend/src/main/resources/messages_en.properties b/backend/src/main/resources/messages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/src/main/resources/messages_fr.properties b/backend/src/main/resources/messages_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..78e23b4dc51a6225f99b970df89fa9682a7ff2ed --- /dev/null +++ b/backend/src/main/resources/messages_fr.properties @@ -0,0 +1,10 @@ +navbar.urgi=URGI +navbar.urgi.home=Accueil +navbar.urgi.news=Informations +navbar.urgi.about-us=À propos +navbar.about=À propos +navbar.join-us=Rejoignez-nous (EN) +navbar.terms-of-use=Conditions d'utilisation +navbar.help=Aide +navbar.news-perspectives=Nouveautés/Perspectives +navbar.web-services=Web services diff --git a/backend/src/main/resources/serverinfo.json b/backend/src/main/resources/serverinfo.json new file mode 100644 index 0000000000000000000000000000000000000000..315c103e7e65be621ed24a9d591bc39e2a3dfb8c --- /dev/null +++ b/backend/src/main/resources/serverinfo.json @@ -0,0 +1,92 @@ +{ + "@context": [ + "https://brapi.org/jsonld/context/metadata.jsonld" + ], + "metadata": { + "datafiles": [], + "pagination": { + "currentPage": 0, + "pageSize": 1000, + "totalCount": 10, + "totalPages": 1 + }, + "status": [ + { + "message": "Request accepted, response successful", + "messageType": "INFO" + } + ] + }, + "result": { + "calls": [ + { + "contentTypes": [ + "application/json" + ], + "dataTypes": [ + "application/json" + ], + "methods": [ + "GET" + ], + "service": "germplasm/{germplasmDbId}", + "versions": [ + "2.0", + "2.1" + ] + },{ + "contentTypes": [ + "application/json" + ], + "dataTypes": [ + "application/json" + ], + "methods": [ + "GET" + ], + "service": "collection", + "versions": [ + "2.0", + "2.1" + ] + },{ + "contentTypes": [ + "application/json" + ], + "dataTypes": [ + "application/json" + ], + "methods": [ + "GET" + ], + "service": "germplasm", + "versions": [ + "2.0", + "2.1" + ] + },{ + "contentTypes": [ + "application/json" + ], + "dataTypes": [ + "application/json" + ], + "methods": [ + "POST" + ], + "service": "search/germplasm", + "versions": [ + "2.0", + "2.1" + ] + } + ], + "contactEmail": "contact@institute.org", + "documentationURL": "institute.org/server", + "location": "FRA", + "organizationName": "INRAE", + "organizationURL": "institute.org/home", + "serverDescription": "FAIDARE Server", + "serverName": "FAIDARE Server" + } +} \ No newline at end of file diff --git a/backend/src/main/resources/templates/layout/main.html b/backend/src/main/resources/templates/layout/main.html index 7b1bb775d55f36e7445153370ed12a73ca14b209..24a79ec5077de626583e18f2a419e53459369c42 100644 --- a/backend/src/main/resources/templates/layout/main.html +++ b/backend/src/main/resources/templates/layout/main.html @@ -20,13 +20,13 @@ </head> <body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <nav class="navbar navbar-expand-lg navbar-light py-0"> <div class="container"> <a - class="navbar-brand py-0" + class="navbar-brand d-flex align-items-center p-2" href="https://urgi.versailles.inrae.fr/faidare" > - <img th:src="@{/resources/images/logo.png}" style="height: 40px" /> + <img th:src="@{/resources/images/logo.png}" style="height: 56px" /> </a> <button class="navbar-toggler" @@ -44,9 +44,9 @@ <th:block th:each="topEntry : ${#faidare.navbarEntries}"> <li class="nav-item" th:if="${#lists.isEmpty(topEntry.subMenu)}"> <a - class="nav-link" + class="nav-link d-flex align-items-center" th:href="${topEntry.url}" - th:text="${topEntry.label}" + th:text="#{${topEntry.labelKey}}" ></a> </li> <li @@ -54,24 +54,24 @@ th:if="${not #lists.isEmpty(topEntry.subMenu)}" > <a - class="nav-link dropdown-toggle" - th:id="${'navbar-dropdown-' + topEntry.label}" + class="nav-link dropdown-toggle d-flex align-items-center" + th:id="${'navbar-dropdown-' + topEntry.labelKey}" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false" - th:text="${topEntry.label}" + th:text="#{${topEntry.labelKey}}" > </a> <ul - class="dropdown-menu bg-light" - th:aria-labelledby="${'navbar-dropdown-' + topEntry.label}" + class="dropdown-menu" + th:aria-labelledby="${'navbar-dropdown-' + topEntry.labelKey}" > - <li th:each="subEntry : ${topEntry.subMenu}" class="bg-light"> + <li th:each="subEntry : ${topEntry.subMenu}"> <a class="dropdown-item" th:href="${subEntry.url}" - th:text="${subEntry.label}" + th:text="#{${subEntry.labelKey}}" ></a> </li> </ul> diff --git a/backend/src/main/resources/templates/site.html b/backend/src/main/resources/templates/site.html index 586affe043f0c5dfbf5c3dbc5901dd24698f47b1..db6aac97d0c6550bb1fe71328540aff0a27df355 100644 --- a/backend/src/main/resources/templates/site.html +++ b/backend/src/main/resources/templates/site.html @@ -125,7 +125,7 @@ <script th:inline="javascript"> faidare.initializeMap({ - contextPath: [[${#request.getContextPath()}]], + contextPath: [[${model.getContextPath()}]], locations: [[${model.mapLocations}]] }); </script> diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandlerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandlerTest.java deleted file mode 100644 index e606f6979efd60e22d61b002a2f029fe19132a72..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/BrapiExceptionHandlerTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.repository.es.GermplasmAttributeRepository; -import fr.inra.urgi.faidare.service.es.GermplasmService; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = {GermplasmController.class}) -class BrapiExceptionHandlerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private GermplasmService service; - - @MockBean - private GermplasmAttributeRepository attributeRepository; - - @Test - void should_Throw_Pagination_Max_Size_Exception() throws Exception { - mockMvc.perform(get("/brapi/v1/germplasm?pageSize=99999")) - .andExpect(status().isBadRequest()) - .andExpect(content().json("{\n" + - " \"metadata\": {\n" + - " \"pagination\": {\n" + - " \"pageSize\": 0,\n" + - " \"totalCount\": 0,\n" + - " \"totalPages\": 0,\n" + - " \"currentPage\": 0\n" + - " },\n" + - " \"status\": [" + - " {" + - " \"name\":\"Bad Request: Page size cannot be above 1000\"," + - " \"code\":\"400\"" + - " },{" + - " \"name\":\"Bad Request: The result window (page x pageSize) cannot be over 10000. Please use an export API to download all the requested data.\"," + - " \"code\":\"400\"" + - " }" + - " ]," + - " \"datafiles\": []\n" + - " },\n" + - " \"result\": null\n" + - "}")); - } - - @Test - void should_Throw_Pagination_Min_Size_Exception() throws Exception { - mockMvc.perform(get("/brapi/v1/germplasm?pageSize=-1")) - .andExpect(status().isBadRequest()) - .andExpect(content().json("{\n" + - " \"metadata\": {\n" + - " \"pagination\": {\n" + - " \"pageSize\": 0,\n" + - " \"totalCount\": 0,\n" + - " \"totalPages\": 0,\n" + - " \"currentPage\": 0\n" + - " },\n" + - " \"status\": [{\n" + - " \"name\": \"Bad Request: Page size cannot be below 1\",\n" + - " \"code\": \"400\"\n" + - " }],\n" + - " \"datafiles\": []\n" + - " },\n" + - " \"result\": null\n" + - "}")); - } - - - @Test - void should_Throw_Pagination_Min_Page_Exception() throws Exception { - mockMvc.perform(get("/brapi/v1/germplasm?page=-1")) - .andExpect(status().isBadRequest()) - .andExpect(content().json("{\n" + - " \"metadata\": {\n" + - " \"pagination\": {\n" + - " \"pageSize\": 0,\n" + - " \"totalCount\": 0,\n" + - " \"totalPages\": 0,\n" + - " \"currentPage\": 0\n" + - " },\n" + - " \"status\": [{\n" + - " \"name\": \"Bad Request: Page number cannot be below 0\",\n" + - " \"code\": \"400\"\n" + - " }],\n" + - " \"datafiles\": []\n" + - " },\n" + - " \"result\": null\n" + - "}")); - } - - @Test - void should_Throw_Invalid_Param_Value_Exception() throws Exception { - mockMvc.perform(get("/brapi/v1/germplasm?page=foo")) - .andExpect(status().isBadRequest()) - .andExpect(content().json("{\n" + - " \"metadata\": {\n" + - " \"pagination\": {\n" + - " \"pageSize\": 0,\n" + - " \"totalCount\": 0,\n" + - " \"totalPages\": 0,\n" + - " \"currentPage\": 0\n" + - " },\n" + - " \"status\": [{\n" + - " \"name\": \"Bad Request: Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Long' for property 'page'; nested exception is java.lang.NumberFormatException: For input string: \\\"foo\\\"\",\n" + - " \"code\": \"400\"\n" + - " }],\n" + - " \"datafiles\": []\n" + - " },\n" + - " \"result\": null\n" + - "}")); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/CallsControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/CallsControllerTest.java deleted file mode 100644 index 73c08d4acd51a331c6dd49d1c49601462da233f3..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/CallsControllerTest.java +++ /dev/null @@ -1,212 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.hamcrest.Matchers.hasSize; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@SpringBootTest -@AutoConfigureMockMvc -class CallsControllerTest { - - @Autowired - private MockMvc mockMvc; - - @Test - void should_Get_Page_Size() throws Exception { - int pageSize = 3; - mockMvc.perform(get("/brapi/v1/calls?pageSize=" + pageSize)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.metadata.status", hasSize(0))) - .andExpect(jsonPath("$.result.data", hasSize(pageSize))); - } - - @Test - void should_Fail_Page_Overflow() throws Exception { - mockMvc.perform(get("/brapi/v1/calls?pageSize=100&page=2")) - .andExpect(status().isBadRequest()) - .andExpect(content().json("{" + - "\"metadata\":{" + - "\"pagination\":{\"pageSize\":100,\"currentPage\":2,\"totalCount\":27,\"totalPages\":1}," + - "\"status\":[{" + - "\"name\":\"Bad Request: The current page should be strictly less than the total number of pages.\"," + - "\"code\":\"400\"" + - "}]," + - "\"datafiles\":[]" + - "}," + - "\"result\":{\"data\":null}" + - "}" - )); - } - - @Test - void should_Get_All() throws Exception { - mockMvc.perform(get("/brapi/v1/calls?pageSize=1000")) - .andExpect(status().isOk()) - .andExpect(content().json("{\n" + - " \"metadata\": {\n" + - " \"pagination\": {\n" + - " \"pageSize\": 1000,\n" + - " \"currentPage\": 0,\n" + - " \"totalCount\": 27,\n" + - " \"totalPages\": 1\n" + - " },\n" + - " \"status\": [],\n" + - " \"datafiles\": []\n" + - " },\n" + - " \"result\": {\n" + - " \"data\": [{\n" + - " \"call\": \"calls\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm-search\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"POST\", \"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm/{germplasmDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm/{germplasmDbId}/attributes\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm/{germplasmDbId}/mcpd\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm/{germplasmDbId}/pedigree\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"germplasm/{germplasmDbId}/progeny\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"locations\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"locations/{locationDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"ontologies\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"phenotypes-search\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"POST\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"programs\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"programs-search\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"POST\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"programs/{programDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies-search\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"POST\", \"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}/germplasm\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}/observationUnits\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}/observationVariables\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}/observationunits\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"studies/{studyDbId}/observationvariables\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"trials\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"trials/{trialDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"variables\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }, {\n" + - " \"call\": \"variables/{observationVariableDbId}\",\n" + - " \"datatypes\": [\"json\"],\n" + - " \"methods\": [\"GET\"],\n" + - " \"versions\": [\"1.0\", \"1.1\", \"1.2\"]\n" + - " }]\n" + - " }\n" + - "}")); - } - - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmControllerTest.java deleted file mode 100644 index ec28b1a29d5b8b1c41bd8cd72fb0e3d2ab73bc5c..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/GermplasmControllerTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.DonorVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.ProgenyVO; -import fr.inra.urgi.faidare.repository.es.GermplasmAttributeRepository; -import fr.inra.urgi.faidare.service.es.GermplasmService; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Collections; - -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = GermplasmController.class) -class GermplasmControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private GermplasmService service; - - @MockBean - private GermplasmAttributeRepository germplasmAttributeRepository; - - static GermplasmVO GERMPLASM; - static { - String id = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg=="; - String uri = "http://doi.org/foo/bar"; - GERMPLASM = new GermplasmVO(); - GERMPLASM.setUri(uri); - GERMPLASM.setGermplasmDbId(id); - } - - @Test - void should_Not_Show_JSON_LD_Fields_By_Default() throws Exception { - when(service.getById(anyString())).thenReturn(GERMPLASM); - - mockMvc.perform(get("/brapi/v1/germplasm/" + GERMPLASM.getGermplasmDbId())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id").doesNotExist()); - } - - @Test - void should_Show_JSON_LD_Fields_When_Asked() throws Exception { - when(service.getById(anyString())).thenReturn(GERMPLASM); - - mockMvc.perform(get("/brapi/v1/germplasm/"+GERMPLASM.getGermplasmDbId()) - .accept(BrapiJSONViewHandler.APPLICATION_LD_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id", is(GERMPLASM.getUri()))); - } - - @Test - void should_Load_Germplasm_progeny_From_PUID() throws Exception { - ProgenyVO progeny = new ProgenyVO(); - when(service.getProgeny(anyString())).thenReturn(progeny); - - mockMvc.perform(get("/brapi/v1/germplasm/Z25waXNfcHVpOnVua25vd246UmljZToxNjc4MzEw/progeny")) - .andExpect(status().isOk()); - } - - @Test - void should_Load_Germplasm_Encoded_DOI() throws Exception { - GermplasmVO germplasm = new GermplasmVO(); - when(service.getById(anyString())).thenReturn(germplasm); - - mockMvc.perform(get("/brapi/v1/germplasm/Z25waXNfcHVpOnVua25vd246UmljZToxNjc4MzEw")) - .andExpect(status().isOk()); - } - - @Test - void should_Return_Not_Found() throws Exception { - when(service.getById(anyString())).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/germplasm/foo")) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.metadata.status", hasSize(1))) - .andExpect(jsonPath("$.metadata.status[0].code", is("404"))); - } - - - @Test - void should_Serialize_Fields_Correctly() throws Exception { - GermplasmVO germplasm = new GermplasmVO(); - - germplasm.setGroupId(0L); - - germplasm.setGermplasmDbId("germplasmDbId"); - germplasm.setDefaultDisplayName("defaultDisplayName"); - - CollPopVO collection = new CollPopVO(); - collection.setName("name"); - germplasm.setCollection(Collections.singletonList(collection)); - - DonorVO donor = new DonorVO(); - donor.setDonorGermplasmPUI("pui"); - germplasm.setDonors(Collections.singletonList(donor)); - - when(service.getById(anyString())).thenReturn(germplasm); - - mockMvc.perform(get("/brapi/v1/germplasm/foo")) - // Should not have private fields - .andExpect(jsonPath("$.result", not(hasProperty("groupId")))) - .andExpect(jsonPath("$.result", not(hasProperty("speciesGroup")))) - - // BrAPI fields should appear - .andExpect(jsonPath("$.result.germplasmDbId", is(germplasm.getGermplasmDbId()))) - .andExpect(jsonPath("$.result.defaultDisplayName", is(germplasm.getDefaultDisplayName()))) - .andExpect(jsonPath("$.result.donors[0].donorGermplasmPUI", is(donor.getDonorGermplasmPUI()))) - - // GnpIS specific fields should not appear - .andExpect(jsonPath("$.result.donors[0]", not(hasProperty("donationDate")))) - .andExpect(jsonPath("$.result", not(hasProperty("collection")))); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/LocationControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/LocationControllerTest.java deleted file mode 100644 index 3f41729253c114cb26823ca7bf609c80d68ea4c2..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/LocationControllerTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = LocationController.class) -class LocationControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private LocationRepository repository; - - static LocationVO LOCATION; - static { - String id = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg=="; - String uri = "http://doi.org/foo/bar"; - LOCATION = new LocationVO(); - LOCATION.setUri(uri); - LOCATION.setLocationDbId(id); - } - - @Test - void should_Not_Show_JSON_LD_Fields_By_Default() throws Exception { - when(repository.getById(LOCATION.getLocationDbId())).thenReturn(LOCATION); - - mockMvc.perform(get("/brapi/v1/locations/" + LOCATION.getLocationDbId())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id").doesNotExist()); - } - - @Test - void should_Show_JSON_LD_Fields_When_Asked() throws Exception { - when(repository.getById(LOCATION.getLocationDbId())).thenReturn(LOCATION); - - mockMvc.perform(get("/brapi/v1/locations/"+LOCATION.getLocationDbId()) - .accept(BrapiJSONViewHandler.APPLICATION_LD_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id", is(LOCATION.getUri()))); - } - - @Test - void should_Get_By_Id() throws Exception { - String identifier = "identifier"; - - LocationVO location = new LocationVO(); - when(repository.getById(identifier)).thenReturn(location); - - mockMvc.perform(get("/brapi/v1/locations/" + identifier)) - .andExpect(status().isOk()); - } - - @Test - void should_Return_Not_Found() throws Exception { - when(repository.getById("foo")).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/locations/foo")) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.metadata.status", hasSize(1))) - .andExpect(jsonPath("$.metadata.status[0].code", is("404"))); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableControllerTest.java deleted file mode 100644 index 5a7863aaa6bd7527a4ee1eacefa27ecae1103079..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ObservationVariableControllerTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = ObservationVariableController.class) -class ObservationVariableControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private CropOntologyRepository repository; - - private static ObservationVariableVO VARIABLE; - static { - String id = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg=="; - String uri = "http://doi.org/foo/bar"; - VARIABLE = new ObservationVariableVO(); - VARIABLE.setUri(uri); - VARIABLE.setObservationVariableDbId(id); - } - - @Test - void should_Not_Show_JSON_LD_Fields_By_Default() throws Exception { - when(repository.getVariableById(VARIABLE.getObservationVariableDbId())).thenReturn(VARIABLE); - mockMvc.perform(get("/brapi/v1/variables/" + VARIABLE.getObservationVariableDbId())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id").doesNotExist()); - } - - @Test - void should_Show_JSON_LD_Fields_When_Asked() throws Exception { - when(repository.getVariableById(VARIABLE.getObservationVariableDbId())).thenReturn(VARIABLE); - - mockMvc.perform(get("/brapi/v1/variables/"+ VARIABLE.getObservationVariableDbId()) - .accept(BrapiJSONViewHandler.APPLICATION_LD_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id", is(VARIABLE.getUri()))); - } - - @Test - void should_Get_By_Id() throws Exception { - String identifier = "identifier"; - - ObservationVariableVO variable = new ObservationVariableVO(); - when(repository.getVariableById(identifier)).thenReturn(variable); - - mockMvc.perform(get("/brapi/v1/variables/" + identifier)) - .andExpect(status().isOk()); - } - - @Test - void should_Return_Not_Found() throws Exception { - when(repository.getVariableById("foo")).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/variables/foo")) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.metadata.status", hasSize(1))) - .andExpect(jsonPath("$.metadata.status[0].code", is("404"))); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramControllerTest.java deleted file mode 100644 index d05bb8a36085701feb5814a0dce3c84b812ab82a..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/ProgramControllerTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.repository.es.ProgramRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = ProgramController.class) -class ProgramControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private ProgramRepository repository; - - private static ProgramVO PROGRAM; - static { - String id = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg=="; - String uri = "http://doi.org/foo/bar"; - PROGRAM = new ProgramVO(); - PROGRAM.setUri(uri); - PROGRAM.setProgramDbId(id); - } - - @Test - void should_Not_Show_JSON_LD_Fields_By_Default() throws Exception { - when(repository.getById(PROGRAM.getProgramDbId())).thenReturn(PROGRAM); - mockMvc.perform(get("/brapi/v1/programs/" + PROGRAM.getProgramDbId())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id").doesNotExist()); - } - - @Test - void should_Show_JSON_LD_Fields_When_Asked() throws Exception { - when(repository.getById(PROGRAM.getProgramDbId())).thenReturn(PROGRAM); - - mockMvc.perform(get("/brapi/v1/programs/"+ PROGRAM.getProgramDbId()) - .accept(BrapiJSONViewHandler.APPLICATION_LD_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id", is(PROGRAM.getUri()))); - } - - @Test - void should_Get_By_Id() throws Exception { - String identifier = "identifier"; - - ProgramVO program = new ProgramVO(); - when(repository.getById(identifier)).thenReturn(program); - - mockMvc.perform(get("/brapi/v1/programs/" + identifier)) - .andExpect(status().isOk()); - } - - @Test - void should_Return_Not_Found() throws Exception { - when(repository.getById("foo")).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/programs/foo")) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.metadata.status", hasSize(1))) - .andExpect(jsonPath("$.metadata.status[0].code", is("404"))); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/StudyControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/StudyControllerTest.java deleted file mode 100644 index 253c4a0dca2cb03ee3ecc6765560c84decf52cdd..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/brapi/v1/StudyControllerTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package fr.inra.urgi.faidare.api.brapi.v1; - -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.domain.response.PaginationImpl; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.ObservationUnitRepository; -import fr.inra.urgi.faidare.repository.es.StudyRepository; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.ArrayList; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = StudyController.class) -class StudyControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private ObservationUnitRepository observationUnitRepository; - - @MockBean - private GermplasmRepository germplasmRepository; - - @MockBean - private CropOntologyRepository cropOntologyRepository; - - @MockBean - private StudyRepository repository; - - private static StudyDetailVO STUDY; - static { - String id = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg=="; - String uri = "http://doi.org/foo/bar"; - STUDY = new StudyDetailVO(); - STUDY.setUri(uri); - STUDY.setStudyDbId(id); - } - - @Test - void should_Not_Show_JSON_LD_Fields_By_Default() throws Exception { - when(repository.getById(STUDY.getStudyDbId())).thenReturn(STUDY); - mockMvc.perform(get("/brapi/v1/studies/" + STUDY.getStudyDbId())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id").doesNotExist()); - } - - @Test - void should_Show_JSON_LD_Fields_When_Asked() throws Exception { - when(repository.getById(STUDY.getStudyDbId())).thenReturn(STUDY); - - mockMvc.perform(get("/brapi/v1/studies/"+ STUDY.getStudyDbId()) - .accept(BrapiJSONViewHandler.APPLICATION_LD_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.result.@id", is(STUDY.getUri()))); - } - - @Test - void should_Get_By_Id() throws Exception { - String identifier = "identifier"; - - StudyDetailVO study = new StudyDetailVO(); - when(repository.getById(identifier)).thenReturn(study); - - mockMvc.perform(get("/brapi/v1/studies/" + identifier)) - .andExpect(status().isOk()); - } - - @Test - void should_Return_Not_Found() throws Exception { - when(repository.getById("foo")).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/studies/foo")) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.metadata.status", hasSize(1))) - .andExpect(jsonPath("$.metadata.status[0].code", is("404"))); - } - - @Test - void should_Paginate_ObservationUnits_By_Study() throws Exception { - String studyDbId = "foo"; - int page = 2; - int pageSize = 12; - - Pagination pagination = PaginationImpl.create(pageSize, page, 1000); - PaginatedList<ObservationUnitVO> observationUnits = new PaginatedList<>(pagination, new ArrayList<>()); - when(observationUnitRepository.find(any())).thenReturn(observationUnits); - - mockMvc.perform(get("/brapi/v1/studies/{id}/observationUnits?page={page}&pageSize={pageSize}", studyDbId, page, pageSize)) - .andExpect(jsonPath("$.metadata.pagination.currentPage", is(page))) - .andExpect(jsonPath("$.metadata.pagination.pageSize", is(pageSize))); - } - - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmControllerTest.java b/backend/src/test/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmControllerTest.java deleted file mode 100644 index 03edbd78f736b99ae574bb069a1238b24175d9ca..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/api/faidare/v1/GnpISGermplasmControllerTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package fr.inra.urgi.faidare.api.faidare.v1; - -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.DonorVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.service.es.GermplasmService; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Collections; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.hasProperty; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author C. Michotey, E. Kimmel, gcornut - */ -@ExtendWith(SpringExtension.class) -@WebMvcTest(controllers = GnpISGermplasmController.class) -class GnpISGermplasmControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private GermplasmService service; - - @Test - void should_Return_Not_Found_With_Id() throws Exception { - String id = "foo"; - when(service.getById(id)).thenReturn(null); - - mockMvc.perform(get("/brapi/v1/germplasm?id=" + id)) - .andExpect(status().isNotFound()); - } - - @Test - void should_Return_Not_Found_With_PUI() throws Exception { - when(service.find(any(GermplasmSearchCriteria.class))).thenReturn(null); - - String pui = "foo"; - mockMvc.perform(get("/brapi/v1/germplasm?pui=" + pui)) - .andExpect(status().isNotFound()); - } - - @Test - void should_Load_Germplasm_From_DOI() throws Exception { - GermplasmVO germplasm = new GermplasmVO(); - PaginatedList<GermplasmVO> germplasmPage = new PaginatedList<>(null, Collections.singletonList(germplasm)); - - ArgumentCaptor<GermplasmSearchCriteria> criteriaCaptor = ArgumentCaptor.forClass(GermplasmSearchCriteria.class); - when(service.find(criteriaCaptor.capture())).thenReturn(germplasmPage); - - String pui = "doi:10.15454/1.4921786234137117E12"; - mockMvc.perform(get("/faidare/v1/germplasm?pui=" + pui)) - .andExpect(status().isOk()); - - GermplasmSearchCriteria value = criteriaCaptor.getValue(); - assertThat(value).isInstanceOf(GermplasmGETSearchCriteria.class); - - // Check the generated criteria contains only the PUI given in REST query param - GermplasmGETSearchCriteria criteria = (GermplasmGETSearchCriteria) value; - assertThat(criteria.getGermplasmPUI()).isNotNull().hasSize(1).containsOnly(pui); - } - - @Test - void should_Return_Bad_Request_With_No_Param() throws Exception { - mockMvc.perform(get("/faidare/v1/germplasm")) - .andExpect(status().isBadRequest()); - } - - @Test - void should_Serialize_Fields_Correctly() throws Exception { - GermplasmVO germplasm = new GermplasmVO(); - - germplasm.setGroupId(0L); - - germplasm.setGermplasmDbId("germplasmDbId"); - germplasm.setDefaultDisplayName("defaultDisplayName"); - - // Add GnpIS specific field - CollPopVO collection = new CollPopVO(); - collection.setName("name"); - germplasm.setCollection(Collections.singletonList(collection)); - - DonorVO donor = new DonorVO(); - donor.setDonorGermplasmPUI("pui"); - germplasm.setDonors(Collections.singletonList(donor)); - - PaginatedList<GermplasmVO> germplasmPage = new PaginatedList<>(null, Collections.singletonList(germplasm)); - - when(service.find(any(GermplasmSearchCriteria.class))).thenReturn(germplasmPage); - - mockMvc.perform(get("/faidare/v1/germplasm?pui=foo")) - // Should not have private fields - .andExpect(jsonPath("$", not(hasProperty("groupId")))) - .andExpect(jsonPath("$", not(hasProperty("speciesGroup")))) - - // BrAPI fields should appear - .andExpect(jsonPath("$.germplasmDbId", is(germplasm.getGermplasmDbId()))) - .andExpect(jsonPath("$.defaultDisplayName", is(germplasm.getDefaultDisplayName()))) - .andExpect(jsonPath("$.donors[0].donorGermplasmPUI", is(donor.getDonorGermplasmPUI()))) - - // GnpIS specific fields should appear - //.andExpect(jsonPath("$.donors[0].donationDate", is(donor.getDonationDate()))) - .andExpect(jsonPath("$.collection[0].name", is(collection.getName()))); - - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/domain/brapi/v1/BrapiMappingTest.java b/backend/src/test/java/fr/inra/urgi/faidare/domain/brapi/v1/BrapiMappingTest.java deleted file mode 100644 index 454a3bf75162dcfd43000da6efdef77e8aad2672..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/domain/brapi/v1/BrapiMappingTest.java +++ /dev/null @@ -1,232 +0,0 @@ -package fr.inra.urgi.faidare.domain.brapi.v1; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrial; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrialStudy; -import fr.inra.urgi.faidare.domain.criteria.ProgramCriteria; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.domain.data.TrialDatasetAuthorshipVO; -import fr.inra.urgi.faidare.domain.data.TrialStudySummaryVO; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitXRefVO; -import fr.inra.urgi.faidare.domain.data.variable.OntologyVO; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactoryTest; -import org.assertj.core.api.Condition; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test mapping of Brapi data interfaces to JSON - * - * @author gcornut - */ -class BrapiMappingTest { - - private static ObjectMapper mapper; - - private static String additionalInfoExample; - private static String trialExample; - private static String programCriteriaExample; - - @BeforeAll - static void beforeClass() { - mapper = new ObjectMapper(); - - // Making sure we always serialize json fields in the same order for - // test purpose - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - additionalInfoExample = "{" + - " \"prop2\":[\"value2\",\"value3\"]," + - " \"prop1\":\"value1\"" + - "}"; - - trialExample = "{" + - " \"additionalInfo\":{" + - " \"publications\":[\"pubMedId\",\"doi\"]" + - " }," + - " \"datasetAuthorship\":{" + - " \"datasetPUI\":\"datasetPUI\"," + - " \"license\":\"license\"" + - " }," + - " \"studies\":[{" + - " \"studyDbId\":\"study1\",\"studyName\":\"Study 1\"" + - " },{" + - " \"studyDbId\":\"study2\",\"studyName\":\"Study 2\"" + - " }]," + - " \"trialDbId\":\"trial\"," + - " \"trialName\":\"Trial\"" + - "}"; - - programCriteriaExample = "{\"page\":0,\"pageSize\":100,\"programDbId\":\"A\",\"name\":\"B\"}"; - } - - @Test - void should_Serialize_Additional_Info() throws IOException { - BrapiAdditionalInfo info = new BrapiAdditionalInfo(); - info.addProperty("prop1", "value1"); - info.addProperty("prop2", Arrays.asList("value2", "value3")); - - String expectedJson = additionalInfoExample; - String actualJson = mapper.writeValueAsString(info); - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - } - - @SuppressWarnings("unchecked") - @Test - void should_Deserialize_Additional_Info() throws IOException { - String json = additionalInfoExample; - BrapiAdditionalInfo info = mapper.readValue(json, BrapiAdditionalInfo.class); - - assertThat(info).isNotNull(); - assertThat(info.getProperties()).isNotNull().isNotEmpty(); - assertThat(info.getProperties().get("prop1")).isNotNull().isEqualTo("value1"); - assertThat(info.getProperties().get("prop2")).isNotNull().isInstanceOf(List.class); - assertThat((List<String>) info.getProperties().get("prop2")).isNotEmpty().contains("value2", "value3"); - } - - /** - * {@link BrapiTrial} is a good example of a complex Brapi object. It is an - * interface (with separate concrete implementation) containing dynamically - * mapped field (additional info), an interface field - * (trial.datasetAuthorship) and a list of interfaces (trial.contacts, - * trial.studies). - */ - @Test - void should_Serialize_Complex_Brapi_Object() throws IOException { - TrialDatasetAuthorshipVO authorship = new TrialDatasetAuthorshipVO(); - authorship.setLicense("license"); - authorship.setDatasetPUI("datasetPUI"); - - BrapiAdditionalInfo additionalInfo = new BrapiAdditionalInfo(); - additionalInfo.addProperty("publications", Arrays.asList("pubMedId", "doi")); - - TrialStudySummaryVO study1 = new TrialStudySummaryVO(); - study1.setStudyDbId("study1"); - study1.setStudyName("Study 1"); - - TrialStudySummaryVO study2 = new TrialStudySummaryVO(); - study2.setStudyDbId("study2"); - study2.setStudyName("Study 2"); - - List<BrapiTrialStudy> studies = Arrays.asList( - ((BrapiTrialStudy) study1), - ((BrapiTrialStudy) study2) - ); - - TrialVO trial = new TrialVO(); - trial.setTrialDbId("trial"); - trial.setTrialName("Trial"); - trial.setDatasetAuthorship(authorship); - trial.setStudies(studies); - trial.setAdditionalInfo(additionalInfo); - - String expectedJson = trialExample; - String actualJson = mapper.writeValueAsString(trial); - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - } - - @SuppressWarnings("unchecked") - @Test - void should_Deserialize_Complex_Brapi_Object() throws IOException { - BrapiTrial trial = mapper.readValue(trialExample, TrialVO.class); - - assertThat(trial).isNotNull(); - assertThat(trial.getTrialDbId()).isEqualTo("trial"); - assertThat(trial.getTrialName()).isEqualTo("Trial"); - - assertThat(trial.getDatasetAuthorship()).isNotNull(); - assertThat(trial.getDatasetAuthorship().getLicense()).isEqualTo("license"); - assertThat(trial.getDatasetAuthorship().getDatasetPUI()).isEqualTo("datasetPUI"); - - assertThat(trial.getStudies()).isNotNull().isNotEmpty(); - assertThat(trial.getStudies()).are(new Condition<BrapiTrialStudy>() { - @Override - public boolean matches(BrapiTrialStudy value) { - String id = value.getStudyDbId(); - String name = value.getStudyName(); - - return ("study1".equals(id) && "Study 1".equals(name)) || - ("study2".equals(id) && "Study 2".equals(name)); - } - }); - - assertThat(trial.getAdditionalInfo()).isNotNull(); - Map<String, Object> properties = trial.getAdditionalInfo().getProperties(); - assertThat(properties) - .isNotNull().isNotEmpty(); - Object publications = properties.get("publications"); - assertThat(publications) - .isNotNull() - .isInstanceOf(List.class); - assertThat((List<String>) publications) - .isNotNull() - .contains("pubMedId", "doi"); - } - - @Test - void should_Serialize_Program_Criteria() throws IOException { - ProgramCriteria criteria = new ProgramCriteria(); - criteria.setProgramDbId("A"); - criteria.setName("B"); - - String expectedJson = programCriteriaExample; - String actualJson = mapper.writeValueAsString(criteria); - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - } - - /** - * Some BrAPI fields should never be null so they must be serialized as empty strings... - */ - @Test - void should_Serialize_Some_Empty_Fields_As_Empty_Strings() throws IOException { - TrialVO trialVO = new TrialVO(); - - String actualJson = mapper.writeValueAsString(trialVO); - String expectedJson = "{\"datasetAuthorship\":{\"license\":\"\",\"datasetPUI\":\"\"}}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - - ProgramVO programVO = new ProgramVO(); - - actualJson = mapper.writeValueAsString(programVO); - expectedJson = "{\"objective\":\"\",\"leadPerson\":\"\"}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - - ObservationUnitVO observationUnitVO = new ObservationUnitVO(); - - actualJson = mapper.writeValueAsString(observationUnitVO); - expectedJson = "{\"entryType\":\"\",\"entryNumber\":\"\"}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - - ObservationUnitXRefVO observationUnitXRefVO = new ObservationUnitXRefVO(); - - actualJson = mapper.writeValueAsString(observationUnitXRefVO); - expectedJson = "{\"id\":\"\"}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - - GermplasmVO germplasmVO = new GermplasmVO(); - - actualJson = mapper.writeValueAsString(germplasmVO); - expectedJson = "{\"instituteCode\":\"\"}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - - OntologyVO ontologyVO = new OntologyVO(); - - actualJson = mapper.writeValueAsString(ontologyVO); - expectedJson = "{\"authors\":\"\",\"licence\":\"\",\"copyright\":\"\",\"version\":\"\"}"; - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationValidatorTest.java b/backend/src/test/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationValidatorTest.java deleted file mode 100644 index 368e64ce6fecc837d9d6b0e53d3a408736dee789..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/domain/criteria/base/PaginationValidatorTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package fr.inra.urgi.faidare.domain.criteria.base; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; -import java.util.Set; - - -/** - * @author gcornut - */ -public class PaginationValidatorTest { - - - private static Validator validator; - - @BeforeAll - public static void setUp() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - validator = factory.getValidator(); - } - - @Test - public void should_Control_Nulls() { - PaginationCriteriaImpl criteria = new PaginationCriteriaImpl(); - criteria.setPageSize(null); - criteria.setPage(null); - - Set<ConstraintViolation<PaginationCriteria>> violations = - validator.validate(((PaginationCriteria) criteria)); - Assertions.assertThat(violations).isNotNull().hasSize(2); - Assertions.assertThat(violations) - .extracting("message") - .containsOnly(PaginationCriteriaImpl.ERROR_PAGE_NULL, PaginationCriteriaImpl.ERROR_PAGE_SIZE_NULL); - } - - @Test - public void should_Control_Min() { - PaginationCriteriaImpl criteria = new PaginationCriteriaImpl(); - criteria.setPageSize(PaginationCriteriaImpl.MIN_PAGE_SIZE - 1); - criteria.setPage(PaginationCriteriaImpl.MIN_PAGE - 1); - - Set<ConstraintViolation<PaginationCriteria>> violations = - validator.validate(((PaginationCriteria) criteria)); - Assertions.assertThat(violations).isNotNull().hasSize(2); - Assertions.assertThat(violations) - .extracting("message") - .containsOnly(PaginationCriteriaImpl.ERROR_PAGE_MIN, PaginationCriteriaImpl.ERROR_PAGE_SIZE_MIN); - } - - @Test - public void should_Control_Max_Size() { - PaginationCriteriaImpl criteria = new PaginationCriteriaImpl(); - criteria.setPageSize(PaginationCriteriaImpl.MAX_PAGE_SIZE + 1); - - Set<ConstraintViolation<PaginationCriteria>> violations = - validator.validate(((PaginationCriteria) criteria)); - Assertions.assertThat(violations).isNotNull().hasSize(1); - Assertions.assertThat(violations) - .extracting("message") - .containsOnly(PaginationCriteriaImpl.ERROR_PAGE_SIZE_MAX); - } - - @Test - public void should_Control_Max_Result_Window() { - PaginationCriteriaImpl criteria = new PaginationCriteriaImpl(); - - criteria.setPageSize(101L); - criteria.setPage(100L); - - Set<ConstraintViolation<PaginationCriteria>> violations; - violations = validator.validate(((PaginationCriteria) criteria)); - Assertions.assertThat(violations).isNotNull().hasSize(1); - Assertions.assertThat(violations) - .extracting("message") - .containsOnly(PaginationMaxResultValidator.ERROR_MAX_RESULT_WINDOW); - } - - @Test - public void should_Succeed_On_Valid_Pagination() { - PaginationCriteriaImpl criteria = new PaginationCriteriaImpl(); - - criteria.setPageSize(13L); - criteria.setPage(11L); - - Set<ConstraintViolation<PaginationCriteria>> violations; - violations = validator.validate(((PaginationCriteria) criteria)); - Assertions.assertThat(violations).isNotNull().isEmpty(); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/domain/response/ApiResponseTest.java b/backend/src/test/java/fr/inra/urgi/faidare/domain/response/ApiResponseTest.java deleted file mode 100644 index be5a654b340bf44ea57ede0fb5b610bb524d4c4f..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/domain/response/ApiResponseTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package fr.inra.urgi.faidare.domain.response; - -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.api.brapi.v1.exception.BrapiPaginationException; -import fr.inra.urgi.faidare.domain.JSONView; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiListResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiResponse; -import fr.inra.urgi.faidare.domain.brapi.v1.response.BrapiStatus; -import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactoryTest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.Arrays; - -/** - * Create BrAPI response and test their serialization in JSON - * - * @author gcornut - */ -class ApiResponseTest { - - private static ObjectMapper objectMapper; - - @BeforeAll - static void beforeClass() { - objectMapper = new ObjectMapper(); - - // Making sure we always serialize json fields in the same order for test purpose - objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); - - status1 = ApiResponseFactory.createStatus("status1", "code1"); - status2 = ApiResponseFactory.createStatus("status2", "code2"); - - o1 = new DataObject(); - o1.id = 1; - o1.name = "name1"; - o2 = new DataObject(); - o2.id = 2; - o2.name = "name2"; - } - - private static DataObject o1; - private static DataObject o2; - private static BrapiStatus status1; - private static BrapiStatus status2; - - @Test - void should_Create_Null_Result_Response() throws IOException { - BrapiResponse<Void> response = ApiResponseFactory.createSingleObjectResponse(null, null); - - String json = objectMapper.writerWithView(JSONView.BrapiFields.class).writeValueAsString(response); - ESGenericQueryFactoryTest.assertJsonEquals(json, - "{" + - "\"metadata\":{" + - "\"datafiles\":[]," + - "\"pagination\":{\"currentPage\":0,\"pageSize\":0,\"totalCount\":0,\"totalPages\":0}," + - "\"status\":[]" + - "}," + - "\"result\":null" + - "}" - ); - } - - @Test - void should_Create_Single_Object_Response() throws IOException { - BrapiResponse<DataObject> response = ApiResponseFactory.createSingleObjectResponse(o1, null); - - String json = objectMapper.writerWithView(JSONView.BrapiFields.class).writeValueAsString(response); - ESGenericQueryFactoryTest.assertJsonEquals(json, - "{" + - "\"metadata\":{" + - "\"datafiles\":[]," + - "\"pagination\":{\"currentPage\":0,\"pageSize\":0,\"totalCount\":0,\"totalPages\":0}," + - "\"status\":[]" + - "}," + - "\"result\":{" + - "\"id\":" + o1.id + "," + - "\"name\":\"" + o1.name + "\"" + - "}" + - "}" - ); - } - - @Test - void should_Create_Multi_Error_Response() throws IOException { - BrapiResponse<Void> response = ApiResponseFactory.createSingleObjectResponse(null, Arrays.asList(status1, status2)); - - String json = objectMapper.writerWithView(JSONView.BrapiFields.class).writeValueAsString(response); - ESGenericQueryFactoryTest.assertJsonEquals(json, - "{" + - "\"metadata\":{" + - "\"datafiles\":[]," + - "\"pagination\":{\"currentPage\":0,\"pageSize\":0,\"totalCount\":0,\"totalPages\":0}," + - "\"status\":[" + - "{\"code\":\"" + status1.getCode() + "\",\"name\":\"" + status1.getName() + "\"}," + - "{\"code\":\"" + status2.getCode() + "\",\"name\":\"" + status2.getName() + "\"}" + - "]" + - "}," + - "\"result\":null" + - "}" - ); - } - - @Test - void should_Create_Single_Object_And_Multi_Error_Response() throws IOException { - BrapiResponse<DataObject> response = ApiResponseFactory.createSingleObjectResponse(o1, Arrays.asList(status1, status2)); - - String json = objectMapper.writerWithView(JSONView.BrapiFields.class).writeValueAsString(response); - ESGenericQueryFactoryTest.assertJsonEquals(json, - "{" + - "\"metadata\":{" + - "\"datafiles\":[]," + - "\"pagination\":{\"currentPage\":0,\"pageSize\":0,\"totalCount\":0,\"totalPages\":0}," + - "\"status\":[" + - "{\"code\":\"" + status1.getCode() + "\",\"name\":\"" + status1.getName() + "\"}," + - "{\"code\":\"" + status2.getCode() + "\",\"name\":\"" + status2.getName() + "\"}" + - "]" + - "}," + - "\"result\":{" + - "\"id\":" + o1.id + "," + - "\"name\":\"" + o1.name + "\"" + - "}" + - "}" - ); - } - - @Test - void should_Create_Multi_Object_And_Multi_Error_Response() throws IOException { - long totalPages = 1; - long totalCount = 2; - long currentPage = 0; - long pageSize = 2; - - String expectedJson = - "{" + - "\"metadata\":{" + - "\"datafiles\":[]," + - "\"pagination\":{" + - "\"currentPage\":" + currentPage + "," + - "\"pageSize\":" + pageSize + "," + - "\"totalCount\":" + totalCount + "," + - "\"totalPages\":" + totalPages + - "}," + - "\"status\":[" + - "{\"code\":\"" + status1.getCode() + "\",\"name\":\"" + status1.getName() + "\"}," + - "{\"code\":\"" + status2.getCode() + "\",\"name\":\"" + status2.getName() + "\"}" + - "]" + - "}," + - "\"result\":{" + - "\"data\":[" + - "{" + - "\"id\":" + o1.id + "," + - "\"name\":\"" + o1.name + "\"" + - "}," + - "{" + - "\"id\":" + o2.id + "," + - "\"name\":\"" + o2.name + "\"" + - "}" + - "]" + - "}" + - "}"; - - BrapiListResponse<DataObject> response = ApiResponseFactory.createListResponse( - PaginationImpl.create(pageSize, currentPage, totalCount, totalPages), - Arrays.asList(status1, status2), Arrays.asList(o1, o2) - ); - - String actualJson = objectMapper.writerWithView(JSONView.BrapiFields.class).writeValueAsString(response); - ESGenericQueryFactoryTest.assertJsonEquals(actualJson, expectedJson); - } - - @Test - void should_Fail_When_Result_Count_Greater_Than_Page_Size() { - long totalPages = 1; - long totalCount = 2; - long currentPage = 0; - long pageSize = 1; - - Assertions.assertThrows(BrapiPaginationException.class, - () -> ApiResponseFactory.createListResponse( - PaginationImpl.create(pageSize, currentPage, totalCount, totalPages), - Arrays.asList(status1, status2), Arrays.asList(o1, o2) - )); - } - - @Test - void should_Fail_When_Page_Equal_Total_Pages() { - long totalPages = 1; - long totalCount = 2; - long currentPage = totalPages; - long pageSize = 1; - - - Assertions.assertThrows(BrapiPaginationException.class, - () -> { - ApiResponseFactory.createListResponse( - PaginationImpl.create(pageSize, currentPage, totalCount, totalPages), - Arrays.asList(status1, status2), Arrays.asList(o1, o2) - ); - }); - } - - @Test - void should_Fail_When_Page_Greater_Than_Total_Pages() { - long totalPages = 1; - long totalCount = 2; - long currentPage = totalPages + 2; - long pageSize = 1; - - Assertions.assertThrows(BrapiPaginationException.class, - () -> ApiResponseFactory.createListResponse( - PaginationImpl.create(pageSize, currentPage, totalCount, totalPages), - Arrays.asList(status1, status2), Arrays.asList(o1, o2) - )); - } - - /** - * Example data object VO for test purpose - */ - public static class DataObject { - public long id; - public String name; - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactoryTest.java deleted file mode 100644 index 5ff7d1caca4c449001201504d92df3c6f960395b..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESRequestFactoryTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch; - -import com.fasterxml.jackson.databind.util.ArrayIterator; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.repository.http.UserGroupsResourceClient; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -class ESRequestFactoryTest { - - @InjectMocks - ESRequestFactory requestFactory; - - @Mock - FaidareProperties properties; - - @Mock - UserGroupsResourceClient userGroupsResourceClient; - - @Test - void should_Generate_Aliases_Single_Group_No_Source() { - String documentType = "doc1"; - List<Integer> groups = Collections.singletonList(0); - String index0 = "index_group0"; - - when(properties.getAliasName(documentType, 0)).thenReturn(index0); - - when(userGroupsResourceClient.getUserGroups()).thenReturn(groups); - - String[] aliases = requestFactory.getAliases(documentType); - assertThat(aliases).containsExactly(index0); - } - - @Test - void should_Generate_Aliases_Multiple_Groups_Multiple_Sources() { - String documentType = "doc1"; - List<Integer> groups = Arrays.asList(0, 1, 2); - List<String> sources = Arrays.asList("a", "b", "c"); - String[] indices = { - "index_sourcea_group1", - "index_sourcea_group2", - "index_sourcea_group0", - }; - - when(properties.getAliasName(documentType, 1)).thenReturn(indices[0]); - when(properties.getAliasName(documentType, 2)).thenReturn(indices[1]); - when(properties.getAliasName(documentType, 0)).thenReturn(indices[2]); - - when(userGroupsResourceClient.getUserGroups()).thenReturn(groups); - - String[] aliases = requestFactory.getAliases(documentType, sources); - assertThat(aliases).containsOnlyElementsOf(new ArrayIterator<>(indices)); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParserTest.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParserTest.java deleted file mode 100644 index c215c6a81403124c3be7182741532bca017d9325..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/ESResponseParserTest.java +++ /dev/null @@ -1,193 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.elasticsearch.fixture.DocumentObject; -import org.apache.lucene.search.TotalHits; -import org.assertj.core.util.Lists; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.aggregations.Aggregations; -import org.elasticsearch.search.aggregations.bucket.filter.Filter; -import org.elasticsearch.search.aggregations.bucket.terms.Terms; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.beans.IntrospectionException; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@Import({ESResponseParser.class, ObjectMapper.class}) -class ESResponseParserTest { - - @Autowired - ESResponseParser parser; - - @Autowired - ObjectMapper mapper; - - @Test - void should_Parse_Total_Hits() { - Long expectedTotalHits = 11L; - SearchHit[] hitsArray = {}; - float maxScore = 100; - - // Can't mock SearchHits since it is a final class - SearchHits hits = new SearchHits(hitsArray, new TotalHits(expectedTotalHits, TotalHits.Relation.EQUAL_TO), maxScore); - - SearchResponse response = mock(SearchResponse.class); - when(response.getHits()).thenReturn(hits); - - Long actualTotalHits = parser.parseTotalHits(response); - - assertThat(actualTotalHits).isEqualTo(expectedTotalHits); - } - - @Test - void should_Fail_Parse_Total_Hits() { - Long expectedTotalHits = null; - - SearchResponse response = mock(SearchResponse.class); - when(response.getHits()).thenReturn(null); - - Long actualTotalHits = parser.parseTotalHits(response); - - assertThat(actualTotalHits).isEqualTo(expectedTotalHits); - } - - @Test - void should_Parse_Hits() throws IOException, ReflectiveOperationException { - DocumentObject object1 = new DocumentObject(); - object1.id = 1L; - object1.name = "object1"; - DocumentObject object2 = new DocumentObject(); - object2.id = 2L; - object2.name = "object2"; - DocumentObject object3 = new DocumentObject(); - object3.id = 3L; - object3.name = "object3"; - List<DocumentObject.Nested> nestedList = new ArrayList<>(); - DocumentObject.Nested nested1 = new DocumentObject.Nested(); - nested1.id = "N1"; - nestedList.add(nested1); - DocumentObject.Nested nested2 = new DocumentObject.Nested(); - nested2.id = "N2"; - nestedList.add(nested2); - object3.nested = nestedList; - List<DocumentObject> expectedDocumentObjects = Arrays.asList(object1, object2, object3); - - SearchHit hit1 = mockSearchHit(object1); - SearchHit hit2 = mockSearchHit(object2); - SearchHit hit3 = mockSearchHit(object3); - - // Can't mock SearchHits since it is a final class - SearchHits hits = new SearchHits(new SearchHit[]{hit1, hit2, hit3}, new TotalHits(3L, TotalHits.Relation.EQUAL_TO), 100); - - SearchResponse response = mock(SearchResponse.class); - when(response.getHits()).thenReturn(hits); - - List<DocumentObject> actualDocumentObject = parser.parseHits(response, DocumentObject.class); - - assertThat(actualDocumentObject) - .isNotNull().isNotEmpty() - .hasSameElementsAs(expectedDocumentObjects); - } - - private SearchHit mockSearchHit(DocumentObject object) throws IOException { - OutputStream out = new ByteArrayOutputStream(); - mapper.writeValue(out, object); - XContentBuilder content = XContentFactory.jsonBuilder(out); - BytesReference bytes = BytesReference.bytes(content); - - // Can't mock SearchHit since it is a final class - SearchHit hit = new SearchHit(object.id.intValue()); - hit.sourceRef(bytes); - return hit; - } - - @Test - void should_Fail_Parse_Hits() throws IOException, IntrospectionException, ReflectiveOperationException { - // Return null if no hits - SearchResponse response = mock(SearchResponse.class); - when(response.getHits()).thenReturn(null); - - List<DocumentObject> result = parser.parseHits(response, DocumentObject.class); - assertThat(result).isNull(); - - // Return null if no hits in hits - SearchHits hits = new SearchHits(null, new TotalHits(0, TotalHits.Relation.EQUAL_TO), 100); - when(response.getHits()).thenReturn(hits); - - List<DocumentObject> result2 = parser.parseHits(response, DocumentObject.class); - assertThat(result2).isNull(); - } - - @Test - void should_Parse_TermKeysAgg() { - String termAggName = "termAgg"; - String filterAggName = "filterAgg"; - List<String> aggregationPath = Arrays.asList(filterAggName, termAggName); - List<String> expectedKeys = Arrays.asList("key1", "key2", "key3"); - List<Long> expectedCounts = Arrays.asList(300L, 200L, 100L); - SearchResponse response = mockFilterTermAggResponse(filterAggName, termAggName, expectedKeys, expectedCounts); - - List<String> actualKeys = parser.parseTermAggKeys(response, aggregationPath); - - assertThat(actualKeys).isNotNull().isNotEmpty().containsExactlyElementsOf(expectedKeys); - } - - - private SearchResponse mockFilterTermAggResponse( - String filterAggName, String termAggName, List<String> keys, List<Long> counts - ) { - List<Terms.Bucket> buckets = new ArrayList<>(); - Iterator<String> keyIt = keys.iterator(); - Iterator<Long> countIt = counts.iterator(); - while (keyIt.hasNext() && countIt.hasNext()) { - String key = keyIt.next(); - Long docCount = countIt.next(); - - Terms.Bucket bucket = mock(Terms.Bucket.class); - when(bucket.getKey()).thenReturn(key); - when(bucket.getKeyAsString()).thenReturn(key); - when(bucket.getDocCount()).thenReturn(docCount); - buckets.add(bucket); - } - - Terms termAgg = mock(Terms.class); - doReturn(buckets).when(termAgg).getBuckets(); - doReturn(termAggName).when(termAgg).getName(); - - Aggregations aggs2 = new Aggregations(Lists.newArrayList(termAgg)); - - Filter filterAgg = mock(Filter.class); - when(filterAgg.getAggregations()).thenReturn(aggs2); - when(filterAgg.getName()).thenReturn(filterAggName); - - Aggregations aggs1 = new Aggregations(Lists.newArrayList(filterAgg)); - - SearchResponse response = mock(SearchResponse.class); - when(response.getAggregations()).thenReturn(aggs1); - - return response; - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapperTest.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapperTest.java deleted file mode 100644 index 6b12495222ac45fc7a418d53831b2c391ba636fb..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/AnnotatedCriteriaMapperTest.java +++ /dev/null @@ -1,172 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria; - -import com.google.common.collect.ImmutableList; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.fixture.*; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMapping; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingCriterion; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTree; -import fr.inra.urgi.faidare.elasticsearch.criteria.mapping.CriteriaMappingTreeNode; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.index.query.TermQueryBuilder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.InvocationTargetException; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author gcornut - */ -public class AnnotatedCriteriaMapperTest { - - /** - * Error if the mapper encounters a criteria with no field to map - */ - @Test - public void should_Fail_Mapping_Empty_Criteria() { - Assertions.assertThrows( - AnnotatedCriteriaMapper.CriteriaMappingException.class, - () -> AnnotatedCriteriaMapper.getMapping(IncorrectEmptyCriteria.class) - ); - } - - /** - * Error if the mapper encounters a criteria without {@link DocumentPath} or - * {@link NoDocumentMapping} annotations on fields - */ - @Test - public void should_Fail_Mapping_Incorrectly_Annotated_Criteria_Field() { - Assertions.assertThrows( - AnnotatedCriteriaMapper.CriteriaMappingException.class, - () -> AnnotatedCriteriaMapper.getMapping(IncorrectFieldAnnotationCriteria.class) - ); - } - - /** - * Error if the mapper encounters a criteria without - * {@link CriteriaForDocument} - * annotation on class - */ - @Test - public void should_Fail_Mapping_Incorrectly_Annotated_Criteria_Class() { - Assertions.assertThrows( - AnnotatedCriteriaMapper.CriteriaMappingException.class, - () -> AnnotatedCriteriaMapper.getMapping(IncorrectClassAnnotationCriteria.class) - ); - } - - /** - * Error if the mapper encounters a criteria without correct getter/setter on - * criteria fields - */ - @Test - public void should_Fail_Mapping_Incorrect_Bean_Property_Criteria() { - Assertions.assertThrows( - AnnotatedCriteriaMapper.CriteriaMappingException.class, - () -> AnnotatedCriteriaMapper.getMapping(IncorrectBeanPropertyCriteria.class) - ); - } - - /** - * Error if the mapper encounters an incorrect document field path - */ - @Test - public void should_Fail_Mapping_Incorrect_Document_Path_Criteria() { - Assertions.assertThrows( - AnnotatedCriteriaMapper.CriteriaMappingException.class, - () -> AnnotatedCriteriaMapper.getMapping(IncorrectDocumentPathCriteria.class) - ); - } - - @Test - public void should_Map_Complex_Annotated_Criteria() throws InvocationTargetException, IllegalAccessException { - ComplexAnnotatedCriteria complexAnnotatedCriteria = new ComplexAnnotatedCriteria(); - List<String> value1 = ImmutableList.of("value1"); - complexAnnotatedCriteria.setCriteria1(value1); - String value2 = "value2"; - complexAnnotatedCriteria.setCriteria2(value2); - - CriteriaMapping mapping = AnnotatedCriteriaMapper.getMapping(ComplexAnnotatedCriteria.class); - - Map<List<String>, CriteriaMappingTree> mappingTree = mapping.getMappingTree(); - assertThat(mappingTree).isNotNull().isNotEmpty().hasSize(2); - - List<String> fieldPath1 = ImmutableList.of("field1"); - CriteriaMappingCriterion criterion1 = mapping.getMapping(CriteriaMappingCriterion.class, fieldPath1); - assertThat(criterion1).isNotNull(); - assertThat(criterion1.getValue(complexAnnotatedCriteria)).isEqualTo(value1); - assertThat(criterion1.getName()).isEqualTo("criteria1"); - assertThat(criterion1.getDocumentFieldName()).isEqualTo("field1"); - assertThat(criterion1.getDocumentFieldPath()).isEqualTo(fieldPath1); - assertThat(criterion1.getQueryType()).isEqualTo(RangeQueryBuilder.class); - - ImmutableList<String> fieldPath2 = ImmutableList.of("field2"); - CriteriaMappingTreeNode node = mapping.getMapping(CriteriaMappingTreeNode.class, fieldPath2); - assertThat(node).isNotNull(); - assertThat(node.getDocumentFieldName()).isEqualTo("field2"); - assertThat(node.getDocumentFieldPath()).isEqualTo(fieldPath2); - - List<String> fieldPath3 = ImmutableList.of("field2", "field3"); - CriteriaMappingCriterion criterion3 = mapping.getMapping(CriteriaMappingCriterion.class, fieldPath3); - assertThat(criterion3).isNotNull(); - assertThat(criterion3.getValue(complexAnnotatedCriteria)).isEqualTo(value2); - assertThat(criterion3.getName()).isEqualTo("criteria2"); - assertThat(criterion3.getDocumentFieldName()).isEqualTo("field3"); - assertThat(criterion3.getDocumentFieldPath()).isEqualTo(fieldPath3); - assertThat(criterion3.getQueryType()).isEqualTo(TermQueryBuilder.class); - } - - @Test - public void should_Get_Document_Path_From_Criterion() { - CriteriaMapping mapping = AnnotatedCriteriaMapper.getMapping(ComplexAnnotatedCriteria.class); - - String documentPath1 = mapping.getDocumentPath("criteria1", false); - assertThat(documentPath1).isEqualTo("field1"); - - String documentPathWithVirtual = mapping.getDocumentPath("criteria3", false); - assertThat(documentPathWithVirtual).isEqualTo("field2.field4.subField"); - - String documentPathWithoutVirtual = mapping.getDocumentPath("criteria3", true); - assertThat(documentPathWithoutVirtual).isEqualTo("field2.field4"); - } - - @Test - public void should_Use_JsonProperty_Annotation() { - CriteriaMapping mapping = AnnotatedCriteriaMapper.getMapping(ComplexAnnotatedCriteria.class); - - /* - * Should find actual JSON name by direct Field annotation - */ - String documentPath2 = mapping.getDocumentPath("criteria5", false); - assertThat(documentPath2).isEqualTo("field2.schema:name"); - - /* - * Should find actual JSON name by in-direct getter annotation on a parent Interface - */ - String documentPath = mapping.getDocumentPath("criteria4", false); - assertThat(documentPath).isEqualTo("field2.schema:identifier"); - } - - - @Test - public void should_Enable_Criteria_Set_Value() throws InvocationTargetException, IllegalAccessException { - ComplexAnnotatedCriteria complexAnnotatedCriteria = new ComplexAnnotatedCriteria(); - String value2 = "value2"; - complexAnnotatedCriteria.setCriteria2(value2); - - CriteriaMapping mapping = AnnotatedCriteriaMapper.getMapping(ComplexAnnotatedCriteria.class); - - List<String> fieldPath = ImmutableList.of("field2", "field3"); - CriteriaMappingCriterion criterion = mapping.getMapping(CriteriaMappingCriterion.class, fieldPath); - assertThat(criterion).isNotNull(); - assertThat(criterion.getValue(complexAnnotatedCriteria)).isEqualTo(value2); - criterion.setValue(complexAnnotatedCriteria, null); - assertThat(criterion.getValue(complexAnnotatedCriteria)).isNull(); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/ComplexAnnotatedCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/ComplexAnnotatedCriteria.java deleted file mode 100644 index 2f7e18d4eb075904bd07f93bb75c5f42b7d35d8b..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/ComplexAnnotatedCriteria.java +++ /dev/null @@ -1,71 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.QueryType; -import org.elasticsearch.index.query.RangeQueryBuilder; - -import java.util.List; - -/** - * @author gcornut - */ -@CriteriaForDocument(DocumentObject.class) -public class ComplexAnnotatedCriteria { - - @DocumentPath("field1") - @QueryType(RangeQueryBuilder.class) - List<String> criteria1; - - @DocumentPath({"field2", "field3"}) - String criteria2; - - @DocumentPath(value = {"field2", "field4"}, virtualField = "subField") - String criteria3; - - @DocumentPath({"field2", "identifier"}) - String criteria4; - - @DocumentPath({"field2", "name"}) - String criteria5; - - public String getCriteria2() { - return criteria2; - } - - public List<String> getCriteria1() { - return criteria1; - } - - public void setCriteria1(List<String> criteria1) { - this.criteria1 = criteria1; - } - - public void setCriteria2(String criteria2) { - this.criteria2 = criteria2; - } - - public String getCriteria3() { - return criteria3; - } - - public void setCriteria3(String criteria3) { - this.criteria3 = criteria3; - } - - public String getCriteria4() { - return criteria4; - } - - public void setCriteria4(String criteria4) { - this.criteria4 = criteria4; - } - - public String getCriteria5() { - return criteria5; - } - - public void setCriteria5(String criteria5) { - this.criteria5 = criteria5; - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/DocumentObject.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/DocumentObject.java deleted file mode 100644 index 5e92b1373aea747a950b58b55f3aada464d36ff1..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/DocumentObject.java +++ /dev/null @@ -1,95 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; - -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "vo") -public class DocumentObject { - @Id - String field1; - - @Nested - @JsonDeserialize(contentAs = NestedObject.class) - List<NestedObject> field2; - - public String getField1() { - return field1; - } - - public void setField1(String field1) { - this.field1 = field1; - } - - public List<NestedObject> getField2() { - return field2; - } - - public void setField2(List<NestedObject> field2) { - this.field2 = field2; - } - - @Document(type = "nested") - class NestedObject implements HasJSONLDIdentifier { - @Id - String field3; - - String field4; - - String identifier; - - @JsonProperty("schema:name") - String name; - - public String getField3() { - return field3; - } - - public void setField3(String field3) { - this.field3 = field3; - } - - public String getField4() { - return field4; - } - - public void setField4(String field4) { - this.field4 = field4; - } - - @Override - public String getIdentifier() { - return identifier; - } - - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - - /** - * A Data interface providing Jackson JSON annotation - */ - interface HasJSONLDIdentifier { - - @JsonProperty("schema:identifier") - String getIdentifier(); - - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectBeanPropertyCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectBeanPropertyCriteria.java deleted file mode 100644 index 70d888105018e909d9849f2f5c762ab8acf7ff9d..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectBeanPropertyCriteria.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -/** - * @author gcornut - */ -@CriteriaForDocument(DocumentObject.class) -public class IncorrectBeanPropertyCriteria { - - // Missing getter & setter here: - @DocumentPath("field1") - String criteria1; - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectClassAnnotationCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectClassAnnotationCriteria.java deleted file mode 100644 index af53f6b366e4d5a720ff9c7f91cef31580d63639..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectClassAnnotationCriteria.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -/** - * Criteria missing the {@link CriteriaForDocument} annotation - * - * @author gcornut - */ -public class IncorrectClassAnnotationCriteria { - - @DocumentPath({"field2"}) - String criteria1; - - public String getCriteria1() { - return criteria1; - } - - public void setCriteria1(String criteria1) { - this.criteria1 = criteria1; - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectDocumentPathCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectDocumentPathCriteria.java deleted file mode 100644 index dea944e8cf449d631d41270e0db1291621c7e3ab..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectDocumentPathCriteria.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; - -/** - * @author gcornut - */ -@CriteriaForDocument(DocumentObject.class) -public class IncorrectDocumentPathCriteria { - - // This document path does not exist in document - @DocumentPath({"field2", "foo"}) - String criteria1; - - public String getCriteria1() { - return criteria1; - } - - public void setCriteria1(String criteria1) { - this.criteria1 = criteria1; - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectEmptyCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectEmptyCriteria.java deleted file mode 100644 index e8a2a04ea81a5af9b6cfbe1e26843a14a4491718..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectEmptyCriteria.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.NoDocumentMapping; - -/** - * @author gcornut - */ -@CriteriaForDocument(DocumentObject.class) -public class IncorrectEmptyCriteria { - - @NoDocumentMapping - String hiddenCriteria; - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectFieldAnnotationCriteria.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectFieldAnnotationCriteria.java deleted file mode 100644 index 9ea80291acdd667fa8fa985af33bac8a6b983a8e..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/criteria/fixture/IncorrectFieldAnnotationCriteria.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.criteria.fixture; - -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; - -/** - * @author gcornut - */ -@CriteriaForDocument(DocumentObject.class) -public class IncorrectFieldAnnotationCriteria { - - // Missing @DocumentPath annotation here: - String criteria1; - - public String getCriteria1() { - return criteria1; - } - - public void setCriteria1(String criteria1) { - this.criteria1 = criteria1; - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtilTest.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtilTest.java deleted file mode 100644 index a712bfe44b6b5683c5c1f87a290e48d790136920..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/DocumentAnnotationUtilTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document; - -import com.google.common.collect.ImmutableList; -import fr.inra.urgi.faidare.elasticsearch.document.fixture.ComplexDocument; -import fr.inra.urgi.faidare.elasticsearch.document.fixture.IncorrectMissingAnnotationDocument; -import fr.inra.urgi.faidare.elasticsearch.document.fixture.IncorrectNestedAnnotationDocument; -import fr.inra.urgi.faidare.elasticsearch.document.fixture.SimpleDocument; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author gcornut - */ -class DocumentAnnotationUtilTest { - - @Test - void should_Fail_Missing_Doc_Annotation() { - Assertions.assertThrows( - DocumentAnnotationUtil.ValueObjectMetadataException.class, - () -> DocumentAnnotationUtil.getDocumentObjectMetadata(IncorrectMissingAnnotationDocument.class) - ); - } - - @Test - void should_Fail_Missing_Collection_Content_Annotation() { - Assertions.assertThrows( - DocumentAnnotationUtil.ValueObjectMetadataException.class, - () -> DocumentAnnotationUtil.getDocumentObjectMetadata(IncorrectNestedAnnotationDocument.class) - ); - } - - @Test() - void should_Generate_Simple_Metadata() { - DocumentMetadata<SimpleDocument> metadata = DocumentAnnotationUtil - .getDocumentObjectMetadata(SimpleDocument.class); - assertThat(metadata).isNotNull(); - assertThat(metadata.getDocumentType()).isEqualTo("dataObject3"); - assertThat(metadata.getIdField()).isEqualTo("id"); - assertThat(metadata.getDocumentClass()).isEqualTo(SimpleDocument.class); - - assertThat(metadata.getExcludedFields()).isEmpty(); - assertThat(metadata.getFieldsByName()).hasSize(1); - } - - @Test() - void should_Generate_Complex_Metadata() { - DocumentMetadata<ComplexDocument> metadata = DocumentAnnotationUtil - .getDocumentObjectMetadata(ComplexDocument.class); - assertThat(metadata).isNotNull(); - assertThat(metadata.getDocumentType()).isEqualTo("dataObject4"); - assertThat(metadata.getIncludedFields()).containsExactly("id", "nested0"); - assertThat(metadata.getExcludedFields()).containsExactly("a", "b"); - - assertThat(metadata.getIdField()).isEqualTo("@id"); - assertThat(metadata.getDocumentClass()).isEqualTo(ComplexDocument.class); - - assertThat(metadata.getFieldsByName()).hasSize(5); - - DocumentMetadata.Field nested1 = metadata.getFieldsByName().get("nested1"); - assertThat(nested1.getDescriptor()).isNotNull(); - assertThat(nested1.getPath()).isEqualTo(ImmutableList.of("nested1")); - assertThat(nested1.isNestedObject()).isTrue(); - assertThat(nested1.getFieldClass()).isEqualTo(ComplexDocument.NestedObject1.class); - - DocumentMetadata.Field id = metadata.getFieldsByName().get("id"); - assertThat(id.getDescriptor()).isNull(); - assertThat(id.getPath()).isEqualTo(ImmutableList.of("id")); - assertThat(id.isNestedObject()).isFalse(); - assertThat(id.getFieldClass()).isEqualTo(String.class); - - DocumentMetadata.Field nested2 = metadata.getFieldsByName().get("nested2"); - assertThat(nested2.getDescriptor()).isNotNull(); - assertThat(nested2.getPath()).isEqualTo(ImmutableList.of("nested2")); - assertThat(nested2.isNestedObject()).isTrue(); - assertThat(nested2.getFieldClass()).isEqualTo(ComplexDocument.NestedObject2.class); - } - - @Test - void should_Get_Field_By_Path() { - DocumentMetadata<ComplexDocument> metadata = DocumentAnnotationUtil - .getDocumentObjectMetadata(ComplexDocument.class); - - DocumentMetadata.Field field; - field = metadata.getByPath(ImmutableList.of("nested2", "foo")); - assertThat(field).isNotNull(); - - field = metadata.getByPath(ImmutableList.of("nested3", "foo")); - assertThat(field).isNotNull(); - - field = metadata.getByPath(ImmutableList.of("nested0", "id")); - assertThat(field).isNotNull(); - } - - @Test - void should_Get_Field_By_JSON_Path_Or_Java_Path() { - DocumentMetadata<ComplexDocument> metadata = DocumentAnnotationUtil - .getDocumentObjectMetadata(ComplexDocument.class); - - DocumentMetadata.Field field; - - // Get by java path - field = metadata.getByPath(ImmutableList.of("nested2", "name")); - assertThat(field).isNotNull(); - // Get by json path (set with direct Jackson JSON annotation on field) - field = metadata.getByPath(ImmutableList.of("nested2", "schema:name")); - assertThat(field).isNotNull(); - - // Get by java path - field = metadata.getByPath(ImmutableList.of("nested2", "identifier")); - assertThat(field).isNotNull(); - // Get by json path (set with indirect Jackson JSON annotation on getter method of parent interface) - field = metadata.getByPath(ImmutableList.of("nested2", "schema:identifier")); - assertThat(field).isNotNull(); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/ComplexDocument.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/ComplexDocument.java deleted file mode 100644 index e799a70ab4fd8f21413735811c2bd058311f61f0..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/ComplexDocument.java +++ /dev/null @@ -1,70 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.fixture; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; - -import java.util.List; - -/** - * @author gcornut - */ -@Document(type = "dataObject4", includedFields = { "id", "nested0"}, excludedFields = {"a", "b"}) -public class ComplexDocument { - @Id(jsonName = "@id") - String id; - - NestedObject1 nested0; - - @Nested - NestedObject1 nested1; - - @Nested - @JsonDeserialize(contentAs = NestedObject2.class) - List<NestedObject2> nested2; - - @JsonDeserialize(contentAs = NestedObject2.class) - List<NestedObject2> nested3; - - public NestedObject1 getNested1() { - return nested1; - } - - public List<NestedObject2> getNested2() { - return nested2; - } - - public class NestedObject1 { - String id; - } - - public class NestedObject2 implements HasJSONLDIdentifier { - String foo; - - @JsonProperty("schema:name") - String name; - - String identifier; - - @Override - public String getIdentifier() { - return identifier; - } - - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - } - - /** - * A Data interface providing Jackson JSON annotation - */ - interface HasJSONLDIdentifier { - - @JsonProperty("schema:identifier") - String getIdentifier(); - - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectMissingAnnotationDocument.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectMissingAnnotationDocument.java deleted file mode 100644 index 0397f46e7e313d7ae8817320171c4ce32dd145a8..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectMissingAnnotationDocument.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.fixture; - -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; - -/** - * Document class missing the {@link Document} annotation - * - * @author gcornut - */ -public class IncorrectMissingAnnotationDocument { -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectNestedAnnotationDocument.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectNestedAnnotationDocument.java deleted file mode 100644 index 9bac3333635196b9cc4597e53ff4fb1879e45678..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/IncorrectNestedAnnotationDocument.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.fixture; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Nested; - -import java.util.List; - -/** - * Incorrectly annotated document object missing annotation on the type of - * object in the nestedObjects field. - * <p> - * This should be remedied using the {@link JsonDeserialize} annotation with the - * "contentAs" attribute. - * - * @author gcornut - */ -@Document(type = "dataObject1") -public class IncorrectNestedAnnotationDocument { - @Nested - List<Object> nestedObjects; -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/SimpleDocument.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/SimpleDocument.java deleted file mode 100644 index febc945e54eedda7c6681ece22a0037871109866..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/document/fixture/SimpleDocument.java +++ /dev/null @@ -1,13 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.document.fixture; - -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -/** - * @author gcornut - */ -@Document(type = "dataObject3") -public class SimpleDocument { - @Id - String id; -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/fixture/DocumentObject.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/fixture/DocumentObject.java deleted file mode 100644 index ca9df8961432c1257cc350a7043ee9dba6f3b527..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/fixture/DocumentObject.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.fixture; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Id; - -import java.util.List; - -/** - * Data object class for test purpose only - */ -@Document(type = "dataObject") -public class DocumentObject { - @Id - public Long id; - public String name; - - @JsonDeserialize(contentAs = Nested.class) - public List<Nested> nested; - - @Override - public boolean equals(Object obj) { - DocumentObject obj1 = (DocumentObject) obj; - return obj1.id.equals(id) && obj1.name.equals(name); - } - - public static class Nested { - public String id; - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactoryTest.java deleted file mode 100644 index 8b6bcd21b1d74da82304944fef7d651df725224a..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/elasticsearch/query/impl/ESGenericQueryFactoryTest.java +++ /dev/null @@ -1,361 +0,0 @@ -package fr.inra.urgi.faidare.elasticsearch.query.impl; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Sets; -import com.google.common.io.CharStreams; -import fr.inra.urgi.faidare.domain.criteria.*; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteria; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteriaImpl; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.CriteriaForDocument; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.DocumentPath; -import fr.inra.urgi.faidare.elasticsearch.criteria.annotation.QueryType; -import fr.inra.urgi.faidare.elasticsearch.criteria.fixture.ComplexAnnotatedCriteria; -import fr.inra.urgi.faidare.elasticsearch.document.annotation.Document; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.index.query.ScriptQueryBuilder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.util.Lists.newArrayList; - -/** - * @author gcornut - */ -public class ESGenericQueryFactoryTest { - - @Document(type = "valueobject") - private class ValueObject { - String field1; - } - - @CriteriaForDocument(ValueObject.class) - public class UnimplementedQueryTypeCriteria { - @DocumentPath("field1") - @QueryType(ScriptQueryBuilder.class) - String criteria1; - } - - @Test - void should_Fail_Generating_Not_Implemented_Query_Type() { - ESGenericQueryFactory<UnimplementedQueryTypeCriteria> queryFactory = new ESGenericQueryFactory<>(); - UnimplementedQueryTypeCriteria criteria = new UnimplementedQueryTypeCriteria(); - Assertions.assertThrows( - ESGenericQueryFactory.ESQueryGenerationException.class, - () -> queryFactory.createQuery(criteria) - ); - } - - @CriteriaForDocument(ValueObject.class) - public class RangeCriteria { - @DocumentPath("field1") - @QueryType(RangeQueryBuilder.class) - List<String> rangeCriteria; - - public List<String> getRangeCriteria() { - return rangeCriteria; - } - - public void setRangeCriteria(List<String> rangeCriteria) { - this.rangeCriteria = rangeCriteria; - } - } - - @Test - void should_Fail_Generating_Invalid_Range() { - ESGenericQueryFactory<RangeCriteria> queryFactory = new ESGenericQueryFactory<>(); - RangeCriteria criteria = new RangeCriteria(); - criteria.setRangeCriteria(newArrayList("a", "b", "c")); - Assertions.assertThrows( - ESGenericQueryFactory.ESQueryGenerationException.class, - () -> queryFactory.createQuery(criteria) - ); - } - - /** - * Simple term query without bool query - */ - @Test - void should_Generate_Term_Query() { - ProgramCriteria criteria = new ProgramCriteria(); - String id = "A"; - criteria.setProgramDbId(id); - - ESGenericQueryFactory<ProgramCriteria> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = "{\n" + - " \"term\" : {\n" + - " \"programDbId\" : {\n" + - " \"value\" : \"" + id + "\",\n" + - " \"boost\" : 1.0\n" + - " }\n" + - " }\n" + - "}"; - String actualQuery = query.toString(); - assertThat(actualQuery).isEqualToIgnoringWhitespace(expectedQuery); - } - - /** - * Match query - */ - @Test - void should_Generate_Match_Query() throws IOException { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - String accessionSearchText = "charg"; - criteria.setAccessions(newArrayList(accessionSearchText)); - - ESGenericQueryFactory<DataDiscoveryCriteriaImpl> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = "{\n" + - " \"match_phrase\" : {\n" + - " \"germplasm.accession.suggest\" : {\n" + - " \"query\" : \"" + accessionSearchText + "\",\n" + - " \"slop\" : 0,\n" + - " \"zero_terms_query\" : \"NONE\",\n" + - " \"boost\" : 1.0\n" + - " }\n" + - " }\n" + - "}"; - - String actualQuery = query.toString(); - assertJsonEquals(actualQuery, expectedQuery); - } - - /** - * Bool query made of terms queries - */ - @Test - void should_Generate_Location_Query() throws IOException { - LocationCriteria criteria = new LocationCriteria(); - criteria.setLocationTypes(Sets.newHashSet("C", "D")); - - ESGenericQueryFactory<LocationCriteria> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = "{\n" + - " \"terms\" : {\n" + - " \"locationType\" : [\n" + - " \"D\",\n" + - " \"C\"\n" + - " ],\n" + - " \"boost\" : 1.0\n" + - " }\n" + - "}"; - - String actualQuery = query.toString(); - assertJsonEquals(actualQuery, expectedQuery); - } - - /** - * Bool query made of term queries - */ - @Test - void should_Generate_Program_Query() throws IOException { - ProgramCriteria criteria = new ProgramCriteria(); - criteria.setProgramDbId("A"); - criteria.setName("B"); - - ESGenericQueryFactory<ProgramCriteria> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = readResource("expected/query1.json"); - String actualQuery = query.toString(); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Simple_Bool_Terms_Query() throws Exception { - StudySearchCriteria criteria = new StudySearchCriteria(); - criteria.setProgramNames(Sets.newHashSet("A", "B")); - criteria.setStudyLocations(Sets.newHashSet("C", "D")); - - ESGenericQueryFactory<StudySearchCriteria> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = readResource("expected/query5.json"); - String actualQuery = query.toString(); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Complex_Query_With_Nested_Bool_Must_Terms_And_Range_Query() throws Exception { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - criteria.setObservationLevel("level1"); - criteria.setObservationVariableDbIds(Sets.newHashSet("VAR1", "VAR2")); - criteria.setSeasonDbIds(Sets.newHashSet("SEASON1", "SEASON2")); - criteria.setObservationTimeStampRange(newArrayList("TIMESTAMP1", "TIMESTAMP2")); - - ESGenericQueryFactory<ObservationUnitCriteria> queryFactory = new ESGenericQueryFactory<>(); - QueryBuilder query = queryFactory.createQuery(criteria); - - String expectedQuery = readResource("expected/query4.json"); - String actualQuery = query.toString(); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Data_Discovery_Criteria() throws IOException { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - - criteria.setAccessions(newArrayList("A1", "A2")); - criteria.setCrops(newArrayList("C1")); - criteria.setGermplasmLists(newArrayList("G1", "G2", "G3")); - criteria.setObservationVariableIds(newArrayList("V1")); - criteria.setSources(newArrayList("S1")); - criteria.setTypes(newArrayList("T1", "T2")); - - ESGenericQueryFactory<DataDiscoveryCriteria> queryFactory = - new ESGenericQueryFactory<>(); - - - QueryBuilder query = queryFactory.createQuery(criteria); - String actualQuery = query.toString(); - - String expectedQuery = readResource("expected/query2.json"); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Criteria() throws IOException { - ComplexAnnotatedCriteria criteria = new ComplexAnnotatedCriteria(); - - criteria.setCriteria1(Arrays.asList("1", "2")); - criteria.setCriteria2("3"); - criteria.setCriteria3("4"); - criteria.setCriteria4("5"); - criteria.setCriteria5("6"); - - ESGenericQueryFactory<ComplexAnnotatedCriteria> queryFactory = - new ESGenericQueryFactory<>(); - - QueryBuilder query = queryFactory.createQuery(criteria); - String actualQuery = query.toString(); - - String expectedQuery = readResource("expected/query7.json"); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Criteria_With_Exclusion() throws IOException { - ComplexAnnotatedCriteria criteria = new ComplexAnnotatedCriteria(); - - criteria.setCriteria1(Arrays.asList("1", "2")); - criteria.setCriteria2("3"); - criteria.setCriteria3("4"); - criteria.setCriteria4("5"); - criteria.setCriteria5("6"); - - ESGenericQueryFactory<ComplexAnnotatedCriteria> queryFactory = - new ESGenericQueryFactory<>(); - - QueryBuilder query = queryFactory.createQueryExcludingFields( - criteria, "field2.schema:name", "field1" - ); - String actualQuery = query.toString(); - - String expectedQuery = readResource("expected/query3.json"); - assertJsonEquals(actualQuery, expectedQuery); - } - - @Test - void should_Generate_Criteria_With_Inclusion() throws IOException { - ComplexAnnotatedCriteria criteria = new ComplexAnnotatedCriteria(); - - criteria.setCriteria1(Arrays.asList("1", "2")); - criteria.setCriteria2("3"); - criteria.setCriteria3("4"); - criteria.setCriteria4("5"); - criteria.setCriteria5("6"); - - ESGenericQueryFactory<ComplexAnnotatedCriteria> queryFactory = - new ESGenericQueryFactory<>(); - - QueryBuilder query = queryFactory.createQueryIncludingFields( - criteria, "field2.schema:name", "field1" - ); - String actualQuery = query.toString(); - - String expectedQuery = readResource("expected/query6.json"); - assertJsonEquals(actualQuery, expectedQuery); - } - - - @Test - void should_Generate_Filter_Bool_Terms_Query() throws Exception { - FaidareGermplasmPOSTShearchCriteria criteria = new FaidareGermplasmPOSTShearchCriteria(); - - criteria.setSpecies(newArrayList("Triticum", "Populus")); - criteria.setGenus(newArrayList("Triticum", "Populus")); - criteria.setGenusSpecies(newArrayList("Triticum", "Populus")); - - criteria.setBiologicalStatus(newArrayList("Wild")); - - ESGenericQueryFactory<FaidareGermplasmPOSTShearchCriteria> queryFactory = - new ESGenericQueryFactory<>(); - - QueryBuilder query = queryFactory.createShouldFilterQuery(criteria); - - String actualQuery = query.toString(); - - String expectedQuery = readResource("expected/query8.json"); - assertJsonEquals(actualQuery, expectedQuery); - } - - public static void assertJsonEquals(String json1, String json2) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - - JsonNode jsonNode1 = mapper.readTree(json1); - JsonNode jsonNode2 = mapper.readTree(json2); - - assertJsonEquals(jsonNode1, jsonNode2); - } - - private static void assertJsonEquals(JsonNode node1, JsonNode node2) { - assertThat(node1.getNodeType()).isEqualTo(node2.getNodeType()); - - if (node1.isObject()) { - Set<String> fields1 = Sets.newHashSet(node1.fieldNames()); - Set<String> fields2 = Sets.newHashSet(node2.fieldNames()); - - assertThat(fields1) - .as("Actual json object node should have expected fields") - .isEqualTo(fields2); - - for (String field : fields1) { - assertJsonEquals(node1.get(field), node2.get(field)); - } - - } else if (node1.isArray()) { - Set<JsonNode> elements1 = Sets.newHashSet(node1.elements()); - Set<JsonNode> elements2 = Sets.newHashSet(node1.elements()); - - assertThat(elements1) - .as("Actual json array node should contain exactly the expected elements") - .isEqualTo(elements2); - } else { - assertThat(node1).isEqualTo(node2); - } - } - - /** - * Read package resource in a String - */ - @SuppressWarnings("UnstableApiUsage") - private String readResource(String path) { - try { - return CharStreams.toString(new InputStreamReader(getClass().getResourceAsStream(path))); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryTest.java deleted file mode 100644 index 8d9d75556db6028cfddb4e72e3e6fdc9cb1f4155..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/DataDiscoveryRepositoryTest.java +++ /dev/null @@ -1,214 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.datadiscovery.criteria.DataDiscoveryCriteriaImpl; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataDiscoveryDocument; -import fr.inra.urgi.faidare.domain.datadiscovery.data.Facet; -import fr.inra.urgi.faidare.domain.datadiscovery.data.FacetTerm; -import fr.inra.urgi.faidare.domain.datadiscovery.response.DataDiscoveryResponse; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.elasticsearch.search.sort.SortOrder; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author gcornut - */ -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class DataDiscoveryRepositoryTest { - - @Autowired - DataDiscoveryRepositoryImpl repository; - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(DataDiscoveryDocument.class, 0L); - } - - @Test - void should_Suggest() { - String field = "crops"; - Collection<String> result = repository.suggest(field, null, null, null); - assertThat(result).isNotNull(); - assertThat(result).contains("Triticum"); - } - - @Test - void should_Suggest_Fetch_Size() { - String field = "crops"; - Integer fetchSize = 5; - Collection<String> result = repository.suggest(field, null, fetchSize, null); - assertThat(result).isNotNull().hasSize(fetchSize); - } - - @Test - void should_Suggest_Text() { - String field = "crops"; - Collection<String> result = repository.suggest(field, "ble", null, null); - assertThat(result).isNotNull(); - assertThat(result.iterator().next()).contains("Blé"); - } - - @Test - void should_Suggest_Criteria() { - String field = "accessions"; - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - criteria.setCrops(Arrays.asList("Triticum", "Zea", "Rice")); - Collection<String> result = repository.suggest(field, null, null, criteria); - assertThat(result).isNotNull(); - assertThat(result).doesNotContain("V1", "V2"); - assertThat(result).contains("B1", "B2"); - } - - @Test - void should_Suggest_Ignoring_Criteria_If_Same_Field_As_Suggested() { - String field = "crops"; - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - criteria.setCrops(Arrays.asList("Zea")); - Collection<String> result = repository.suggest(field, "Triticum", null, criteria); - assertThat(result).isNotNull(); - assertThat(result).contains("Triticum"); - } - - @Test - void should_Find_Without_Facets() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().isNotEmpty(); - assertThat(result.getFacets()).isNull(); - } - - @Test - void should_Find_By_Accession() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - criteria.setAccessions(Arrays.asList("kolben")); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().isNotEmpty() - .extracting("name").contains("AUSTRO KOLBEN"); - } - - @Test - void should_Find_By_Type() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - List<String> types = Arrays.asList("Germplasm"); - criteria.setTypes(types); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().hasSize(2) - .flatExtracting("type").isSubsetOf(types); - } - - @Test - void should_Find_By_Source() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - List<String> sources = Arrays.asList("http://example.com/catalog1"); - criteria.setSources(sources); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().hasSize(2) - .extracting("sourceUri").isSubsetOf(sources); - } - - @Test - void should_Find_Documents_With_URL() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - criteria.setCrops(Arrays.asList("Rice")); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().isNotEmpty().extracting("url").isNotNull().isNotEmpty(); - } - - @Test - void should_Find_Documents_By_Page() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - criteria.setPage(0L); - criteria.setPageSize(2L); - criteria.setSortBy("@id"); - criteria.setSortOrder(SortOrder.DESC.toString()); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData().size()).isEqualTo(2); - assertThat(result.getResult().getData().get(0).getUri()).isEqualTo("urn:germplasm/austro_kolben"); - assertThat(result.getResult().getData().get(1).getUri()).isEqualTo("urn:foo_study"); - - assertThat(result.getMetadata().getPagination().getCurrentPage()).isEqualTo(0L); - assertThat(result.getMetadata().getPagination().getTotalPages()).isEqualTo(5L); - assertThat(result.getMetadata().getPagination().getPageSize()).isEqualTo(2L); - assertThat(result.getMetadata().getPagination().getTotalCount()).isEqualTo(10L); - - criteria.setPage(1L); - criteria.setPageSize(3L); - result = repository.find(criteria); - assertThat(result.getResult().getData().size()).isEqualTo(3); - assertThat(result.getResult().getData().get(0).getUri()).isEqualTo("urn:foo2_germplasm"); - - assertThat(result.getMetadata().getPagination().getCurrentPage()).isEqualTo(1L); - assertThat(result.getMetadata().getPagination().getTotalPages()).isEqualTo(4L); - assertThat(result.getMetadata().getPagination().getPageSize()).isEqualTo(3L); - assertThat(result.getMetadata().getPagination().getTotalCount()).isEqualTo(10L); - } - - @Test - void should_Find_With_Facets() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - String criterionName = "sources"; - criteria.setFacetFields(Arrays.asList(criterionName)); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().isNotEmpty(); - assertThat(result.getFacets()).isNotNull().hasSize(1); - - Facet facet = result.getFacets().get(0); - assertThat(facet.getField()).isEqualTo(criterionName); - - List<? extends FacetTerm> terms = facet.getTerms(); - assertThat(terms).isNotNull().hasSize(2); - - FacetTerm facetTerm = terms.get(0); - assertThat(facetTerm.getTerm()).isEqualTo("http://example.com/catalog1"); - assertThat(facetTerm.getCount()).isEqualTo(2); - - FacetTerm facetTerm1 = terms.get(1); - assertThat(facetTerm1.getTerm()).isEqualTo("http://example.com/catalog2"); - assertThat(facetTerm1.getCount()).isEqualTo(1); - } - - @Test - void should_Find_With_Filtered_Facets() { - DataDiscoveryCriteriaImpl criteria = new DataDiscoveryCriteriaImpl(); - String criterionName = "sources"; - criteria.setFacetFields(Arrays.asList(criterionName)); - criteria.setCrops(Arrays.asList( - "Triticum" - )); - DataDiscoveryResponse result = repository.find(criteria); - assertThat(result.getResult().getData()).isNotNull().isNotEmpty(); - assertThat(result.getFacets()).isNotNull().hasSize(1); - - Facet facet = result.getFacets().get(0); - assertThat(facet.getField()).isEqualTo(criterionName); - - List<? extends FacetTerm> terms = facet.getTerms(); - assertThat(terms).isNotNull(); - assertThat(terms).isNotNull().hasSize(1); - - FacetTerm facetTerm = terms.get(0); - assertThat(facetTerm.getTerm()).isEqualTo("http://example.com/catalog2"); - assertThat(facetTerm.getCount()).isEqualTo(1); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryTest.java deleted file mode 100644 index af19b3c50396a576221d006bffe3e10b21770e1c..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmAttributeRepositoryTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiGermplasmAttributeValue; -import fr.inra.urgi.faidare.domain.criteria.GermplasmAttributeCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class GermplasmAttributeRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(GermplasmAttributeValueListVO.class, 0L); - } - - @Autowired - GermplasmAttributeRepository repository; - - @Test - void should_Find_Paginated() { - int pageSize = 3; - int page = 1; - GermplasmAttributeCriteria criteria = new GermplasmAttributeCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<GermplasmAttributeValueListVO> result = repository.find(criteria); - assertThat(result).isNotNull().isNotEmpty().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_Empty_By_Germplasm() { - String expectedGermplasm = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTUxNDk2NzQzRTEy"; - GermplasmAttributeCriteria criteria = new GermplasmAttributeCriteria(); - criteria.setGermplasmDbId(expectedGermplasm); - - PaginatedList<GermplasmAttributeValueListVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty().hasSize(1); - - GermplasmAttributeValueListVO attribute = result.get(0); - assertThat(attribute.getGermplasmDbId()).isEqualTo(expectedGermplasm); - assertThat(attribute.getData()).isNotNull().isEmpty(); - } - - @Test - void should_Find_All_Attributes_By_Germplasm() { - String expectedGermplasm = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTU1NDM3OTc1OEUxMg=="; - GermplasmAttributeCriteria criteria = new GermplasmAttributeCriteria(); - criteria.setGermplasmDbId(expectedGermplasm); - - PaginatedList<GermplasmAttributeValueListVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty().hasSize(1); - - GermplasmAttributeValueListVO attribute = result.get(0); - assertThat(attribute.getGermplasmDbId()).isEqualTo(expectedGermplasm); - assertThat(attribute.getData()).isNotNull().hasSize(3); - } - - @Test - void should_Find_By_Germplasm_And_Attribute() { - String expectedGermplasm = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTU1NDM3OTc1OEUxMg=="; - List<String> expectedAttributes = Arrays.asList("39228", "39229"); - GermplasmAttributeCriteria criteria = new GermplasmAttributeCriteria(); - criteria.setGermplasmDbId(expectedGermplasm); - criteria.setAttributeList(expectedAttributes); - - PaginatedList<GermplasmAttributeValueListVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty().hasSize(1); - - List<BrapiGermplasmAttributeValue> data = result.get(0).getData(); - assertThat(data).isNotNull().isNotEmpty().hasSize(2); - assertThat(data) - .extracting("attributeDbId") - .isSubsetOf(expectedAttributes); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryTest.java deleted file mode 100644 index 4ba1d45b622eea6310e5e7bb99bc234201ace801..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/GermplasmRepositoryTest.java +++ /dev/null @@ -1,449 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.ProgenyVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.response.Pagination; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.assertj.core.data.Index; -import org.assertj.core.util.Lists; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class GermplasmRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(GermplasmVO.class, 0L); - esSetUp.initialize(ProgenyVO.class, 0L); - esSetUp.initialize(PedigreeVO.class, 0L); - esSetUp.initialize(GermplasmMcpdVO.class, 0L); - } - - @Autowired - GermplasmRepository repository; - - @Test - void should_Get_By_Id() { - String germplasmDbId = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4NDcyNjA1MkUxMg=="; - GermplasmVO germplasm = repository.getById(germplasmDbId); - assertThat(germplasm).isNotNull(); - assertThat(germplasm.getGermplasmDbId()).isEqualTo(germplasmDbId); - } - - @Test - void should_Find_By_PUI() { - String germplasmPUI = "doi:10.15454/1.4921786381783696E12"; - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setGermplasmPUIs(Collections.singletonList(germplasmPUI)); - - PaginatedList<GermplasmVO> germplasm = repository.find(criteria); - assertThat(germplasm).isNotNull().hasSize(1); - assertThat(germplasm.get(0).getGermplasmPUI()).isEqualTo(germplasmPUI); - } - - - @Test - void should_Get_Mcpd_By_Id() { - String germplasmDbId = "13705"; - GermplasmMcpdVO germplasm = repository.getAsMcpdById(germplasmDbId); - assertThat(germplasm).isNotNull(); - assertThat(germplasm.getGermplasmDbId()).isEqualTo(germplasmDbId); - } - - - @Test - void should_Not_Get_Mcpd_With_Wrong_Id() { - String germplasmDbId = "489485184"; - GermplasmMcpdVO germplasm = repository.getAsMcpdById(germplasmDbId); - assertThat(germplasm).isNull(); - } - - @Test - void should_Get_Mcpd_By_Id_checkAll() { - String germplasmDbId = "13705"; - GermplasmMcpdVO germplasm = repository.getAsMcpdById(germplasmDbId); - assertThat(germplasm).isNotNull(); - assertThat(germplasm.getGermplasmDbId()).isEqualTo(germplasmDbId); - assertThat(germplasm.getCollectingInfo()).isNotNull(); - assertThat(germplasm.getCollectingInfo().getCollectingSite()).isNotNull(); - assertThat(germplasm.getCollectingInfo().getCollectingSite().getLocationDbId()).isNotNull(); - assertThat(germplasm.getCollectingInfo().getCollectingSite().getLocationDbId()).isEqualTo("dXJuOlVSR0kvbG9jYXRpb24vNDA2MzU="); - assertThat(germplasm.getCollectingInfo().getCollectingSite().getLocationDbId()).isNotEqualTo("dXJuOlVSR0kvbG9"); - } - - @Test - void should_Not_Get_By_Incorrect_Id() { - String germplasmDbId = "FOOO"; - GermplasmVO germplasm = repository.getById(germplasmDbId); - assertThat(germplasm).isNull(); - } - - @Test - void should_Scroll_All() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - Iterator<GermplasmVO> list = repository.scrollAll(criteria); - assertThat(list).isNotNull().toIterable().hasSize(14); - } - - @Test - void should_Scroll_Nothing() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setAccessionNumbers(Collections.singletonList("FOOOO")); - Iterator<GermplasmVO> list = repository.scrollAll(criteria); - assertThat(list).isNotNull().toIterable().hasSize(0); - } - - @Test - void shouldScrollAllForSitemap() { - Iterator<GermplasmSitemapVO> list = repository.scrollAllForSitemap(100); - assertThat(list).toIterable() - .isNotEmpty() - .allMatch(vo -> !vo.getGermplasmDbId().isEmpty()); - } - - @Test - void shouldScrollGermplasmMcpdsByIds() { - Iterator<GermplasmMcpdVO> list = repository.scrollGermplasmMcpdsByIds(Collections.singleton("13705"), 1000); - assertThat(list).toIterable() - .hasSize(1) - .allMatch(vo -> !vo.getGermplasmDbId().isEmpty()); - - list = repository.scrollGermplasmMcpdsByIds(Collections.singleton("1370"), 1000); - assertThat(list).toIterable() - .isEmpty(); - - list = repository.scrollGermplasmMcpdsByIds(Collections.singleton("Prunus"), 1000); - assertThat(list).toIterable() - .isEmpty(); - } - - @Test - void shouldScrollGermplasmsByIds() { - Iterator<GermplasmVO> list = repository.scrollGermplasmsByIds( - new HashSet<>( - Arrays.asList( - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4NDcyNjA1MkUxMg==") - ), 1000); - assertThat(list).toIterable() - .hasSize(2) - .allMatch(vo -> !vo.getGermplasmDbId().isEmpty()); - - list = repository.scrollGermplasmsByIds(Collections.singleton("ZG9pOjEwL"), 1000); - assertThat(list).toIterable() - .isEmpty(); - - list = repository.scrollGermplasmsByIds(Collections.singleton("ZG9pOjEwL"), 1000); - assertThat(list).toIterable() - .isEmpty(); - } - - @Test - void should_Scroll_By_accessionNumber() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String accessionNumber = "1801Mtp3"; - - criteria.setAccessionNumbers(Collections.singletonList(accessionNumber)); - - Iterator<GermplasmVO> list = repository.scrollAll(criteria); - assertThat(list).isNotNull() - .toIterable() - .hasSize(1) - .extracting("accessionNumber").containsOnly(accessionNumber); - } - - @Test - void should_Scroll_Germplasm_By_accessionNumber_Numeric() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String accessionNumber = "2360"; - criteria.setAccessionNumbers(Collections.singletonList(accessionNumber)); - Iterator<GermplasmVO> list = repository.scrollAll(criteria); - assertThat(list).isNotNull() - .toIterable() - .hasSize(1) - .extracting("accessionNumber").containsOnly(accessionNumber); - } - - @Test - void should_Scroll_Germplasm_By_variety_species() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String species = "vinifera"; - criteria.setGermplasmSpecies(Lists.newArrayList(species)); - Iterator<GermplasmVO> result = repository.scrollAll(criteria); - assertThat(result).isNotNull() - .toIterable() - .isNotEmpty() - .extracting("species").containsOnly(species); - } - - @Test - void should_Scroll_Germplasm_By_genus() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String genus = "Solanum"; - criteria.setGermplasmGenus(Lists.newArrayList(genus)); - Iterator<GermplasmVO> g = repository.scrollAll(criteria); - assertThat(g).isNotNull() - .toIterable() - .hasSize(2) - .extracting("genus").containsOnly(genus); - } - - @Test - void should_Find_Paginated_Germplasm_By_Genus_Triticum() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String genus = "Triticum"; - criteria.setGermplasmGenus(Lists.newArrayList(genus)); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().hasSize(3) - .extracting("genus").containsOnly(genus); - } - - @Test - void should_Find_Paginated_Germplasm_By_Species_TriticumAestivum() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String species = "aestivum"; - criteria.setGermplasmSpecies(Lists.newArrayList(species)); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().hasSize(3) - .extracting("species").containsOnly(species); - } - - @Test - void should_Find_Paginated_Germplasm_By_Names_CHARGER() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String name = "CHARGER"; - criteria.setGermplasmNames(Lists.newArrayList(name)); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().hasSize(1).extracting("germplasmName").containsOnly(name); - } - - @Test - void should_Find_Paginated_Germplasm_By_Names_CHARGER_AND_Number13431() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String name = "CHARGER"; - criteria.setGermplasmNames(Lists.newArrayList(name, "13431")); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isNotEmpty().extracting("germplasmName").containsOnly(name); - } - - @Test - void should_NOT_Find_Paginated_Germplasm_By_Names_dummmy() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String name = "nobody should name any accession like that"; - criteria.setGermplasmNames(Lists.newArrayList(name)); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isEmpty(); - } - - @Test - void should_Find_Paginated_Germplasm_By_Names_dummy_AND_Number13431() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - String name = "CHARGER"; - criteria.setGermplasmNames(Lists.newArrayList(name, "nobody should name any accession like that")); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isNotEmpty().extracting("germplasmName").containsOnly(name); - } - - @Test - void should_Find_Germplasm_With_Pages_1() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - Long pageSize = 5L; - criteria.setPage(0L); //Need to test page 0 to check we are 0 based - criteria.setPageSize(pageSize); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isNotEmpty(); - assertThat(pager.size()).isLessThanOrEqualTo(pageSize.intValue()); - } - - @Test - void should_Find_Germplasm_With_Pages_2() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - Long pageSize = 5L; - criteria.setPage(0L); - criteria.setPageSize(pageSize); - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isNotEmpty(); - assertThat(pager.size()).isLessThanOrEqualTo(pageSize.intValue()); - } - - @Test - void should_Get_Metadata() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setPage(1L); - criteria.setPageSize(3L); - PaginatedList<GermplasmVO> g = repository.find(criteria); - assertThat(g).isNotNull(); - } - - @Test - void should_Test_Json_Serialization() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setPage(1L); - criteria.setPageSize(3L); - PaginatedList<GermplasmVO> g = repository.find(criteria); - assertThat(g).isNotNull(); - String json = null; - - ObjectMapper jacksonMapper = new ObjectMapper(); - try { - json = jacksonMapper.writeValueAsString(g); - } catch (JsonProcessingException e) { - fail("Jackson error", e); - } - assertThat(json).isNotNull().isNotEmpty(); - } - - @Test - void should_Not_Have_Identical_Germplasm_On_Several_Pages() { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setPage(0L); - criteria.setPageSize(10L); - PaginatedList<GermplasmVO> pager0 = repository.find(criteria); - assertThat(pager0).isNotNull().isNotEmpty(); - assertThat(pager0.getPagination()).isNotNull(); - - criteria.setPage(1L); - PaginatedList<GermplasmVO> pager1 = repository.find(criteria); - assertThat(pager1).isNotNull().isNotEmpty(); - assertThat(pager0).doesNotContainAnyElementsOf(pager1); - } - - @Test - void should_Find_As_Much_Germplasm_Via_Scroll_And_Pager() { - final String species = "aestivum"; - int numberOfAestivum = 3; - - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setGermplasmSpecies(Lists.newArrayList(species)); - - Iterator<GermplasmVO> scroll = repository.scrollAll(criteria); - assertThat(scroll).isNotNull().toIterable().hasSize(numberOfAestivum); - - PaginatedList<GermplasmVO> pager = repository.find(criteria); - assertThat(pager).isNotNull().isNotEmpty(); - - Pagination pagination = pager.getPagination(); - assertThat(pagination).isNotNull(); - Long totalCount = pagination.getTotalCount(); - assertThat(totalCount).isNotNull().isEqualTo(numberOfAestivum); - } - - @Test - void should_Succeed_Empty_BrAPI_GET_Search_Criteria() { - GermplasmSearchCriteria criteria = new GermplasmGETSearchCriteria(); - PaginatedList<GermplasmVO> vos = repository.find(criteria); - assertThat(vos).isNotNull().isNotEmpty(); - assertThat(vos.size()).isGreaterThan(1); - } - - @Test - void should_Succeed_Full_BrAPI_POST_Search_Criteria() { - List<String> accessionNumbers = Arrays.asList( - "301Ang6", "P3725", "TX235"); - List<String> germplasmDbIds = Arrays.asList( - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTg2MTk3NTU3OUUxMg==", "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTcxMTA0NzIwNUUxMg==", "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjY5NTQ2NjIzM0UxMg=="); - List<String> germplasmNames = Arrays.asList( - "Sauvignon gris", "Grosse Bleue", "05-HD357.80."); - List<String> germplasmGenus = Arrays.asList( - "Vitis", "Prunus", "Triticum"); - List<String> germplasmSpecies = Arrays.asList( - "vinifera", "domestica", "aestivum"); - - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - criteria.setAccessionNumbers(accessionNumbers); - criteria.setGermplasmDbIds(germplasmDbIds); - criteria.setGermplasmNames(germplasmNames); - criteria.setGermplasmGenus(germplasmGenus); - criteria.setGermplasmSpecies(germplasmSpecies); - - PaginatedList<GermplasmVO> vos = repository.find(criteria); - assertThat(vos).isNotNull().isNotEmpty(); - - assertThat(vos).extracting("accessionNumber").isSubsetOf(accessionNumbers); - assertThat(vos).extracting("germplasmDbId").isSubsetOf(germplasmDbIds); - assertThat(vos).extracting("germplasmName").isSubsetOf(germplasmNames); - assertThat(vos).extracting("genus").isSubsetOf(germplasmGenus); - assertThat(vos).extracting("species").isSubsetOf(germplasmSpecies); - } - - @Test - void should_Succeed_Full_BrAPI_GET_Search_Criteria() { - List<String> germplasmDbIds = Arrays.asList( - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTg2MTk3NTU3OUUxMg==", "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTcxMTA0NzIwNUUxMg==", "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjY5NTQ2NjIzM0UxMg=="); - List<String> germplasmNames = Arrays.asList( - "Sauvignon gris", "Grosse Bleue", "05-HD357.80."); - - GermplasmGETSearchCriteria criteria = new GermplasmGETSearchCriteria(); - criteria.setGermplasmDbId(germplasmDbIds); - criteria.setGermplasmName(germplasmNames); - - PaginatedList<GermplasmVO> vos = repository.find(criteria); - assertThat(vos).isNotNull().isNotEmpty(); - - assertThat(vos).extracting("germplasmDbId").isSubsetOf(germplasmDbIds); - assertThat(vos).extracting("germplasmName").isSubsetOf(germplasmNames); - } - - @Test - void should_get_empty_progeny_by_id() { - String germplasmDbId = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njg4NjAyMzEwNUUxMg=="; - ProgenyVO progeny = repository.findProgeny(germplasmDbId); - assertThat(progeny).isNotNull(); - assertThat(progeny.getGermplasmDbId()).isEqualTo(germplasmDbId); - assertThat(progeny.getProgeny()).isNotNull().isEmpty(); - } - - @Test - void should_get_progeny_by_id() { - String germplasmDbId = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMjc4NDQ4MkUxMg=="; - ProgenyVO progeny = repository.findProgeny(germplasmDbId); - assertThat(progeny).isNotNull(); - assertThat(progeny.getGermplasmDbId()).isEqualTo(germplasmDbId); - assertThat(progeny.getProgeny()).isNotNull().hasSize(1); - } - - @Test - void should_get_pedigree_by_id() { - String germplasmDbId = "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4MjQwNzQ2OEUxMg=="; - PedigreeVO pedigree = repository.findPedigree(germplasmDbId); - assertThat(pedigree).isNotNull(); - assertThat(pedigree.getGermplasmDbId()).isEqualTo(germplasmDbId); - assertThat(pedigree.getSiblings()).isNotNull().hasSize(9); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryTest.java deleted file mode 100644 index 4bf6186663d41d17b821d39cb2b1181e001af180..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/LocationRepositoryTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.LocationCriteria; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Iterator; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class LocationRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(LocationVO.class, 0L); - } - - @Autowired - LocationRepository repository; - - @Test - void should_Get_By_Id() { - String expectedId = "805"; - LocationVO result = repository.getById(expectedId); - assertThat(result).isNotNull(); - assertThat(result.getLocationDbId()).isEqualTo(expectedId); - } - - @Test - void should_Have_Same_Name_And_LocationName() { - // 805 - LocationVO result = repository.getById("805"); - assertThat(result).isNotNull(); - assertThat(result.getLocationName()).isNotBlank().isEqualTo(result.getName()); - - // 806 - result = repository.getById("806"); - assertThat(result).isNotNull(); - assertThat(result.getLocationName()).isNotBlank().isEqualTo(result.getName()); - } - - @SuppressWarnings("deprecation") - @Test - void should_Have_Same_Abbreviation_And_Abreviation() { - // 805 - LocationVO result = repository.getById("805"); - assertThat(result).isNotNull(); - assertThat(result.getAbbreviation()).isNotBlank().isEqualTo(result.getAbreviation()); - - // 806 - result = repository.getById("806"); - assertThat(result).isNotNull(); - assertThat(result.getAbbreviation()).isNotBlank().isEqualTo(result.getAbreviation()); - } - - @SuppressWarnings("deprecation") - @Test - void should_Have_Same_InstituteAddress_And_InstituteAdress() { - // 805 - LocationVO result = repository.getById("805"); - assertThat(result).isNotNull(); - assertThat(result.getInstituteAddress()).isNotBlank().isEqualTo(result.getInstituteAdress()); - - // 806 - result = repository.getById("806"); - assertThat(result).isNotNull(); - assertThat(result.getInstituteAddress()).isNotBlank().isEqualTo(result.getInstituteAdress()); - } - - @Test - void should_Find() { - int pageSize = 3; - int page = 1; - LocationCriteria criteria = new LocationCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<LocationVO> result = repository.find(criteria); - assertThat(result).isNotNull().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_By_Types() { - Set<String> expectedTypes = Sets.newHashSet("Breeding and Evaluation site", "Origin and Breeding site"); - LocationCriteria criteria = new LocationCriteria(); - criteria.setLocationTypes(expectedTypes); - - PaginatedList<LocationVO> locations = repository.find(criteria); - - assertThat(locations).isNotNull().hasSize(3); - assertThat(locations).extracting("locationType").hasSameElementsAs(expectedTypes); - } - - @Test - void shouldScrollAllForSitemap() { - Iterator<LocationSitemapVO> list = repository.scrollAllForSitemap(100); - assertThat(list).toIterable() - .isNotEmpty() - .allMatch(vo -> !vo.getLocationDbId().isEmpty()); - } - - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryTest.java deleted file mode 100644 index e30c1f8f980fa2e0b5359ab6c4f1c38c7f0d9775..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ObservationUnitRepositoryTest.java +++ /dev/null @@ -1,273 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.ObservationUnitCriteria; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationUnitVO; -import fr.inra.urgi.faidare.domain.data.phenotype.ObservationVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.assertj.core.api.Condition; -import org.joda.time.DateTime; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class ObservationUnitRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(ObservationUnitVO.class, 0L); - } - - @Autowired - ObservationUnitRepository repository; - - @Test - void should_Find_Paginated() { - int pageSize = 3; - int page = 1; - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - assertThat(result).isNotNull().isNotEmpty().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_By_Level() { - String expectedLevel = "BLOCK"; - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - criteria.setObservationLevel(expectedLevel); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().hasSize(5); - assertThat(result).extracting("observationLevel").containsOnly(expectedLevel); - } - - @Test - void should_Find_By_Timestamp_Range() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - String from = "2001-12-31T00:00:00Z"; - String to = "2005-12-31T01:00:00Z"; - final Date fromDate = DateTime.parse(from).toDate(); - final Date toDate = DateTime.parse(to).toDate(); - List<String> timestampRange = Arrays.asList(from, to); - criteria.setObservationTimeStampRange(timestampRange); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().hasSize(4); - assertThat(result) - .flatExtracting("observations") - .are(new Condition<Object>() { - @Override - public boolean matches(Object data) { - if (data instanceof ObservationVO) { - ObservationVO observation = (ObservationVO) data; - Date timeStamp = observation.getObservationTimeStamp(); - assertThat(timeStamp).isAfter(fromDate); - assertThat(timeStamp).isBefore(toDate); - return true; - } - return false; - } - }); - } - - @Test - void should_Fail_Find_Invalid_Timestamp_Range() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - List<String> timestampRange = Arrays.asList("foo", "bar", "baz"); - criteria.setObservationTimeStampRange(timestampRange); - - assertThrows( - RuntimeException.class, - () -> repository.find(criteria) - ); - } - - @Test - void should_Find_By_Variables() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - String variableId1 = "CO_357:0000088"; - String variableId2 = "CO_357:0000089"; - Set<String> variableIds = Sets.newHashSet(variableId1, variableId2); - criteria.setObservationVariableDbIds(variableIds); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - assertThat(result) - .flatExtracting("observations") - .extracting("observationVariableDbId") - .hasSameElementsAs(variableIds); - } - - @Test - void should_Find_By_Variables_And_Timestamp() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - String variableId1 = "CO_357:0000088"; - String variableId2 = "CO_357:0000089"; - Set<String> variableIds = Sets.newHashSet(variableId1, variableId2); - criteria.setObservationVariableDbIds(variableIds); - - String from = "2002-07-03T00:00:00Z"; - String to = "2005-11-14T00:00:00Z"; - final Date fromDate = DateTime.parse(from).toDate(); - final Date toDate = DateTime.parse(to).toDate(); - List<String> timestampRange = Arrays.asList(from, to); - criteria.setObservationTimeStampRange(timestampRange); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - - assertThat(result) - .flatExtracting("observations") - .extracting("observationVariableDbId") - .hasSameElementsAs(variableIds); - - assertThat(result) - .flatExtracting("observations") - .are(new ObservationsInTimeRange(fromDate, toDate)); - } - - - @Test - void should_Find_By_Invalid_Variables() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - String variableId1 = "FOO:BAR"; - Set<String> variableIds = Sets.newHashSet(variableId1); - criteria.setObservationVariableDbIds(variableIds); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isEmpty(); - } - - - @Test - void should_Find_By_All_Criteria() { - ObservationUnitCriteria criteria = new ObservationUnitCriteria(); - - String variableId1 = "CO_357:0000088"; - String variableId2 = "CO_357:0000089"; - Set<String> variableIds = Sets.newHashSet(variableId1, variableId2); - criteria.setObservationVariableDbIds(variableIds); - - String from = "2002-07-03T00:00:00Z"; - String to = "2005-11-14T00:00:00Z"; - final Date fromDate = DateTime.parse(from).toDate(); - final Date toDate = DateTime.parse(to).toDate(); - List<String> timestampRange = Arrays.asList(from, to); - criteria.setObservationTimeStampRange(timestampRange); - - Set<String> programIds = Sets.newHashSet("P1", "P2"); - criteria.setProgramDbIds(programIds); - - Set<String> germplasmIds = Sets.newHashSet("G1", "G2"); - criteria.setGermplasmDbIds(germplasmIds); - - Set<String> locationIds = Sets.newHashSet("34069"); - criteria.setLocationDbIds(locationIds); - - Set<String> seasons = Sets.newHashSet("2002"); - criteria.setSeasonDbIds(seasons); - - String observationLevel = "BLOCK"; - criteria.setObservationLevel(observationLevel); - - Set<String> studyIds = Sets.newHashSet("POP2-Orleans-chancre"); - criteria.setStudyDbIds(studyIds); - - PaginatedList<ObservationUnitVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - - assertThat(result) - .extracting("studyDbId") - .hasSameElementsAs(studyIds); - - assertThat(result) - .extracting("observationLevel") - .containsOnly(observationLevel); - - assertThat(result) - .extracting("studyLocationDbId") - .hasSameElementsAs(locationIds); - - assertThat(result) - .extracting("germplasmDbId") - .hasSameElementsAs(germplasmIds); - - assertThat(result) - .flatExtracting("observations") - .extracting("season") - .hasSameElementsAs(seasons); - - assertThat(result) - .flatExtracting("observations") - .extracting("observationVariableDbId") - .hasSameElementsAs(variableIds); - - assertThat(result) - .flatExtracting("observations") - .are(new ObservationsInTimeRange(fromDate, toDate)); - } - - private static class ObservationsInTimeRange extends Condition<Object> { - private final Date fromDate; - private final Date toDate; - - ObservationsInTimeRange(Date fromDate, Date toDate) { - this.fromDate = fromDate; - this.toDate = toDate; - } - - @Override - public boolean matches(Object data) { - if (data instanceof ObservationVO) { - ObservationVO observation = (ObservationVO) data; - Date timeStamp = observation.getObservationTimeStamp(); - assertThat(timeStamp).isAfter(fromDate); - assertThat(timeStamp).isBefore(toDate); - return true; - } - return false; - } - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryTest.java deleted file mode 100644 index 252e412ecf85e226a43624ef5fa978f98c501913..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/ProgramRepositoryTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.ProgramCriteria; -import fr.inra.urgi.faidare.domain.data.ProgramVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class ProgramRepositoryTest { - - @Autowired - ProgramRepository repository; - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(ProgramVO.class, 0L); - } - - @Test - void should_Get_By_Id() { - String expectedId = "P1"; - ProgramVO result = repository.getById(expectedId); - assertThat(result).isNotNull(); - assertThat(result.getProgramDbId()).isEqualTo(expectedId); - } - - @Test - void should_Have_Same_Name_And_ProgramName() { - // P1 - ProgramVO result = repository.getById("P1"); - assertThat(result).isNotNull(); - assertThat(result.getProgramName()).isNotBlank().isEqualTo(result.getName()); - - // P2 - result = repository.getById("P2"); - assertThat(result).isNotNull(); - assertThat(result.getProgramName()).isNotBlank().isEqualTo(result.getName()); - } - - @Test - void should_Find_Paginated() { - int pageSize = 3; - int page = 1; - ProgramCriteria criteria = new ProgramCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<ProgramVO> result = repository.find(criteria); - assertThat(result).isNotNull().isNotEmpty().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_By_Name() { - String expectedName = "Amaizing"; - ProgramCriteria criteria = new ProgramCriteria(); - criteria.setName(expectedName); - - PaginatedList<ProgramVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty().hasSize(1); - assertThat(result).extracting("name").containsOnly(expectedName); - } - - @Test - void should_Find_By_Abbreviation() { - String expectedAbbreviation = "ANR-12-ADAP-0009"; - ProgramCriteria criteria = new ProgramCriteria(); - criteria.setAbbreviation(expectedAbbreviation); - - PaginatedList<ProgramVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty().hasSize(1); - assertThat(result).extracting("abbreviation").containsOnly(expectedAbbreviation); - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryTest.java deleted file mode 100644 index af5cfa85677e4db56ff6bc973fabb6340f4a7629..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/StudyRepositoryTest.java +++ /dev/null @@ -1,177 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.StudySearchCriteria; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.data.study.StudySummaryVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Comparator; -import java.util.Iterator; -import java.util.Set; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class StudyRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(StudyDetailVO.class, 0L); - esSetUp.initialize(LocationVO.class, 0L); - } - - @Autowired - StudyRepository repository; - - @Test - void should_Get_By_Id() { - String expectedId = "BTH_Orgeval_2008_SetA2"; - StudyDetailVO result = repository.getById(expectedId); - assertThat(result).isNotNull(); - assertThat(result.getStudyDbId()).isEqualTo(expectedId); - assertThat(result.getLocation()).isNotNull(); - } - - - @Test - void should_Have_Same_Name_And_StudyName() { - // BTH_Orgeval_2008_SetA2 - StudyDetailVO result = repository.getById("BTH_Orgeval_2008_SetA2"); - Assertions.assertThat(result).isNotNull(); - Assertions.assertThat(result.getStudyName()).isNotBlank().isEqualTo(result.getName()); - - // S2 - result = repository.getById("S2"); - Assertions.assertThat(result).isNotNull(); - Assertions.assertThat(result.getStudyName()).isNotBlank().isEqualTo(result.getName()); - } - - @Test - void should_Find_Paginated() { - int pageSize = 3; - int page = 2; - StudySearchCriteria criteria = new StudySearchCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<StudySummaryVO> result = repository.find(criteria); - assertThat(result).isNotNull().isNotEmpty().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_By_Locations() { - Set<String> expectedLocations = Sets.newHashSet("Bordeaux", "Cavallermaggiore"); - StudySearchCriteria criteria = new StudySearchCriteria(); - criteria.setStudyLocations(expectedLocations); - - PaginatedList<StudySummaryVO> result = repository.find(criteria); - - assertThat(result).isNotNull().hasSize(3); - assertThat(result).extracting("locationName") - .hasSameElementsAs(expectedLocations); - } - - @Test - void should_Find_By_Names() { - Set<String> expectedNames = Sets.newHashSet("BTH_Lusignan_2015_SetB1", "BTH_Le_Moulon_2006_SetA2"); - StudySearchCriteria criteria = new StudySearchCriteria(); - criteria.setStudyNames(expectedNames); - - PaginatedList<StudySummaryVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - assertThat(result).extracting("name") - .hasSameElementsAs(expectedNames); - } - - @Test - void should_Find_All_Criteria() { - StudySearchCriteria criteria = new StudySearchCriteria(); - Set<String> names = Sets.newHashSet( - "Test de comparaison de provenances de chene sessile - 181000402", - "Test de comparaison de provenances de chene sessile - 181000102"); - criteria.setStudyNames(names); - Set<String> locations = Sets.newHashSet("Saint-Laurent - Forêt domaniale de Vierzon"); - criteria.setStudyLocations(locations); - Set<String> programs = Sets.newHashSet("PlantaComp"); - criteria.setProgramNames(programs); - Boolean active = true; - criteria.setActive(active); - Set<String> germplasm = Sets.newHashSet("ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzAyMDkxOEUxMg==", "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjkxNTQwMjg5NkUxMg=="); - criteria.setGermplasmDbIds(germplasm); - Set<String> variables = Sets.newHashSet("CO_357:0000011"); - criteria.setObservationVariableDbIds(variables); - String season = "1996"; - criteria.setSeasonDbId(season); - String type = "Provenance trial"; - criteria.setStudyType(type); - - PaginatedList<StudySummaryVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - assertThat(result).extracting("name").hasSameElementsAs(names); - assertThat(result).extracting("locationName").hasSameElementsAs(locations); - assertThat(result).extracting("programName").hasSameElementsAs(programs); - assertThat(result).extracting("active").containsOnly(active); - assertThat(result).flatExtracting("seasons").contains(season); - assertThat(result).extracting("studyType").containsOnly(type); - } - - @Test - void should_Find_Sorted() { - String sortField = "studyName"; - - StudySearchCriteria criteria = new StudySearchCriteria(); - criteria.setSortBy(sortField); - criteria.setSortOrder("desc"); - - PaginatedList<StudySummaryVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - - assertThat(result).extracting(sortField).isSortedAccordingTo(new DescendingOrder()); - } - - @Test - void shouldScrollAllForSitemap() { - Iterator<StudySitemapVO> list = repository.scrollAllForSitemap(100); - assertThat(list).toIterable() - .isNotEmpty() - .allMatch(vo -> !vo.getStudyDbId().isEmpty()); - } - - private class DescendingOrder implements Comparator<Object> { - @Override - public int compare(Object o1, Object o2) { - return ((String) o2).compareTo(((String) o1)); - } - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryTest.java deleted file mode 100644 index 660fa8abf376cfd73954b208fb196dab5fc12d8e..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/TrialRepositoryTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.criteria.TrialCriteria; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Comparator; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class TrialRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initialize(TrialVO.class, 0L); - } - - @Autowired - TrialRepository repository; - - @Test - void should_Get_By_Id() { - String expectedId = "T1"; - TrialVO result = repository.getById(expectedId); - assertThat(result).isNotNull(); - assertThat(result.getTrialDbId()).isEqualTo(expectedId); - } - - @Test - void should_Find_Paginated() { - int pageSize = 3; - int page = 1; - TrialCriteria criteria = new TrialCriteria(); - criteria.setPageSize((long) pageSize); - criteria.setPage((long) page); - - PaginatedList<TrialVO> result = repository.find(criteria); - assertThat(result).isNotNull().isNotEmpty().hasSize(pageSize); - - assertThat(result.getPagination()).isNotNull(); - assertThat(result.getPagination().getPageSize()).isEqualTo(pageSize); - assertThat(result.getPagination().getCurrentPage()).isEqualTo(page); - } - - @Test - void should_Find_By_Location() { - String expectedLocationDbId = "37497"; - TrialCriteria criteria = new TrialCriteria(); - criteria.setLocationDbId(expectedLocationDbId); - - PaginatedList<TrialVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - TrialVO trialVO = result.get(0); - assertThat(trialVO.getStudies()).extracting("locationDbId") - .contains(expectedLocationDbId); - } - - @Test - void should_Find_Sorted() { - String sortField = "trialName"; - - TrialCriteria criteria = new TrialCriteria(); - criteria.setSortBy(sortField); - criteria.setSortOrder("desc"); - - PaginatedList<TrialVO> result = repository.find(criteria); - - assertThat(result).isNotNull().isNotEmpty(); - assertThat(result).extracting(sortField).isSortedAccordingTo(new DescendingOrder()); - } - - private class DescendingOrder implements Comparator<Object> { - @Override - public int compare(Object o1, Object o2) { - return ((String) o2).compareTo(((String) o1)); - } - } -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryTest.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryTest.java deleted file mode 100644 index f7ae93de08663973ab75a23410820fe8232d3998..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package fr.inra.urgi.faidare.repository.es; - -import fr.inra.urgi.faidare.Application; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.setup.ESSetUp; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Collections; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author gcornut - */ - -@ExtendWith(SpringExtension.class) -@Import({ESSetUp.class}) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestPropertySource("/test.properties") -@SpringBootTest(classes = Application.class) -class XRefDocumentRepositoryTest { - - @Autowired - ESSetUp esSetUp; - - @BeforeAll - void before() { - esSetUp.initializeXref(0L); - } - - @Autowired - XRefDocumentRepository repository; - - @Test - void should_Find_All() { - XRefDocumentSearchCriteria criteria = new XRefDocumentSearchCriteria(); - PaginatedList<XRefDocumentVO> documents = repository.find(criteria); - assertThat(documents).isNotNull().hasSize(3); - } - - @Test - void should_Find_By_Enty_Type() { - String entryType = "Accession"; - XRefDocumentSearchCriteria criteria = new XRefDocumentSearchCriteria(); - criteria.setEntryType(entryType); - PaginatedList<XRefDocumentVO> documents = repository.find(criteria); - assertThat(documents).isNotNull().hasSize(1) - .extracting("entryType").containsOnly(entryType); - } - - @Test - void should_Find_By_Linked_Id() { - String id = "ID2"; - List<String> linkedResourcesID = Collections.singletonList(id); - XRefDocumentSearchCriteria criteria = new XRefDocumentSearchCriteria(); - criteria.setLinkedResourcesID(linkedResourcesID); - PaginatedList<XRefDocumentVO> documents = repository.find(criteria); - assertThat(documents).isNotNull().hasSize(2) - .flatExtracting("linkedResourcesID") - .contains(id); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/setup/ESSetUp.java b/backend/src/test/java/fr/inra/urgi/faidare/repository/es/setup/ESSetUp.java deleted file mode 100644 index 760e5d3ff3c9caacdfc41e16730e9b139a093209..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/es/setup/ESSetUp.java +++ /dev/null @@ -1,189 +0,0 @@ -package fr.inra.urgi.faidare.repository.es.setup; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.io.CharStreams; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.elasticsearch.document.DocumentAnnotationUtil; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepositoryImpl; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; -import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.client.indices.CreateIndexRequest; -import org.elasticsearch.client.indices.CreateIndexResponse; -import org.elasticsearch.client.indices.GetIndexRequest; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentType; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.*; -import java.util.Arrays; -import java.util.Iterator; - -/** - * @author gcornut - */ -@Component -public class ESSetUp { - - private final RestHighLevelClient client; - private final FaidareProperties properties; - - @Autowired - public ESSetUp(RestHighLevelClient client, FaidareProperties properties) { - this.client = client; - this.properties = properties; - } - - /** - * Delete index/alias if it exists - */ - private void deleteIndex(String indexName) throws IOException { - GetIndexRequest existsRequest = new GetIndexRequest(indexName); - boolean exists = client.indices().exists(existsRequest, RequestOptions.DEFAULT); - if (!exists) { - // Do not delete non existing index - return; - } - - DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indexName); - AcknowledgedResponse response = client.indices().delete(deleteRequest, RequestOptions.DEFAULT); - - if (!response.isAcknowledged()) { - throw new RuntimeException("Index deletion not acknowledged (index name: '" + indexName + "'"); - } - } - - /** - * Create index with data - */ - private void addIndex(String indexName, String jsonPath, String documentType) throws IOException { - // Create index - CreateIndexRequest createIndex = new CreateIndexRequest(indexName); - - // with settings - String settings = readResource("./index/settings.json"); - createIndex.settings(toXContentBuilder(settings)); - - // with document mappings - String mapping = readResource("./index/" + documentType + "_mapping.json"); - createIndex.mapping(mapping, XContentType.JSON); - - CreateIndexResponse createResponse = client.indices().create(createIndex, RequestOptions.DEFAULT); - if (!createResponse.isAcknowledged()) { - throw new RuntimeException("Could not create index '" + indexName + "': " + createResponse); - } - - // Bulk index fixture data - InputStream jsonStream = getClass().getResourceAsStream(jsonPath); - JsonNode jsonNode = new ObjectMapper().readTree(jsonStream); - - BulkRequest bulkRequest = new BulkRequest(); - - Iterator<JsonNode> elements = jsonNode.elements(); - while (elements.hasNext()) { - JsonNode document = elements.next(); - - IndexRequest indexRequest = new IndexRequest(indexName); - indexRequest.source(toXContentBuilder(document.toString())); - bulkRequest.add(indexRequest); - } - - BulkResponse response; - response = client.bulk(bulkRequest, RequestOptions.DEFAULT); - - if (response.hasFailures()) { - System.err.println(response.buildFailureMessage()); - throw new RuntimeException("Indexing failed (index name: '" + indexName + "')"); - } - } - - /** - * Initialize fixture indices for a document and a list of group IDs - */ - public void initialize(Class<?> documentClass, Long... groupIds) { - String documentType = DocumentAnnotationUtil.getDocumentObjectMetadata(documentClass).getDocumentType(); - try { - for (long groupId : groupIds) { - String indexName = properties.getAliasName(documentType, groupId); - - // Delete fixture index if exists - deleteIndex(indexName); - - // Add fixture index (with data) - String jsonPath = "./fixture/" + documentType + groupId + ".json"; - addIndex(indexName, jsonPath, documentType); - } - refreshIndex(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Initialize fixture indices for a document and a list of group IDs - */ - public void initializeXref(Long... groupIds) { - Class<?> documentClass = XRefDocumentVO.class; - String documentType = DocumentAnnotationUtil.getDocumentObjectMetadata(documentClass).getDocumentType(); - try { - String baseIndex = properties.getElasticsearchXrefIndexName(); - String[] indexNames = XRefDocumentRepositoryImpl.getGroupAliases(baseIndex, Arrays.asList(groupIds)); - for (String indexName : indexNames) { - - // Delete fixture index if exists - deleteIndex(indexName); - - // Add fixture index (with data) - String jsonPath = "./fixture/" + indexName + ".json"; - addIndex(indexName, jsonPath, documentType); - } - refreshIndex(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Refresh indices to make sure the new documents are correctly indexed - */ - private void refreshIndex() throws IOException { - RefreshRequest refreshRequest = new RefreshRequest(); - RefreshResponse refreshResponse = client.indices().refresh(refreshRequest, RequestOptions.DEFAULT); - if (refreshResponse.getFailedShards() > 0) { - throw new RuntimeException("Could not refresh Elasticsearch indices."); - } - } - - /** - * Read package resource in a String - */ - @SuppressWarnings("UnstableApiUsage") - private String readResource(String path) { - try { - InputStream resource = getClass().getResourceAsStream(path); - if (resource == null) { - throw new RuntimeException("Could not find resource at path '"+path+"'"); - } - return CharStreams.toString(new InputStreamReader(resource)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private XContentBuilder toXContentBuilder(String json) throws IOException { - OutputStream out = new ByteArrayOutputStream(); - out.write(json.getBytes()); - return XContentFactory.jsonBuilder(out); - } - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/service/es/GermplasmServiceTest.java b/backend/src/test/java/fr/inra/urgi/faidare/service/es/GermplasmServiceTest.java deleted file mode 100644 index 253abe39a3a10b7697338a32c5d02ad820e88f57..0000000000000000000000000000000000000000 --- a/backend/src/test/java/fr/inra/urgi/faidare/service/es/GermplasmServiceTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package fr.inra.urgi.faidare.service.es; - -import com.opencsv.CSVReader; -import fr.inra.urgi.faidare.domain.criteria.GermplasmPOSTSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import org.assertj.core.util.Lists; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.Iterator; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -/** - * @author gcornut - */ - -@ExtendWith(SpringExtension.class) -public class GermplasmServiceTest { - - @InjectMocks - GermplasmServiceImpl germplasmService; - - @Mock - GermplasmRepository repository; - - @Test - void exportCSV() throws FileNotFoundException { - GermplasmPOSTSearchCriteria criteria = new GermplasmPOSTSearchCriteria(); - Iterator<GermplasmVO> germplasmIterator = mockGermplasms(); - - when(repository.scrollAll(criteria)).thenReturn(germplasmIterator); - - File csvFile = germplasmService.exportCSV(criteria); - - CSVReader strings = new CSVReader(new FileReader(csvFile)); - assertThat(strings.iterator()).toIterable().hasSize(4); - //TODO: Add more validation with mock data - } - - private Iterator<GermplasmVO> mockGermplasms() { - GermplasmVO g1 = new GermplasmVO(); - GermplasmVO g2 = new GermplasmVO(); - GermplasmVO g3 = new GermplasmVO(); - - return Lists.newArrayList(g1, g2, g3).iterator(); - } - - -} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/ApplicationTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/ApplicationTest.java similarity index 87% rename from backend/src/test/java/fr/inra/urgi/faidare/ApplicationTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/ApplicationTest.java index e1fbec0d8c8eb100cc7cd2e51056c64d834ad6dc..05713949419e8246cce80ca0a15bc2d242af497c 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/ApplicationTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/ApplicationTest.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare; +package fr.inrae.urgi.faidare; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,7 +13,6 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; */ @ExtendWith(SpringExtension.class) @SpringBootTest -@TestPropertySource("/test.properties") class ApplicationTest { @Test diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1ControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1ControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5f8d570334e2ed1e7eff5f832eaa3bedc3559c64 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v1/GermplasmV1ControllerTest.java @@ -0,0 +1,259 @@ +package fr.inrae.urgi.faidare.api.brapi.v1; + +/** + * Unit tests for {@link GermplasmController} + * + * @author Cpommier + */ + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jayway.jsonpath.JsonPath; +import fr.inrae.urgi.faidare.Application; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.skyscreamer.jsonassert.JSONAssert; +import org.skyscreamer.jsonassert.JSONCompareMode; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.*; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.ResourceUtils; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = Application.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class GermplasmV1ControllerTest { + + @Value("${server.servlet.context-path}") + private String contextPath; + + @LocalServerPort + private int port; + + TestRestTemplate testRestTemplate = new TestRestTemplate(); + HttpHeaders headers = new HttpHeaders(); + + + private String createURLWithPort(String uri) { + return "http://localhost:" + port + contextPath + uri; + } + + //TODO: maybe move in a fixture class + //NB: onlyt part of the actual data are copied, especially for the site and panels .... + // Use LENIET JSONAssert + private String APACHE_GERMPLASM = """ + { + "groupId": 0, + "germplasmDbId": "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1Y4V1JIWQ==", + "defaultDisplayName": "APACHE", + "accessionNumber": "13481", + "germplasmName": "APACHE", + "germplasmPUI": "https://doi.org/10.15454/V8WRHY", + "synonyms": + [ + "NSA 93-0211", + "NSA 93-211", + "WW-154" + ], + "commonCropName": "Wheat", + "biologicalStatusOfAccessionCode": "Advanced or improved cultivar", + "countryOfOriginCode": "France", + "genus": "Triticum", + "species": "aestivum", + "genusSpecies": "Triticum aestivum", + "subtaxa": "subsp. aestivum", + "genusSpeciesSubtaxa": "Triticum aestivum subsp. aestivum", + "donors": + [ + { + "donorInstituteCode": "FRA051", + "donorAccessionNumber": "NSA930211", + "donorInstitute": + { + "instituteName": "Unite experimentale du Magneraud, GEVES", + "instituteCode": "FRA051", + "acronym": "MAGNERAUD GEVES", + "organisation": "GEVES", + "instituteType": "Public-sector research organization", + "webSite": "http://www.geves.fr", + "address": "Saint Pierre-d'Amilly, BP 52, 17700 SURGERES, France" + }, + "donationDate": 19970000 + } + ], + "taxonCommonNames": + [ + "Blé tendre", + "Bread wheat", + "Soft wheat" + ], + "photo": + { + "file": "https://urgi.versailles.inrae.fr/files/siregal/images/accession/CEREALS/13481_Mult13_Epi.jpg", + "thumbnailFile": "https://urgi.versailles.inrae.fr/files/siregal/images/accession/CEREALS/thumbnails/thumb_13481_Mult13_Epi.jpg", + "photoName": "APACHE spike", + "description": "Spike ; field multiplication 2013", + "copyright": "INRA, Marion DELOCHE 2013" + }, + "holdingGenbank": + { + "instituteName": "Small grain cereals BRC", + "instituteCode": "CEREALS", + "webSite": "https://www6.ara.inra.fr/umr1095/Equipes/Recherches/Centre-de-Ressources-Biologiques", + "logo": "https://urgi.versailles.inrae.fr/files/siregal/images/grc/inra_brc_en.png" + }, + "presenceStatus": "Maintained", + "originSite": + { + "siteId": "1626", + "siteName": "France", + "latitude": 47.428085, + "longitude": 2.680664, + "siteType": "Origin, Breeding and Collecting site" + }, + "evaluationSites":[{"siteId":"1994","siteName":"Clermont-Ferrand","latitude":45.773,"longitude":3.144,"siteType":"Breeding and Evaluation site"},{"siteId":"32824","siteName":"Lusignan","latitude":46.4,"longitude":0.07,"siteType":"Breeding and Evaluation site"},{"siteId":"33425","siteName":"Reclainville","latitude":48.338615,"longitude":1.746084,"siteType":"Evaluation site"},{"siteId":"33426","siteName":"FLORIMOND DESPREZ","latitude":50.510277,"longitude":3.1725,"siteType":"Evaluation site"},{"siteId":"33427","siteName":"MOMONT_COINGS","latitude":46.868332,"longitude":1.74,"siteType":"Evaluation site"},{"siteId":"33428","siteName":"Estrées-Mons","latitude":49.87857,"longitude":3.007548,"siteType":"Evaluation site"},{"siteId":"33698","siteName":"Colmar","latitude":48.064,"longitude":7.33,"siteType":"Collecting site"},{"siteId":"33818","siteName":"Dijon","latitude":47.277,"longitude":5.094,"siteType":"Collecting and Evaluation site"},{"siteId":"33985","siteName":"Rennes","latitude":48.106,"longitude":-1.791,"siteType":"Collecting and Evaluation site"},{"siteId":"34063","siteName":"Chaux des Prés","latitude":46.512,"longitude":5.865,"siteType":"Evaluation site"},{"siteId":"34064","siteName":"Le Moulon","latitude":48.711,"longitude":2.16,"siteType":"Evaluation site"},{"siteId":"34065","siteName":"Orgeval","latitude":48.838,"longitude":1.953,"siteType":"Evaluation site"},{"siteId":"34066","siteName":"Champagne-céréales","latitude":49.42,"longitude":4.272,"siteType":"Evaluation site"},{"siteId":"34067","siteName":"Epi-centre","latitude":47.029,"longitude":2.331,"siteType":"Evaluation site"},{"siteId":"35627","siteName":"ARVALIS CHALONS","siteType":"Evaluation site"},{"siteId":"35628","siteName":"ARVALIS GREOUX","siteType":"Evaluation site"},{"siteId":"35629","siteName":"CAUSSADE REALVILLE","siteType":"Evaluation site"},{"siteId":"35632","siteName":"LIMAGRAIN VERNEUIL","siteType":"Evaluation site"},{"siteId":"35633","siteName":"SYNGENTA ANDELU","siteType":"Evaluation site"},{"siteId":"35634","siteName":"RAGT CHAMPIGNY","siteType":"Evaluation site"},{"siteId":"37173","siteName":"RAGT LOUVILLE","latitude":48.324444,"longitude":1.787778,"siteType":"Evaluation site"},{"siteId":"37174","siteName":"SECOBRA MAULE","latitude":48.907778,"longitude":1.825278,"siteType":"Evaluation site"},{"siteId":"37175","siteName":"BIOGEMMA Mondonville","latitude":43.676761,"longitude":1.290872,"siteType":"Evaluation site"},{"siteId":"37176","siteName":"SYNGENTA ORGERUS","latitude":48.857182,"longitude":1.698764,"siteType":"Evaluation site"},{"siteId":"37177","siteName":"BIOGER","siteType":"Evaluation site"},{"siteId":"37178","siteName":"BAYER MILLY-LA-FORET","latitude":48.4,"longitude":2.46,"siteType":"Evaluation site"},{"siteId":"37179","siteName":"MOMONT_ALLONNES","siteType":"Evaluation site"},{"siteId":"37195","siteName":"Clermont-Ferrand Le Moulon, Mons en Chaussée","siteType":"Evaluation site"},{"siteId":"37198","siteName":"Clermont-Ferrand, Cappelle-en-Pévèle (59), Estrées-Mons (80)","siteType":"Evaluation site"},{"siteId":"38045","siteName":"INRA Clermont-Ferrand","latitude":45.775596,"longitude":3.144028,"siteType":"Evaluation site"},{"siteId":"38063","siteName":"INRA Mons","latitude":50.641425,"longitude":3.141075,"siteType":"Evaluation site"},{"siteId":"39988","siteName":"Magyar Tudomanyos Akademia Agrartudomanyi Kutatokozpont","latitude":47.05,"longitude":18.133333,"siteType":"Evaluation site"},{"siteId":"39990","siteName":"KWS UK","latitude":52.120612,"longitude":0.085243,"siteType":"Evaluation site"},{"siteId":"39991","siteName":"Çukurova University","latitude":37.854027,"longitude":32.574489,"siteType":"Evaluation site"},{"siteId":"40012","siteName":"Saint Paul","latitude":43.687778,"longitude":5.708333,"siteType":"Origin and Collecting site"},{"siteId":"40305","siteName":"ARVALIS OUZOUER","siteType":"Evaluation site"},{"siteId":"40307","siteName":"RAGT LEVESVILLE","siteType":"Evaluation site"}], + "panel":[{"id":"6","name":"WP2_CC","germplasmCount":370},{"id":"8","name":"SMALL_GRAIN_CEREALS_NETWORK_COL","germplasmCount":1728},{"id":"11","name":"BREEDWHEAT_PANEL","germplasmCount":3047},{"id":"12","name":"TaBW420K_V2_BW_WP1_Discovery_plate","germplasmCount":94},{"id":"17","name":"TaBW420K_V2_BW_WP3_Genetic_Resources","germplasmCount":4531},{"id":"24","name":"CC_Précocité","germplasmCount":226},{"id":"25","name":"CC_Qualité","germplasmCount":365},{"id":"26","name":"SDD","germplasmCount":196},{"id":"29","name":"RIL","germplasmCount":367},{"id":"30","name":"BREEDWHEAT_2011-2012","germplasmCount":220},{"id":"31","name":"BREEDWHEAT_2012-2013","germplasmCount":220},{"id":"32","name":"BREEDWHEAT_2013-2014","germplasmCount":220},{"id":"35","name":"BREEDWHEAT_ASSOCIATION_BWP2","germplasmCount":283},{"id":"37","name":"BREEDWHEAT","germplasmCount":286},{"id":"39","name":"BREEDWHEAT_ASSOCIATION_BWP3","germplasmCount":452},{"id":"43","name":"TaBW420K_V2_BW_Wheatamix","germplasmCount":57}], + "collection":[{"id":"127","name":"Whealbi project wheat collection","type":"Work collection","germplasmCount":509},{"id":"148","name":"WHEAT_ASSOCIATION_GDEC_COL","germplasmCount":366},{"id":"71","name":"Collection du projet Breedwheat","type":"Work collection","germplasmCount":5536},{"id":"72","name":"Soft wheat core collection","type":"Core collection","germplasmCount":367},{"id":"127","name":"Collection blé du projet Whealbi","type":"Work collection","germplasmCount":509},{"id":"72","name":"Core collection blé tendre","type":"Core collection","germplasmCount":367},{"id":"71","name":"Breedwheat project collection","type":"Work collection","germplasmCount":5536},{"id":"74","name":"Wheat INRA collection","type":"INRA collection","germplasmCount":6997},{"id":"74","name":"Collection blé INRA","type":"INRA collection","germplasmCount":6997}], + "studyDbIds":["dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwNl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwN19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwN19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwN19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAwOV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxM19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxM19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NoYXV4X2Rlc19QciVDMyVBOXNfMjAxM19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwM19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwM19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwM19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwNl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwN19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwN19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwN19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAwOV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxM19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxM19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxM19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxNF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxNF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NsZXJtb250LUZlcnJhbmRfMjAxNF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDAwX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDAyX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDAyX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDAyX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA0X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA0X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA0X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA1X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA1X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA1X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA2X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA2X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0NvbG1hcl8yMDA2X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDVfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDVfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDVfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDZfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDZfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDZfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDdfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDdfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDdfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDhfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDhfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDhfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDlfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDlfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDlfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTBfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTBfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTFfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTFfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTFfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMTRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDVfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDVfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDVfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDZfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDZfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDZfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDdfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDdfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDdfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDhfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDhfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDhfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDlfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDlfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDlfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTBfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTBfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTFfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTFfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTFfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAwX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAyX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAyX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAyX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAzX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAzX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAzX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA0X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA0X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA0X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA1X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA1X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA1X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA2X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA2X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA2X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA3X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA3X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA3X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA4X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA4X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA4X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA5X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA5X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA5X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEwX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEwX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEwX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDExX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDExX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDExX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEyX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEyX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEyX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEzX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEzX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDEzX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDE0X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDE0X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDE0X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDVfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDVfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDVfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDZfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDZfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDZfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDdfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDdfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDdfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDhfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDhfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDhfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDlfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDlfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMDlfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTBfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTBfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTBfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTFfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTFfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTFfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTJfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTJfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTJfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTNfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTNfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTNfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTRfU2V0QjE=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTRfU2V0QjI=","dXJuOlVSR0kvc3R1ZHkvQlRIX0x1c2lnbmFuXzIwMTRfU2V0QjM=","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwM19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwM19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwM19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwNl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwN19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwN19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwN19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAwOV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMV9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMV9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMV9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMl9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMl9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxMl9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxM19TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxM19TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxM19TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxNF9TZXRCMQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxNF9TZXRCMg==","dXJuOlVSR0kvc3R1ZHkvQlRIX09yZ2V2YWxfMjAxNF9TZXRCMw==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAwX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAwX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAyX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDAzX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA0X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA0X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA0X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA1X1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA2X1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA3X1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA4X1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDA5X1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDBfU2V0QjFfUElFVElOLVZFUlNF","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDBfU2V0QjJfUElFVElOLVZFUlNF","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDBfU2V0QjNfUElFVElOLVZFUlNF","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEwX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDExX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEzX1NldEIzX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIx","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIxX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIy","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIyX1BJRVRJTi1WRVJTRQ==","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIz","dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDE0X1NldEIzX1BJRVRJTi1WRVJTRQ=="], + "germplasmURI": "https://doi.org/10.15454/V8WRHY", + "@type": "germplasm", + "@id": "https://doi.org/10.15454/V8WRHY", + "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", + "schema:identifier": "25612", + "schema:name": "APACHE", + "studyURIs":["urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2000_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2002_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2002_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2002_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2004_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2004_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2004_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2005_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2005_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2005_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2006_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2006_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2006_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2007_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2007_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2007_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2008_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2008_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2008_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2009_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2009_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2009_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2010_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2010_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2010_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2011_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2011_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2011_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2012_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2012_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2012_SetB3","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2013_SetB1","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2013_SetB2","urn:URGI/study/BTH_Chaux_des_Pr%C3%A9s_2013_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2000_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2002_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2002_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2002_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2003_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2003_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2003_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2004_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2004_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2004_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2005_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2005_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2005_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2006_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2006_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2006_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2007_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2007_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2007_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2008_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2008_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2008_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2009_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2009_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2009_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2010_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2010_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2010_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2011_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2011_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2011_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2012_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2012_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2012_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2013_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2013_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2013_SetB3","urn:URGI/study/BTH_Clermont-Ferrand_2014_SetB1","urn:URGI/study/BTH_Clermont-Ferrand_2014_SetB2","urn:URGI/study/BTH_Clermont-Ferrand_2014_SetB3","urn:URGI/study/BTH_Colmar_2000_SetB1","urn:URGI/study/BTH_Colmar_2002_SetB1","urn:URGI/study/BTH_Colmar_2002_SetB2","urn:URGI/study/BTH_Colmar_2002_SetB3","urn:URGI/study/BTH_Colmar_2004_SetB1","urn:URGI/study/BTH_Colmar_2004_SetB2","urn:URGI/study/BTH_Colmar_2004_SetB3","urn:URGI/study/BTH_Colmar_2005_SetB1","urn:URGI/study/BTH_Colmar_2005_SetB2","urn:URGI/study/BTH_Colmar_2005_SetB3","urn:URGI/study/BTH_Colmar_2006_SetB1","urn:URGI/study/BTH_Colmar_2006_SetB2","urn:URGI/study/BTH_Colmar_2006_SetB3","urn:URGI/study/BTH_Dijon_2000_SetB1","urn:URGI/study/BTH_Dijon_2002_SetB1","urn:URGI/study/BTH_Dijon_2002_SetB2","urn:URGI/study/BTH_Dijon_2002_SetB3","urn:URGI/study/BTH_Dijon_2003_SetB1","urn:URGI/study/BTH_Dijon_2003_SetB2","urn:URGI/study/BTH_Dijon_2003_SetB3","urn:URGI/study/BTH_Dijon_2004_SetB1","urn:URGI/study/BTH_Dijon_2004_SetB2","urn:URGI/study/BTH_Dijon_2004_SetB3","urn:URGI/study/BTH_Dijon_2005_SetB1","urn:URGI/study/BTH_Dijon_2005_SetB2","urn:URGI/study/BTH_Dijon_2005_SetB3","urn:URGI/study/BTH_Dijon_2006_SetB1","urn:URGI/study/BTH_Dijon_2006_SetB2","urn:URGI/study/BTH_Dijon_2006_SetB3","urn:URGI/study/BTH_Dijon_2007_SetB1","urn:URGI/study/BTH_Dijon_2007_SetB2","urn:URGI/study/BTH_Dijon_2007_SetB3","urn:URGI/study/BTH_Dijon_2008_SetB1","urn:URGI/study/BTH_Dijon_2008_SetB2","urn:URGI/study/BTH_Dijon_2008_SetB3","urn:URGI/study/BTH_Dijon_2009_SetB1","urn:URGI/study/BTH_Dijon_2009_SetB2","urn:URGI/study/BTH_Dijon_2009_SetB3","urn:URGI/study/BTH_Dijon_2010_SetB1","urn:URGI/study/BTH_Dijon_2010_SetB2","urn:URGI/study/BTH_Dijon_2010_SetB3","urn:URGI/study/BTH_Dijon_2011_SetB1","urn:URGI/study/BTH_Dijon_2011_SetB2","urn:URGI/study/BTH_Dijon_2011_SetB3","urn:URGI/study/BTH_Dijon_2012_SetB1","urn:URGI/study/BTH_Dijon_2012_SetB2","urn:URGI/study/BTH_Dijon_2012_SetB3","urn:URGI/study/BTH_Dijon_2013_SetB1","urn:URGI/study/BTH_Dijon_2013_SetB2","urn:URGI/study/BTH_Dijon_2013_SetB3","urn:URGI/study/BTH_Dijon_2014_SetB1","urn:URGI/study/BTH_Dijon_2014_SetB2","urn:URGI/study/BTH_Dijon_2014_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2000_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2002_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2002_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2002_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2003_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2003_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2003_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2004_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2004_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2004_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2005_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2005_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2005_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2006_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2006_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2006_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2007_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2007_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2007_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2008_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2008_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2008_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2009_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2009_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2009_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2010_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2010_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2010_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2011_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2011_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2011_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2012_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2012_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2012_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2013_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2013_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2013_SetB3","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2014_SetB1","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2014_SetB2","urn:URGI/study/BTH_Estr%C3%A9es-Mons_2014_SetB3","urn:URGI/study/BTH_Le_Moulon_2000_SetB1","urn:URGI/study/BTH_Le_Moulon_2002_SetB1","urn:URGI/study/BTH_Le_Moulon_2002_SetB2","urn:URGI/study/BTH_Le_Moulon_2002_SetB3","urn:URGI/study/BTH_Le_Moulon_2003_SetB1","urn:URGI/study/BTH_Le_Moulon_2003_SetB2","urn:URGI/study/BTH_Le_Moulon_2003_SetB3","urn:URGI/study/BTH_Le_Moulon_2004_SetB1","urn:URGI/study/BTH_Le_Moulon_2004_SetB2","urn:URGI/study/BTH_Le_Moulon_2004_SetB3","urn:URGI/study/BTH_Le_Moulon_2005_SetB1","urn:URGI/study/BTH_Le_Moulon_2005_SetB2","urn:URGI/study/BTH_Le_Moulon_2005_SetB3","urn:URGI/study/BTH_Le_Moulon_2006_SetB1","urn:URGI/study/BTH_Le_Moulon_2006_SetB2","urn:URGI/study/BTH_Le_Moulon_2006_SetB3","urn:URGI/study/BTH_Le_Moulon_2007_SetB1","urn:URGI/study/BTH_Le_Moulon_2007_SetB2","urn:URGI/study/BTH_Le_Moulon_2007_SetB3","urn:URGI/study/BTH_Le_Moulon_2008_SetB1","urn:URGI/study/BTH_Le_Moulon_2008_SetB2","urn:URGI/study/BTH_Le_Moulon_2008_SetB3","urn:URGI/study/BTH_Le_Moulon_2009_SetB1","urn:URGI/study/BTH_Le_Moulon_2009_SetB2","urn:URGI/study/BTH_Le_Moulon_2009_SetB3","urn:URGI/study/BTH_Le_Moulon_2010_SetB1","urn:URGI/study/BTH_Le_Moulon_2010_SetB2","urn:URGI/study/BTH_Le_Moulon_2010_SetB3","urn:URGI/study/BTH_Le_Moulon_2011_SetB1","urn:URGI/study/BTH_Le_Moulon_2011_SetB2","urn:URGI/study/BTH_Le_Moulon_2011_SetB3","urn:URGI/study/BTH_Le_Moulon_2012_SetB1","urn:URGI/study/BTH_Le_Moulon_2012_SetB2","urn:URGI/study/BTH_Le_Moulon_2012_SetB3","urn:URGI/study/BTH_Le_Moulon_2013_SetB1","urn:URGI/study/BTH_Le_Moulon_2013_SetB2","urn:URGI/study/BTH_Le_Moulon_2013_SetB3","urn:URGI/study/BTH_Le_Moulon_2014_SetB1","urn:URGI/study/BTH_Le_Moulon_2014_SetB2","urn:URGI/study/BTH_Le_Moulon_2014_SetB3","urn:URGI/study/BTH_Lusignan_2000_SetB1","urn:URGI/study/BTH_Lusignan_2002_SetB1","urn:URGI/study/BTH_Lusignan_2002_SetB2","urn:URGI/study/BTH_Lusignan_2002_SetB3","urn:URGI/study/BTH_Lusignan_2003_SetB1","urn:URGI/study/BTH_Lusignan_2003_SetB2","urn:URGI/study/BTH_Lusignan_2003_SetB3","urn:URGI/study/BTH_Lusignan_2004_SetB1","urn:URGI/study/BTH_Lusignan_2004_SetB2","urn:URGI/study/BTH_Lusignan_2004_SetB3","urn:URGI/study/BTH_Lusignan_2005_SetB1","urn:URGI/study/BTH_Lusignan_2005_SetB2","urn:URGI/study/BTH_Lusignan_2005_SetB3","urn:URGI/study/BTH_Lusignan_2006_SetB1","urn:URGI/study/BTH_Lusignan_2006_SetB2","urn:URGI/study/BTH_Lusignan_2006_SetB3","urn:URGI/study/BTH_Lusignan_2007_SetB1","urn:URGI/study/BTH_Lusignan_2007_SetB2","urn:URGI/study/BTH_Lusignan_2007_SetB3","urn:URGI/study/BTH_Lusignan_2008_SetB1","urn:URGI/study/BTH_Lusignan_2008_SetB2","urn:URGI/study/BTH_Lusignan_2008_SetB3","urn:URGI/study/BTH_Lusignan_2009_SetB1","urn:URGI/study/BTH_Lusignan_2009_SetB2","urn:URGI/study/BTH_Lusignan_2009_SetB3","urn:URGI/study/BTH_Lusignan_2010_SetB1","urn:URGI/study/BTH_Lusignan_2010_SetB2","urn:URGI/study/BTH_Lusignan_2010_SetB3","urn:URGI/study/BTH_Lusignan_2011_SetB1","urn:URGI/study/BTH_Lusignan_2011_SetB2","urn:URGI/study/BTH_Lusignan_2011_SetB3","urn:URGI/study/BTH_Lusignan_2012_SetB1","urn:URGI/study/BTH_Lusignan_2012_SetB2","urn:URGI/study/BTH_Lusignan_2012_SetB3","urn:URGI/study/BTH_Lusignan_2013_SetB1","urn:URGI/study/BTH_Lusignan_2013_SetB2","urn:URGI/study/BTH_Lusignan_2013_SetB3","urn:URGI/study/BTH_Lusignan_2014_SetB1","urn:URGI/study/BTH_Lusignan_2014_SetB2","urn:URGI/study/BTH_Lusignan_2014_SetB3","urn:URGI/study/BTH_Orgeval_2000_SetB1","urn:URGI/study/BTH_Orgeval_2002_SetB1","urn:URGI/study/BTH_Orgeval_2002_SetB2","urn:URGI/study/BTH_Orgeval_2002_SetB3","urn:URGI/study/BTH_Orgeval_2003_SetB1","urn:URGI/study/BTH_Orgeval_2003_SetB2","urn:URGI/study/BTH_Orgeval_2003_SetB3","urn:URGI/study/BTH_Orgeval_2004_SetB1","urn:URGI/study/BTH_Orgeval_2004_SetB2","urn:URGI/study/BTH_Orgeval_2004_SetB3","urn:URGI/study/BTH_Orgeval_2005_SetB1","urn:URGI/study/BTH_Orgeval_2005_SetB2","urn:URGI/study/BTH_Orgeval_2005_SetB3","urn:URGI/study/BTH_Orgeval_2006_SetB1","urn:URGI/study/BTH_Orgeval_2006_SetB2","urn:URGI/study/BTH_Orgeval_2006_SetB3","urn:URGI/study/BTH_Orgeval_2007_SetB1","urn:URGI/study/BTH_Orgeval_2007_SetB2","urn:URGI/study/BTH_Orgeval_2007_SetB3","urn:URGI/study/BTH_Orgeval_2008_SetB1","urn:URGI/study/BTH_Orgeval_2008_SetB2","urn:URGI/study/BTH_Orgeval_2008_SetB3","urn:URGI/study/BTH_Orgeval_2009_SetB1","urn:URGI/study/BTH_Orgeval_2009_SetB2","urn:URGI/study/BTH_Orgeval_2009_SetB3","urn:URGI/study/BTH_Orgeval_2010_SetB1","urn:URGI/study/BTH_Orgeval_2010_SetB2","urn:URGI/study/BTH_Orgeval_2010_SetB3","urn:URGI/study/BTH_Orgeval_2011_SetB1","urn:URGI/study/BTH_Orgeval_2011_SetB2","urn:URGI/study/BTH_Orgeval_2011_SetB3","urn:URGI/study/BTH_Orgeval_2012_SetB1","urn:URGI/study/BTH_Orgeval_2012_SetB2","urn:URGI/study/BTH_Orgeval_2012_SetB3","urn:URGI/study/BTH_Orgeval_2013_SetB1","urn:URGI/study/BTH_Orgeval_2013_SetB2","urn:URGI/study/BTH_Orgeval_2013_SetB3","urn:URGI/study/BTH_Orgeval_2014_SetB1","urn:URGI/study/BTH_Orgeval_2014_SetB2","urn:URGI/study/BTH_Orgeval_2014_SetB3","urn:URGI/study/BTH_Rennes_2000_SetB1","urn:URGI/study/BTH_Rennes_2000_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2002_SetB1","urn:URGI/study/BTH_Rennes_2002_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2002_SetB2","urn:URGI/study/BTH_Rennes_2002_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2002_SetB3","urn:URGI/study/BTH_Rennes_2002_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2003_SetB1","urn:URGI/study/BTH_Rennes_2003_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2003_SetB2","urn:URGI/study/BTH_Rennes_2003_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2003_SetB3","urn:URGI/study/BTH_Rennes_2003_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2004_SetB1","urn:URGI/study/BTH_Rennes_2004_SetB2","urn:URGI/study/BTH_Rennes_2004_SetB3","urn:URGI/study/BTH_Rennes_2005_SetB1","urn:URGI/study/BTH_Rennes_2005_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2005_SetB2","urn:URGI/study/BTH_Rennes_2005_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2005_SetB3","urn:URGI/study/BTH_Rennes_2005_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2006_SetB1","urn:URGI/study/BTH_Rennes_2006_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2006_SetB2","urn:URGI/study/BTH_Rennes_2006_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2006_SetB3","urn:URGI/study/BTH_Rennes_2006_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2007_SetB1","urn:URGI/study/BTH_Rennes_2007_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2007_SetB2","urn:URGI/study/BTH_Rennes_2007_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2007_SetB3","urn:URGI/study/BTH_Rennes_2007_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2008_SetB1","urn:URGI/study/BTH_Rennes_2008_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2008_SetB2","urn:URGI/study/BTH_Rennes_2008_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2008_SetB3","urn:URGI/study/BTH_Rennes_2008_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2009_SetB1","urn:URGI/study/BTH_Rennes_2009_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2009_SetB2","urn:URGI/study/BTH_Rennes_2009_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2009_SetB3","urn:URGI/study/BTH_Rennes_2009_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_200_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_200_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_200_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2010_SetB1","urn:URGI/study/BTH_Rennes_2010_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2010_SetB2","urn:URGI/study/BTH_Rennes_2010_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2010_SetB3","urn:URGI/study/BTH_Rennes_2010_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2011_SetB1","urn:URGI/study/BTH_Rennes_2011_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2011_SetB2","urn:URGI/study/BTH_Rennes_2011_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2011_SetB3","urn:URGI/study/BTH_Rennes_2011_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2012_SetB1","urn:URGI/study/BTH_Rennes_2012_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2012_SetB2","urn:URGI/study/BTH_Rennes_2012_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2012_SetB3","urn:URGI/study/BTH_Rennes_2012_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2013_SetB1","urn:URGI/study/BTH_Rennes_2013_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2013_SetB2","urn:URGI/study/BTH_Rennes_2013_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2013_SetB3","urn:URGI/study/BTH_Rennes_2013_SetB3_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2014_SetB1","urn:URGI/study/BTH_Rennes_2014_SetB1_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2014_SetB2","urn:URGI/study/BTH_Rennes_2014_SetB2_PIETIN-VERSE","urn:URGI/study/BTH_Rennes_2014_SetB3","urn:URGI/study/BTH_Rennes_2014_SetB3_PIETIN-VERSE"] + } + """; + + @Test + void should_call_calls() throws Exception { + + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/calls"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode serverInfoFileJson = mapper.readTree(ResourceUtils.getFile("classpath:calls.json")); + JSONAssert.assertEquals( + serverInfoFileJson.toString(), + response.getBody(), false); + + + } + + + @Test + void should_get_germplasm_by_germplasmDbId() throws Exception { + + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm/dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + } + + @Test + void should_get_germplasm_by_germplasmDbId_full_check() throws Exception { + + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm/aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1Y4V1JIWQ=="), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.accessionNumber"); + assertThat(accNumber).isEqualTo("13481"); + JSONObject actualgermplasmJson = new JSONObject(response.getBody()).getJSONObject("result"); + + assertThat(actualgermplasmJson).isNotNull(); + + JSONAssert.assertEquals(APACHE_GERMPLASM, actualgermplasmJson, JSONCompareMode.LENIENT); + + } + + /*@Test + void should_get_germplasm_by_accessionNumber_by_page_O_pageSize_1() throws Exception { + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm?accessionNumber=IRGC53931&page=0&pageSize=1"), + HttpMethod.GET, entity, String.class); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.data.[0].accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + Integer pageSize = JsonPath.parse(response.getBody()).read("$.metadata.pagination.pageSize"); + assertThat(pageSize).isEqualTo(1); + } + + + @Test + void should_get_germplasm_by_accessionNumber() throws Exception { + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm?accessionNumber=IRGC53931"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.data.[0].accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + }*/ + + @Test + void should_search_germplasm_by_dbids() throws URISyntaxException { + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + HttpEntity<String> entity = new HttpEntity<>("{\"germplasmDbIds\": [\"dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5\"]}", headers); + + URI uri = new URI(createURLWithPort("/brapi/v2/search/germplasm")); + ResponseEntity<String> response = testRestTemplate.postForEntity(uri, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + } + + @Test + void should_get_all_germplasm_first_page(){ + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Integer pageSize = JsonPath.parse(response.getBody()).read("$.metadata.pagination.pageSize"); + assertThat(pageSize).isEqualTo(10); + Integer page = JsonPath.parse(response.getBody()).read("$.metadata.pagination.currentPage"); + assertThat(page).isEqualTo(0); + } + + @Test + void should_get_all_germplasm_2nd_page(){ + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v1/germplasm?page=1"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + Integer pageSize = JsonPath.parse(response.getBody()).read("$.metadata.pagination.pageSize"); + assertThat(pageSize).isEqualTo(10); + Integer page = JsonPath.parse(response.getBody()).read("$.metadata.pagination.currentPage"); + assertThat(page).isEqualTo(1); + } + + @Test + void germplasmAttribute() { + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2ControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2ControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bc85dc4dc32d1cccb38774b71a8af1ffa0329ce9 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/api/brapi/v2/GermplasmV2ControllerTest.java @@ -0,0 +1,186 @@ +package fr.inrae.urgi.faidare.api.brapi.v2; + +/** + * Unit tests for {@link GermplasmController} + * @author Cpommier + */ + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jayway.jsonpath.JsonPath; +import fr.inrae.urgi.faidare.Application; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.v2.GermplasmV2Dao; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.*; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.ResourceUtils; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = Application.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class GermplasmV2ControllerTest { + + + @Autowired + protected GermplasmV2Dao germplasmDao; + + @Value("${server.servlet.context-path}") + private String contextPath; + + + @LocalServerPort + private int port; + + TestRestTemplate testRestTemplate = new TestRestTemplate(); + HttpHeaders headers = new HttpHeaders(); + + + private String createURLWithPort(String uri) { + return "http://localhost:" + port + contextPath + uri; + } + + @Test + void should_call_serverinfo() throws Exception{ + + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v2/serverinfo"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode serverInfoFileJson = mapper.readTree(ResourceUtils.getFile("classpath:serverinfo.json")); + JSONAssert.assertEquals( + serverInfoFileJson.toString(), + response.getBody(), false); + + + } + + + + @Test + void should_get_germplasm_by_germplasmDbId() throws Exception { + + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v2/germplasm/dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + } + + + + @Test + void should_get_germplasm_by_accessionNumber_by_page_O_pageSize_1() throws Exception { + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v2/germplasm?accessionNumber=IRGC53931&page=0&pageSize=1"), + HttpMethod.GET, entity, String.class); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.data.[0].accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + Integer pageSize = JsonPath.parse(response.getBody()).read("$.metadata.pagination.pageSize"); + assertThat(pageSize).isEqualTo(1); + } + + + @Test + void should_get_germplasm_by_accessionNumber() throws Exception { + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v2/germplasm?accessionNumber=IRGC53931"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String accNumber = JsonPath.parse(response.getBody()).read("$.result.data.[0].accessionNumber"); + assertThat(accNumber).isEqualTo("IRGC53931"); + } + + @Test + void should_search_germplasm_by_dbids() throws URISyntaxException { + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + HttpEntity<String> entity = new HttpEntity<>("{\"germplasmDbIds\": [\"dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5\"]}", headers); + + URI uri = new URI(createURLWithPort("/brapi/v2/search/germplasm")); + ResponseEntity<String> response = testRestTemplate.postForEntity(uri, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + } + + + + @Test + void germplasmAttribute() { + } + + @Test + void should_get_collection(){ + HttpEntity<String> entity = new HttpEntity<>(null, headers); + + ResponseEntity<String> response = testRestTemplate.exchange( + createURLWithPort("/brapi/v2/collection"), + HttpMethod.GET, entity, String.class); + assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); + String collName = JsonPath.parse(response.getBody()).read("$.result.data.[0].name"); + assertThat(collName).isEqualTo("SMALL_GRAIN_CEREALS_NETWORK_COL"); + } + + @Test + public void unitTestGetAliasName() { + FaidareProperties properties = new FaidareProperties(); + properties.setElasticsearchIndexingTemplate("faidare_{documentType}"); + + String aliasName = properties.getAliasName("germplasm", 0L); + assertThat(aliasName).isEqualTo("faidare_germplasm-group0"); + } + + @Autowired + private FaidareProperties faidareProperties; + + @Test + public void integrationTestAliasName() { + String indexName = faidareProperties.getAliasName("germplasm", 0L); + assertThat(indexName).isEqualTo("faidare_germplasm_dev-group0"); + } + + @Test + public void testIndexation() { + // Créer un document à indexer + GermplasmV2VO germplasm = new GermplasmV2VO(); + germplasm.setGermplasmDbId("123"); + germplasm.setGermplasmName("Test Germplasm"); + + // Indexer le document + germplasmDao.save(germplasm); + + // Vérifier que le document a bien été indexé + GermplasmV2VO indexedGermplasm = germplasmDao.findById("123").orElse(null); + assertNotNull(indexedGermplasm); + assertEquals("Test Germplasm", indexedGermplasm.getGermplasmName()); + } +} + + diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/ColPopV2DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/ColPopV2DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6fa03b80d823aa449503965d632079a6e1a01708 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/ColPopV2DaoTest.java @@ -0,0 +1,26 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.dao.v2.CollectionV2Dao; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +public class ColPopV2DaoTest { + + @Autowired + protected CollectionV2Dao dao; + + @Test + public void should_get_all_CollPops(){ + BrapiListResponse<CollPopVO> response = dao.getAllCollections(); + assertThat(response).isNotNull(); + assertThat(response.getMetadata().getPagination().getTotalCount()).isGreaterThan(11); + assertThat(response.getResult().getData()).anyMatch(collPop -> collPop.getName().equals("SMALL_GRAIN_CEREALS_NETWORK_COL")); + + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmMcpdDaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmMcpdDaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d9fd525f1a961a326838416e820943bc71b10667 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmMcpdDaoTest.java @@ -0,0 +1,47 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v2.GermplasmMcpdDao; +import fr.inrae.urgi.faidare.domain.GermplasmMcpdVO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class GermplasmMcpdDaoTest { + + @Autowired + protected GermplasmMcpdDao germplasmMcpdDao; + + + @Test + void getByPUID() { + GermplasmMcpdVO germplasmVo = + germplasmMcpdDao.getByPUID("https://doi.org/10.15454/4NCDUP"); + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo).isInstanceOf(GermplasmMcpdVO.class); + assertThat(germplasmVo.getAncestralData()).isNotNull(); + assertThat(germplasmVo.getAncestralData()).isEqualTo("RE99102"); + + } + + @Test + void getByGermplasmDbId() { + GermplasmMcpdVO germplasmVo = + germplasmMcpdDao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo).isInstanceOf(GermplasmMcpdVO.class); + assertThat(germplasmVo.getAncestralData()).isNotNull(); + assertThat(germplasmVo.getAncestralData()).isEqualTo("RECITAL"); + } + + @Test + void findByGermplasmDbIdIn() { + List<GermplasmMcpdVO> list = germplasmMcpdDao.findByGermplasmDbIdIn(Set.of("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5", "not-existing")).toList(); + assertThat(list).extracting(GermplasmMcpdVO::getGermplasmDbId).containsOnly("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmPedigreeV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmPedigreeV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c5b554f9142f4ab807f5e1d5631a9532d88c7e6f --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmPedigreeV1DaoTest.java @@ -0,0 +1,115 @@ +package fr.inrae.urgi.faidare.dao; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.inrae.urgi.faidare.dao.v1.GermplasmPedigreeV1Dao; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmPedigreeV1VO; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; +import org.skyscreamer.jsonassert.JSONCompareMode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +public class GermplasmPedigreeV1DaoTest { + + @Autowired + protected GermplasmPedigreeV1Dao dao; + String expectedPedigreeFull = """ + { + "groupId" : 0, + "germplasmDbId" : "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0LzZHRlc4VQ==", + "defaultDisplayName" : "661300425", + "crossingPlan" : "Factorial", + "familyCode" : "0504B", + "parent1DbId" : "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1NQQTBRSQ==", + "parent1Name" : "73028-62", + "parent1Type" : "FEMALE", + "parent2DbId" : "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0cwT1NVQg==", + "parent2Name" : "101-74", + "parent2Type" : "MALE", + "siblings" : [ + { + "germplasmDbId" : "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0ZaWDhLTw==", + "defaultDisplayName" : "661302619", + "germplasmURI" : "https://doi.org/10.15454/FZX8KO" + }, + { + "germplasmDbId" : "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1hZREs0TA==", + "defaultDisplayName" : "661302686", + "germplasmURI" : "https://doi.org/10.15454/XYDK4L" + } + ], + "germplasmPedigreeDbId" : "dXJuOlVSR0kvZ2VybXBsYXNtUGVkaWdyZWUvMTk4MzYyNjQxOA==", + "germplasmPedigreeURI" : "urn:URGI/germplasmPedigree/1983626418", + "@type" : "germplasmPedigree", + "@id" : "urn:URGI/germplasmPedigree/1983626418", + "schema:includedInDataCatalog" : "https://urgi.versailles.inrae.fr/gnpis", + "schema:identifier" : "1983626418", + "schema:name" : null, + "germplasmURI" : "https://doi.org/10.15454/6GFW8U", + "parent1URI" : "https://doi.org/10.15454/SPA0QI", + "parent2URI" : "https://doi.org/10.15454/G0OSUB" + } + """; + + String expectedPedigree = """ + { + "groupId": 0, + "germplasmDbId": "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQ1MDM3-test", + "defaultDisplayName": "661300238", + "crossingPlan": "Factorial", + "crossingYear": null, + "familyCode": "0504B", + "pedigree": null, + "parent1DbId": "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQzMTY1", + "parent1Name": "73028-62", + "parent1Type": "FEMALE", + "parent2DbId": "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQzMTQ4", + "parent2Name": "101-74", + "parent2Type": "MALE", + "siblings": [ + { + "germplasmDbId": "46452", + "defaultDisplayName": "661303513" + }, + { + "germplasmDbId": "46389", + "defaultDisplayName": "661303449" + } + ], + "germplasmPedigreeDbId": "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtUGVkaWdyZWUvNDE1MTAxODg4-test", + "germplasmPedigreeURI": "urn:INRAE-URGI/germplasmPedigree/415101888-test", + "germplasmURI": "urn:INRAE-URGI/germplasm/45037-test", + "parent1URI": "urn:INRAE-URGI/germplasm/43165", + "parent2URI": "urn:INRAE-URGI/germplasm/43148", + "@id": "urn:INRAE-URGI/germplasmPedigree/415101888-test", + "@type": "germplasmPedigree" + } + """; + + /** + * To use for GermplasmController{ + * germplasmRepository.findPedigree(germplasm.getGermplasmDbId()); + * } + */ + @Test + public void should_get_one_pedigree_perDbId(){ + GermplasmPedigreeV1VO vo = dao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQ1MDM3-test"); + assertThat(vo).isNotNull(); + assertThat(vo.getGermplasmDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQ1MDM3-test"); + ObjectMapper jacksonMapper = new ObjectMapper(); + try { + JSONAssert.assertEquals(expectedPedigree, jacksonMapper.writeValueAsString(vo), JSONCompareMode.LENIENT); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } catch (JSONException e) { + throw new RuntimeException(e); + } + + + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..25eaa49643db57a5d39d98c209343c4654ee627d --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV1DaoTest.java @@ -0,0 +1,440 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.domain.PuiNameValueVO; +import fr.inrae.urgi.faidare.domain.brapi.GermplasmSitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; +import org.springframework.data.elasticsearch.core.SearchHitsIterator; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class GermplasmV1DaoTest { + + @Autowired + protected GermplasmV1Dao germplasmDao; + + /** + Code tested For futur implementation in Faidare cards: + public ModelAndView get(@PathVariable("germplasmId") String germplasmId) { + GermplasmVO germplasm = germplasmDao.getByGermplasmDbId(germplasmId); + + @GetMapping(params = "id") + public ModelAndView getById(@RequestParam("id") String germplasmId) { + GermplasmVO germplasm = germplasmRepository.getByGermplasmDbId(germplasmId); + */ + @Test + void getByGermplasmDbId_should_return_one_result() { + GermplasmV1VO germplasmVo = + germplasmDao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo.getGermplasmDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + } + + + /** + * Code tested For Faidare cards: + * @GetMapping(params = "pui") + * public ModelAndView getByPui(@RequestParam("pui") String pui) { + * GermplasmV1VO germplasmVo = + * germplasmDao.getByGermplasmPUI(pui); + */ + @Test + void getByGermplasmPUI_should_return_one_result() { + GermplasmV1VO germplasmVo = + germplasmDao.getByGermplasmPUI("https://doi.org/10.15454/4NCDUP"); + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo.getGermplasmPUI()) + .isEqualTo("https://doi.org/10.15454/4NCDUP"); + assertThat(germplasmVo.getGermplasmDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI2MDAy"); + } + +// test : Iterator<GermplasmVO> scrollGermplasmsByIds(Set<String> ids, int fetchSize); + + /** + * Should be usable for backend/src/main/java/fr/inra/urgi/faidare/web/germplasm/GermplasmController.java + + @PostMapping("/exports/plant-material") + @ResponseBody + public ResponseEntity<StreamingResponseBody> export(@Validated @RequestBody GermplasmExportCommand command) { + List<GermplasmExportableField> fields = getFieldsToExport(command); + + StreamingResponseBody body = out -> { + Iterator<GermplasmVO> iterator = germplasmRepository.scrollGermplasmsByIds(command.getIds(), 1000); + germplasmExportService.export(out, iterator, fields); + + By using germplasmDao.scrollGermplasmsByGermplasmDbIds instead of germplasmRepository.scrollGermplasmsByIds + */ + @Test + void should_get_germplasms_by_id1(){ + Set<String> dbIds = Set.of("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5",//recital + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MzI4",//soisson + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0NTA1");//TREMIE + SearchHitsIterator<GermplasmV1VO> gVoIter = germplasmDao.scrollGermplasmsByGermplasmDbIds(dbIds, 10); + assertThat(gVoIter).isNotNull(); + assertThat(gVoIter.getTotalHits()).isEqualTo(3); + GermplasmV1VO gVo = Objects.requireNonNull(gVoIter.stream() + .filter(gVoHit -> "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MzI4".equals(gVoHit.getContent().getGermplasmDbId())) + .findAny().orElse(null)).getContent(); + assertThat(gVo).isNotNull(); + assertThat(gVo.getGermplasmName()).isEqualTo("SOISSONS"); + } + + /** + * Code to use in controllers for + * germplasmCriteria.setGermplasmDbIds(Lists.newArrayList(study.getGermplasmDbIds())); + * return germplasmRepository.find(germplasmCriteria) + * + */ + @Test + void should_get_germplasms_by_id2(){ + Set<String> dbIds = Set.of("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5",//recital + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MzI4",//soisson + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0NTA1",//TREMIE + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI1NTg1",//ISENGRAIN + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI1NjEy",//APACHE + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI1ODk1",//CF00193 + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI1OTEz");//CAPHORN + SearchHitsIterator<GermplasmV1VO> gVoIter = germplasmDao.scrollGermplasmsByGermplasmDbIds(dbIds, 3); + assertThat(gVoIter).isNotNull(); + assertThat(gVoIter.getTotalHits()).isEqualTo(7); + Set<String> resultSet = new HashSet<>(); + while (gVoIter.hasNext()){ + GermplasmV1VO v1VO = gVoIter.next().getContent(); + resultSet.add( v1VO.getGermplasmDbId()); + } + assertThat(resultSet.size()).isEqualTo(7); + assertThat(resultSet).isEqualTo(dbIds); + } + + @Test + void findByGermplasmDbIdIn() { + String id = "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"; + List<GermplasmV1VO> list = germplasmDao.findByGermplasmDbIdIn(Set.of(id)).toList(); + assertThat(list).extracting(GermplasmV1VO::getGermplasmDbId).containsOnly(id); + } + + @Test + void findAllForSitemap() { + List<GermplasmSitemapVO> list = germplasmDao.findAllForSitemap().toList(); + assertThat(list.size()).isGreaterThan(1); + assertThat(list.get(0)).isInstanceOf(GermplasmSitemapVO.class); + assertThat(list.get(0).getGermplasmDbId()).isNotNull(); + } + + @Test + void should_find_by_germplasmId(){ + GermplasmV1VO gVo = germplasmDao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + assertThat(gVo).isNotNull(); + assertThat(gVo.getGermplasmDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + assertThat(gVo.getGermplasmPUI()).isEqualTo("https://doi.org/10.15454/WL6NIE"); + assertThat(gVo.getGermplasmName()).isEqualTo("RECITAL"); + assertThat(gVo.getAccessionNames()).contains("RECITAL"); + } + + @Test + void should_find_by_germplasmId_with_collecting_site2(){ + GermplasmV1VO gVo = germplasmDao.getByGermplasmDbId("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0VFVkNaUQ=="); + assertThat(gVo).isNotNull(); + assertThat(gVo.getGermplasmDbId()).isEqualTo("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0VFVkNaUQ=="); + assertThat(gVo.getCollectingSite()).isNotNull(); + assertThat(gVo.getCollectingSite().getSiteId()).isEqualTo("40635"); + assertThat(gVo.getCollectingSite().getSiteName()).isEqualTo("(U) Liamone - ULI"); + assertThat(gVo.getCollectingSite().getLatitude()).isEqualTo(42.124165); + assertThat(gVo.getCollectingSite().getLongitude()).isEqualTo(8.749445); + assertThat(gVo.getCollectingSite().getSiteType()).isEqualTo("Origin and Collecting site"); + } + + @Test + void should_get_by_germplasm_id_and_have_collector(){ + GermplasmV1VO gVo = germplasmDao.getByGermplasmDbId("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0VFVkNaUQ=="); + assertThat(gVo).isNotNull(); + assertThat(gVo.getGermplasmDbId()).isEqualTo("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0VFVkNaUQ=="); + assertThat(gVo.getCollector()).isNotNull(); + assertThat(gVo.getCollector().getInstitute().getAcronym()).isEqualTo("INRAE_ONF_UMR_BioForA"); + assertThat(gVo.getCollector().getMaterialType()).isEqualTo("Cutting"); + assertThat(gVo.getCollector().getAccessionCreationDate()).isEqualTo(20091200); + } + + @Test + void should_get_by_germplasm_id_and_have_children(){ + GermplasmV1VO gVo = germplasmDao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQzMTY1"); + assertThat(gVo).isNotNull(); + assertThat(gVo.getGermplasmDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQzMTY1"); + assertThat(gVo.getChildren()).isNotNull(); + assertThat(gVo.getChildren().size()).isEqualTo(11); + assertThat(gVo.getChildren().get(0).getFirstParentPUI()).isEqualTo("https://doi.org/10.15454/SPA0QI"); + PuiNameValueVO pnv = new PuiNameValueVO(); + pnv.setPui("https://doi.org/10.15454/OMH2PC"); + assertThat(gVo.getChildren().get(0).getSibblings()).isNotNull().isNotEmpty().contains(pnv); + } + //TODO: criteria search, to reactivate for full BrAPIV1 + /* + @Test + void custom_should_search_by_accessionNumber(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setAccessionNumber(List.of("IRGC53931")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getAccessionNumber()).isEqualTo("IRGC53931"); + } + + @Test + void custom_should_search_by_binomialNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setBinomialNames(List.of("Zea mays")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getGenusSpecies()).isEqualTo("Zea mays"); + } + + @Test + void custom_should_search_by_collection(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("Wheat INRA collection"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("Wheat INRA collection") ; + assertThat(germplasmVOs.getResult().getData().get(0).getCollection().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_panel(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("RIL"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("RIL") ; + assertThat(germplasmVOs.getResult().getData().get(0).getPanel().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_pop(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("ILN028"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("ILN028") ; + assertThat(germplasmVOs.getResult().getData().get(0).getPopulation().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_commonCropNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCommonCropNames(List.of("Maize")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + GermplasmV2VO toto = germplasmVOs.getResult().getData().get(0); + assertThat(toto.getCommonCropName()).isEqualTo("Maize"); + } + + void custom_should_search_by_externalReferenceIDs(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceIDs(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_externalReferenceIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_externalReferenceSources(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceSources(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + // assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_familyCodes(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setFamilyCodes(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_genus(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGenus(List.of("Oryza")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getGenus()).isEqualTo("Oryza"); + } + + @Test + void custom_should_search_by_genus_pageSize1(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGenus(List.of("Oryza")); + gCrit.setPageSize(1); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getPageSize()).isEqualTo(1); + assertThat(germplasmVOs.getMetadata().getPagination().getCurrentPage()).isEqualTo(0); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(60); + assertThat(germplasmVOs.getResult().getData().get(0).getGenus()).isEqualTo("Oryza"); + } + + @Test + void custom_should_search_by_germplasmDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmDbIds(List.of("dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5", "aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1NQQTBRSQ==")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(2); + assertThat(germplasmVOs.getResult().getData().get(0).getGermplasmDbId()).isEqualTo("dXJuOklCRVQvYmU0ZTljZGMtNTgwMC00NDU3LWE2YzgtNDA1NjNjMDI3ZGQ5"); + assertThat(germplasmVOs.getResult().getData().get(1).getGermplasmDbId()).isEqualTo("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L1NQQTBRSQ=="); + } + + @Test + void custom_should_search_by_germplasmName(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmName(List.of("APACHE")); + BrapiListResponse<GermplasmV2VO> pgVo = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(pgVo).isNotNull(); + assertThat(pgVo.getResult().getData()).isNotEmpty(); + assertThat(pgVo.getResult().getData().get(0).getGermplasmName()).isEqualTo("APACHE"); + } + + @Test + void custom_should_search_by_germplasmPUIs(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmPUIs(List.of("27756e94-501e-41f4-8482-250c6f3527b7")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getGermplasmPUI()).isEqualTo("27756e94-501e-41f4-8482-250c6f3527b7"); + } + + @Test + void custom_should_search_by_instituteCodes(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setInstituteCodes(List.of("PHL001")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getInstituteCode()).isEqualTo("PHL001"); + } + + + void custom_should_search_by_parentDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setParentDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_progenyDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgenyDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_programDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgramDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_programNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgramNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_species(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setSpecies(List.of("aestivum")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getSpecies()).isEqualTo("aestivum"); + } + + + @Test + void custom_should_search_by_studyDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setStudyDbIds(List.of("dXJuOklCRVQvc3R1ZHkvMQ==")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getStudyDbIds()).contains("dXJuOklCRVQvc3R1ZHkvMQ=="); + } + + void custom_should_search_by_studyNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setStudyNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + //assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_synonyms(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setSynonyms(List.of("Hsinchu 103")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getSynonyms()).contains("Hsinchu 103"); + } + + void custom_should_search_by_trialDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setTrialDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_trialNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setTrialNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + // assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + */ +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV2DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV2DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..85037e16f1ffe139d7227d2abe4b04bceb835e25 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/GermplasmV2DaoTest.java @@ -0,0 +1,323 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.api.brapi.v2.BrapiListResponse; +import fr.inrae.urgi.faidare.dao.v2.GermplasmCriteria; +import fr.inrae.urgi.faidare.dao.v2.GermplasmV2Dao; +import fr.inrae.urgi.faidare.domain.CollPopVO; +import fr.inrae.urgi.faidare.domain.brapi.v2.GermplasmV2VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; +import java.util.function.Predicate; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class GermplasmV2DaoTest { + + @Autowired + protected GermplasmV2Dao germplasmDao; + +/* + @Test + void getByGermplasmDbId_Mcpd_flavor_test() { + GermplasmMcpdVO germplasmVo = + germplasmDao.getByGermplasmDbId("dXJuOklCRVQvNzc5OGU1N2QtNzZjYS00ZjJiLTliMDctYmI5NTI0ODZlYjFi"); + + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo).isInstanceOf(GermplasmMcpdVO.class); + assertThat(germplasmVo.getAccessionNames()).isNull(); + if (germplasmVo.getAccessionNames() != null) { + assertThat(germplasmVo.getAccessionNames()).isEmpty(); + } + + } */ + + @Test + void getByGermplasmDbId_should_return_one_result() { + GermplasmV2VO germplasmVo = + germplasmDao.getByGermplasmDbId("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0NTA1"); + + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo.getGermplasmDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0NTA1"); + } + + @Test + void getByGermplasmPUI_should_return_one_result() { + GermplasmV2VO germplasmVo = + germplasmDao.getByGermplasmPUI("https://doi.org/10.15454/WL6NIE"); + assertThat(germplasmVo).isNotNull(); + assertThat(germplasmVo.getGermplasmPUI()) + .isEqualTo("https://doi.org/10.15454/WL6NIE"); + assertThat(germplasmVo.getGermplasmDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + } + + @Test + void custom_should_search_by_accessionNumber(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setAccessionNumber(List.of("EM01324")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(1); + assertThat(germplasmVOs.getResult().getData().get(0).getAccessionNumber()).isEqualTo("EM01324"); + } + + @Test + void custom_should_search_by_binomialNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setBinomialNames(List.of("Triticum aestivum")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getGenusSpecies()).isEqualTo("Triticum aestivum"); + } + + @Test + void custom_should_search_by_collection(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("Wheat INRA collection"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(200); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("Wheat INRA collection") ; + assertThat(germplasmVOs.getResult().getData().get(0).getCollection().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_panel(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("RIL"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("RIL") ; + assertThat(germplasmVOs.getResult().getData().get(0).getPanel().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_pop(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCollections((List.of("ILN028"))); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + Predicate<CollPopVO> streamsPredicate = item -> item.getName().equals("ILN028") ; + assertThat(germplasmVOs.getResult().getData().get(0).getPopulation().stream().filter(streamsPredicate)).isNotEmpty(); + } + + @Test + void custom_should_search_by_commonCropNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setCommonCropNames(List.of("Wheat")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + GermplasmV2VO toto = germplasmVOs.getResult().getData().get(0); + assertThat(toto.getCommonCropName()).isEqualTo("Wheat"); + } + + void custom_should_search_by_externalReferenceIDs(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceIDs(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_externalReferenceIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_externalReferenceSources(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setExternalReferenceSources(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + // assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_familyCodes(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setFamilyCodes(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_genus(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGenus(List.of("Populus")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getGenus()).isEqualTo("Populus"); + } + + @Test + void custom_should_search_by_genus_pageSize1(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGenus(List.of("Triticum")); + gCrit.setPageSize(1); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getPageSize()).isEqualTo(1); + assertThat(germplasmVOs.getMetadata().getPagination().getCurrentPage()).isEqualTo(0); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(544); + assertThat(germplasmVOs.getResult().getData().get(0).getGenus()).isEqualTo("Triticum"); + } + + @Test + void custom_should_search_by_germplasmDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmDbIds(List.of( + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5",//recital + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MzI4",//soisson + "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0NTA1"//TREMIE + )); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(3); + assertThat(germplasmVOs.getResult().getData().get(0).getGermplasmDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MDU5"); + assertThat(germplasmVOs.getResult().getData().get(1).getGermplasmDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI0MzI4"); + } + + @Test + void custom_should_search_by_germplasmName(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmName(List.of("APACHE")); + BrapiListResponse<GermplasmV2VO> pgVo = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(pgVo).isNotNull(); + assertThat(pgVo.getResult().getData()).isNotEmpty(); + assertThat(pgVo.getResult().getData().get(0).getGermplasmName()).isEqualTo("APACHE"); + } + + @Test + void custom_should_search_by_germplasmPUIs(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setGermplasmPUIs(List.of("gnpis_pui:holding-921_taxon-4898_accession-49472")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isEqualTo(1); + assertThat(germplasmVOs.getResult().getData().get(0).getGermplasmPUI()).isEqualTo("gnpis_pui:holding-921_taxon-4898_accession-49472"); + } + + @Test + void custom_should_search_by_instituteCodes(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setInstituteCodes(List.of("FRA095")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(10); + assertThat(germplasmVOs.getResult().getData().get(0).getInstituteCode()).isEqualTo("FRA095"); + } + + //might be unrelevant or badly implemented with V2, see pedigree call + void custom_should_search_by_parentDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setParentDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_progenyDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgenyDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_programDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgramDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_programNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setProgramNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_species(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setSpecies(List.of("aestivum")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getSpecies()).isEqualTo("aestivum"); + } + + + @Test + void custom_should_search_by_studyDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setStudyDbIds(List.of("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAyX1RFQ0g=")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(10); + assertThat(germplasmVOs.getResult().getData().get(0).getStudyDbIds()).contains("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDAyX1RFQ0g="); + } + + void custom_should_search_by_studyNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setStudyNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + //assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + @Test + void custom_should_search_by_synonyms(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setSynonyms(List.of("test-synonym")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = + germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()) + .isGreaterThan(0); + assertThat(germplasmVOs.getResult().getData().get(0).getSynonyms()) + .contains("test-synonym"); + assertThat(germplasmVOs.getResult().getData().get(0).getGermplasmDbId()) + .isEqualTo("aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0VFVkNaUQ=="); + } + + void custom_should_search_by_trialDbIds(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setTrialDbIds(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); +// assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } + + void custom_should_search_by_trialNames(){ + GermplasmCriteria gCrit = new GermplasmCriteria(); + gCrit.setTrialNames(List.of("")); + BrapiListResponse<GermplasmV2VO> germplasmVOs = germplasmDao.findGermplasmsByCriteria(gCrit); + assertThat(germplasmVOs).isNotNull(); + assertThat(germplasmVOs.getMetadata().getPagination().getTotalCount()).isGreaterThan(0); + // assertThat(germplasmVOs.getSearchHits().getSearchHit(0).getContent().get()).isEqualTo(""); + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/LocationV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/LocationV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d5a9a845ef2cf21fdc271767928e5f62f70b5457 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/LocationV1DaoTest.java @@ -0,0 +1,35 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v1.LocationV1Dao; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.brapi.LocationSitemapVO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +public class LocationV1DaoTest { + + @Autowired + protected LocationV1Dao locDao; + + @Test + public void should_get_one_location_perDbId(){ + LocationVO lVo = locDao.getByLocationDbId("dXJuOklOUkFFLVVSR0kvbG9jYXRpb24vMTk5NA=="); + assertThat(lVo).isNotNull(); + assertThat(lVo.getLocationDbId()).isEqualTo("dXJuOklOUkFFLVVSR0kvbG9jYXRpb24vMTk5NA=="); + assertThat(lVo.getLocationName()).isEqualTo("Clermont-Ferrand"); + } + + @Test + void findAllForSitemap() { + List<LocationSitemapVO> list = locDao.findAllForSitemap().toList(); + assertThat(list.size()).isGreaterThan(1); + assertThat(list.get(0)).isInstanceOf(LocationSitemapVO.class); + assertThat(list.get(0).getLocationDbId()).isNotNull(); + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5e54133c8d8ba0bc026094e6f6da88ab4106b3ac --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV1DaoTest.java @@ -0,0 +1,87 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v1.StudyV1Dao; +import fr.inrae.urgi.faidare.domain.brapi.StudySitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class StudyV1DaoTest { + + @Autowired + protected StudyV1Dao studyV1Dao; + + /** + * Code tested For futur implementation in Faidare cards: + * public ModelAndView get(@PathVariable("germplasmId") String germplasmId) { + * GermplasmVO germplasm = germplasmDao.getByGermplasmDbId(germplasmId); + * + * @GetMapping(params = "id") + * public ModelAndView getById(@RequestParam("id") String germplasmId) { + * GermplasmVO germplasm = germplasmRepository.getByGermplasmDbId(germplasmId); + */ + @Test + void getByStudyDbId_should_return_one_result() { + StudyV1VO sVo = + studyV1Dao.getByStudyDbId("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA0X1RFQ0g="); + + assertThat(sVo).isNotNull(); + assertThat(sVo.getStudyDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0xlX01vdWxvbl8yMDA0X1RFQ0g="); + } + + @Test + void getByStudyDbId_should_return_lastUpdate() { + StudyV1VO sVo = + studyV1Dao.getByStudyDbId("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDRfVEVDSA=="); + + assertThat(sVo).isNotNull(); + assertThat(sVo.getStudyDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMDRfVEVDSA=="); + assertThat(sVo.getLastUpdate().getTimestamp()).isNotNull().containsSubsequence("2017-02-21"); + } + + /** + * Present for historic reasons. + * replacement code for + * public Set<String> getVariableIds(String studyDbId) + */ + @Test + void should_get_variables_by_study_id(){ + StudyV1VO sVo = + studyV1Dao.getByStudyDbId("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTBfVEVDSA=="); + + assertThat(sVo).isNotNull(); + assertThat(sVo.getStudyDbId()) + .isEqualTo("dXJuOklOUkFFLVVSR0kvc3R1ZHkvQlRIX0VzdHIlQzMlQTllcy1Nb25zXzIwMTBfVEVDSA=="); + Set<String> obsVarIds = Set.copyOf(sVo.getObservationVariableDbIds()); + assertThat(obsVarIds).isNotNull().isNotEmpty().hasSizeGreaterThan(10); + assertThat(obsVarIds).contains("CO_321:1000216"); + assertThat(obsVarIds).containsAll(List.of("CO_321:1000227", + "CO_321:1000228", + "CO_321:1000229", + "CO_321:1000230", + "CO_321:1000231", + "CO_321:1000236", + "CO_321:1000237", + "CO_321:1000238", + "CO_321:1000239", + "CO_321:1000240")); + assertThat(obsVarIds).doesNotContain("foo"); + } + + @Test + void findAllForSitemap() { + List<StudySitemapVO> list = studyV1Dao.findAllForSitemap().toList(); + assertThat(list.size()).isGreaterThan(1); + assertThat(list.get(0)).isInstanceOf(StudySitemapVO.class); + assertThat(list.get(0).getStudyDbId()).isNotNull(); + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV2DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV2DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..58a8c0501f96c6b04aecf3860e9e11617e6f5b21 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/StudyV2DaoTest.java @@ -0,0 +1,226 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v2.StudyCriteria; +import fr.inrae.urgi.faidare.dao.v2.StudyV2Dao; +import fr.inrae.urgi.faidare.domain.brapi.v2.StudyV2VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; +import org.springframework.data.elasticsearch.core.SearchHits; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class StudyV2DaoTest { + + /** + * StudyV1VO and StudyV2VO are compatible enough. + * Therefore, there is no studyV1DAO, only a StudyV2DAO that serves both + */ + + @Autowired + protected StudyV2Dao studyV2Dao; + + @Test + void getByStudyDbId_should_return_empty_result() { + StudyV2VO studyVO = + studyV2Dao.getByStudyDbId("foo"); + assertThat(studyVO).isNull(); + } + + @Test + void getByStudyDbID_studyDbId(){ + StudyV2VO studyVO = studyV2Dao.getByStudyDbId("dXJuOklCRVQvc3R1ZHkvMQ=="); + assertThat(studyVO).isNotNull(); + assertThat(studyVO.getStudyDbId()).isEqualTo("dXJuOklCRVQvc3R1ZHkvMQ=="); + } + + @Test + void custom_should_search_by_commonCropNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setCommonCropNames(List.of("Rice")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getCommonCropName()).isEqualTo("Rice"); + } + + + //TODO : check if this is in the spec + void custom_should_search_by_externalReferenceIDs(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setExternalReferenceIDs(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); +// assertThat(studyVOs.getSearchHit(0).getContent().getExternalReferences()).contains(""); + } + + + //TODO : check if this is in the spec + void custom_should_search_by_externalReferenceSources(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setExternalReferenceSources(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + // assertThat(studyVOs.getSearchHit(0).getContent().get()).isEqualTo(""); + } + + @Test + void custom_should_search_by_germplasmDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setGermplasmDbIds((List.of("dXJuOklCRVQvYTY3OTk1MDgtMmFhOS00NmVjLThjM2MtMjcyZmViODg1MDVi"))); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getGermplasmDbIds()).contains("dXJuOklCRVQvYTY3OTk1MDgtMmFhOS00NmVjLThjM2MtMjcyZmViODg1MDVi"); + } + + + + //TODO : check if this is in the spec + void custom_should_search_by_germplasmNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setGermplasmNames(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + // assertThat(studyVOs.getSearchHit(0).getContent().get()).isEqualTo(""); + } + + @Test + void custom_should_search_by_locationDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setLocationDbIds(List.of("dXJuOklCRVQvbG9jYXRpb24vdW5kZWZpbmVk")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getLocationDbId()).isEqualTo("dXJuOklCRVQvbG9jYXRpb24vdW5kZWZpbmVk"); + } + + @Test + void custom_should_search_by_locationNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setLocationNames(List.of("Grandola (Barradas da Serra)")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getLocationName()).isEqualTo("Grandola (Barradas da Serra)"); + } + + @Test + void custom_should_search_by_observationVariableDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setObservationVariableDbIds(List.of("17")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getObservationVariableDbIds()).contains("17"); + } + + + //TODO : check if this is in the spec + void custom_should_search_by_observationVariableNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setObservationVariableNames(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); +// assertThat(studyVOs.getSearchHit(0).getContent().get()).isEqualTo(""); + } + + + //TODO : check if this is in the spec + void custom_should_search_by_observationVariablePUIs(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setObservationVariablePUIs(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); +// assertThat(studyVOs.getSearchHit(0).getContent().get()).isEqualTo(""); + } + + @Test + void custom_should_search_by_programDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setProgramDbIds(List.of("dXJuOklCRVQvcHJvZ3JhbS8x")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getProgramDbId()).isEqualTo("dXJuOklCRVQvcHJvZ3JhbS8x"); + } + + @Test + void custom_should_search_by_programNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setProgramNames(List.of("INRA Wheat Breeding Network")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getProgramName()).isEqualTo("INRA Wheat Breeding Network"); + } + + //@Test + void custom_should_search_by_seasonDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setSeasonDbIds(List.of("2000")); + //TODO : test data is still V1 compliant + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getTotalHits()).isEqualTo(10); + } + + //@Test + void custom_should_search_by_studyCodes(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setStudyCodes(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getStudyCode()).isEqualTo(""); + } + + @Test + void custom_should_search_by_studyDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setStudyDbIds(List.of("dXJuOklCRVQvc3R1ZHkvMQ==")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getStudyDbId()).isEqualTo("dXJuOklCRVQvc3R1ZHkvMQ=="); + } + + @Test + void custom_should_search_by_studyName(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setStudyNames(List.of("D4")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getStudyName()).isEqualTo("D4"); + } + + void custom_should_search_by_studyPUIs(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setStudyPUIs(List.of("")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getStudyPUI()).isEqualTo(""); + } + + @Test + void custom_should_search_by_studyTypes(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setStudyTypes(List.of("Phenotyping Study")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getStudyType()).isEqualTo("Phenotyping Study"); + } + + @Test + void custom_should_search_by_trialDbIds(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setTrialDbIds(List.of("dXJuOklCRVQvdHJpYWwvMQ==")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getTrialDbId()).contains("dXJuOklCRVQvdHJpYWwvMQ=="); + } + + @Test + void custom_should_search_by_trialNames(){ + StudyCriteria sCrit = new StudyCriteria(); + sCrit.setTrialNames(List.of("Cork quality traits in three populations of Quercus suber")); + SearchHits<StudyV2VO> studyVOs = studyV2Dao.findStudiesByCriteria(sCrit); + assertThat(studyVOs).isNotNull().isNotEmpty(); + assertThat(studyVOs.getSearchHit(0).getContent().getTrialName()).isEqualTo("Cork quality traits in three populations of Quercus suber"); + } + +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/TrialV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/TrialV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f28db76158e6350faa6c58d95275311239c2165a --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/TrialV1DaoTest.java @@ -0,0 +1,24 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.dao.v1.TrialV1Dao; +import fr.inrae.urgi.faidare.domain.brapi.v1.TrialV1VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +public class TrialV1DaoTest { + + @Autowired + protected TrialV1Dao dao; + + @Test + public void should_get_one_location_perDbId(){ + TrialV1VO vo = dao.getByTrialDbId("dXJuOklOUkFFLVVSR0kvdHJpYWwvNw=="); + assertThat(vo).isNotNull(); + assertThat(vo.getTrialName()).isEqualTo("INRA Wheat Network technological variables"); + + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/XRefDaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/XRefDaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..58fb42ef73f856aec89d1ac1a2f93e622573ae0d --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/XRefDaoTest.java @@ -0,0 +1,34 @@ +package fr.inrae.urgi.faidare.dao; + +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +public class XRefDaoTest { + + @Autowired + protected XRefDocumentDao dao; + + /** + * To be used in thymeleaf controlers for the following code : + * List<XRefDocumentVO> crossReferences = xRefDocumentRepository.find( + * XRefDocumentSearchCriteria.forXRefId(study.getStudyDbId()) + */ + @Test + public void should_get_perDbId(){ + //TODO: problem between resources and ressources check what is realy produced byt the current ETL. + List<XRefDocumentVO> lVos = dao.findByLinkedResourcesID("dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzQ1MDI5"); + assertThat(lVos).hasSize(3); + assertThat(lVos).allMatch(vo -> !vo.getUrl().isBlank()); + assertThat(lVos).anyMatch(vo -> vo.getDatabaseName().equals("GnpIS")); + assertThat(lVos).anyMatch(vo -> vo.getEntryType().equals("Phenotyping study")); + assertThat(lVos).anyMatch(vo -> vo.getSpecies().get(0).equals("Populus deltoides")); + + } +} diff --git a/backend/src/test/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeValueV1DaoTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeValueV1DaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7f3deb6ae66f346f94ef70f6929e08006cc70509 --- /dev/null +++ b/backend/src/test/java/fr/inrae/urgi/faidare/dao/v1/GermplasmAttributeValueV1DaoTest.java @@ -0,0 +1,33 @@ +package fr.inrae.urgi.faidare.dao.v1; + +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeValueV1VO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataElasticsearchTest +class GermplasmAttributeValueV1DaoTest { + + @Autowired + GermplasmAttributeV1Dao dao; + + /** + * To be used in Faidare fr/inra/urgi/faidare/web/germplasm/GermplasmController.java + * private List<BrapiGermplasmAttributeValue> getAttributes(GermplasmVO germplasm) + */ + @Test + void should_getByGermplasmDbId() { + String germplasmDbId = "dXJuOklOUkFFLVVSR0kvZ2VybXBsYXNtLzI1NjEy"; + GermplasmAttributeV1VO result = dao.getByGermplasmDbId(germplasmDbId); + assertThat(result).isNotNull(); + assertThat(result.getGermplasmDbId()).isEqualTo(germplasmDbId); + List<GermplasmAttributeValueV1VO> attributeValues = result.getData(); + assertThat(attributeValues).isNotEmpty().hasSize(4); + assertThat(attributeValues.get(0).getAttributeName()).isEqualTo("Growth class"); + } +} diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClientTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClientTest.java similarity index 91% rename from backend/src/test/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClientTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClientTest.java index e557ebbeff9798ba938ebc7665c98c1573f9954d..0014c18de7e08bc3d6558edfdcae26d15ee82d83 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/http/UserGroupsResourceClientTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/repository/http/UserGroupsResourceClientTest.java @@ -1,7 +1,7 @@ -package fr.inra.urgi.faidare.repository.http; +package fr.inrae.urgi.faidare.repository.http; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.filter.AuthenticationStore; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.filter.AuthenticationStore; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/backend/src/test/java/fr/inra/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java similarity index 94% rename from backend/src/test/java/fr/inra/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java index d1bf30709551b515374feddb7942c3f9f93b4301..a390e3c2299e48368180b55c692b6a43a363374f 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/repository/ontology/CropOntologyRepositoryTest.java @@ -1,11 +1,11 @@ -package fr.inra.urgi.faidare.repository.ontology; +package fr.inrae.urgi.faidare.repository.ontology; import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.data.variable.OntologyVO; -import fr.inra.urgi.faidare.domain.data.variable.TraitVO; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepositoryImpl; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.file.CropOntologyRepositoryImpl; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.domain.variable.OntologyVO; +import fr.inrae.urgi.faidare.domain.variable.TraitVO; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/Fixtures.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/Fixtures.java similarity index 64% rename from backend/src/test/java/fr/inra/urgi/faidare/web/Fixtures.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/Fixtures.java index 7b84aefb6f71f61fce51b201713969be15e50bff..ec9a7e88c3877d7dda4a526ed98d2d8032907933 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/Fixtures.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/Fixtures.java @@ -1,42 +1,16 @@ -package fr.inra.urgi.faidare.web; +package fr.inrae.urgi.faidare.web; +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.domain.*; +import fr.inrae.urgi.faidare.domain.brapi.v1.*; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.domain.variable.TraitVO; + +import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiAdditionalInfo; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiSibling; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiStudyDataLink; -import fr.inra.urgi.faidare.domain.brapi.v1.data.BrapiTrialStudy; -import fr.inra.urgi.faidare.domain.data.ContactVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.TrialStudySummaryVO; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.data.germplasm.CollPopVO; -import fr.inra.urgi.faidare.domain.data.germplasm.DonorVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GenealogyVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmInstituteVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.germplasm.InstituteVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PedigreeVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PhotoVO; -import fr.inra.urgi.faidare.domain.data.germplasm.PuiNameValueVO; -import fr.inra.urgi.faidare.domain.data.germplasm.SiblingVO; -import fr.inra.urgi.faidare.domain.data.germplasm.SiteVO; -import fr.inra.urgi.faidare.domain.data.germplasm.TaxonSourceVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDataLinkVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.data.variable.TraitVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSourceImpl; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; - /** * Utility class to create test fixtures * @author JB Nizet @@ -51,13 +25,15 @@ public class Fixtures { site.setUrl("https://google.com"); site.setLatitude(45.65); site.setLongitude(1.34); - BrapiAdditionalInfo additionalInfo = new BrapiAdditionalInfo(); - additionalInfo.addProperty("Slope", 4.32); - additionalInfo.addProperty("Distance to city", "3 km"); - additionalInfo.addProperty("foo", "bar"); - additionalInfo.addProperty("baz", "zing"); - additionalInfo.addProperty("blob", null); - site.setAdditionalInfo(additionalInfo); + + // FIXME JBN uncomment this once LocationVO has additionalInfo +// BrapiAdditionalInfo additionalInfo = new BrapiAdditionalInfo(); +// additionalInfo.addProperty("Slope", 4.32); +// additionalInfo.addProperty("Distance to city", "3 km"); +// additionalInfo.addProperty("foo", "bar"); +// additionalInfo.addProperty("baz", "zing"); +// additionalInfo.addProperty("blob", null); +// site.setAdditionalInfo(additionalInfo); return site; } @@ -72,37 +48,39 @@ public class Fixtures { } public static DataSource createDataSource() { - DataSourceImpl dataSource = new DataSourceImpl(); - dataSource.setUri("Test URI"); - dataSource.setUrl("https://google.fr"); - dataSource.setName("Some Data Source"); - dataSource.setIdentifier("DS1"); - dataSource.setImage("https://images.com/image.png"); - return dataSource; + return new DataSource( + "Test URI", + "Some Data Source", + "https://google.fr", + "https://images.com/image.png" + ); } - public static StudyDetailVO createStudy() { - StudyDetailVO study = new StudyDetailVO(); + public static StudyV1VO createStudy() { + StudyV1VO study = new StudyV1VO(); study.setStudyDbId("study1"); - study.setUri("Test URI"); + // FIXME JBN uncomment this once study has a uri + // study.setUri("Test URI"); study.setStudyName("Study 1"); study.setStudyType("Doability"); study.setProgramName("Program 1"); study.setActive(true); - study.setStartDate(new Date()); - study.setDataLinks(Arrays.asList(createDataLink())); - study.setContacts(Arrays.asList(createContact())); - - BrapiAdditionalInfo additionalInfo = new BrapiAdditionalInfo(); - additionalInfo.addProperty("foo", "bar"); - additionalInfo.addProperty("baz", "zing"); - additionalInfo.addProperty("blob", null); - study.setAdditionalInfo(additionalInfo); + // FIXME JBN study.startDate used to be a java.util.Date, it's now a String. What does it contain? + study.setStartDate(LocalDate.now().toString()); + study.setDataLinks(List.of(createDataLink())); + study.setContact(List.of(createContact())); + + // FIXME JBN uncomment this once study has additionalInfo +// BrapiAdditionalInfo additionalInfo = new BrapiAdditionalInfo(); +// additionalInfo.addProperty("foo", "bar"); +// additionalInfo.addProperty("baz", "zing"); +// additionalInfo.addProperty("blob", null); +// study.setAdditionalInfo(additionalInfo); study.setLocationDbId("france"); study.setLocationName("France"); - study.setGermplasmDbIds(Collections.singleton("germplasm1")); - study.setTrialDbIds(Collections.singleton("trial1")); + study.setGermplasmDbIds(List.of("germplasm1")); + study.setTrialsDbIds(Collections.singleton("trial1")); return study; } @@ -115,8 +93,8 @@ public class Fixtures { return contact; } - private static BrapiStudyDataLink createDataLink() { - StudyDataLinkVO dataLink = new StudyDataLinkVO(); + private static DataLinksVO createDataLink() { + DataLinksVO dataLink = new DataLinksVO(); dataLink.setName("Link 1"); dataLink.setUrl("http://inrae.fr"); return dataLink; @@ -126,13 +104,13 @@ public class Fixtures { return new HtmlContentResultMatchers(); } - public static GermplasmVO createGermplasm() { - GermplasmVO germplasm = new GermplasmVO(); + public static GermplasmV1VO createGermplasm() { + GermplasmV1VO germplasm = new GermplasmV1VO(); germplasm.setGermplasmDbId("germplasm1"); germplasm.setGermplasmName("BLE BARBU DU ROUSSILLON"); germplasm.setAccessionNumber("1408"); - germplasm.setSynonyms(Arrays.asList("BLE DU ROUSSILLON", "FRA051:1699", "ROUSSILLON")); + germplasm.setSynonyms(List.of("BLE DU ROUSSILLON", "FRA051:1699", "ROUSSILLON")); PhotoVO photo = new PhotoVO(); photo.setPhotoName("Blé du roussillon"); photo.setCopyright("INRA, Emmanuelle BOULAT/Lionel BARDY 2012"); @@ -152,8 +130,8 @@ public class Fixtures { originSite.setSiteId("1234"); originSite.setSiteName("Le Moulon"); originSite.setSiteType("Origin site"); - originSite.setLatitude(47.0F); - originSite.setLongitude(12.0F); + originSite.setLatitude(47.0); + originSite.setLongitude(12.0); germplasm.setOriginSite(originSite); List<SiteVO> evaluationSites = new ArrayList<>(); @@ -162,8 +140,8 @@ public class Fixtures { evaluationSite.setSiteId(Integer.toString(12347 + i)); evaluationSite.setSiteType("Evaluation site"); evaluationSite.setSiteName("Site " + i); - evaluationSite.setLatitude(46.0F + i); - evaluationSite.setLongitude(13.0F + i); + evaluationSite.setLatitude(46.0 + i); + evaluationSite.setLongitude(13.0 + i); evaluationSites.add(evaluationSite); } germplasm.setEvaluationSites(evaluationSites); @@ -171,14 +149,22 @@ public class Fixtures { germplasm.setGenus("Genus 1"); germplasm.setSpecies("Species 1"); germplasm.setSpeciesAuthority("Species Auth"); + germplasm.setSourceUri("https://urgi.versailles.inrae.fr/gnpis"); + germplasm.setSubtaxa("Subtaxa 1"); germplasm.setGenusSpeciesSubtaxa("Triticum aestivum subsp. aestivum"); germplasm.setSubtaxaAuthority("INRAE"); - germplasm.setTaxonIds(Arrays.asList(createTaxonId(), createTaxonId())); - germplasm.setTaxonComment("C'est bon le blé"); - germplasm.setTaxonCommonNames(Arrays.asList("Blé tendre", "Bread wheat", "Soft wheat")); - germplasm.setTaxonSynonyms(Arrays.asList("Blé tendre1", "Bread wheat1", "Soft wheat1")); + + // FIXME JBN uncomment this once germplasm has taxon IDs + // germplasm.setTaxonIds(List.of(createTaxonId(), createTaxonId())); + + // FIXME JBN uncomment this once germplasm has taxon comment + // germplasm.setTaxonComment("C'est bon le blé"); + germplasm.setTaxonCommonNames(List.of("Blé tendre", "Bread wheat", "Soft wheat")); + + // FIXME JBN uncomment this once germplasm has taxon synonyms + // germplasm.setTaxonSynonyms(List.of("Blé tendre1", "Bread wheat1", "Soft wheat1")); InstituteVO holdingInstitute = new InstituteVO(); holdingInstitute.setInstituteName("GDEC - UMR Génétique, Diversité et Ecophysiologie des Céréales"); @@ -206,9 +192,10 @@ public class Fixtures { collectingSite.setSiteId("1235"); collectingSite.setSiteName("St Just"); collectingSite.setSiteType("Collecting site"); - collectingSite.setLatitude(48.0F); - collectingSite.setLongitude(13.0F); + collectingSite.setLatitude(48.0); + collectingSite.setLongitude(13.0); germplasm.setCollectingSite(collectingSite); + germplasm.setAcquisitionDate("In the summer"); GermplasmInstituteVO breeder = new GermplasmInstituteVO(); @@ -221,28 +208,24 @@ public class Fixtures { breeder.setDeregistrationYear(2019); germplasm.setBreeder(breeder); - germplasm.setDonors(Arrays.asList( - createDonor() - )); + germplasm.setDonors(List.of(createDonor())); - germplasm.setDistributors(Arrays.asList( - createDistributor() - )); + germplasm.setDistributors(List.of(createDistributor())); - germplasm.setChildren(Arrays.asList(createChild(), createChild())); + germplasm.setChildren(List.of(createChild(), createChild())); germplasm.setGermplasmPUI("germplasmPUI"); - germplasm.setPopulation(Arrays.asList(createPopulation1(), createPopulation2(), createPopulation3())); + germplasm.setPopulation(List.of(createPopulation1(), createPopulation2(), createPopulation3())); - germplasm.setCollection(Arrays.asList(createCollection())); + germplasm.setCollection(List.of(createCollection())); - germplasm.setPanel(Arrays.asList(createPanel())); + germplasm.setPanel(List.of(createPanel())); return germplasm; } - public static GermplasmVO createGermplasmMinimal() { - GermplasmVO germplasm = new GermplasmVO(); + public static GermplasmV1VO createGermplasmMinimal() { + GermplasmV1VO germplasm = new GermplasmV1VO(); germplasm.setGermplasmDbId("germplasm-mini1"); germplasm.setGermplasmName("BLE BARBU DU ROUSSILLON mini"); @@ -256,10 +239,10 @@ public class Fixtures { germplasm.setBiologicalStatusOfAccessionCode("Traditional cultivar/landrace "); - germplasm.setGenus("Genus 1"); germplasm.setSpecies("Species 1"); - germplasm.setTaxonIds(Arrays.asList(createTaxonId(), createTaxonId())); + // FIXME JBN uncomment this once germplasm has taxon IDs + // germplasm.setTaxonIds(List.of(createTaxonId(), createTaxonId())); InstituteVO holdingInstitute = new InstituteVO(); holdingInstitute.setInstituteName("GDEC - UMR Génétique, Diversité et Ecophysiologie des Céréales"); @@ -299,8 +282,8 @@ public class Fixtures { return result; } - private static PedigreeVO createPedigree() { - PedigreeVO result = new PedigreeVO(); + private static GermplasmPedigreeV1VO createPedigree() { + GermplasmPedigreeV1VO result = new GermplasmPedigreeV1VO(); result.setPedigree("Pedigree 1"); result.setParent1DbId("12345"); result.setParent1Name("Parent 1"); @@ -310,12 +293,12 @@ public class Fixtures { result.setParent2Type("P2"); result.setCrossingPlan("crossing plan 1"); result.setCrossingYear("2012"); - result.setSiblings(Arrays.asList(createBrapiSibling())); + result.setSiblings(List.of(createBrapiSibling())); return result; } - private static BrapiSibling createBrapiSibling() { - SiblingVO sibling = new SiblingVO(); + private static SiblingV1VO createBrapiSibling() { + SiblingV1VO sibling = new SiblingV1VO(); sibling.setGermplasmDbId("5678"); sibling.setDefaultDisplayName("Sibling 5678"); return sibling; @@ -325,7 +308,7 @@ public class Fixtures { GenealogyVO result = new GenealogyVO(); result.setFirstParentName("CP1"); result.setSecondParentName("CP2"); - result.setSibblings(Arrays.asList(createPuiNameValueVO(), createPuiNameValueVO())); + result.setSibblings(List.of(createPuiNameValueVO(), createPuiNameValueVO())); return result; } @@ -337,7 +320,7 @@ public class Fixtures { } private static CollPopVO createPopulation1() { - CollPopVO result = new CollPopVO(); + CollPopVO result = new CollPopVO("Population 1", "collpop1"); result.setName("Population 1"); result.setType("Pop Type 1"); result.setGermplasmCount(3); @@ -346,7 +329,7 @@ public class Fixtures { } private static CollPopVO createPopulation2() { - CollPopVO result = new CollPopVO(); + CollPopVO result = new CollPopVO("Population 2", "collpop2"); result.setName("Population 2"); result.setGermplasmCount(3); PuiNameValueVO puiNameValueVO = createPuiNameValueVO(); @@ -356,21 +339,21 @@ public class Fixtures { } private static CollPopVO createPopulation3() { - CollPopVO result = new CollPopVO(); + CollPopVO result = new CollPopVO("Population 3", "collpop3"); result.setName("Population 3"); result.setGermplasmCount(5); return result; } private static CollPopVO createCollection() { - CollPopVO result = new CollPopVO(); + CollPopVO result = new CollPopVO("Collection 1", "collpop4"); result.setName("Collection 1"); result.setGermplasmCount(7); return result; } private static CollPopVO createPanel() { - CollPopVO result = new CollPopVO(); + CollPopVO result = new CollPopVO("The_panel_1", "collpop5"); result.setName("The_panel_1"); result.setGermplasmCount(2); return result; @@ -383,30 +366,31 @@ public class Fixtures { return result; } - public static TrialVO createTrial() { - TrialVO trial = new TrialVO(); + public static TrialV1VO createTrial() { + TrialV1VO trial = new TrialV1VO(); trial.setTrialName("Trail 1"); trial.setTrialType("Trial type 1"); trial.setDocumentationURL("http://trials.com"); - trial.setStudies(Arrays.asList(createTrialStudy())); + trial.setStudies(List.of(createTrialStudy())); return trial; } - private static BrapiTrialStudy createTrialStudy() { - TrialStudySummaryVO study = new TrialStudySummaryVO(); + private static StudyV1miniVO createTrialStudy() { + StudyV1miniVO study = new StudyV1miniVO(); study.setStudyDbId("study2"); study.setStudyName("Study 2"); return study; } - public static GermplasmAttributeValueListVO createGermplasmAttributeValueList() { - GermplasmAttributeValueVO value = new GermplasmAttributeValueVO(); + + public static GermplasmAttributeV1VO createGermplasmAttribute() { + GermplasmAttributeValueV1VO value = new GermplasmAttributeValueV1VO(); value.setAttributeName("A1"); value.setValue("V1"); - GermplasmAttributeValueListVO list = new GermplasmAttributeValueListVO(); - list.setData(Arrays.asList(value)); - return list; + GermplasmAttributeV1VO germplasmAttribute = new GermplasmAttributeV1VO(); + germplasmAttribute.setData(List.of(value)); + return germplasmAttribute; } public static ObservationVariableVO createVariable() { @@ -414,7 +398,7 @@ public class Fixtures { variable.setObservationVariableDbId("variable1"); variable.setDocumentationURL("http://variables.com"); variable.setName("Variable 1"); - variable.setSynonyms(Arrays.asList("V1")); + variable.setSynonyms(List.of("V1")); variable.setOntologyName("Ontology 1"); TraitVO trait = new TraitVO(); trait.setDescription("Trait 1"); @@ -424,7 +408,7 @@ public class Fixtures { public static GermplasmMcpdVO createGermplasmMcpd() { GermplasmMcpdVO result = new GermplasmMcpdVO(); - result.setGermplasmPUI("PUI1"); + result.setPUID("PUI1"); result.setInstituteCode("Inst1"); return result; } diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/HtmlContentResultMatchers.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/HtmlContentResultMatchers.java similarity index 95% rename from backend/src/test/java/fr/inra/urgi/faidare/web/HtmlContentResultMatchers.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/HtmlContentResultMatchers.java index 74e7234e4f4915e9ca343486bb0a12179ae36520..265310a914a78ef90f135ddcada526534c9fc36a 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/HtmlContentResultMatchers.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/HtmlContentResultMatchers.java @@ -1,4 +1,4 @@ -package fr.inra.urgi.faidare.web; +package fr.inrae.urgi.faidare.web; import static org.assertj.core.api.Assertions.assertThat; @@ -7,7 +7,6 @@ import java.util.stream.Collectors; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; import org.springframework.test.web.servlet.ResultMatcher; /** diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/germplasm/GermplasmControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmControllerTest.java similarity index 78% rename from backend/src/test/java/fr/inra/urgi/faidare/web/germplasm/GermplasmControllerTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmControllerTest.java index c089b0f512ba5c59dda74b7651f3efc03c99979e..57bf8ec44ff5768794f21d69c79880a3c6765899 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/germplasm/GermplasmControllerTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/germplasm/GermplasmControllerTest.java @@ -1,36 +1,22 @@ -package fr.inra.urgi.faidare.web.germplasm; - -import static fr.inra.urgi.faidare.web.Fixtures.htmlContent; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +package fr.inrae.urgi.faidare.web.germplasm; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.criteria.GermplasmGETSearchCriteria; -import fr.inra.urgi.faidare.domain.criteria.GermplasmSearchCriteria; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmAttributeValueListVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmMcpdVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmSitemapVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.GermplasmAttributeRepository; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.web.Fixtures; +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmAttributeV1Dao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmPedigreeV1Dao; +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.dao.v2.GermplasmMcpdDao; +import fr.inrae.urgi.faidare.domain.GermplasmMcpdVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.GermplasmSitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmAttributeV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.web.Fixtures; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -39,6 +25,17 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; +import java.util.Arrays; +import java.util.List; + +import static fr.inrae.urgi.faidare.web.Fixtures.htmlContent; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + /** * MVC tests for {@link GermplasmController} * @author JB Nizet @@ -54,38 +51,46 @@ public class GermplasmControllerTest { private ObjectMapper objectMapper; @MockBean - private GermplasmRepository mockGermplasmRepository; + private GermplasmV1Dao mockGermplasmRepository; @MockBean private FaidareProperties mockFaidareProperties; @MockBean - private XRefDocumentRepository mockXRefDocumentRepository; + private XRefDocumentDao mockXRefDocumentRepository; + + @MockBean + private GermplasmAttributeV1Dao mockGermplasmAttributeRepository; @MockBean - private GermplasmAttributeRepository mockGermplasmAttributeRepository; + private GermplasmMcpdDao mockGermplasmMcpdRepository; - private GermplasmVO germplasm; + @MockBean + private GermplasmPedigreeV1Dao mockGermplasmPedigreeV1Dao; + + private GermplasmV1VO germplasm; private List<XRefDocumentVO> crossReferences; private DataSource dataSource; @BeforeEach void prepare() { germplasm = Fixtures.createGermplasm(); - when(mockGermplasmRepository.getById(germplasm.getGermplasmDbId())).thenReturn(germplasm); + when(mockGermplasmRepository.getByGermplasmDbId(germplasm.getGermplasmDbId())).thenReturn(germplasm); crossReferences = Arrays.asList( Fixtures.createXref("foobar"), Fixtures.createXref("bazbing") ); - when(mockXRefDocumentRepository.find(any())) - .thenReturn(new PaginatedList<>(null, crossReferences)); + when(mockXRefDocumentRepository.findByLinkedResourcesID(any())) + .thenReturn(crossReferences); dataSource = Fixtures.createDataSource(); + when(mockFaidareProperties.getByUri(germplasm.getSourceUri())).thenReturn(dataSource); + when(mockFaidareProperties.getByUri(any())).thenReturn(dataSource); - List<GermplasmAttributeValueListVO> attributes = Arrays.asList(Fixtures.createGermplasmAttributeValueList()); - when(mockGermplasmAttributeRepository.find(any())).thenReturn(new PaginatedList<>(null, attributes)); + GermplasmAttributeV1VO attribute = Fixtures.createGermplasmAttribute(); + when(mockGermplasmAttributeRepository.getByGermplasmDbId(germplasm.getGermplasmDbId())).thenReturn(attribute); } @Test @@ -155,8 +160,7 @@ public class GermplasmControllerTest { @Test void shouldDisplayGermplasmWithPuiAsParameter() throws Exception { - PaginatedList<GermplasmVO> puiList = new PaginatedList<>(null, Collections.singletonList(germplasm)); - when(mockGermplasmRepository.find(any())).thenReturn(puiList); + when(mockGermplasmRepository.getByGermplasmPUI(germplasm.getGermplasmPUI())).thenReturn(germplasm); mockMvc.perform(get("/germplasms").param("pui", germplasm.getGermplasmPUI())) .andExpect(status().isOk()) @@ -175,18 +179,11 @@ public class GermplasmControllerTest { "Panel", "Cross references")) .andExpect(htmlContent().endsCorrectly()); - - ArgumentMatcher<GermplasmSearchCriteria> criteriaMatcher = criteria -> - criteria instanceof GermplasmGETSearchCriteria - && ((GermplasmGETSearchCriteria) criteria).getGermplasmPUI() - .equals(Collections.singletonList(germplasm.getGermplasmPUI())); - verify(mockGermplasmRepository).find(argThat(criteriaMatcher)); } @Test void shouldSupportLegacyPath() throws Exception { - PaginatedList<GermplasmVO> puiList = new PaginatedList<>(null, Collections.singletonList(germplasm)); - when(mockGermplasmRepository.find(any())).thenReturn(puiList); + when(mockGermplasmRepository.getByGermplasmPUI(germplasm.getGermplasmPUI())).thenReturn(germplasm); mockMvc.perform(get("/germplasm").param("pui", germplasm.getGermplasmPUI())) .andExpect(status().isOk()) @@ -209,7 +206,7 @@ public class GermplasmControllerTest { // uncomment the following line to see which sitemap index each study has // germplasms.forEach(germplasm -> System.out.println(germplasm.getGermplasmDbId() + " = " + Math.floorMod(germplasm.getGermplasmDbId().hashCode(), Sitemaps.BUCKET_COUNT))); - when(mockGermplasmRepository.scrollAllForSitemap(anyInt())).thenAnswer(invocation -> germplasms.iterator()); + when(mockGermplasmRepository.findAllForSitemap()).thenAnswer(invocation -> germplasms.stream()); testSitemap(6, "http://localhost/faidare/germplasms/germplasm1\nhttp://localhost/faidare/germplasms/germplasm45\n"); testSitemap(9, "http://localhost/faidare/germplasms/germplasm4\nhttp://localhost/faidare/germplasms/germplasm73\n"); @@ -222,7 +219,7 @@ public class GermplasmControllerTest { @Test void shouldExportMcpds() throws Exception { - List<GermplasmMcpdVO> germplasms = Arrays.asList( + List<GermplasmMcpdVO> germplasms = List.of( Fixtures.createGermplasmMcpd(), Fixtures.createGermplasmMcpd() ); @@ -231,13 +228,12 @@ public class GermplasmControllerTest { Sets.newHashSet("g1", "g2"), Arrays.asList(GermplasmMcpdExportableField.PUID, GermplasmMcpdExportableField.INSTCODE)); - when(mockGermplasmRepository.scrollGermplasmMcpdsByIds(eq(command.getIds()), anyInt())) - .thenAnswer(invocation -> germplasms.iterator()); + when(mockGermplasmMcpdRepository.findByGermplasmDbIdIn(eq(command.getIds()))) + .thenAnswer(invocation -> germplasms.stream()); MvcResult mvcResult = mockMvc.perform(post("/germplasms/exports/mcpd") .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsBytes( - command))) + .content(objectMapper.writeValueAsBytes(command))) .andExpect(request().asyncStarted()) .andReturn(); @@ -251,7 +247,7 @@ public class GermplasmControllerTest { @Test void shouldExportPlantMaterials() throws Exception { - List<GermplasmVO> germplasms = Arrays.asList( + List<GermplasmV1VO> germplasms = Arrays.asList( Fixtures.createGermplasm(), Fixtures.createGermplasm(), Fixtures.createGermplasmMinimal() @@ -263,8 +259,8 @@ public class GermplasmControllerTest { GermplasmExportableField.ACCESSION_NUMBER, GermplasmExportableField.ACCESSION_NAME)); - when(mockGermplasmRepository.scrollGermplasmsByIds(eq(command.getIds()), anyInt())) - .thenAnswer(invocation -> germplasms.iterator()); + when(mockGermplasmRepository.findByGermplasmDbIdIn(eq(command.getIds()))) + .thenAnswer(invocation -> germplasms.stream()); MvcResult mvcResult = mockMvc.perform(post("/germplasms/exports/plant-material") .contentType(MediaType.APPLICATION_JSON) diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/site/SiteControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/site/SiteControllerTest.java similarity index 72% rename from backend/src/test/java/fr/inra/urgi/faidare/web/site/SiteControllerTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/site/SiteControllerTest.java index 98237eb1ea3d436242e9eb098216a1b3a10de4c8..e56e122b139d7e4c9a43288b494feb724753b73b 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/site/SiteControllerTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/site/SiteControllerTest.java @@ -1,40 +1,32 @@ -package fr.inra.urgi.faidare.web.site; - -import static fr.inra.urgi.faidare.web.Fixtures.htmlContent; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import java.util.Arrays; -import java.util.List; - -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.utils.Sitemaps; -import fr.inra.urgi.faidare.web.Fixtures; -import fr.inra.urgi.faidare.web.thymeleaf.CoordinatesDialect; -import fr.inra.urgi.faidare.web.thymeleaf.FaidareDialect; +package fr.inrae.urgi.faidare.web.site; + +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.v1.LocationV1Dao; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.LocationSitemapVO; +import fr.inrae.urgi.faidare.web.Fixtures; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; +import java.util.Arrays; +import java.util.List; + +import static fr.inrae.urgi.faidare.web.Fixtures.htmlContent; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + /** * MVC tests for {@link SiteController} * @author JB Nizet @@ -45,10 +37,10 @@ public class SiteControllerTest { private MockMvc mockMvc; @MockBean - private LocationRepository mockLocationRepository; + private LocationV1Dao mockLocationRepository; @MockBean - private XRefDocumentRepository mockXRefDocumentRepository; + private XRefDocumentDao mockXRefDocumentRepository; @MockBean private FaidareProperties mockFaidareProperties; @@ -60,14 +52,14 @@ public class SiteControllerTest { @BeforeEach void prepare() { site = Fixtures.createSite(); - when(mockLocationRepository.getById(site.getLocationDbId())).thenReturn(site); + when(mockLocationRepository.getByLocationDbId(site.getLocationDbId())).thenReturn(site); crossReferences = Arrays.asList( Fixtures.createXref("foobar"), Fixtures.createXref("bazbing") ); - when(mockXRefDocumentRepository.find(any())) - .thenReturn(new PaginatedList<>(null, crossReferences)); + when(mockXRefDocumentRepository.findByLinkedResourcesID(any())) + .thenReturn(crossReferences); dataSource = Fixtures.createDataSource(); when(mockFaidareProperties.getByUri(site.getSourceUri())).thenReturn(dataSource); @@ -97,7 +89,7 @@ public class SiteControllerTest { // uncomment the following line to see which sitemap index each study has // sites.forEach(site -> System.out.println(site.getLocationDbId() + " = " + Math.floorMod(site.getLocationDbId().hashCode(), Sitemaps.BUCKET_COUNT))); - when(mockLocationRepository.scrollAllForSitemap(anyInt())).thenAnswer(invocation -> sites.iterator()); + when(mockLocationRepository.findAllForSitemap()).thenAnswer(invocation -> sites.stream()); testSitemap(2, "http://localhost/faidare/sites/site1\nhttp://localhost/faidare/sites/site53\n"); testSitemap(5, "http://localhost/faidare/sites/site4\nhttp://localhost/faidare/sites/site68\n"); testSitemap(7, ""); diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java similarity index 92% rename from backend/src/test/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java index f482c052de0e6e9d832a98adc02978cd1e5cfd80..a7992d7e039557d3e2a29589200224390768f9ce 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/sitemap/SitemapIndexControllerTest.java @@ -1,10 +1,9 @@ -package fr.inra.urgi.faidare.web.sitemap; +package fr.inrae.urgi.faidare.web.sitemap; -import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import fr.inra.urgi.faidare.utils.Sitemaps; +import fr.inrae.urgi.faidare.utils.Sitemaps; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; diff --git a/backend/src/test/java/fr/inra/urgi/faidare/web/study/StudyControllerTest.java b/backend/src/test/java/fr/inrae/urgi/faidare/web/study/StudyControllerTest.java similarity index 74% rename from backend/src/test/java/fr/inra/urgi/faidare/web/study/StudyControllerTest.java rename to backend/src/test/java/fr/inrae/urgi/faidare/web/study/StudyControllerTest.java index 784f3cbcd28ac88caaceef3e6ff76b956b68d093..2bd91204b68b2f170f5903bd40ad0806e50dc31e 100644 --- a/backend/src/test/java/fr/inra/urgi/faidare/web/study/StudyControllerTest.java +++ b/backend/src/test/java/fr/inrae/urgi/faidare/web/study/StudyControllerTest.java @@ -1,56 +1,43 @@ -package fr.inra.urgi.faidare.web.study; - -import static fr.inra.urgi.faidare.web.Fixtures.createSite; -import static fr.inra.urgi.faidare.web.Fixtures.htmlContent; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Set; - -import fr.inra.urgi.faidare.config.FaidareProperties; -import fr.inra.urgi.faidare.domain.data.LocationSitemapVO; -import fr.inra.urgi.faidare.domain.data.LocationVO; -import fr.inra.urgi.faidare.domain.data.TrialVO; -import fr.inra.urgi.faidare.domain.data.germplasm.GermplasmVO; -import fr.inra.urgi.faidare.domain.data.study.StudyDetailVO; -import fr.inra.urgi.faidare.domain.data.study.StudySitemapVO; -import fr.inra.urgi.faidare.domain.data.variable.ObservationVariableVO; -import fr.inra.urgi.faidare.domain.datadiscovery.data.DataSource; -import fr.inra.urgi.faidare.domain.response.PaginatedList; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentSearchCriteria; -import fr.inra.urgi.faidare.domain.xref.XRefDocumentVO; -import fr.inra.urgi.faidare.repository.es.GermplasmRepository; -import fr.inra.urgi.faidare.repository.es.LocationRepository; -import fr.inra.urgi.faidare.repository.es.StudyRepository; -import fr.inra.urgi.faidare.repository.es.TrialRepository; -import fr.inra.urgi.faidare.repository.es.XRefDocumentRepository; -import fr.inra.urgi.faidare.repository.file.CropOntologyRepository; -import fr.inra.urgi.faidare.utils.Sitemaps; -import fr.inra.urgi.faidare.web.Fixtures; -import fr.inra.urgi.faidare.web.site.SiteController; -import fr.inra.urgi.faidare.web.thymeleaf.CoordinatesDialect; -import fr.inra.urgi.faidare.web.thymeleaf.FaidareDialect; +package fr.inrae.urgi.faidare.web.study; + +import fr.inrae.urgi.faidare.config.DataSource; +import fr.inrae.urgi.faidare.config.FaidareProperties; +import fr.inrae.urgi.faidare.dao.XRefDocumentDao; +import fr.inrae.urgi.faidare.dao.file.CropOntologyRepository; +import fr.inrae.urgi.faidare.dao.v1.GermplasmV1Dao; +import fr.inrae.urgi.faidare.dao.v1.LocationV1Dao; +import fr.inrae.urgi.faidare.dao.v1.StudyV1Dao; +import fr.inrae.urgi.faidare.dao.v1.TrialV1Dao; +import fr.inrae.urgi.faidare.domain.LocationVO; +import fr.inrae.urgi.faidare.domain.XRefDocumentVO; +import fr.inrae.urgi.faidare.domain.brapi.StudySitemapVO; +import fr.inrae.urgi.faidare.domain.brapi.v1.GermplasmV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.StudyV1VO; +import fr.inrae.urgi.faidare.domain.brapi.v1.TrialV1VO; +import fr.inrae.urgi.faidare.domain.variable.ObservationVariableVO; +import fr.inrae.urgi.faidare.web.Fixtures; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.web.servlet.ModelAndView; +import java.util.*; +import java.util.stream.Stream; + +import static fr.inrae.urgi.faidare.web.Fixtures.htmlContent; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + /** * MVC tests for {@link StudyController} * @author JB Nizet @@ -61,62 +48,67 @@ public class StudyControllerTest { private MockMvc mockMvc; @MockBean - private StudyRepository mockStudyRepository; + private StudyV1Dao mockStudyRepository; @MockBean private FaidareProperties mockFaidareProperties; @MockBean - private XRefDocumentRepository mockXRefDocumentRepository; + private XRefDocumentDao mockXRefDocumentRepository; @MockBean - private GermplasmRepository mockGermplasmRepository; + private GermplasmV1Dao mockGermplasmRepository; @MockBean private CropOntologyRepository mockCropOntologyRepository; @MockBean - private TrialRepository mockTrialRepository; + private TrialV1Dao mockTrialRepository; @MockBean - private LocationRepository mockLocationRepository; + private LocationV1Dao mockLocationRepository; @Autowired private StudyController studyController; - private StudyDetailVO study; - private GermplasmVO germplasm; + private StudyV1VO study; + private GermplasmV1VO germplasm; private List<XRefDocumentVO> crossReferences; private DataSource dataSource; private LocationVO location; - private TrialVO trial; + private TrialV1VO trial; @BeforeEach void prepare() { study = Fixtures.createStudy(); - when(mockStudyRepository.getById(study.getStudyDbId())).thenReturn(study); + when(mockStudyRepository.getByStudyDbId(study.getStudyDbId())).thenReturn(study); germplasm = Fixtures.createGermplasm(); - when(mockGermplasmRepository.find(any())).thenReturn(new PaginatedList<>(null, Arrays.asList(germplasm))); + when(mockGermplasmRepository.findByGermplasmDbIdIn(any())).thenAnswer( + invocation -> Stream.of(germplasm) + ); crossReferences = Arrays.asList( Fixtures.createXref("foobar"), Fixtures.createXref("bazbing") ); - when(mockXRefDocumentRepository.find(any())) - .thenReturn(new PaginatedList<>(null, crossReferences)); + when(mockXRefDocumentRepository.findByLinkedResourcesID(any())) + .thenReturn(crossReferences); dataSource = Fixtures.createDataSource(); + when(mockFaidareProperties.getByUri(study.getSourceUri())).thenReturn(dataSource); location = Fixtures.createSite(); - when(mockLocationRepository.getById(study.getLocationDbId())).thenReturn(location); + when(mockLocationRepository.getByLocationDbId(study.getLocationDbId())).thenReturn(location); trial = Fixtures.createTrial(); - when(mockTrialRepository.getById(study.getTrialDbIds().iterator().next())).thenReturn(trial); + when(mockTrialRepository.getByTrialDbId(study.getTrialsDbIds().iterator().next())).thenReturn(trial); Set<String> variableDbIds = Collections.singleton("variable1"); - when(mockStudyRepository.getVariableIds(study.getStudyDbId())).thenReturn(variableDbIds); + // FIXME JBN uncomment this line once StudyV1Dao has a getVariableIds() method + // when(mockStudyRepository.getVariableIds(study.getStudyDbId())).thenReturn(variableDbIds); + when(mockCropOntologyRepository.getVariableByIds(variableDbIds)).thenReturn( Arrays.asList(Fixtures.createVariable()) ); @@ -146,7 +138,7 @@ public class StudyControllerTest { // uncomment the following line to see which sitemap index each study has // studies.forEach(study -> System.out.println(study.getStudyDbId() + " = " + Math.floorMod(study.getStudyDbId().hashCode(), Sitemaps.BUCKET_COUNT))); - when(mockStudyRepository.scrollAllForSitemap(anyInt())).thenAnswer(invocation -> studies.iterator()); + when(mockStudyRepository.findAllForSitemap()).thenAnswer(invocation -> studies.stream()); testSitemap(6, "http://localhost/faidare/studies/study1\nhttp://localhost/faidare/studies/study72\n"); testSitemap(9, "http://localhost/faidare/studies/study4\nhttp://localhost/faidare/studies/study51\n"); testSitemap(7, ""); diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query1.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query1.json deleted file mode 100644 index 132c63452decafe4cc9a9100b0e8d15038db3ac6..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query1.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "term" : { - "programDbId" : { - "value" : "A", - "boost" : 1.0 - } - } - }, - { - "term" : { - "name" : { - "value" : "B", - "boost" : 1.0 - } - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query2.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query2.json deleted file mode 100644 index bcb0ad3a5ac8d50074222faba0a049c5359a9b6a..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query2.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "terms" : { - "schema:includedInDataCatalog" : [ - "S1" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "@type" : [ - "T1", - "T2" - ], - "boost" : 1.0 - } - }, - { - "match_phrase" : { - "germplasm.accession.suggest" : { - "query" : "A1", - "slop" : 0, - "zero_terms_query" : "NONE", - "boost" : 1.0 - } - } - }, - { - "match_phrase" : { - "germplasm.accession.suggest" : { - "query" : "A2", - "slop" : 0, - "zero_terms_query" : "NONE", - "boost" : 1.0 - } - } - }, - { - "terms" : { - "germplasm.cropName" : [ - "C1" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "germplasm.germplasmList" : [ - "G1", - "G2", - "G3" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "trait.observationVariableIds" : [ - "V1" - ], - "boost" : 1.0 - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query3.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query3.json deleted file mode 100644 index 2e066801302bf694bcec337405ec4d5f6fbed810..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query3.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "nested": { - "query": { - "bool": { - "must": [ - { - "term": { - "field2.schema:identifier": { - "value": "5", - "boost": 1.0 - } - } - }, - { - "term": { - "field2.field4.subField": { - "value": "4", - "boost": 1.0 - } - } - }, - { - "term": { - "field2.field3": { - "value": "3", - "boost": 1.0 - } - } - } - ], - "adjust_pure_negative": true, - "boost": 1.0 - } - }, - "path": "field2", - "ignore_unmapped": false, - "score_mode": "none", - "boost": 1.0, - "inner_hits": { - "ignore_unmapped": false, - "from": 0, - "size": 10000, - "version": false, - "seq_no_primary_term": false, - "explain": false, - "track_scores": false - } - } -} diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query4.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query4.json deleted file mode 100644 index d32d323461da047fbff5f4cc2a94409d35ead75a..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query4.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "nested" : { - "query" : { - "bool" : { - "must" : [ - { - "range" : { - "observations.observationTimeStamp" : { - "from" : "TIMESTAMP1", - "to" : "TIMESTAMP2", - "include_lower" : true, - "include_upper" : true, - "boost" : 1.0 - } - } - }, - { - "terms" : { - "observations.season" : [ - "SEASON1", - "SEASON2" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "observations.observationVariableDbId" : [ - "VAR1", - "VAR2" - ], - "boost" : 1.0 - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } - }, - "path" : "observations", - "ignore_unmapped" : false, - "score_mode" : "none", - "boost" : 1.0, - "inner_hits" : { - "ignore_unmapped" : false, - "from" : 0, - "size" : 10000, - "version" : false, - "explain" : false, - "track_scores" : false - } - } - }, - { - "term" : { - "observationLevel" : { - "value" : "level1", - "boost" : 1.0 - } - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query5.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query5.json deleted file mode 100644 index ed7459a0fc16ad8a3425858850ff79ad08ff38b7..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query5.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "terms" : { - "programName" : [ - "A", - "B" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "locationName" : [ - "D", - "C" - ], - "boost" : 1.0 - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query6.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query6.json deleted file mode 100644 index dc01815e68116954801d4673b080f720e19535ce..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query6.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "nested" : { - "query" : { - "term" : { - "field2.schema:name" : { - "value" : "6", - "boost" : 1.0 - } - } - }, - "path" : "field2", - "ignore_unmapped" : false, - "score_mode" : "none", - "boost" : 1.0, - "inner_hits" : { - "ignore_unmapped" : false, - "from" : 0, - "size" : 10000, - "version" : false, - "explain" : false, - "track_scores" : false - } - } - }, - { - "range" : { - "field1" : { - "from" : "1", - "to" : "2", - "include_lower" : true, - "include_upper" : true, - "boost" : 1.0 - } - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query7.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query7.json deleted file mode 100644 index 4908efaa728469ae88d6aed002319e9d60b7f718..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query7.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "nested" : { - "query" : { - "bool" : { - "must" : [ - { - "term" : { - "field2.schema:identifier" : { - "value" : "5", - "boost" : 1.0 - } - } - }, - { - "term" : { - "field2.field4.subField" : { - "value" : "4", - "boost" : 1.0 - } - } - }, - { - "term" : { - "field2.field3" : { - "value" : "3", - "boost" : 1.0 - } - } - }, - { - "term" : { - "field2.schema:name" : { - "value" : "6", - "boost" : 1.0 - } - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } - }, - "path" : "field2", - "ignore_unmapped" : false, - "score_mode" : "none", - "boost" : 1.0, - "inner_hits" : { - "ignore_unmapped" : false, - "from" : 0, - "size" : 10000, - "version" : false, - "explain" : false, - "track_scores" : false - } - } - }, - { - "range" : { - "field1" : { - "from" : "1", - "to" : "2", - "include_lower" : true, - "include_upper" : true, - "boost" : 1.0 - } - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query8.json b/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query8.json deleted file mode 100644 index 462708718ed5641b91825c6a87d77f5090538653..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/elasticsearch/query/impl/expected/query8.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "bool" : { - "must" : [ - { - "bool" : { - "should" : [ - { - "terms" : { - "commonCropName" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "genusSpeciesSubtaxa" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "species" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "genus" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "subtaxa" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "taxonSynonyms" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - }, - { - "terms" : { - "genusSpecies" : [ - "Triticum", - "Populus" - ], - "boost" : 1.0 - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } - } - ], - "filter" : [ - { - "terms" : { - "biologicalStatusOfAccessionCode" : [ - "Wild" - ], - "boost" : 1.0 - } - } - ], - "adjust_pure_negative" : true, - "boost" : 1.0 - } -} diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/datadiscovery0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/datadiscovery0.json deleted file mode 100644 index 58e6e0968583ba986fd109cff7e905b7bab457ee..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/datadiscovery0.json +++ /dev/null @@ -1,71 +0,0 @@ -[ - { - "@id": "urn:foo_study", - "@type": [ - "Study" - ], - "schema:identifier": "foo_study", - "schema:name": "Foo study", - "schema:description": "Foo study is a study", - "schema:url": null, - "schema:includedInDataCatalog": "http://example.com/catalog2", - "germplasm": { - "cropName": ["Triticum", "Triticum aestivum", "Triticum aestivum", "Blé", "Blé tendre"], - "accession": ["B1", "B2"] - } - }, - { - "@id": "urn:foo_germplasm", - "@type": [ - "Germplasm" - ], - "schema:identifier": "foo_germplasm", - "schema:name": "Foo germplasm", - "schema:description": "Foo germplasm is a germplasm", - "schema:url": null, - "schema:includedInDataCatalog": "http://example.com/catalog1", - "germplasm": { - "cropName": ["Vitis", "Grapevine"], - "accession": ["V1", "V2", "AUSTRO KOLBEN"] - } - }, - { - "@id": "urn:germplasm/austro_kolben", - "schema:name": "AUSTRO KOLBEN", - "germplasm": { - "accession": ["AUSTRO KOLBEN"] - } - }, - { - "@id": "urn:foo2_germplasm", - "@type": [ - "Germplasm" - ], - "schema:identifier": "foo2_germplasm", - "schema:name": "Foo2 germplasm", - "schema:description": "Foo2 germplasm is a germplasm", - "schema:url": "http://example.com/foo2_germplasm", - "schema:includedInDataCatalog": "http://example.com/catalog1", - "germplasm": { - "cropName": ["Rice"] - } - }, - { - "schema:name": "FOO 5" - }, - { - "schema:name": "FOO 6" - }, - { - "schema:name": "FOO 7" - }, - { - "schema:name": "FOO 8" - }, - { - "schema:name": "FOO 9" - }, - { - "schema:name": "FOO 10" - } -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasm0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasm0.json deleted file mode 100644 index 6d275e992867f1764c9127649461f98f6620c0bd..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasm0.json +++ /dev/null @@ -1,129 +0,0 @@ -[ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjEyODU5MjE2M0UxMg==", - "accessionNumber": "1801Mtp3" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjEyODU5MjE2M0UxMg==", - "accessionNumber": "2360" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4MTc4MzY5NkUxMg==", - "accessionNumber": "193Mtp97", - "germplasmName": "Pinot noir productif 106", - "germplasmPUI": "doi:10.15454/1.4921786381783696E12", - "commonCropName": "Grapevine", - "genus": "Vitis", - "species": "vinifera", - "speciesAuthority": "", - "subtaxa": "subsp. vinifera cv. Pinot noir", - "subtaxaAuthority": "" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjM4NDcyNjA1MkUxMg==", - "accessionNumber": "A0481", - "genus": "Solanum", - "species": "melongena" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjY1NTk0NDEwNkUxMg==", - "accessionNumber": "A0336", - "genus": "Solanum", - "species": "melongena" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjQ3NDg1NjQzOEUxMg==", - "accessionNumber": "2121", - "genus": "Triticum", - "species": "aestivum" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjQ3NjE5NDA0NUUxMg==", - "accessionNumber": "2042", - "genus": "Triticum", - "species": "aestivum" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjQ5NDc1ODQ2MkUxMg==", - "defaultDisplayName": "CHARGER", - "accessionNumber": "13431", - "germplasmName": "CHARGER", - "germplasmPUI": "doi:10.15454/1.4921786494758462E12" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjIyNDY1Njg4N0UxMg==", - "defaultDisplayName": "RE09001", - "accessionNumber": "37208", - "germplasmName": "RE09001", - "germplasmPUI": "doi:10.15454/1.4921786224656887E12", - "panel": [ - { - "id": 28, - "name": "HD2", - "germplasmCount": 382 - } - ] - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjUyMzI3Mjg2NkUxMg==", - "defaultDisplayName": "EM08227", - "accessionNumber": "37402", - "germplasmName": "EM08227", - "germplasmPUI": "doi:10.15454/1.4921786523272866E12", - "panel": [ - { - "id": 29, - "name": "RIL", - "germplasmCount": 367 - } - ] - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjkxNjAxNTUwOEUxMg==", - "defaultDisplayName": "Ressor", - "accessionNumber": "Ressor", - "germplasmName": "Ressor", - "germplasmPUI": "doi:10.15454/1.4921786916015508E12", - "panel": [ - { - "id": 8, - "name": "SMALL_GRAIN_CEREALS_NETWORK_COL", - "germplasmCount": 1728 - }, - { - "id": 29, - "name": "RIL", - "germplasmCount": 367 - } - ] - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTg2MTk3NTU3OUUxMg==", - "accessionNumber": "301Ang6", - "germplasmName": "Sauvignon gris", - "germplasmPUI": "doi:10.15454/1.4921785861975579E12", - "commonCropName": "Grapevine", - "genus": "Vitis", - "species": "vinifera" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTcxMTA0NzIwNUUxMg==", - "defaultDisplayName": "Grosse Bleue", - "accessionNumber": "P3725", - "germplasmName": "Grosse Bleue", - "germplasmPUI": "doi:10.15454/1.4921785711047205E12", - "commonCropName": "Plum", - "genus": "Prunus", - "species": "domestica" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjY5NTQ2NjIzM0UxMg==", - "defaultDisplayName": "05-HD357.80.", - "accessionNumber": "TX235", - "germplasmName": "05-HD357.80.", - "germplasmPUI": "doi:10.15454/1.4921786695466233E12", - "commonCropName": "Wheat", - "genus": "Triticum", - "species": "aestivum" - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmAttribute0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmAttribute0.json deleted file mode 100644 index b84f3ec716f540e6f125bfccfc710004be2748d3..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmAttribute0.json +++ /dev/null @@ -1,48 +0,0 @@ -[ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTUxNDk2NzQzRTEy", - "data": [] - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTU1NDM3OTc1OEUxMg==", - "data": [ - { - "attributeDbId": "39228", - "attributeName": "Time of leaf bud burst", - "attributeCode": "NUTS_BUDBURST", - "value": "early / précoce (Ref Précoce de Vans)", - "determinedDate": null - }, - { - "attributeDbId": "39229", - "attributeName": "Time of beginning of male flowering", - "attributeCode": "NUTS_MALFLOWER", - "value": "early / précoce (Ref Marigoule)", - "determinedDate": null - }, - { - "attributeDbId": "39234", - "attributeName": "Fruit shape", - "attributeCode": "NUTS_FRUITSHAPE", - "value": "transverse broad ellipsoid / ellipsoïde large transverse (Ref Laguepie)", - "determinedDate": null - } - ] - }, - { - "germplasmDbId": "foo", - "data": [] - }, - { - "germplasmDbId": "bar", - "data": [] - }, - { - "germplasmDbId": "baz", - "data": [] - }, - { - "germplasmDbId": "fizz", - "data": [] - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmMcpd0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmMcpd0.json deleted file mode 100644 index 676a8611f5b21347b326fdbb924bc453dc9b9ac2..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmMcpd0.json +++ /dev/null @@ -1,91 +0,0 @@ -[{ - "docId": 13705, - "groupId": 0, - "accessionNames": [ - "Belle Magnifique", - "Angleterre tardive,Belle de Chatenay,Belle de Sceaux,Belle de Spa,Cerise d'Agen,Cerise de Crêve,Cerise de Planchoury,Cerise de Saxe,de Spa,Gros de Sceaux,Magnifique de Sceaux" - ], - "accessionNumber": "V3853", - "acquisitionDate": 20040000, - "acquisitionSourceCode": null, - "alternateIDs": [ - "V3853", - "https://doi.org/10.15454/QOYDZ8", - "13705" - ], - "ancestralData": "Il y a deux hypothèses sur l'origine de cette variété : elle aurait été obtenue dans une pépinière de Vitry-sur-Seine ou trouvée dans une propriété à Chatenay (Pomologie de la France 1871).", - "biologicalStatusOfAccessionCode": "test", - "breedingInstitutes": [ - { - "instituteName": null, - "instituteCode": null - } - ], - "collectingInfo": { - "collectingDate": 20040000, - "collectingInstitutes": [ - { - "instituteAddress": "", - "instituteCode": null, - "instituteName": null - } - ], - "collectingMissionIdentifier": null, - "collectingNumber": null, - "collectingSite": { - "locationDbId": "dXJuOlVSR0kvbG9jYXRpb24vNDA2MzU=", - "locationName": "(U) Liamone - ULI", - "latitudeDecimal": 42.124165, - "locationDescription": "Liamone", - "longitudeDecimal": 8.749445, - "locationURI": "urn:URGI/location/40635", - "coordinateUncertainty": "test", - "elevation": "test", - "georeferencingMethod": "test", - "latitudeDegrees": "test", - "longitudeDegrees": "test", - "spatialReferenceSystem": "test" - } - }, - "cropName": "Cherry", - "countryOfOriginCode": "France", - "donorInfo ": [ - { - "donorAccessionNumber": "C101", - "donorInstitute": { - "donorInstituteCode": null, - "donorInstitute": "Conservatoire Végétal Régional d'Aquitaine" - } - } - ], - "genus": "Prunus", - "germplasmDbId": 13705, - "germplasmPUI": "https://doi.org/10.15454/QOYDZ8", - "instituteCode": "FRA057", - "mlsStatus": "0", - "remarks": "Quelques auteurs disent que cette variété a été obtenue vers 1795 par un nommé Chatenay, dit le Magnifique, pépiniériste à Vitry-sur-Seine (Pomologie de la France 1871). D'autres disent qu'elle a été trouvée dans une propriété à Chatenay, et multipliée par les pépiniéristes de Sceaux et de Chatenay, localités où elle a porté pendant longtemps le nom de Cerise de la Madeleine (Pomologie de la France 1871).", - "safetyDuplicateInstitues": [ - { - "instituteCode": null, - "instituteName": null - } - ], - "species": "cerasus", - "speciesAuthority": "L.", - "holdingInstitute": { - "instituteName": "UMR0588-BioForA (Biologie Intégrée pour la valorisation de la diversité des arbres et de la Forêt)", - "acronym": "BioForA", - "organisation": "INRA-ONF", - "instituteType": "Public-sector research organization", - "webSite": "https://www6.val-de-loire.inrae.fr/biofora", - "instituteAddress": "2163 avenue de la Pomme de Pin - CS 40001 ARDON, 45075 ORLÉANS CEDEX 2, France" - }, - "storageTypeCodes": [ - "" - ], - "subtaxon": "subsp. vulgaris", - "subtaxonAuthority": "L.", - "originLocationDbId": "2400", - "originLocationName": "test" -} -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmPedigree0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmPedigree0.json deleted file mode 100644 index 7aeb16135ac3e37cc6b99e70d8648f27c288c2c6..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmPedigree0.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4MjQwNzQ2OEUxMg==", - "defaultDisplayName": "661303831", - "crossingPlan": "Factorial", - "familyCode": "0504B", - "parent1DbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjA4MTAyNDI5N0UxMg==", - "parent2DbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTY0MDI1MjA0OEUxMg==", - "parent1Name": "73028-62", - "parent2Name": "101-74", - "parent1Type": "FEMALE", - "parent2Type": "MALE", - "siblings": [ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4MjQ2OTc5MkUxMg==", - "defaultDisplayName": "661300444" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjgwMzMxNDg5NUUxMg==", - "defaultDisplayName": "661303042" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc3NzUwMjQxN0UxMg==", - "defaultDisplayName": "661300252" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4MjU0NDU4NUUxMg==", - "defaultDisplayName": "661300447" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc5NDYwNjY4N0UxMg==", - "defaultDisplayName": "661302772" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4OTkxNDAwNkUxMg==", - "defaultDisplayName": "661302596" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc5MjA0MTIzOEUxMg==", - "defaultDisplayName": "661302675" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc4NTAzODQ2NEUxMg==", - "defaultDisplayName": "661300540" - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njc3OTQ0NjEzRTEy", - "defaultDisplayName": "661300328" - } - ] - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmProgeny0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmProgeny0.json deleted file mode 100644 index d6829e1cd2306b7ec5b7644976f2aa5f5770a558..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/germplasmProgeny0.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4Njg4NjAyMzEwNUUxMg==", - "defaultDisplayName": "663300829", - "progeny": [] - }, - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMjc4NDQ4MkUxMg==", - "defaultDisplayName": "302", - "progeny": [ - { - "germplasmDbId": "ZG9pOjEwLjE1NDU0LzEuNDkzODIxNDk4MDEwMTgxMkUxMg==", - "defaultDisplayName": "276", - "parentType": "FEMALE" - } - ] - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/location0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/location0.json deleted file mode 100644 index 97e298950feb1d9237ff973bfc9b15b280e1c0d1..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/location0.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - { - "locationDbId": "805", - "name": "L805", - "locationType": "Breeding and Evaluation site", - "instituteAdress": "Add 805", - "abbreviation": "AL805" - }, - { - "locationDbId": "806", - "locationName": "L806", - "locationType": "Breeding and Evaluation site", - "instituteAddress": "Add 806", - "abreviation": "AL806" - }, - { - "locationDbId": "807", - "locationType": "Origin and Breeding site" - }, - { - "locationDbId": "808" - }, - { - "locationDbId": "809" - }, - { - "locationDbId": "810" - } -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/observationUnit0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/observationUnit0.json deleted file mode 100644 index a035a18c42e257adf57881a1dc4a0bb8b739ef06..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/observationUnit0.json +++ /dev/null @@ -1,88 +0,0 @@ -[ - { - "observationUnitDbId": "1", - "observationLevel": "BLOCK" - }, - { - "observationUnitDbId": "2", - "observationLevel": "BLOCK", - "programDbId": "P2", - "observations": [ - { - "observationTimeStamp": "2001-12-30T00:00:00Z" - } - ] - }, - { - "observationUnitDbId": "3", - "observationLevel": "BLOCK", - "studyLocationDbId": "34069", - "studyDbId": "POP2-Orleans-chancre", - "programDbId": "P1", - "germplasmDbId": "G2", - "observations": [ - { - "observationTimeStamp": "2001-12-31T01:00:00Z", - "season": "2002" - }, - { - "observationTimeStamp": "2002-12-31T02:00:00Z", - "observationVariableDbId": "CO_357:0000089", - "season": "2002" - } - ] - }, - { - "observationUnitDbId": "4", - "observationLevel": "BLOCK", - "studyLocationDbId": "34069", - "studyDbId": "POP2-Orleans-chancre", - "programDbId": "P2", - "germplasmDbId": "G1", - "observations": [ - { - "observationTimeStamp": "2004-12-31T01:00:00Z", - "observationVariableDbId": "CO_357:0000088", - "season": "2002" - }, - { - "observationTimeStamp": "2003-12-31T02:00:00Z", - "season": "2002" - } - ] - }, - { - "observationUnitDbId": "5", - "programDbId": "P1", - "germplasmDbId": "G0", - "observations": [ - { - "observationTimeStamp": "2005-12-31T02:00:00Z" - } - ] - }, - { - "observationUnitDbId": "6", - "observationLevel": "BLOCK", - "germplasmDbId": "G2", - "observations": [ - { - "observationTimeStamp": "2002-12-31T02:00:00Z", - "observationVariableDbId": "CO_357:0000089", - "season": "2002" - } - ] - }, - { - "observationUnitDbId": "7", - "studyLocationDbId": "34069", - "studyDbId": "POP2-Orleans-chancre", - "germplasmDbId": "G1", - "observations": [ - { - "observationTimeStamp": "2004-12-31T01:00:00Z", - "observationVariableDbId": "CO_357:0000088" - } - ] - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/program0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/program0.json deleted file mode 100644 index 94e0662d724b26a48ed39929689729998d8991eb..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/program0.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "programDbId": "P1", - "programName": "Amaizing" - }, - { - "programDbId": "P2", - "name": "ANR-12", - "abbreviation": "ANR-12-ADAP-0009" - }, - { - "programDbId": "P3" - }, - { - "programDbId": "P4" - }, - { - "programDbId": "P5" - }, - { - "programDbId": "P6" - }, - { - "programDbId": "P7" - } -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/study0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/study0.json deleted file mode 100644 index 6a0b9ca489d3b5f9c620ab0139b27a0c4abd08f6..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/study0.json +++ /dev/null @@ -1,108 +0,0 @@ -[ - { - "studyDbId": "BTH_Orgeval_2008_SetA2", - "studyName": "BTH_Orgeval_2008_SetA2", - "name": "BTH_Orgeval_2008_SetA2", - "location": { - "locationDbId": "805" - } - }, - { - "studyDbId": "S2", - "studyName": "Study 2", - "locationName": "Bordeaux" - }, - { - "studyDbId": "S3", - "studyName": "Study 3", - "locationName": "Cavallermaggiore" - }, - { - "studyDbId": "S4", - "studyName": "Study 4", - "locationName": "Bordeaux" - }, - { - "studyDbId": "S5", - "studyName": "BTH_Lusignan_2015_SetB1" - }, - { - "studyDbId": "S6", - "studyName": "BTH_Le_Moulon_2006_SetA2" - }, - { - "studyDbId": "S7", - "studyName": "Study 7" - }, - { - "studyDbId": "181000402", - "studyName": "Test de comparaison de provenances de chene sessile - 181000402", - "startDate": "1993-03-01", - "active": true, - "studyType": "Provenance trial", - "trialDbIds": [ - "15", - "3" - ], - "programDbId": "PlantaComp", - "programName": "PlantaComp", - "seasons": [ - "1996", - "1999", - "2003" - ], - "locationDbId": "33585", - "locationName": "Saint-Laurent - Forêt domaniale de Vierzon", - "location": { - "locationDbId": "33585" - }, - "observationVariableDbIds": [ - "CO_357:0000011", - "CO_357:0000021", - "CO_357:0000048" - ], - "germplasmDbIds": [ - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NjkxNTQwMjg5NkUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwNDI2MzA1NEUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwNDI5NzY2RTEy", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwNDQ3MzcyM0UxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwNDU2ODgwNEUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwNDUzMzIzMkUxMg==" - ] - }, - { - "studyDbId": "181000102", - "studyName": "Test de comparaison de provenances de chene sessile - 181000102", - "startDate": "1990-03-01", - "active": true, - "studyType": "Provenance trial", - "trialDbIds": [ - "1", - "15" - ], - "programDbId": "PlantaComp", - "programName": "PlantaComp", - "seasons": [ - "1991", - "1992", - "1993", - "1996", - "1999" - ], - "locationDbId": "33585", - "locationName": "Saint-Laurent - Forêt domaniale de Vierzon", - "observationVariableDbIds": [ - "CO_357:0000011", - "CO_357:0000019", - "CO_357:0000045", - "CO_357:0000063" - ], - "germplasmDbIds": [ - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzAyMDkxOEUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzE5ODQ4MUUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzEwMDA1MUUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzI1MTI5NkUxMg==", - "ZG9pOjEwLjE1NDU0LzEuNDkyMTc4NTMwMzM0NzY1NkUxMg==" - ] - } -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/trial0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/trial0.json deleted file mode 100644 index d8e4e3831953f8af0b923a61c66c719735697365..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/trial0.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "trialDbId": "T1", - "trialName": "Trial 1" - }, - { - "trialDbId": "T2", - "trialName": "Trial 2" - }, - { - "trialDbId": "T3", - "trialName": "Trial 3", - "studies": [ - { - "locationDbId": "37497" - } - ] - }, - { - "trialDbId": "T4", - "trialName": "Trial 4" - }, - { - "trialDbId": "T5", - "trialName": "Trial 5" - }, - { - "trialDbId": "T6", - "trialName": "Trial 6" - }, - { - "trialDbId": "T7", - "trialName": "Trial 7" - } -] \ No newline at end of file diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/urgi_xref_test-group0.json b/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/urgi_xref_test-group0.json deleted file mode 100644 index a91de2ba3d914716f9b07eec2bef2d7e549b6b36..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/fixture/urgi_xref_test-group0.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "linkedResourcesID": [ - "ID2" - ], - "groupId": "0", - "entryType": "Accession", - "databaseName": "GnpIS", - "identifier": "ID1", - "name": "355", - "description": "Lorem ipsum....", - "url": "https://urgi.versailles.inra.fr/gnpis-core/#accessionCard/id=aHR0cHM6Ly9kb2kub3JnLzEwLjE1NDU0L0tGUVRGTA==", - "species": "Quercus petraea" - }, - { - "linkedResourcesID": [ - "ID3" - ], - "entryType": "Site" - }, - { - "linkedResourcesID": [ - "ID2", - "ID3" - ], - "entryType": "Site" - } -] diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/README.md b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/README.md similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/README.md rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/README.md diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/datadiscovery_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/datadiscovery_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/datadiscovery_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/datadiscovery_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmAttribute_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmAttribute_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmAttribute_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmAttribute_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmMcpd_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmMcpd_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmMcpd_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmMcpd_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmPedigree_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmPedigree_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmPedigree_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmPedigree_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmProgeny_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmProgeny_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasmProgeny_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasmProgeny_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasm_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasm_mapping.json similarity index 98% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasm_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasm_mapping.json index d902ed3d49bdaec9b0b253edb4ff6e8596a742e7..1ed674958f4af6e191577354914a203c417a1da9 100644 --- a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/germplasm_mapping.json +++ b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/germplasm_mapping.json @@ -141,8 +141,12 @@ "type": "keyword" }, "synonyms": { - "type": "keyword", - "doc_values": true + "type": "nested", + "properties": { + "type": { "type": "keyword" }, + "synonym": { "type": "keyword" } + } + }, "taxonIds": { "properties": { diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/location_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/location_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/location_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/location_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/observationUnit_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/observationUnit_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/observationUnit_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/observationUnit_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/program_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/program_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/program_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/program_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/study_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/study_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/study_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/study_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/trial_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/trial_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/trial_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/trial_mapping.json diff --git a/backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/xref_mapping.json b/backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/xref_mapping.json similarity index 100% rename from backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/xref_mapping.json rename to backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/xref_mapping.json diff --git a/backend/src/test/resources/test.properties b/backend/src/test/resources/test.properties deleted file mode 100644 index fae763c68b5272818217300769fb71ec32205506..0000000000000000000000000000000000000000 --- a/backend/src/test/resources/test.properties +++ /dev/null @@ -1,2 +0,0 @@ -faidare.elasticsearch-alias-template=gnpis_{source}_{documentType}-group{groupId} -faidare.elasticsearch-xref-index-name=urgi_xref_test diff --git a/data/test/json-bulk/INRAE-URGI/contact-1.json.gz b/data/test/json-bulk/INRAE-URGI/contact-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..aed75edd4f82c754eb71eacf744794ea8e41eb7b Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/contact-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/datadiscovery-1.json.gz b/data/test/json-bulk/INRAE-URGI/datadiscovery-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..d1b4d847a1a043f29c7a2a25ecdd6647b810b412 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/datadiscovery-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/germplasm-1.json.gz b/data/test/json-bulk/INRAE-URGI/germplasm-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..70e4ff8608b769a64838d7b71b8a1d1d42c3ed47 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasm-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/germplasm-2.json.gz b/data/test/json-bulk/INRAE-URGI/germplasm-2.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..a3bd61c815e6639f737813e1dc11cc74c4a1d651 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasm-2.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/germplasmAttribute-1.json.gz b/data/test/json-bulk/INRAE-URGI/germplasmAttribute-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3511c789fa6dd6108d7621f7c0c1a9401802bb25 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasmAttribute-1.json.gz differ diff --git a/data/test/json-bulk/URGI/germplasmMcpd-1.json.gz b/data/test/json-bulk/INRAE-URGI/germplasmMcpd-1.json.gz similarity index 100% rename from data/test/json-bulk/URGI/germplasmMcpd-1.json.gz rename to data/test/json-bulk/INRAE-URGI/germplasmMcpd-1.json.gz diff --git a/data/test/json-bulk/INRAE-URGI/germplasmPedigree-1.json.gz b/data/test/json-bulk/INRAE-URGI/germplasmPedigree-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..29554e0b952565c2560ee9ce13351324a66ca0b0 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasmPedigree-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/germplasmPedigree-2.json.gz b/data/test/json-bulk/INRAE-URGI/germplasmPedigree-2.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..293165d26a692cc692a91c4c1f052d054498bb60 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasmPedigree-2.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/germplasmProgeny-1.json.gz b/data/test/json-bulk/INRAE-URGI/germplasmProgeny-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..5aa854690c23749d1fb53738d385f15daedf478f Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/germplasmProgeny-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/location-1.json.gz b/data/test/json-bulk/INRAE-URGI/location-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..92e0a9e84274d9710d8c7fdc46a6d1ad45af9136 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/location-1.json.gz differ diff --git a/data/test/json-bulk/URGI/location-2.json.gz b/data/test/json-bulk/INRAE-URGI/location-2.json.gz similarity index 100% rename from data/test/json-bulk/URGI/location-2.json.gz rename to data/test/json-bulk/INRAE-URGI/location-2.json.gz diff --git a/data/test/json-bulk/INRAE-URGI/observationUnit-1.json.gz b/data/test/json-bulk/INRAE-URGI/observationUnit-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1aa92e076d5e57b284b82241ce31e1407095d6ca Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/observationUnit-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/observationVariable-1.json b/data/test/json-bulk/INRAE-URGI/observationVariable-1.json new file mode 100644 index 0000000000000000000000000000000000000000..d8715c0acfe689fa97249611cff8a172b4f2fa06 --- /dev/null +++ b/data/test/json-bulk/INRAE-URGI/observationVariable-1.json @@ -0,0 +1 @@ +[{"observationVariableDbId": "CO_321:1000217", "name": "r", "ontologyDbId": "CO_321", "ontologyName": "Wheat Crop Ontology", "synonyms": ["Yield"], "xref": "WIPO:0000217", "institution": "INRA", "scientist": "Arnaud Gauffretau, Francois-Xavier Oury", "date": "21/09/2017", "language": "EN", "crop": "Wheat", "trait": {"traitDbId": "CO_321:0000013", "name": "Grain yield", "description": "Amount (weight) of grains that was harvested.", "mainAbbreviation": "GY", "alternativeAbbreviations": ["GrnYld", "Yld"], "entity": "Grain", "attribute": "Yield", "xref": "WIPO:0010019", "class": "Agronomical"}, "method": {"methodDbId": "CO_321:1020029", "name": "Reference variety comparaison", "description": "Yield expressed as a percentage of the average yield of reference varieties.", "class": "Measurement"}, "scale": {"scaleDbId": "UO:0000187", "name": "%", "dataType": "Numerical"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000217", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000217", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDFKbGJtNWxjMTh5TURFeVgxTmxkRUl5WDFCSlJWUkpUaTFXUlZKVFJRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDBScGFtOXVYekl3TURSZlUyVjBRakUlM0Q="], "source": "URGI", "ontologyDbIds": ["CO_321"], "observationVariableURI": "urn:URGI/observationVariable/CO_321%3A1000217", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_321%3A1000217", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_321:1000217", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIyX1BJRVRJTi1WRVJTRQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjE%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000020", "name": "CIR1", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Circonférence de l'arbre à 1m", "Circum.F", "Circum.I", "Circum.UK", "CIR1[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Trial evaluation", "Breeding criterion"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000012", "name": "Circonférence de l'arbre", "description": "Circonférence du tronc principal de l'arbre", "mainAbbreviation": "CIR", "alternativeAbbreviations": ["CIRC", "Circ", "CI", "Girth"], "entity": "tronc", "attribute": "circonférence", "status": "Standard for INRAE", "class": "Morphological"}, "method": {"methodDbId": "CO_357:2000018", "name": "Protocole ruban 1m", "description": "Mesuré à 1m avec un ruban souple gradué en millimètres", "reference": "http://www.csdhub.com/national-plant-specification/conifers/nps-conifers-girth/", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000108", "name": "mm", "dataType": "Numerical", "xref": "http://purl.obolibrary.org/obo/UO_0000016"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000020", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000020", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFNRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000020", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000020", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000020", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItSQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000048", "name": "HT", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Hauteur totale de l'arbre", "TH", "H", "Height.F", "Height.UK", "Height.I", "HT[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Trial evaluation", "Breeding criterion"], "status": "Standard for INRAE & GenTree project", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000037", "name": "Hauteur de l'arbre", "description": "Hauteur totale de l'arbre, du sol à la plus haute partie du houppier", "mainAbbreviation": "HT", "alternativeAbbreviations": ["Height", "HP", "HPL", "h", "H", "TH", "Height.F", "Height.UK", "Height.I"], "entity": "plante", "attribute": "hauteur", "status": "Standard for INRAE & GenTree project", "class": "Morphological"}, "method": {"methodDbId": "CO_357:2000027", "name": "Protocole hauteur arbre", "description": "Mesuré du sol au haut du houppier avec une perche ou un clinomètre", "reference": "GenTree_protocols_0.99.pdf page 16, https://en.wikipedia.org/wiki/Tree_measurement#Height, https://www.researchgate.net/profile/Erkki_Tomppo/publication/228779321/figure/fig3/AS:300717131747329@1448707959145/Examples-of-tree-height-stem-length-breast-height-and-stump-height-in-several.png", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000107", "name": "cm", "dataType": "Numerical", "xref": "http://purl.obolibrary.org/obo/UO_0000015"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000048", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000048", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFNRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000048", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000048", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000048", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItSQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000079", "name": "Shoots", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Nombre de repousses", "Shoots.F", "Shoots.I", "Shoots.UK", "Shoot[Adonis]"], "contextOfUse": ["Research-intensive characterization", "trial evaluation"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000067", "name": "Quantité de repousse", "description": "Evaluation du nombre de pousses ou de repousses de plus de 30cm de long après une taille", "mainAbbreviation": "Shoots", "alternativeAbbreviations": ["Shoot_nb", "Resprouts_nb", "Stem_nb"], "entity": "pousse", "attribute": "quantité", "status": "Standard for INRAE", "class": "Morphological"}, "method": {"methodDbId": "CO_357:2000002", "name": "Comptage visuel", "description": "Compté à l'oeil nu", "class": "Counting"}, "scale": {"scaleDbId": "CO_357:3000123", "name": "Comptage", "dataType": "Numerical", "decimalPlaces": "0", "xref": "http://purl.obolibrary.org/obo/UO_0000189"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000079", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000079", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFNRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000079", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000079", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000079", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItSQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000080", "name": "SLA", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Surface foliaire specifique", "SLAR", "SLA[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Breeding criterion", "trial evaluation"], "status": "Standard for INRAE", "xref": "10.1111/j.1365-2435.2006.01135.x", "institution": "INRAE/IBET", "scientist": "Célia Michotey/Inês Chaves", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000068", "name": "Surface foliaire spécifique", "description": "Surface foliaire par biomasse foliaire sèche", "mainAbbreviation": "SLA", "alternativeAbbreviations": ["SLAR"], "entity": "feuille", "attribute": "surface spécifique", "status": "Standard for INRAE", "xref": "TO:0000562", "class": "Morphological"}, "method": {"methodDbId": "CO_357:2000035", "name": "Protocole SLA", "description": "Ratio entre la surface de la feuille, mesurée par analyse d'image, et sa biomasse sèche", "reference": "GenTree_protocols_0.99.pdf page 19-25", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000045", "name": "cm2/g", "dataType": "Numerical", "decimalPlaces": "1", "validValues": {"max": 100.0}}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000080", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000080", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000080", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000080", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000080", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000086", "name": "CM", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Teneur en carbone des feuilles", "CM.F", "CM[Adonis]"], "contextOfUse": ["Research-intensive characterization"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000074", "name": "Teneur en carbone foliaire", "description": "Teneur en carbone des feuilles", "mainAbbreviation": "CM", "alternativeAbbreviations": ["CM.F"], "entity": "feuille", "attribute": "teneur en carbone", "status": "Standard for INRAE", "class": "Biochemical"}, "method": {"methodDbId": "CO_357:2100002", "name": "Mesure", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000047", "name": "mg/g", "dataType": "Numerical"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000086", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000086", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000086", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000086", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000086", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000085", "name": "Delta13C", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Discrimination isotopique du carbone des feuilles", "delta C13", "delta-13C", "Delta.F", "discriC13", "d13Cf", "d13C", "D13C[Adonis]"], "contextOfUse": ["Research-intensive characterization", "QTL analysis"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000073", "name": "Delta C13", "description": "Teneur en isotope de carbone (C13) des feuilles", "mainAbbreviation": "Delta13C", "alternativeAbbreviations": ["Delta.F", "d13Cf", "d13C"], "entity": "feuille", "attribute": "discrimination du carbone", "status": "Standard for INRAE", "class": "Biochemical"}, "method": {"methodDbId": "CO_357:2100002", "name": "Mesure", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000046", "name": "‰", "dataType": "Numerical"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000085", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000085", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000085", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000085", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000085", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000016", "name": "BS_date", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Date bourgeonement", "date15", "date15.F", "date15.I", "date15.UK", "date15.3", "date15.3.F", "BS_d[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Trial evaluation", "Breeding criterion"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000009", "name": "Date d'aoûtement", "description": "Estimation de la date à laquelle le score d'aoûtement pourra être observé pour la première fois", "mainAbbreviation": "BS_date", "entity": "bourgeon", "attribute": "aoûtement", "status": "Standard for INRAE", "class": "Phenological"}, "method": {"methodDbId": "CO_357:2000014", "name": "Protocole date bourgeon", "description": "Estimation de la date d'après une régression polynomiale réalisée sur une série temporelle de scores de débourrement ou bourgeonement", "class": "Computation"}, "scale": {"scaleDbId": "CO_357:3000043", "name": "Jour calendaire", "dataType": "Date"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000016", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000016", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000016", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000016", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000016", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000010", "name": "BF_score_BL", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Score de débourrement feuillus", "Budflush.F", "Budflush.I", "Budflush.UK", "DEB", "BF_BL[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Trial evaluation", "Breeding criterion"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000006", "name": "Débourrement", "description": "Evaluation du débourrement, le moment de l'année où les bourgeons végétatifs et floraux des arbres se développent pour laisser apparaître leur bourre (le duvet et les jeunes feuilles et fleurs enfouies dans les bourgeons) puis leurs feuilles et fleurs", "synonyms": ["Débourrage"], "mainAbbreviation": "BF_score", "alternativeAbbreviations": ["DEB", "Budflush", "Budflush.F", "Budflush.I", "Budflush.UK", "BF", "Budburst"], "entity": "bourgeon", "attribute": "débourrement", "status": "Standard for INRAE", "class": "Phenological"}, "method": {"methodDbId": "CO_357:2000009", "name": "Protocole score débourrement", "description": "Evaluation à l'oeil nu selon une échelle de notation de référence sur le bourgeon apical (ou supposé apical) ou sur l'arbre entier lorsque le bourgeon apical n'est pas visible", "reference": "https://forgemia.inra.fr/urgi-is/ontologies/blob/develop/Tree/T4F_D21_submitted.pdf - pages 6-20 + 30-35 pour les feuillus et 45-49 + 62-64 pour les conifers", "class": "Estimation"}, "scale": {"scaleDbId": "CO_357:3000010", "name": "Note de débourrement feuillus", "dataType": "Nominal", "decimalPlaces": "0", "validValues": {"min": 1.0, "max": 6.0, "categories": ["1 = Bourgeon dormant complètement enveloppé par les écailles (perulae)", "2 = Gonflement et élongation des bourgeons avec des écailles légèrement divergentes, présence d'une ou plusieurs gouttelettes de baume", "3 = Germination des bourgeons avec les pointes de petites feuilles qui commencent à sortir des écailles, du vert commence à être visible", "4 = Les bourgeons sont complètement ouverts avec des feuilles encore regroupées, des écailles toujours présentes", "5 = Les feuilles s'étendent et divergent mais sont toujours enroulées sur elles-mêmes, les écailles peuvent être présentes ou absentes", "6 = Les feuilles sont complètement ouvertes (mais de taille inférieure à celles matures), allongement de l'axe principal, écailles absentes"]}}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000010", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000010", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000010", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000010", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000010", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000083", "name": "Syllep", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Nombre de ramifications sylleptiques", "Syllep.F", "Syllep.I", "Syllep.UK", "RAMA", "Sylle[Adonis]"], "contextOfUse": ["Research-intensive characterization", "trial evaluation"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000071", "name": "Quantité de rameaux sylleptiques", "description": "Evaluation du nombre de rameaux sylleptiques, une pousse qui se développe à partir d'un bourgeon latéral sur la pousse principale et dont la croissance n'est pas précédée par une période de repos marquée", "synonyms": ["Rameaux anticipés"], "mainAbbreviation": "Syllep", "alternativeAbbreviations": ["Syllep.F", "Syllep.I", "Syllep.UK", "RAMA"], "entity": "rameau anticipé", "attribute": "quantité", "status": "Standard for INRAE", "class": "Morphological"}, "method": {"methodDbId": "CO_357:2000036", "name": "Protocole ramification sylleptiques", "description": "Nombre de branches sylleptiques de plus de 10 cm de long comptées à la fin de la saison de croissance", "class": "Counting"}, "scale": {"scaleDbId": "CO_357:3000123", "name": "Comptage", "dataType": "Numerical", "decimalPlaces": "0", "xref": "http://purl.obolibrary.org/obo/UO_0000189"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000083", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000083", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFNRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000083", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000083", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000083", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItSQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000074", "name": "REP", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Nombre de répétitions", "REP[Adonis]"], "contextOfUse": ["Research-intensive characterization", "Trial evaluation", "Breeding criterion"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000063", "name": "Nombre de répétitions", "description": "Nombre de réplicats utilisés pour calculer la valeur moyenne de la associée", "mainAbbreviation": "REP", "alternativeAbbreviations": ["nrep"], "entity": "plante", "attribute": "réplicat", "status": "Standard for INRAE", "class": "Other"}, "method": {"methodDbId": "CO_357:2000034", "name": "Protocole répétitions", "description": "Nombre de réplicats utilisés pour calculer la valeur moyenne du trait associé", "class": "Counting"}, "scale": {"scaleDbId": "CO_357:3000123", "name": "Comptage", "dataType": "Numerical", "decimalPlaces": "0", "xref": "http://purl.obolibrary.org/obo/UO_0000189"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000074", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000074", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFNRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFZVcyUzRA==", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000074", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000074", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000074", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItSQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItVUs%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_321:1000162", "name": "YR-SCORE_score", "ontologyDbId": "CO_321", "ontologyName": "Wheat Crop Ontology", "synonyms": ["Yellow rust score", "Susceptibility to stripe rust"], "xref": "WIPO:0000162", "institution": "INRA", "scientist": "Jacques Le Gouis", "date": "15/06/2016", "language": "EN", "crop": "Wheat", "trait": {"traitDbId": "CO_321:0000907", "name": "Stripe rust notes", "description": "Stripe rust (yellow rust) incidence/severity/response in the plants caused by the agent Puccinia striiformis f.sp. tritici.", "synonyms": ["Stripe rust", "Disease score Yellow Rust"], "mainAbbreviation": "PstriNote", "alternativeAbbreviations": ["YRustNote", "YRNote", "PSTRIL"], "entity": "Leaf", "attribute": "Stripe rust notes", "xref": "WIPO:0010065", "class": "Biotic stress"}, "method": {"methodDbId": "CO_321:1021025", "name": "undefined", "description": "Unavailable method description", "class": "Estimation"}, "scale": {"scaleDbId": "CO_321:1030006", "name": "1 to 9 note", "dataType": "Ordinal", "validValues": {"min": 1.0, "max": 9.0, "categories": ["1 = Resistant", "9 = susceptible"]}}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000162", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000162", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDFKbGJtNWxjMTh5TURFeVgxTmxkRUl5WDFCSlJWUkpUaTFXUlZKVFJRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDBScGFtOXVYekl3TURSZlUyVjBRakUlM0Q="], "source": "URGI", "ontologyDbIds": ["CO_321"], "observationVariableURI": "urn:URGI/observationVariable/CO_321%3A1000162", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_321%3A1000162", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_321:1000162", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIyX1BJRVRJTi1WRVJTRQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjE%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_321:1000074", "name": "GY_q/ha", "ontologyDbId": "CO_321", "ontologyName": "Wheat Crop Ontology", "synonyms": ["Grain yield at 0% humidity ", "rdt"], "growthStage": "Z92 (Grain hard, not dented by thumbnail)", "xref": "WIPO:0000074", "institution": "INRA", "scientist": "Jacques Le Gouis", "date": "15/06/2016", "language": "EN", "crop": "Wheat", "trait": {"traitDbId": "CO_321:0000013", "name": "Grain yield", "description": "Amount (weight) of grains that was harvested.", "mainAbbreviation": "GY", "alternativeAbbreviations": ["GrnYld", "Yld"], "entity": "Grain", "attribute": "Yield", "xref": "WIPO:0010019", "class": "Agronomical"}, "method": {"methodDbId": "CO_321:1020013", "name": "Direct measure harvest 0% humidity", "description": "Arvalis method: Mechanised harvest 0% humidity", "class": "Measurement"}, "scale": {"scaleDbId": "CO_321:1030011", "name": "q/ha", "dataType": "Numerical"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000074", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_321:1000074", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDFKbGJtNWxjMTh5TURFeVgxTmxkRUl5WDFCSlJWUkpUaTFXUlZKVFJRJTNEJTNE", "dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZRbFJJWDBScGFtOXVYekl3TURSZlUyVjBRakUlM0Q="], "source": "URGI", "ontologyDbIds": ["CO_321"], "observationVariableURI": "urn:URGI/observationVariable/CO_321%3A1000074", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_321%3A1000074", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_321:1000074", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX1Jlbm5lc18yMDEyX1NldEIyX1BJRVRJTi1WRVJTRQ%3D%3D", "urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvQlRIX0Rpam9uXzIwMDRfU2V0QjE%3D"], "node": "URGI", "databaseName": "brapi@URGI"}, {"observationVariableDbId": "CO_357:0000087", "name": "LNC", "ontologyDbId": "CO_357", "ontologyName": "Woody Plant Ontology", "synonyms": ["Teneur en azote des feuilles", "NM", "NM.F", "NM[Adonis]"], "contextOfUse": ["Research-intensive characterization"], "status": "Standard for INRAE", "institution": "INRAE", "scientist": "Célia Michotey", "date": "13/03/2017", "language": "FR", "crop": "WoodyPlant", "trait": {"traitDbId": "CO_357:1000075", "name": "Teneur en azote foliaire", "description": "Teneur en azote des feuilles", "mainAbbreviation": "LNC", "alternativeAbbreviations": ["NM", "NM.F"], "entity": "feuille", "attribute": "teneur en azote", "status": "Standard for INRAE", "class": "Biochemical"}, "method": {"methodDbId": "CO_357:2100002", "name": "Mesure", "class": "Measurement"}, "scale": {"scaleDbId": "CO_357:3000047", "name": "mg/g", "dataType": "Numerical"}, "documentationURL": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000087", "schema:url": "https://urgi.versailles.inrae.fr/ontology#termIdentifier=CO_357:0000087", "studyDbIds": ["dXJuOlVSR0kvc3R1ZHkvZFhKdU9sVlNSMGt2YzNSMVpIa3ZVRTlRV1U5TlNVTlRMVkJQVURJdFJnJTNEJTNE"], "source": "URGI", "ontologyDbIds": ["CO_357"], "observationVariableURI": "urn:URGI/observationVariable/CO_357%3A0000087", "@type": "observationVariable", "@id": "urn:URGI/observationVariable/CO_357%3A0000087", "schema:includedInDataCatalog": "https://urgi.versailles.inrae.fr/gnpis", "schema:identifier": "CO_357:0000087", "schema:name": null, "studyURIs": ["urn:URGI/study/dXJuOlVSR0kvc3R1ZHkvUE9QWU9NSUNTLVBPUDItRg%3D%3D"], "node": "URGI", "databaseName": "brapi@URGI"}] \ No newline at end of file diff --git a/data/test/json-bulk/INRAE-URGI/observationVariable-1.json.gz b/data/test/json-bulk/INRAE-URGI/observationVariable-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..b83f8591300536aba717ddee9c62b9eab402643c Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/observationVariable-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/ontology-1.json.gz b/data/test/json-bulk/INRAE-URGI/ontology-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..ab41218983a5a3b4ad2df4b1dcd8da847dfd9e51 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/ontology-1.json.gz differ diff --git a/data/test/json-bulk/URGI/program-1.json.gz b/data/test/json-bulk/INRAE-URGI/program-1.json.gz similarity index 100% rename from data/test/json-bulk/URGI/program-1.json.gz rename to data/test/json-bulk/INRAE-URGI/program-1.json.gz diff --git a/data/test/json-bulk/INRAE-URGI/study-1.json.gz b/data/test/json-bulk/INRAE-URGI/study-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3b73648059d837314fc04e336557dc6408891aee Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/study-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/trial-1.json.gz b/data/test/json-bulk/INRAE-URGI/trial-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..247483f8274ef0c892e9042071f7e5a58ed52678 Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/trial-1.json.gz differ diff --git a/data/test/json-bulk/INRAE-URGI/xref-phenotyping-1.json.gz b/data/test/json-bulk/INRAE-URGI/xref-phenotyping-1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c3221850033b9877104f620996628e2637e8339e Binary files /dev/null and b/data/test/json-bulk/INRAE-URGI/xref-phenotyping-1.json.gz differ diff --git a/data/test/json-bulk/URGI/datadiscovery-1.json.gz b/data/test/json-bulk/URGI/datadiscovery-1.json.gz deleted file mode 100644 index 6ac74719f5f4812c9305a67857eaeca758641cfd..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/datadiscovery-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/germplasm-1.json.gz b/data/test/json-bulk/URGI/germplasm-1.json.gz deleted file mode 100644 index 4182f9911e850dbf705867510a784b8c8b2ecfa1..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/germplasm-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/germplasmAttribute-1.json.gz b/data/test/json-bulk/URGI/germplasmAttribute-1.json.gz deleted file mode 100644 index 2fbdf922e61a6f255f6052c9897190d201b5046f..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/germplasmAttribute-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/germplasmPedigree-1.json.gz b/data/test/json-bulk/URGI/germplasmPedigree-1.json.gz deleted file mode 100644 index b265e2d8ff5806fa069feef69025c573d2e56435..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/germplasmPedigree-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/germplasmProgeny-1.json.gz b/data/test/json-bulk/URGI/germplasmProgeny-1.json.gz deleted file mode 100644 index 0a71aa221bd0ed854dc294b73050a21b9412301b..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/germplasmProgeny-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/location-1.json.gz b/data/test/json-bulk/URGI/location-1.json.gz deleted file mode 100644 index 9ee1c92b5c4f86999dfafd34c157cf24d092127b..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/location-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/study-1.json.gz b/data/test/json-bulk/URGI/study-1.json.gz deleted file mode 100644 index 46c09ea4cdb10a37cc5d0a29185cfe53551e3539..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/study-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/trial-1.json.gz b/data/test/json-bulk/URGI/trial-1.json.gz deleted file mode 100644 index 62b52333712c59eed3df6ea037a3c7a3ad8752cc..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/trial-1.json.gz and /dev/null differ diff --git a/data/test/json-bulk/URGI/xref-1.json.gz b/data/test/json-bulk/URGI/xref-1.json.gz deleted file mode 100644 index 5a9cfc6637a35c665533c8a3e3fe56f01d16dbe9..0000000000000000000000000000000000000000 Binary files a/data/test/json-bulk/URGI/xref-1.json.gz and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..249e5832f090a2944b7473328c07c9755baa3196 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 00e33edef6936b1ada8721cff42201db8c9d8675..e411586a54a84874f49763fe4742011efc86ca97 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787337ffb79f0e3cf8b1e9f00f680a959de1..a69d9cb6c20655813e44515156e7253a2a239138 100755 --- a/gradlew +++ b/gradlew @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd32c4e687021ef32db511e8a206129b88ec..f127cfd49d4024c3e1e0d08ba56399221b4fb25d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/scripts/harvest.sh b/scripts/harvest.sh index 183f9f479e7fe8995dac56da85997a470c4dcc37..f79a094917393ed58c6db57354b7ba44bb752c81 100755 --- a/scripts/harvest.sh +++ b/scripts/harvest.sh @@ -153,8 +153,8 @@ for DOCUMENT_TYPE in ${DOCUMENT_TYPES}; do \"index_patterns\": [\"${INDEX_PATTERN}-*\"], \"order\": 101, \"mappings\": - $(cat "${BASEDIR}"/../backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/${DOCUMENT_TYPE}_mapping.json), - \"settings\": $(cat "${BASEDIR}"/../backend/src/test/resources/fr/inra/urgi/faidare/repository/es/setup/index/settings.json) + $(cat "${BASEDIR}"/../backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/${DOCUMENT_TYPE}_mapping.json), + \"settings\": $(cat "${BASEDIR}"/../backend/src/test/resources/fr/inrae/urgi/faidare/repository/es/setup/index/settings.json) }") check_acknowledgment "${LOG}" "create template" @@ -189,7 +189,8 @@ for DOCUMENT_TYPE in ${DOCUMENT_TYPES}; do COUNT_EXTRACTED_DOCS=$((COUNT_EXTRACTED_DOCS+COUNT_FILE_DOCS)) done curl -s -XGET "${ES_HOST}:${ES_PORT}/${INDEX_NAME}/_refresh" >/dev/null - COUNT_INDEXED_DOCS=$(curl -s -XGET "${ES_HOST}:${ES_PORT}/_cat/indices/${INDEX_NAME}?h=docs.count") + # Use index/_count instead of docs.count to exclude nested documents (synonyms) from the count. For more details: https://discuss.elastic.co/t/incorrect-doc-count-vs-index-total-returns-in-es/222182/2 + COUNT_INDEXED_DOCS=$(curl -s -XGET "${ES_HOST}:${ES_PORT}/${INDEX_NAME}/_count" | jq '.count') if [ "$COUNT_INDEXED_DOCS" != "$COUNT_EXTRACTED_DOCS" ]; then echo -e "${RED}ERROR: a problem occurred when indexing data from ${DATA_DIR} on FAIDARE ${ENV}.${NC}" echo -e "${ORANGE}Expected ${COUNT_EXTRACTED_DOCS} documents but got ${COUNT_INDEXED_DOCS} indexed documents.${NC}" diff --git a/web/build.gradle.kts b/web/build.gradle.kts index fd9828917cea4449637f247dbf3542b930a20016..a9dd2c50391aa1092e57f4ebd30dd9eef62cede2 100644 --- a/web/build.gradle.kts +++ b/web/build.gradle.kts @@ -3,7 +3,7 @@ import com.github.gradle.node.yarn.task.YarnTask plugins { base - id("com.github.node-gradle.node") version "3.2.1" + id("com.github.node-gradle.node") version "3.4.0" } node { diff --git a/web/package.json b/web/package.json index d940af62f9ba163d5f8fa70ea296821a16bfb0bc..9c3f8c931992ed66e38cd54c2de7b7367080f1ad 100644 --- a/web/package.json +++ b/web/package.json @@ -15,28 +15,28 @@ "author": "", "license": "MIT", "dependencies": { - "@types/leaflet": "1.7.9", - "bootstrap": "5.1.3", - "leaflet": "1.7.1" + "@types/leaflet": "1.9.8", + "bootstrap": "5.3.2", + "leaflet": "1.9.4" }, "devDependencies": { - "@types/bootstrap": "5.1.9", - "@types/leaflet.markercluster": "1.4.6", - "autoprefixer": "10.4.2", + "@types/bootstrap": "5.2.9", + "@types/leaflet.markercluster": "1.5.4", + "autoprefixer": "10.4.16", "clean-webpack-plugin": "4.0.0", - "css-loader": "6.7.1", - "css-minimizer-webpack-plugin": "3.4.1", + "css-loader": "6.8.1", + "css-minimizer-webpack-plugin": "5.0.1", "leaflet.markercluster": "1.5.3", - "mini-css-extract-plugin": "2.6.0", - "postcss": "8.4.8", - "postcss-loader": "6.2.1", - "prettier": "2.5.1", - "sass": "1.49.9", - "sass-loader": "12.6.0", - "ts-loader": "9.2.7", - "typescript": "4.6.2", - "webpack": "5.70.0", - "webpack-cli": "4.9.2" + "mini-css-extract-plugin": "2.7.6", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", + "prettier": "3.0.3", + "sass": "1.69.5", + "sass-loader": "13.3.2", + "ts-loader": "9.5.0", + "typescript": "5.2.2", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" }, "browserslist": [ "defaults" diff --git a/web/src/style/_custom-bootstrap.scss b/web/src/style/_custom-bootstrap.scss index 9de7c3dce4b8fbea20fd88c39b1bc001c72b69a0..d132d25f5de2e1454f0e25df13cc06d2645a3931 100644 --- a/web/src/style/_custom-bootstrap.scss +++ b/web/src/style/_custom-bootstrap.scss @@ -9,7 +9,9 @@ // Configuration @import '~bootstrap/scss/functions'; @import '~bootstrap/scss/variables'; +@import '~bootstrap/scss/variables-dark'; @import '~bootstrap/scss/mixins'; +@import '~bootstrap/scss/maps'; @import '~bootstrap/scss/utilities'; // Layout & components diff --git a/web/src/style/style.scss b/web/src/style/style.scss index 806a0d4bec25eee291369e323e27f2c77d0d3fe1..d6baf08c3d6978165245dca565cb5544112a803b 100644 --- a/web/src/style/style.scss +++ b/web/src/style/style.scss @@ -12,6 +12,54 @@ $table-group-separator-color: $table-border-color; @import '~leaflet.markercluster/dist/MarkerCluster.css'; @import '~leaflet.markercluster/dist/MarkerCluster.Default.css'; +$theme-navbar-height: 4rem; +$theme-navbar-color: $black; +$theme-navbar-bg-color: #eaeaea; +$theme-navbar-hover-color: $white; +$theme-navbar-hover-bg-color: #c2c2c2; + +.navbar { + background-color: $theme-navbar-bg-color; + margin-bottom: 10px; +} + +.navbar-toggler { + color: $theme-navbar-color; + border-color: $theme-navbar-color; + font-size: 1.5rem; + line-height: 1.5rem; +} + +.navbar .navbar-nav .nav-link, +.navbar .navbar-brand { + color: $theme-navbar-color !important; + height: $theme-navbar-height; + &:hover { + color: $theme-navbar-hover-color !important; + background-color: $theme-navbar-hover-bg-color; + } +} + +.dropdown-menu { + background-color: $theme-navbar-bg-color; +} + +.dropdown-item { + color: $theme-navbar-color !important; + background-color: $theme-navbar-bg-color; + + &:hover { + color: $theme-navbar-hover-color !important; + background-color: $theme-navbar-hover-bg-color; + } +} + +.dropdown-item.active { + .text-body-secondary { + color: $white !important; + } +} + a[role='button'] { color: $link-color !important; } diff --git a/web/yarn.lock b/web/yarn.lock index 00732305b51ee97dc6110c11af39adc600beceec..2d0b4b97125c17ee3f589b4e71fd8954264f4c18 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -3,278 +3,356 @@ "@babel/code-frame@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.14.5" + "@babel/highlight" "^7.18.6" -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== +"@babel/helper-validator-identifier@^7.18.6": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" "@discoveryjs/json-ext@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" - integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@popperjs/core@^2.9.2": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.3.tgz#8b68da1ebd7fc603999cf6ebee34a4899a14b88e" - integrity sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ== + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@trysound/sax@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" - integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@types/bootstrap@5.1.9": - version "5.1.9" - resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.1.9.tgz#55b9bea862667e351e9873ff94fad7cd0be10c5f" - integrity sha512-Tembe6lt7819EUzV5LSG9uuwULm4hdEGV9LZ8QBYpWc0J+a+9DdmJEwZ4FMaXGVJWwumTPSkJ8JQF0/KDAmXYg== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/bootstrap@5.2.9": + version "5.2.9" + resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.2.9.tgz#5040df5d8d12cb9fb6268a33b8d87234af15e09a" + integrity sha512-Fcg4nORBKaVUAG4F0ePWcatWQVfr3NAT9XIN+hl1PaiAwb4tq55+iua9R3exsbB3yyfhyQlHYg2foTlW86J+RA== dependencies: "@popperjs/core" "^2.9.2" - "@types/jquery" "*" "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" - integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== + version "8.4.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.7.tgz#0f05a2677d1a394ff70c21a964a32d3efa05f966" + integrity sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/geojson@*": - version "7946.0.8" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" - integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== + version "7946.0.10" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== "@types/glob@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" -"@types/jquery@*": - version "3.5.6" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.6.tgz#97ac8e36dccd8ad8ed3f3f3b48933614d9fd8cf0" - integrity sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg== +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: - "@types/sizzle" "*" + "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/leaflet.markercluster@1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@types/leaflet.markercluster/-/leaflet.markercluster-1.4.6.tgz#1159460b374ba5e329cb678d0e427f99dca75be5" - integrity sha512-MD+bUDzxHznY0zOlSBUAMNQUGB2+xpJPKrR2MNEoBAAKa3QTKJJySBtCqWyGLvYNNO+Cdyc2c64aF2IFwe4fcQ== +"@types/leaflet.markercluster@1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.4.tgz#2ab43417cf3f6a42d0f1baf4e1c8f659cf1dc3a1" + integrity sha512-tfMP8J62+wfsVLDLGh5Zh1JZxijCaBmVsMAX78MkLPwvPitmZZtSin5aWOVRhZrCS+pEOZwNzexbfWXlY+7yjg== dependencies: "@types/leaflet" "*" "@types/leaflet@*": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.7.4.tgz#bb9430f69d588ca5829c1ba82657e179454f93a1" - integrity sha512-a3qYlMwJ62+WRoiDmYODUD4KywA14jP2XohAkAWtELGuMAD3MohZa/MmIvQDqF52xNI9OYaY8BMsL+9z7yf2HQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.9.0.tgz#8caf452255e16cb15e0eabcb0d2a26793da0a6a2" + integrity sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw== dependencies: "@types/geojson" "*" -"@types/leaflet@1.7.9": - version "1.7.9" - resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.7.9.tgz#7993d34f14cfa88c45b3d490daba39a3a1be9a2b" - integrity sha512-H8vPgD49HKzqM41ArHGZM70g/tfhp8W+JcPxfnF+5H/Xvp+xiP+KQOUNWU8U89fqS1Jj3cpRY/+nbnaHFzwnFA== +"@types/leaflet@1.9.8": + version "1.9.8" + resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.9.8.tgz#32162a8eaf305c63267e99470b9603b5883e63e8" + integrity sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg== dependencies: "@types/geojson" "*" "@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/node@*": - version "16.7.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.2.tgz#0465a39b5456b61a04d98bd5545f8b34be340cb7" - integrity sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/sizzle@*": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + version "18.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.3.tgz#78a6d7ec962b596fc2d2ec102c4dd3ef073fea6a" + integrity sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + +"@webassemblyjs/floating-point-hex-parser@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== + +"@webassemblyjs/helper-api-error@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== + +"@webassemblyjs/helper-buffer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== + +"@webassemblyjs/helper-numbers@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-wasm-section" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-opt" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wast-printer" "1.11.5" + +"@webassemblyjs/wasm-gen@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + +"@webassemblyjs/wasm-opt@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" + +"@webassemblyjs/wast-printer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== + dependencies: + "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" - integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== -"@webpack-cli/info@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" - integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== - dependencies: - envinfo "^7.7.3" +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== -"@webpack-cli/serve@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" - integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -286,15 +364,15 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -acorn-import-assertions@^1.7.6: - version "1.7.6" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78" - integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn@^8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.5.0, acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== ajv-formats@^2.1.1: version "2.1.1" @@ -308,7 +386,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.0.0, ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== @@ -326,19 +404,24 @@ ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.8.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" ansi-styles@^3.2.1: version "3.2.1" @@ -362,26 +445,31 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -autoprefixer@10.4.2: - version "10.4.2" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b" - integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ== +autoprefixer@10.4.16: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: - browserslist "^4.19.1" - caniuse-lite "^1.0.30001297" - fraction.js "^4.1.2" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" @@ -399,12 +487,12 @@ binary-extensions@^2.0.0: boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bootstrap@5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" - integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q== +bootstrap@5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.2.tgz#97226583f27aae93b2b28ab23f4c114757ff16ae" + integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g== brace-expansion@^1.1.7: version "1.1.11" @@ -414,34 +502,42 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6: - version "4.16.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" - integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== +browserslist@^4.0.0, browserslist@^4.14.5: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001251" - colorette "^1.3.0" - electron-to-chromium "^1.3.811" - escalade "^3.1.1" - node-releases "^1.1.75" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" -browserslist@^4.19.1: - version "4.20.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" - integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ== +browserslist@^4.21.10: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001313" - electron-to-chromium "^1.4.76" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +browserslist@^4.21.4: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" buffer-from@^1.0.0: version "1.1.2" @@ -463,10 +559,25 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001297, caniuse-lite@^1.0.30001313: - version "1.0.30001314" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596" - integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400: + version "1.0.30001423" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz#57176d460aa8cd85ee1a72016b961eb9aca55d91" + integrity sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ== + +caniuse-lite@^1.0.30001449: + version "1.0.30001464" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" + integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== + +caniuse-lite@^1.0.30001517: + version "1.0.30001521" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz#e9930cf499f7c1e80334b6c1fbca52e00d889e56" + integrity sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ== + +caniuse-lite@^1.0.30001538: + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== chalk@^2.0.0: version "2.4.2" @@ -477,7 +588,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -486,9 +597,9 @@ chalk@^4.1.0: supports-color "^7.1.0" "chokidar@>=3.0.0 <4.0.0": - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -505,6 +616,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" + integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + clean-webpack-plugin@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729" @@ -538,34 +654,34 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colord@^2.0.1, colord@^2.6: - version "2.7.0" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.7.0.tgz#706ea36fe0cd651b585eb142fe64b6480185270e" - integrity sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q== - -colorette@^1.2.2, colorette@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" - integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.0.0, commander@^7.2.0: +commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -573,18 +689,17 @@ commander@^7.0.0, commander@^7.2.0: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: - "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" + js-yaml "^4.1.0" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.10.0" cross-spawn@^7.0.3: version "7.0.3" @@ -595,129 +710,128 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-color-names@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" - integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== +css-declaration-sorter@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== -css-declaration-sorter@^6.0.3: - version "6.1.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.1.tgz#77b32b644ba374bc562c0fc6f4fdaba4dfb0b749" - integrity sha512-BZ1aOuif2Sb7tQYY1GeCjG7F++8ggnwUkH5Ictw0mrdpqpEd+zWmcPdstnH2TItlb74FqR0DrVEieon221T/1Q== - dependencies: - timsort "^0.3.0" - -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== +css-loader@6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" -css-minimizer-webpack-plugin@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== +css-minimizer-webpack-plugin@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== +css-tree@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" + mdn-data "2.0.30" + source-map-js "^1.0.1" -css-what@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" - integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz#359943bf00c5c8e05489f12dd25f3006f2c1cbd2" - integrity sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ== - dependencies: - css-declaration-sorter "^6.0.3" - cssnano-utils "^2.0.1" - postcss-calc "^8.0.0" - postcss-colormin "^5.2.0" - postcss-convert-values "^5.0.1" - postcss-discard-comments "^5.0.1" - postcss-discard-duplicates "^5.0.1" - postcss-discard-empty "^5.0.1" - postcss-discard-overridden "^5.0.1" - postcss-merge-longhand "^5.0.2" - postcss-merge-rules "^5.0.2" - postcss-minify-font-values "^5.0.1" - postcss-minify-gradients "^5.0.2" - postcss-minify-params "^5.0.1" - postcss-minify-selectors "^5.1.0" - postcss-normalize-charset "^5.0.1" - postcss-normalize-display-values "^5.0.1" - postcss-normalize-positions "^5.0.1" - postcss-normalize-repeat-style "^5.0.1" - postcss-normalize-string "^5.0.1" - postcss-normalize-timing-functions "^5.0.1" - postcss-normalize-unicode "^5.0.1" - postcss-normalize-url "^5.0.2" - postcss-normalize-whitespace "^5.0.1" - postcss-ordered-values "^5.0.2" - postcss-reduce-initial "^5.0.1" - postcss-reduce-transforms "^5.0.1" - postcss-svgo "^5.0.2" - postcss-unique-selectors "^5.0.1" - -cssnano-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" - integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== +cssnano-preset-default@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz#2a93247140d214ddb9f46bc6a3562fa9177fe301" + integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^4.0.0" + postcss-calc "^9.0.0" + postcss-colormin "^6.0.0" + postcss-convert-values "^6.0.0" + postcss-discard-comments "^6.0.0" + postcss-discard-duplicates "^6.0.0" + postcss-discard-empty "^6.0.0" + postcss-discard-overridden "^6.0.0" + postcss-merge-longhand "^6.0.0" + postcss-merge-rules "^6.0.1" + postcss-minify-font-values "^6.0.0" + postcss-minify-gradients "^6.0.0" + postcss-minify-params "^6.0.0" + postcss-minify-selectors "^6.0.0" + postcss-normalize-charset "^6.0.0" + postcss-normalize-display-values "^6.0.0" + postcss-normalize-positions "^6.0.0" + postcss-normalize-repeat-style "^6.0.0" + postcss-normalize-string "^6.0.0" + postcss-normalize-timing-functions "^6.0.0" + postcss-normalize-unicode "^6.0.0" + postcss-normalize-url "^6.0.0" + postcss-normalize-whitespace "^6.0.0" + postcss-ordered-values "^6.0.0" + postcss-reduce-initial "^6.0.0" + postcss-reduce-transforms "^6.0.0" + postcss-svgo "^6.0.0" + postcss-unique-selectors "^6.0.0" + +cssnano-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08" + integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== -cssnano@^5.0.6: - version "5.0.8" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.8.tgz#39ad166256980fcc64faa08c9bb18bb5789ecfa9" - integrity sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg== +cssnano@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.1.tgz#87c38c4cd47049c735ab756d7e77ac3ca855c008" + integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== dependencies: - cssnano-preset-default "^5.1.4" - is-resolvable "^1.1.0" - lilconfig "^2.0.3" - yaml "^1.10.2" + cssnano-preset-default "^6.0.1" + lilconfig "^2.1.0" -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== dependencies: - css-tree "^1.1.2" + css-tree "~2.2.0" del@^4.1.1: version "4.1.1" @@ -732,66 +846,71 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" - integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== +domhandler@^5.0.1, domhandler@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: - domelementtype "^2.2.0" + domelementtype "^2.3.0" -domutils@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" -electron-to-chromium@^1.3.811: - version "1.3.818" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.818.tgz#32ed024fa8316e5d469c96eecbea7d2463d80085" - integrity sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== -electron-to-chromium@^1.4.76: - version "1.4.80" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz#299a1ea3e32810934b4e3c2e4d4cb53136fdab3f" - integrity sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg== +electron-to-chromium@^1.4.284: + version "1.4.326" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.326.tgz#a51fb237e9dcfd6716c503d9537d269504c11b76" + integrity sha512-tFNZP7VlGDp88vR7TYQ/h5svw8lzfu44PU5tfDJ+JYdcsEuWv4GpEm7hOF3c4Z/o4QQ6lNxmlGtvGaBVMRM9uQ== + +electron-to-chromium@^1.4.477: + version "1.4.494" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.494.tgz#588f7a3d19d32a31f3a7e05d81b61d95d25b1555" + integrity sha512-KF7wtsFFDu4ws1ZsSOt4pdmO1yWVNWCFtijVYZPUeW4SV7/hy/AESjLn/+qIWgq7mHscNOKAwN5AIM1+YAy+Ww== enhanced-resolve@^5.0.0: - version "5.8.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" - integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.9.2: - version "5.9.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" - integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== envinfo@^7.7.3: version "7.8.1" @@ -805,10 +924,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== escalade@^3.1.1: version "3.1.1" @@ -818,7 +937,7 @@ escalade@^3.1.1: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== eslint-scope@5.1.1: version "5.1.1" @@ -841,30 +960,15 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -876,9 +980,9 @@ fast-json-stable-stringify@^2.0.0: integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fill-range@^7.0.1: version "7.0.1" @@ -895,15 +999,15 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -fraction.js@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fraction.js@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.2" @@ -915,11 +1019,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -933,21 +1032,21 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.0.3, glob@^7.1.3: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -955,20 +1054,15 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -982,20 +1076,15 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== immutable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== import-fresh@^3.2.1: version "3.3.0" @@ -1006,9 +1095,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -1016,7 +1105,7 @@ import-local@^3.0.2: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -1026,20 +1115,15 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" @@ -1048,22 +1132,22 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -1098,46 +1182,65 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" -jest-worker@^27.0.2: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz#a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed" - integrity sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA== +jest-worker@^29.4.3: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -1157,40 +1260,30 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klona@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" - integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== - -klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - leaflet.markercluster@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz#9cdb52a4eab92671832e1ef9899669e80efc4056" integrity sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA== -leaflet@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.7.1.tgz#10d684916edfe1bf41d688a3b97127c0322a2a19" - integrity sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw== +leaflet@1.9.4: + version "1.9.4" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.9.4.tgz#23fae724e282fa25745aff82ca4d394748db7d8d" + integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== -lilconfig@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" - integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^5.0.0: version "5.0.0" @@ -1202,12 +1295,12 @@ locate-path@^5.0.0: lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lru-cache@^6.0.0: version "6.0.0" @@ -1216,10 +1309,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== merge-stream@^2.0.0: version "2.0.0" @@ -1227,68 +1325,68 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.27: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.49.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mime-db "1.52.0" -mini-css-extract-plugin@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" - integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== +mini-css-extract-plugin@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -nanoid@^3.1.23: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -nanoid@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-releases@^1.1.75: - version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" - integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -1298,46 +1396,27 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" - integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -1345,13 +1424,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -1394,19 +1466,19 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -1421,15 +1493,15 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: version "4.0.1" @@ -1439,14 +1511,14 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pkg-dir@^4.2.0: version "4.2.0" @@ -1455,113 +1527,109 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== +postcss-calc@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== dependencies: - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" -postcss-colormin@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88" - integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw== +postcss-colormin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe" + integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" - colord "^2.0.1" - postcss-value-parser "^4.1.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-convert-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232" - integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg== +postcss-convert-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996" + integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== dependencies: - postcss-value-parser "^4.1.0" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-discard-comments@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" - integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== +postcss-discard-comments@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe" + integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== -postcss-discard-duplicates@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" - integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== +postcss-discard-duplicates@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355" + integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== -postcss-discard-empty@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" - integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== +postcss-discard-empty@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee" + integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== -postcss-discard-overridden@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" - integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== +postcss-discard-overridden@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234" + integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== -postcss-loader@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== +postcss-loader@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" + cosmiconfig "^8.2.0" + jiti "^1.18.2" + semver "^7.3.8" -postcss-merge-longhand@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" - integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== dependencies: - css-color-names "^1.0.1" - postcss-value-parser "^4.1.0" - stylehacks "^5.0.1" + postcss-value-parser "^4.2.0" + stylehacks "^6.0.0" -postcss-merge-rules@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" - integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== +postcss-merge-rules@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz#39f165746404e646c0f5c510222ccde4824a86aa" + integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" - cssnano-utils "^2.0.1" + cssnano-utils "^4.0.0" postcss-selector-parser "^6.0.5" - vendors "^1.0.3" -postcss-minify-font-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" - integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== +postcss-minify-font-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070" + integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== dependencies: - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-gradients@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz#7c175c108f06a5629925d698b3c4cf7bd3864ee5" - integrity sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ== +postcss-minify-gradients@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679" + integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== dependencies: - colord "^2.6" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + colord "^2.9.1" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" -postcss-minify-params@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" - integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== +postcss-minify-params@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539" + integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== dependencies: - alphanum-sort "^1.0.2" - browserslist "^4.16.0" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - uniqs "^2.0.0" + browserslist "^4.21.4" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" - integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== +postcss-minify-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2" + integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== dependencies: - alphanum-sort "^1.0.2" postcss-selector-parser "^6.0.5" postcss-modules-extract-imports@^3.0.0: @@ -1569,10 +1637,10 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -1592,154 +1660,158 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-normalize-charset@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" - integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== +postcss-normalize-charset@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975" + integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== -postcss-normalize-display-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" - integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== +postcss-normalize-display-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4" + integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" - integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== +postcss-normalize-positions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301" + integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== dependencies: - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" - integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== +postcss-normalize-repeat-style@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299" + integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-string@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" - integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== +postcss-normalize-string@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8" + integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== dependencies: - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" - integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== +postcss-normalize-timing-functions@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c" + integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" - integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== +postcss-normalize-unicode@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730" + integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== dependencies: - browserslist "^4.16.0" - postcss-value-parser "^4.1.0" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-normalize-url@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" - integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== +postcss-normalize-url@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4" + integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== dependencies: - is-absolute-url "^3.0.3" - normalize-url "^6.0.1" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" - integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== +postcss-normalize-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d" + integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== dependencies: - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-ordered-values@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" - integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== +postcss-ordered-values@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218" + integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" -postcss-reduce-initial@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" - integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== +postcss-reduce-initial@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7" + integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== dependencies: - browserslist "^4.16.0" + browserslist "^4.21.4" caniuse-api "^3.0.0" -postcss-reduce-transforms@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" - integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== +postcss-reduce-transforms@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46" + integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.11: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f" - integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A== +postcss-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" + integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== dependencies: - postcss-value-parser "^4.1.0" - svgo "^2.3.0" + postcss-value-parser "^4.2.0" + svgo "^3.0.2" -postcss-unique-selectors@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" - integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== +postcss-unique-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1" + integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== dependencies: - alphanum-sort "^1.0.2" postcss-selector-parser "^6.0.5" - uniqs "^2.0.0" -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss-value-parser@^4.2.0: +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.8, postcss@^8.4.7: - version "8.4.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.8.tgz#dad963a76e82c081a0657d3a2f3602ce10c2e032" - integrity sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ== +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.3.5: - version "8.3.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" - integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== +postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" -prettier@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== +postcss@^8.4.24: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prettier@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== punycode@^2.1.0: version "2.1.1" @@ -1760,12 +1832,12 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: - resolve "^1.9.0" + resolve "^1.20.0" require-from-string@^2.0.2: version "2.0.2" @@ -1789,13 +1861,14 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" rimraf@^2.6.3: version "2.7.1" @@ -1809,24 +1882,23 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass-loader@12.6.0: - version "12.6.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== +sass-loader@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== dependencies: - klona "^2.0.4" neo-async "^2.6.2" -sass@1.49.9: - version "1.49.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" - integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== +sass@1.69.5: + version "1.69.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -schema-utils@^3.0.0, schema-utils@^3.1.0: +schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -1835,6 +1907,15 @@ schema-utils@^3.0.0, schema-utils@^3.1.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" @@ -1845,17 +1926,27 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.0.0" -semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +schema-utils@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +semver@^7.3.4, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" @@ -1878,55 +1969,35 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - -source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -stylehacks@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" - integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== dependencies: - browserslist "^4.16.0" + browserslist "^4.21.4" postcss-selector-parser "^6.0.4" supports-color@^5.3.0: @@ -1950,49 +2021,48 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -svgo@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.5.0.tgz#3c9051b606d85a02fcb59f459b19970d2cc2c9bf" - integrity sha512-FSdBOOo271VyF/qZnOn1PgwCdt1v4Dx0Sey+U1jgqm1vqRYjPGdip0RGrFW6ItwtkBB8rHgHk26dlVr0uCs82Q== +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svgo@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a" + integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ== dependencies: - "@trysound/sax" "0.1.1" - colorette "^1.3.0" + "@trysound/sax" "0.2.0" commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - stable "^0.1.8" + css-select "^5.1.0" + css-tree "^2.2.1" + csso "^5.0.5" + picocolors "^1.0.0" tapable@^2.1.1, tapable@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" - integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== - -terser-webpack-plugin@^5.1.3: - version "5.1.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" - integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== - dependencies: - jest-worker "^27.0.2" - p-limit "^3.1.0" - schema-utils "^3.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.0" - -terser@^5.7.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.2.tgz#d4d95ed4f8bf735cb933e802f2a1829abf545e3f" - integrity sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw== - dependencies: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" + +terser@^5.16.5: + version "5.16.9" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.9.tgz#7a28cb178e330c484369886f2afd623d9847495f" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + source-map-support "~0.5.20" to-regex-range@^5.0.1: version "5.0.1" @@ -2001,25 +2071,37 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -ts-loader@9.2.7: - version "9.2.7" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.7.tgz#948654099ca96992b62ec47bd9cee5632006e101" - integrity sha512-Fxh44mKli9QezgbdCXkEJWxnedQ0ead7DXTH+lfXEPedu+Y9EtMJ2aQ9G3Dj1j7Q612E8931rww8NDZha4Tibg== +ts-loader@9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.0.tgz#f0a51dda37cc4d8e43e6cb14edebbc599b0c3aa2" + integrity sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" micromatch "^4.0.0" semver "^7.3.4" + source-map "^0.7.4" -typescript@4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== +typescript@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= +update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" uri-js@^4.2.2: version "4.4.1" @@ -2031,37 +2113,33 @@ uri-js@^4.2.2: util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -vendors@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -webpack-cli@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" - integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== +webpack-cli@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.1" - "@webpack-cli/info" "^1.4.1" - "@webpack-cli/serve" "^1.6.1" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" fastest-levenshtein "^1.0.12" import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" + interpret "^3.1.1" + rechoir "^0.8.0" webpack-merge "^5.7.3" webpack-merge@^5.7.3: @@ -2077,34 +2155,34 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.70.0: - version "5.70.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.70.0.tgz#3461e6287a72b5e6e2f4872700bc8de0d7500e6d" - integrity sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw== +webpack@5.89.0: + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.2" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" webpack-sources "^3.2.3" which@^2.0.1: @@ -2122,19 +2200,9 @@ wildcard@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==