From 4855dca493ab50c0aeae1345789cb3c916dc76c0 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:26:44 -0500 Subject: [PATCH 1/8] [BI-2156-qa] - fixed ObsUnitIds not found error handling --- .../controllers/ImportController.java | 2 +- .../model/imports/BrAPIImportService.java | 3 +- .../model/imports/DomainImportService.java | 3 +- .../importer/model/workflow/Workflow.java | 5 ++- .../importer/services/FileImportService.java | 4 +- .../experiment/ExperimentUtilities.java | 2 +- .../ExperimentWorkflowNavigator.java | 41 +++++++++++++------ .../AppendOverwritePhenotypesWorkflow.java | 4 +- .../action/WorkflowReadInitialization.java | 5 ++- .../entity/ExperimentImportEntity.java | 2 +- .../entity/PendingObservationUnit.java | 2 +- .../AppendOverwriteIDValidation.java | 3 +- .../middleware/commit/BrAPICommit.java | 3 +- .../middleware/commit/BrAPIDatasetCommit.java | 2 +- .../commit/BrAPIObservationCommit.java | 2 +- .../commit/BrAPIObservationUnitCommit.java | 2 +- .../middleware/commit/BrAPIStudyCommit.java | 2 +- .../middleware/commit/BrAPITrialCommit.java | 2 +- .../middleware/commit/LocationCommit.java | 2 +- .../initialize/WorkflowInitialization.java | 5 ++- .../appendoverwrite/model/Middleware.java | 6 ++- .../service/ObservationUnitService.java | 5 ++- 22 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java index d732da0c5..c78921693 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java @@ -211,7 +211,7 @@ public HttpResponse>> getSystemMappings(@Nu @Produces(MediaType.APPLICATION_JSON) @AddMetadata @Secured(SecurityRule.IS_ANONYMOUS) - public HttpResponse>> getWorkflowsForSystemMapping(@PathVariable UUID mappingId) { + public HttpResponse>> getWorkflowsForSystemMapping(@PathVariable UUID mappingId) throws UnprocessableEntityException { List workflows = null; try { diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java index 3f25d99e6..606901c4f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java @@ -19,13 +19,14 @@ import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import java.util.List; public interface BrAPIImportService { String getImportTypeId(); BrAPIImport getImportClass(); - List getWorkflows(); + List getWorkflows() throws UnprocessableEntityException; default String getInvalidIntegerMsg(String columnName) { return String.format("Column name \"%s\" must be integer type, but non-integer type provided.", columnName); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java index 5f96ae904..64f84a378 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java @@ -22,6 +22,7 @@ import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import org.breedinginsight.brapps.importer.model.workflow.Workflow; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Singleton; import java.util.List; @@ -43,7 +44,7 @@ public String getMissingColumnMsg(String columnName) { return "Column heading does not match template or ontology"; } @Override - public List getWorkflows() { + public List getWorkflows() throws UnprocessableEntityException { return workflowNavigator.getWorkflows(); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java index 7504d7ab0..f4e37648e 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java @@ -19,6 +19,7 @@ import io.micronaut.core.order.Ordered; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import java.util.ArrayList; import java.util.List; @@ -38,7 +39,7 @@ public interface Workflow extends Ordered { * @param context the ImportServiceContext object containing necessary information for the workflow * @return an Optional of ImportWorkflowResult representing the result of the workflow execution */ - Optional process(ImportServiceContext context); + Optional process(ImportServiceContext context) throws UnprocessableEntityException; /** * Default method to get a list of workflows. @@ -46,7 +47,7 @@ public interface Workflow extends Ordered { * * @return a List of ImportWorkflow containing workflows */ - default List getWorkflows() { + default List getWorkflows() throws UnprocessableEntityException { // Default implementation for getWorkflows method return new ArrayList<>(); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java index 3c3c6a093..1b1033e04 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -449,7 +449,7 @@ private void processFile(String workflowId, List finalBrAPIImportLi progress.setMessage(e.getMessage()); progress.setUpdatedBy(actingUser.getId()); importDAO.update(upload); - }catch (ValidatorException e) { + } catch (ValidatorException e) { log.info("Validation errors: \n" + e); ImportProgress progress = upload.getProgress(); progress.setStatuscode((short) HttpStatus.UNPROCESSABLE_ENTITY.getCode()); @@ -563,7 +563,7 @@ public List getSystemMappingByName(String name) { * @return A list of ImportWorkflow objects representing the workflows for the specified system mapping * @throws DoesNotExistException If the system mapping with the given ID does not exist */ - public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException { + public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException, UnprocessableEntityException { // Retrieve the import mapping configuration based on the provided mapping ID ImportMapping mappingConfig = importMappingDAO.getMapping(mappingId) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java index ae015aab6..d63234265 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java @@ -70,7 +70,7 @@ public class ExperimentUtilities { public static final String PREEXISTING_EXPERIMENT_TITLE = "Experiment Title already exists"; public static final String MISSING_OBS_UNIT_ID_ERROR = "Experimental entities are missing ObsUnitIDs"; public static final String UNMATCHED_COLUMN = "Ontology term(s) not found: "; - + public static final String INVALID_OBS_UNIT_ID_ERROR = "ObsUnitID(s) not found: "; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java index 8de6a7d8b..c42b86696 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java @@ -22,8 +22,10 @@ import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -52,15 +54,20 @@ public ExperimentWorkflowNavigator(List workflows) { * @return An Optional containing the first non-empty ImportWorkflowResult from the executed workflows, or an empty Optional if no non-empty result is found */ @Override - public Optional process(ImportServiceContext context) { + public Optional process(ImportServiceContext context) throws UnprocessableEntityException { /** * Have each workflow in order process the context, returning the first non-empty result */ - return workflows.stream() - .map(workflow->workflow.process(context)) - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); + Optional first = Optional.empty(); + for (ExperimentWorkflow workflow : workflows) { + Optional process = workflow.process(context); + if (process.isPresent()) { + ImportWorkflowResult importWorkflowResult = process.get(); + first = Optional.of(importWorkflowResult); + break; + } + } + return first; } /** @@ -68,13 +75,21 @@ public Optional process(ImportServiceContext context) { * * @return List of ImportWorkflow objects with workflow metadata */ - public List getWorkflows() { - List workflowSummaryList = workflows.stream() - .map(workflow -> workflow.process(null)) // Process each workflow with a null context - .filter(Optional::isPresent) // Filter out any workflows that do not return a result - .map(Optional::get) // Extract the result from Optional - .map(ImportWorkflowResult::getWorkflow) // Retrieve the workflow metadata - .collect(Collectors.toList()); // Collect the workflow metadata into a list + public List getWorkflows() throws UnprocessableEntityException { + // Process each workflow with a null context + // Filter out any workflows that do not return a result + // Extract the result from Optional + // Retrieve the workflow metadata + // Collect the workflow metadata into a list + List workflowSummaryList = new ArrayList<>(); + for (ExperimentWorkflow workflow : workflows) { + Optional process = workflow.process(null); + if (process.isPresent()) { + ImportWorkflowResult importWorkflowResult = process.get(); + ImportWorkflow importWorkflowResultWorkflow = importWorkflowResult.getWorkflow(); + workflowSummaryList.add(importWorkflowResultWorkflow); + } + } // Set the order field for each workflow based on its position in the list for (int i = 0; i < workflowSummaryList.size(); i++) { diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java index fbbc0afbd..accd83c29 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java @@ -30,12 +30,14 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.AppendOverwriteIDValidation; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.commit.BrAPICommit; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.initialize.WorkflowInitialization; +import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.process.AppendStatistic; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.process.ImportTableProcess; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteWorkflowContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; import org.breedinginsight.brapps.importer.services.processors.experiment.model.ImportContext; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Inject; import javax.inject.Singleton; @@ -76,7 +78,7 @@ public AppendOverwritePhenotypesWorkflow(AppendOverwriteIDValidation expUnitIDVa * @return Optional containing ImportWorkflowResult with workflow metadata and import preview response if successful, else empty Optional. */ @Override - public Optional process(ImportServiceContext context) { + public Optional process(ImportServiceContext context) throws UnprocessableEntityException { // Metadata about this workflow processing the context ImportWorkflow workflow = ImportWorkflow.builder() diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java index 717a78f97..5cdddaaf5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java @@ -23,6 +23,7 @@ import org.brapi.client.v2.model.exceptions.ApiException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.BrAPIState; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.entity.ExperimentImportEntity; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import org.breedinginsight.utilities.Utilities; import java.util.List; @@ -44,7 +45,7 @@ protected WorkflowReadInitialization(ExperimentImportEntity entity) { * @return an Optional containing the BrAPIState representing the completed read workflow * @throws ApiException if an error occurs during execution */ - public Optional> execute() throws ApiException { + public Optional> execute() throws ApiException, UnprocessableEntityException { try { List fetchedMembers = entity.brapiRead(); entity.initializeWorkflow(fetchedMembers); @@ -52,6 +53,8 @@ public Optional> execute() throws ApiException { } catch(ApiException e) { log.error(String.format("Error fetching %s: %s", entity.getClass().getName(), Utilities.generateApiExceptionLogMessage(e)), e); throw new ApiException(e); + } catch (UnprocessableEntityException e) { + throw e; } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java index c98d9cf83..3ca5fa004 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java @@ -43,7 +43,7 @@ public interface ExperimentImportEntity { * @return List of fetched entities * @throws ApiException if there is an issue with the API call */ - public List brapiRead() throws ApiException; + public List brapiRead() throws ApiException, UnprocessableEntityException; /** * Commit objects changed by the workflow to the BrAPI service. diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java index f7c29264c..af5d3b7e2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java @@ -94,7 +94,7 @@ public List brapiPost(List members) * @throws ApiException if there is an issue with the API call */ @Override - public List brapiRead() throws ApiException { + public List brapiRead() throws ApiException, UnprocessableEntityException { // Collect deltabreed-generated obs unit ids listed in the import Set obsUnitIds = cache.getReferenceOUIds(); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java index 64f471b88..1068b4119 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java @@ -24,12 +24,13 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; @Slf4j @Prototype public class AppendOverwriteIDValidation extends AppendOverwriteMiddleware { @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { context.getAppendOverwriteWorkflowContext().setReferenceOUIds(ExperimentUtilities.collateReferenceOUIds(context)); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java index 1b6cbd7ee..48b6b3c66 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Inject; @@ -48,7 +49,7 @@ public BrAPICommit(BrAPIDatasetCommit brAPIDatasetCommit, } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { log.debug("starting post of experiment data to BrAPI server"); return this.middleware.process(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java index 368673f19..a9c7378f4 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java @@ -50,7 +50,7 @@ public BrAPIDatasetCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUpdate this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { WorkflowCreation datasetCreation = brAPICreationFactory.datasetWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java index 779d75493..828efe0f8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java @@ -51,7 +51,7 @@ public BrAPIObservationCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUp this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { WorkflowCreation brAPIObservationCreation = brAPICreationFactory.observationWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java index 4610be387..0e5c674ad 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java @@ -44,7 +44,7 @@ public BrAPIObservationUnitCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try{ WorkflowCreation brAPIObservationUnitCreation = brAPICreationFactory.observationUnitWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java index f10a0b8b6..6823a8abc 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java @@ -44,7 +44,7 @@ public BrAPIStudyCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { WorkflowCreation brAPIStudyCreation = brAPICreationFactory.studyWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java index 3ca112b21..59de45c8b 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java @@ -50,7 +50,7 @@ public BrAPITrialCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUpdateFa this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { WorkflowCreation brAPITrialCreation = brAPICreationFactory.trialWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java index 34fda1fca..d68c9183f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java @@ -44,7 +44,7 @@ public LocationCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { try { WorkflowCreation locationCreation = brAPICreationFactory.locationWorkflowCreationBean(context); log.info("creating new locationss in the Deltabreed database"); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java index e65d11d15..d1e3a442a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java @@ -31,6 +31,7 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; import org.breedinginsight.model.ProgramLocation; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Inject; @@ -50,7 +51,7 @@ public WorkflowInitialization(BrAPIReadFactory brAPIReadFactory) { this.brAPIReadFactory = brAPIReadFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { brAPIObservationUnitReadWorkflowInitialization = brAPIReadFactory.observationUnitWorkflowReadInitializationBean(context); brAPITrialReadWorkflowInitialization = brAPIReadFactory.trialWorkflowReadInitializationBean(context); brAPIStudyReadWorkflowInitialization = brAPIReadFactory.studyWorkflowReadInitializationBean(context); @@ -69,6 +70,8 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext } catch (ApiException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); return this.compensate(context); + } catch (UnprocessableEntityException e) { + throw e; } return processNext(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java index 0a730a7b2..5a2fec17a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java @@ -17,6 +17,8 @@ package org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; + public abstract class Middleware { Middleware next; @@ -38,7 +40,7 @@ public static Middleware link(Middleware first, Middleware... chain) { /** * Subclasses will implement this local transaction. */ - public abstract T process(T context); + public abstract T process(T context) throws UnprocessableEntityException; /** * Subclasses will implement this method to handle errors and possibly undo the local transaction. */ @@ -47,7 +49,7 @@ public static Middleware link(Middleware first, Middleware... chain) { * Processes the next local transaction or ends traversing if we're at the * last local transaction of the transaction. */ - protected T processNext(T context) { + protected T processNext(T context) throws UnprocessableEntityException { if (next == null) { return context; } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java index 720c93d25..ba93dfc71 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java @@ -28,6 +28,7 @@ import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; import org.breedinginsight.model.Program; +import org.breedinginsight.services.exceptions.UnprocessableEntityException; import org.breedinginsight.utilities.Utilities; import javax.inject.Inject; @@ -61,7 +62,7 @@ public ObservationUnitService(BrAPIObservationUnitDAO brAPIObservationUnitDAO) { * @throws ApiException if an error occurs during the retrieval of observation units * @throws IllegalStateException if the retrieved observation units do not match the provided observation unit IDs */ - public List getObservationUnitsByDbId(Set obsUnitIds, Program program) throws ApiException, IllegalStateException { + public List getObservationUnitsByDbId(Set obsUnitIds, Program program) throws ApiException, IllegalStateException, UnprocessableEntityException { List brapiUnits = null; // Retrieve reference Observation Units based on IDs @@ -75,7 +76,7 @@ public List getObservationUnitsByDbId(Set obsUnitI missingIds.removeAll(brapiUnits.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toSet())); // Throw exception with missing IDs information - throw new IllegalStateException(ExperimentUtilities.UNMATCHED_COLUMN + String.join(COMMA_DELIMITER, missingIds)); + throw new UnprocessableEntityException(ExperimentUtilities.INVALID_OBS_UNIT_ID_ERROR + String.join(COMMA_DELIMITER, missingIds)); } return brapiUnits; From e52481f645a2d1de0fee0ed8476b3efc617a24e8 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:27:57 -0500 Subject: [PATCH 2/8] [BI-2156-qa] - fixed edge case NPE fixed case when file contains valid ObsUnitIds but no phenotypic data columns --- .../middleware/process/ImportTableProcess.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java index 7ee29e51f..914633769 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java @@ -386,6 +386,11 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext // Add the pending observation map to the context for use in processing the import context.getAppendOverwriteWorkflowContext().setPendingObservationByHash(pendingObservationByHash); + // Make sure the workflow statistic is not null. + if (context.getAppendOverwriteWorkflowContext().getStatistic() == null) { + context.getAppendOverwriteWorkflowContext().setStatistic(statistic); + } + return processNext(context); } catch (DoesNotExistException | ApiException | UnprocessableEntityException | ValidatorException | IllegalStateException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); From 4f0b94122a52c80ec2b9872e1bdb8fd7f12f4ff7 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:57:37 -0500 Subject: [PATCH 3/8] [BI-2156-qa] - made changes based on review --- .../brapps/importer/controllers/ImportController.java | 2 +- .../brapps/importer/model/imports/BrAPIImportService.java | 2 +- .../brapps/importer/model/imports/DomainImportService.java | 2 +- .../brapps/importer/model/workflow/Workflow.java | 4 ++-- .../brapps/importer/services/FileImportService.java | 2 +- .../processors/experiment/ExperimentWorkflowNavigator.java | 4 ++-- .../appendoverwrite/AppendOverwritePhenotypesWorkflow.java | 2 +- .../middleware/AppendOverwriteIDValidation.java | 2 +- .../appendoverwrite/middleware/commit/BrAPICommit.java | 2 +- .../middleware/commit/BrAPIDatasetCommit.java | 2 +- .../middleware/commit/BrAPIObservationCommit.java | 2 +- .../middleware/commit/BrAPIObservationUnitCommit.java | 2 +- .../appendoverwrite/middleware/commit/BrAPIStudyCommit.java | 2 +- .../appendoverwrite/middleware/commit/BrAPITrialCommit.java | 2 +- .../appendoverwrite/middleware/commit/LocationCommit.java | 2 +- .../middleware/initialize/WorkflowInitialization.java | 6 ++---- .../experiment/appendoverwrite/model/Middleware.java | 4 ++-- 17 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java index c78921693..d732da0c5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java @@ -211,7 +211,7 @@ public HttpResponse>> getSystemMappings(@Nu @Produces(MediaType.APPLICATION_JSON) @AddMetadata @Secured(SecurityRule.IS_ANONYMOUS) - public HttpResponse>> getWorkflowsForSystemMapping(@PathVariable UUID mappingId) throws UnprocessableEntityException { + public HttpResponse>> getWorkflowsForSystemMapping(@PathVariable UUID mappingId) { List workflows = null; try { diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java index 606901c4f..4b9ed339d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java @@ -26,7 +26,7 @@ public interface BrAPIImportService { String getImportTypeId(); BrAPIImport getImportClass(); - List getWorkflows() throws UnprocessableEntityException; + List getWorkflows(); default String getInvalidIntegerMsg(String columnName) { return String.format("Column name \"%s\" must be integer type, but non-integer type provided.", columnName); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java index 64f84a378..dcaa3e613 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java @@ -44,7 +44,7 @@ public String getMissingColumnMsg(String columnName) { return "Column heading does not match template or ontology"; } @Override - public List getWorkflows() throws UnprocessableEntityException { + public List getWorkflows() { return workflowNavigator.getWorkflows(); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java index f4e37648e..9c5c2e8d5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java @@ -39,7 +39,7 @@ public interface Workflow extends Ordered { * @param context the ImportServiceContext object containing necessary information for the workflow * @return an Optional of ImportWorkflowResult representing the result of the workflow execution */ - Optional process(ImportServiceContext context) throws UnprocessableEntityException; + Optional process(ImportServiceContext context); /** * Default method to get a list of workflows. @@ -47,7 +47,7 @@ public interface Workflow extends Ordered { * * @return a List of ImportWorkflow containing workflows */ - default List getWorkflows() throws UnprocessableEntityException { + default List getWorkflows() { // Default implementation for getWorkflows method return new ArrayList<>(); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java index 1b1033e04..039c0b58c 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -563,7 +563,7 @@ public List getSystemMappingByName(String name) { * @return A list of ImportWorkflow objects representing the workflows for the specified system mapping * @throws DoesNotExistException If the system mapping with the given ID does not exist */ - public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException, UnprocessableEntityException { + public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException { // Retrieve the import mapping configuration based on the provided mapping ID ImportMapping mappingConfig = importMappingDAO.getMapping(mappingId) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java index c42b86696..7b294c534 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java @@ -54,7 +54,7 @@ public ExperimentWorkflowNavigator(List workflows) { * @return An Optional containing the first non-empty ImportWorkflowResult from the executed workflows, or an empty Optional if no non-empty result is found */ @Override - public Optional process(ImportServiceContext context) throws UnprocessableEntityException { + public Optional process(ImportServiceContext context) { /** * Have each workflow in order process the context, returning the first non-empty result */ @@ -75,7 +75,7 @@ public Optional process(ImportServiceContext context) thro * * @return List of ImportWorkflow objects with workflow metadata */ - public List getWorkflows() throws UnprocessableEntityException { + public List getWorkflows() { // Process each workflow with a null context // Filter out any workflows that do not return a result // Extract the result from Optional diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java index accd83c29..c3a121518 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java @@ -78,7 +78,7 @@ public AppendOverwritePhenotypesWorkflow(AppendOverwriteIDValidation expUnitIDVa * @return Optional containing ImportWorkflowResult with workflow metadata and import preview response if successful, else empty Optional. */ @Override - public Optional process(ImportServiceContext context) throws UnprocessableEntityException { + public Optional process(ImportServiceContext context) { // Metadata about this workflow processing the context ImportWorkflow workflow = ImportWorkflow.builder() diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java index 1068b4119..a7b664520 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java @@ -30,7 +30,7 @@ @Prototype public class AppendOverwriteIDValidation extends AppendOverwriteMiddleware { @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { context.getAppendOverwriteWorkflowContext().setReferenceOUIds(ExperimentUtilities.collateReferenceOUIds(context)); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java index 48b6b3c66..8f96a6ae8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java @@ -49,7 +49,7 @@ public BrAPICommit(BrAPIDatasetCommit brAPIDatasetCommit, } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { log.debug("starting post of experiment data to BrAPI server"); return this.middleware.process(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java index a9c7378f4..368673f19 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIDatasetCommit.java @@ -50,7 +50,7 @@ public BrAPIDatasetCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUpdate this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { WorkflowCreation datasetCreation = brAPICreationFactory.datasetWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java index 828efe0f8..779d75493 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationCommit.java @@ -51,7 +51,7 @@ public BrAPIObservationCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUp this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { WorkflowCreation brAPIObservationCreation = brAPICreationFactory.observationWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java index 0e5c674ad..4610be387 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIObservationUnitCommit.java @@ -44,7 +44,7 @@ public BrAPIObservationUnitCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try{ WorkflowCreation brAPIObservationUnitCreation = brAPICreationFactory.observationUnitWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java index 6823a8abc..f10a0b8b6 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPIStudyCommit.java @@ -44,7 +44,7 @@ public BrAPIStudyCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { WorkflowCreation brAPIStudyCreation = brAPICreationFactory.studyWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java index 59de45c8b..3ca112b21 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPITrialCommit.java @@ -50,7 +50,7 @@ public BrAPITrialCommit(BrAPICreationFactory brAPICreationFactory, BrAPIUpdateFa this.brAPIUpdateFactory = brAPIUpdateFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { WorkflowCreation brAPITrialCreation = brAPICreationFactory.trialWorkflowCreationBean(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java index d68c9183f..34fda1fca 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/LocationCommit.java @@ -44,7 +44,7 @@ public LocationCommit(BrAPICreationFactory brAPICreationFactory) { this.brAPICreationFactory = brAPICreationFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { try { WorkflowCreation locationCreation = brAPICreationFactory.locationWorkflowCreationBean(context); log.info("creating new locationss in the Deltabreed database"); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java index d1e3a442a..909c9db4a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java @@ -51,7 +51,7 @@ public WorkflowInitialization(BrAPIReadFactory brAPIReadFactory) { this.brAPIReadFactory = brAPIReadFactory; } @Override - public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) throws UnprocessableEntityException { + public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { brAPIObservationUnitReadWorkflowInitialization = brAPIReadFactory.observationUnitWorkflowReadInitializationBean(context); brAPITrialReadWorkflowInitialization = brAPIReadFactory.trialWorkflowReadInitializationBean(context); brAPIStudyReadWorkflowInitialization = brAPIReadFactory.studyWorkflowReadInitializationBean(context); @@ -67,11 +67,9 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext locationReadWorkflowInitialization.execute(); brAPIDatasetReadWorkflowInitialization.execute(); brAPIGermplasmReadWorkflowInitialization.execute(); - } catch (ApiException e) { + } catch (ApiException | UnprocessableEntityException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); return this.compensate(context); - } catch (UnprocessableEntityException e) { - throw e; } return processNext(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java index 5a2fec17a..fd9b4d5b7 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java @@ -40,7 +40,7 @@ public static Middleware link(Middleware first, Middleware... chain) { /** * Subclasses will implement this local transaction. */ - public abstract T process(T context) throws UnprocessableEntityException; + public abstract T process(T context); /** * Subclasses will implement this method to handle errors and possibly undo the local transaction. */ @@ -49,7 +49,7 @@ public static Middleware link(Middleware first, Middleware... chain) { * Processes the next local transaction or ends traversing if we're at the * last local transaction of the transaction. */ - protected T processNext(T context) throws UnprocessableEntityException { + protected T processNext(T context) { if (next == null) { return context; } From d23c84c4aafe038ba3380fad7398f5152a46bed6 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Fri, 31 Jan 2025 18:04:15 -0500 Subject: [PATCH 4/8] [BI-2156-qa] - cleaned up imports --- .../model/imports/BrAPIImportService.java | 1 - .../model/imports/DomainImportService.java | 1 - .../importer/model/workflow/Workflow.java | 1 - .../ExperimentWorkflowNavigator.java | 37 ++++++------------- .../AppendOverwritePhenotypesWorkflow.java | 2 - .../AppendOverwriteIDValidation.java | 1 - .../middleware/commit/BrAPICommit.java | 1 - .../appendoverwrite/model/Middleware.java | 2 - .../service/ObservationUnitService.java | 1 - 9 files changed, 11 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java index 4b9ed339d..3f25d99e6 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/BrAPIImportService.java @@ -19,7 +19,6 @@ import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import java.util.List; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java index dcaa3e613..5f96ae904 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java @@ -22,7 +22,6 @@ import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import org.breedinginsight.brapps.importer.model.workflow.Workflow; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Singleton; import java.util.List; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java index 9c5c2e8d5..7504d7ab0 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java @@ -19,7 +19,6 @@ import io.micronaut.core.order.Ordered; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java index 7b294c534..8de6a7d8b 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java @@ -22,10 +22,8 @@ import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Singleton; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -58,16 +56,11 @@ public Optional process(ImportServiceContext context) { /** * Have each workflow in order process the context, returning the first non-empty result */ - Optional first = Optional.empty(); - for (ExperimentWorkflow workflow : workflows) { - Optional process = workflow.process(context); - if (process.isPresent()) { - ImportWorkflowResult importWorkflowResult = process.get(); - first = Optional.of(importWorkflowResult); - break; - } - } - return first; + return workflows.stream() + .map(workflow->workflow.process(context)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); } /** @@ -76,20 +69,12 @@ public Optional process(ImportServiceContext context) { * @return List of ImportWorkflow objects with workflow metadata */ public List getWorkflows() { - // Process each workflow with a null context - // Filter out any workflows that do not return a result - // Extract the result from Optional - // Retrieve the workflow metadata - // Collect the workflow metadata into a list - List workflowSummaryList = new ArrayList<>(); - for (ExperimentWorkflow workflow : workflows) { - Optional process = workflow.process(null); - if (process.isPresent()) { - ImportWorkflowResult importWorkflowResult = process.get(); - ImportWorkflow importWorkflowResultWorkflow = importWorkflowResult.getWorkflow(); - workflowSummaryList.add(importWorkflowResultWorkflow); - } - } + List workflowSummaryList = workflows.stream() + .map(workflow -> workflow.process(null)) // Process each workflow with a null context + .filter(Optional::isPresent) // Filter out any workflows that do not return a result + .map(Optional::get) // Extract the result from Optional + .map(ImportWorkflowResult::getWorkflow) // Retrieve the workflow metadata + .collect(Collectors.toList()); // Collect the workflow metadata into a list // Set the order field for each workflow based on its position in the list for (int i = 0; i < workflowSummaryList.size(); i++) { diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java index c3a121518..fbbc0afbd 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/AppendOverwritePhenotypesWorkflow.java @@ -30,14 +30,12 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.AppendOverwriteIDValidation; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.commit.BrAPICommit; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.initialize.WorkflowInitialization; -import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.process.AppendStatistic; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.process.ImportTableProcess; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteWorkflowContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; import org.breedinginsight.brapps.importer.services.processors.experiment.model.ImportContext; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java index a7b664520..64f471b88 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java @@ -24,7 +24,6 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; @Slf4j @Prototype diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java index 8f96a6ae8..1b6cbd7ee 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/commit/BrAPICommit.java @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import javax.inject.Inject; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java index fd9b4d5b7..0a730a7b2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/model/Middleware.java @@ -17,8 +17,6 @@ package org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; - public abstract class Middleware { Middleware next; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java index ba93dfc71..10f6b4c7d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java @@ -22,7 +22,6 @@ import org.brapi.v2.model.BrAPIExternalReference; import org.brapi.v2.model.pheno.BrAPIObservationUnit; import org.breedinginsight.brapi.v2.dao.BrAPIObservationUnitDAO; -import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.brapps.importer.model.response.ImportObjectState; import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; From 67421212396716bfdc9abb015b27ff4306ecda79 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Mon, 3 Feb 2025 19:44:47 -0500 Subject: [PATCH 5/8] [BI-2156-qa] - made error tabular --- .../experiment/ExperimentUtilities.java | 3 +-- .../experiment/MissingValuesException.java | 12 ++++++++++ .../factory/action/BrAPIAction.java | 3 ++- .../action/WorkflowReadInitialization.java | 6 ++--- .../entity/ExperimentImportEntity.java | 3 ++- .../entity/PendingObservationUnit.java | 24 ++++++++++++++++--- .../initialize/WorkflowInitialization.java | 4 ++-- .../service/ObservationUnitService.java | 8 +++---- 8 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java index d63234265..8c3160e5d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java @@ -70,8 +70,7 @@ public class ExperimentUtilities { public static final String PREEXISTING_EXPERIMENT_TITLE = "Experiment Title already exists"; public static final String MISSING_OBS_UNIT_ID_ERROR = "Experimental entities are missing ObsUnitIDs"; public static final String UNMATCHED_COLUMN = "Ontology term(s) not found: "; - public static final String INVALID_OBS_UNIT_ID_ERROR = "ObsUnitID(s) not found: "; - + public static final String INVALID_OBS_UNIT_ID_ERROR = "Invalid ObsUnitID"; Gson gson; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java new file mode 100644 index 000000000..61e7fc299 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java @@ -0,0 +1,12 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment; + +import lombok.Getter; + +import java.util.Set; + +@Getter +public class MissingValuesException extends Exception { + private Set missingIds; + + public MissingValuesException(Set missingIds) { this.missingIds = missingIds; } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java index 830de5828..436ad2938 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java @@ -23,6 +23,7 @@ import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; +import org.breedinginsight.services.exceptions.ValidatorException; import java.util.Optional; @@ -42,7 +43,7 @@ public interface BrAPIAction { * @return An Optional containing the relevant BrAPI state after executing the action. * @throws ApiException if an error occurs during the execution of the action. */ - Optional> execute() throws ApiException, MissingRequiredInfoException, UnprocessableEntityException, DoesNotExistException; + Optional> execute() throws ApiException, MissingRequiredInfoException, UnprocessableEntityException, DoesNotExistException, ValidatorException; /** * Get the BrAPI entity being acted on based on the provided ExpUnitMiddlewareContext. diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java index 5cdddaaf5..4e1f62142 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java @@ -23,7 +23,7 @@ import org.brapi.client.v2.model.exceptions.ApiException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.BrAPIState; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.entity.ExperimentImportEntity; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; +import org.breedinginsight.services.exceptions.ValidatorException; import org.breedinginsight.utilities.Utilities; import java.util.List; @@ -45,7 +45,7 @@ protected WorkflowReadInitialization(ExperimentImportEntity entity) { * @return an Optional containing the BrAPIState representing the completed read workflow * @throws ApiException if an error occurs during execution */ - public Optional> execute() throws ApiException, UnprocessableEntityException { + public Optional> execute() throws ApiException, ValidatorException { try { List fetchedMembers = entity.brapiRead(); entity.initializeWorkflow(fetchedMembers); @@ -53,8 +53,6 @@ public Optional> execute() throws ApiException, UnprocessableEntit } catch(ApiException e) { log.error(String.format("Error fetching %s: %s", entity.getClass().getName(), Utilities.generateApiExceptionLogMessage(e)), e); throw new ApiException(e); - } catch (UnprocessableEntityException e) { - throw e; } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java index 3ca5fa004..3bb33d78f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java @@ -22,6 +22,7 @@ import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; +import org.breedinginsight.services.exceptions.ValidatorException; import java.util.List; @@ -43,7 +44,7 @@ public interface ExperimentImportEntity { * @return List of fetched entities * @throws ApiException if there is an issue with the API call */ - public List brapiRead() throws ApiException, UnprocessableEntityException; + public List brapiRead() throws ApiException, ValidatorException; /** * Commit objects changed by the workflow to the BrAPI service. diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java index af5d3b7e2..f4e458520 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java @@ -21,11 +21,14 @@ import org.apache.commons.lang3.StringUtils; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.v2.model.pheno.BrAPIObservationUnit; +import org.breedinginsight.api.model.v1.response.ValidationErrors; import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapi.v2.dao.BrAPIObservationUnitDAO; +import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.brapps.importer.model.response.ImportObjectState; import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; +import org.breedinginsight.brapps.importer.services.processors.experiment.MissingValuesException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteWorkflowContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.model.ImportContext; @@ -33,6 +36,7 @@ import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; +import org.breedinginsight.services.exceptions.ValidatorException; import org.breedinginsight.utilities.Utilities; import java.util.*; @@ -94,12 +98,26 @@ public List brapiPost(List members) * @throws ApiException if there is an issue with the API call */ @Override - public List brapiRead() throws ApiException, UnprocessableEntityException { + public List brapiRead() throws ApiException, ValidatorException { // Collect deltabreed-generated obs unit ids listed in the import Set obsUnitIds = cache.getReferenceOUIds(); - // For each id fetch the observation unit from the brapi data store - return observationUnitService.getObservationUnitsByDbId(new HashSet<>(obsUnitIds), importContext.getProgram()); + try { + // For each id fetch the observation unit from the brapi data store + return observationUnitService.getObservationUnitsByDbId(new HashSet<>(obsUnitIds), importContext.getProgram()); + } + catch (MissingValuesException e) { + ValidationErrors validationErrors = new ValidationErrors(); + + // Build a detailed tabular error. + for (int rowNum = 0; rowNum < importContext.getImportRows().size(); rowNum++) { + String rowObsUnitId = ((ExperimentObservation)importContext.getImportRows().get(rowNum)).getObsUnitID(); + if (e.getMissingIds().contains(rowObsUnitId)) { + ExperimentUtilities.addRowError(ExperimentObservation.Columns.OBS_UNIT_ID, ExperimentUtilities.INVALID_OBS_UNIT_ID_ERROR, validationErrors, rowNum); + } + } + throw new ValidatorException(validationErrors); + } } /** diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java index 909c9db4a..40e0ea301 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java @@ -31,7 +31,7 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; import org.breedinginsight.model.ProgramLocation; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; +import org.breedinginsight.services.exceptions.ValidatorException; import javax.inject.Inject; @@ -67,7 +67,7 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext locationReadWorkflowInitialization.execute(); brAPIDatasetReadWorkflowInitialization.execute(); brAPIGermplasmReadWorkflowInitialization.execute(); - } catch (ApiException | UnprocessableEntityException e) { + } catch (ApiException | ValidatorException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); return this.compensate(context); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java index 10f6b4c7d..f34808f7f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java @@ -26,8 +26,8 @@ import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; +import org.breedinginsight.brapps.importer.services.processors.experiment.MissingValuesException; import org.breedinginsight.model.Program; -import org.breedinginsight.services.exceptions.UnprocessableEntityException; import org.breedinginsight.utilities.Utilities; import javax.inject.Inject; @@ -35,8 +35,6 @@ import java.util.*; import java.util.stream.Collectors; -import static org.breedinginsight.brapps.importer.services.processors.experiment.model.ExpImportProcessConstants.COMMA_DELIMITER; - @Singleton public class ObservationUnitService { private final BrAPIObservationUnitDAO brAPIObservationUnitDAO; @@ -61,7 +59,7 @@ public ObservationUnitService(BrAPIObservationUnitDAO brAPIObservationUnitDAO) { * @throws ApiException if an error occurs during the retrieval of observation units * @throws IllegalStateException if the retrieved observation units do not match the provided observation unit IDs */ - public List getObservationUnitsByDbId(Set obsUnitIds, Program program) throws ApiException, IllegalStateException, UnprocessableEntityException { + public List getObservationUnitsByDbId(Set obsUnitIds, Program program) throws ApiException, IllegalStateException, MissingValuesException { List brapiUnits = null; // Retrieve reference Observation Units based on IDs @@ -75,7 +73,7 @@ public List getObservationUnitsByDbId(Set obsUnitI missingIds.removeAll(brapiUnits.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toSet())); // Throw exception with missing IDs information - throw new UnprocessableEntityException(ExperimentUtilities.INVALID_OBS_UNIT_ID_ERROR + String.join(COMMA_DELIMITER, missingIds)); + throw new MissingValuesException(missingIds); } return brapiUnits; From 4d73e2d319283bc267786e7a614eee3df930e697 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:50:22 -0500 Subject: [PATCH 6/8] refactor append workflow obs unit validation and create UndefinedDataset class --- .../experiment/ExperimentUtilities.java | 101 ++++++++++++++---- .../experiment/MissingValuesException.java | 12 --- .../factory/action/BrAPIAction.java | 3 +- .../action/WorkflowReadInitialization.java | 3 +- .../factory/data/ProcessedDataFactory.java | 10 ++ .../factory/data/UndefinedDataset.java | 26 +++++ .../entity/ExperimentImportEntity.java | 3 +- .../entity/PendingObservationUnit.java | 25 +---- .../AppendOverwriteIDValidation.java | 53 ++++++++- .../initialize/WorkflowInitialization.java | 9 +- .../process/ImportTableProcess.java | 62 +++++++---- .../model/EntityNotFoundException.java | 11 ++ .../model/ExpImportProcessConstants.java | 10 +- .../service/ObservationUnitService.java | 15 ++- 14 files changed, 251 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java index 8c3160e5d..4c79478e8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentUtilities.java @@ -44,6 +44,7 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.create.model.PendingData; import org.breedinginsight.brapps.importer.services.processors.experiment.create.model.ProcessedPhenotypeData; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.brapps.importer.services.processors.experiment.model.ExpImportProcessConstants; import org.breedinginsight.model.Program; import org.breedinginsight.model.Scale; @@ -293,44 +294,104 @@ public static void addYearToStudyAdditionalInfo(Program program, BrAPIStudy stud } /** - * This method is responsible for collating unique ObsUnit IDs from the provided context data. + * Collates unique Observation Unit IDs from the import context. * - * @param context the AppendOverwriteMiddlewareContext containing the import rows to process - * @return a Set of unique ObsUnit IDs collated from the import rows - * @throws IllegalStateException if any ObsUnit ID is repeated in the import rows - * @throws HttpStatusException if there is a mix of ObsUnit IDs for some but not all rows + * This method iterates through all import rows in the given context and + * extracts unique Observation Unit IDs (ObsUnit IDs) that are not null or blank. + * + * @param context The AppendOverwriteMiddlewareContext containing the import data. + * @return A Set of String containing all unique, non-null, non-blank Observation Unit IDs. + * + * @implNote The method performs the following steps: + * 1. Initializes an empty HashSet to store unique ObsUnit IDs. + * 2. Iterates through each import row in the context. + * 3. For each row, checks if the ObsUnit ID is not null and not blank. + * 4. If valid, adds the ObsUnit ID to the set. + * 5. Returns the set of unique ObsUnit IDs. */ - public static Set collateReferenceOUIds(AppendOverwriteMiddlewareContext context) throws HttpStatusException, IllegalStateException { + public static Set collateUniqueOUIds(AppendOverwriteMiddlewareContext context) { // Initialize variables to track the presence of ObsUnit IDs Set referenceOUIds = new HashSet<>(); - boolean hasNoReferenceUnitIds = true; - boolean hasAllReferenceUnitIds = true; + + // Iterate through the import rows to process ObsUnit IDs + for (int rowNum = 0; rowNum < context.getImportContext().getImportRows().size(); rowNum++) { + ExperimentObservation importRow = (ExperimentObservation) context.getImportContext().getImportRows().get(rowNum); + if (importRow.getObsUnitID() != null && !importRow.getObsUnitID().isBlank()) { + referenceOUIds.add(importRow.getObsUnitID()); + } + } + return referenceOUIds; + } + + /** + * Validates Observation Unit ID values in the import context. + * + * This method checks each import row for the validity of its Observation Unit ID (ObsUnitID). + * It performs the following validations: + * 1. Checks if the ObsUnitID is null or blank. + * 2. Checks if the ObsUnitID is a duplicate within the import data. + * + * @param context The AppendOverwriteMiddlewareContext containing import data and validation error storage. + * @throws HttpStatusException If there's an HTTP-related error during the validation process. + * @throws IllegalStateException If the system encounters an unexpected state during validation. + * + * @implNote The method performs the following steps: + * 1. Retrieves the ValidationErrors object from the context. + * 2. Initializes a HashSet to track unique ObsUnitIDs. + * 3. Iterates through each import row in the context. + * 4. For each row: + * - If ObsUnitID is null or blank, adds a "missing ObsUnitID" error. + * - If ObsUnitID is already in the set (duplicate), adds a "duplicate ObsUnitID" error. + * - Otherwise, adds the ObsUnitID to the set of unique IDs. + * 5. Errors are added using the addRowError method, specifying the OBS_UNIT_ID column and appropriate error messages. + */ + public static void validateReferenceOUIdValues(AppendOverwriteMiddlewareContext context) throws HttpStatusException, IllegalStateException { + ValidationErrors validationErrors = context.getAppendOverwriteWorkflowContext().getValidationErrors(); + Set referenceOUIds = new HashSet<>(); // Iterate through the import rows to process ObsUnit IDs for (int rowNum = 0; rowNum < context.getImportContext().getImportRows().size(); rowNum++) { ExperimentObservation importRow = (ExperimentObservation) context.getImportContext().getImportRows().get(rowNum); - // Check if ObsUnitID is blank if (importRow.getObsUnitID() == null || importRow.getObsUnitID().isBlank()) { - // Set flag to indicate missing ObsUnit ID for current row - hasAllReferenceUnitIds = false; + // Check if ObsUnitID is blank + addRowError(ExperimentObservation.Columns.OBS_UNIT_ID, ExpImportProcessConstants.ErrMessage.MISSING_OBS_UNIT_ID.getValue(), validationErrors, rowNum); } else if (referenceOUIds.contains(importRow.getObsUnitID())) { - // Throw exception if ObsUnitID is repeated - throw new IllegalStateException("ObsUnitId is repeated: " + importRow.getObsUnitID()); + // Check if ObsUnitID is repeated + addRowError(ExperimentObservation.Columns.OBS_UNIT_ID, ExpImportProcessConstants.ErrMessage.DUPLICATE_OBS_UNIT_ID.getValue(), validationErrors, rowNum); } else { // Add ObsUnitID to referenceOUIds referenceOUIds.add(importRow.getObsUnitID()); - // Set flag to indicate presence of ObsUnit ID - hasNoReferenceUnitIds = false; } } + } - if (!hasNoReferenceUnitIds && !hasAllReferenceUnitIds) { - // Throw exception if there is a mix of ObsUnit IDs for some but not all rows - throw new HttpStatusException(HttpStatus.UNPROCESSABLE_ENTITY, ExpImportProcessConstants.ErrMessage.MISSING_OBS_UNIT_ID_ERROR.getValue()); - } + /** + * Adds validation errors for observation units that were not found in the database. + * + * This method processes an EntityNotFoundException and adds corresponding validation errors + * to the context for each import row where the Observation Unit ID was not found. + * + * @param e The EntityNotFoundException containing information about missing Observation Unit IDs. + * @param context The AppendOverwriteMiddlewareContext containing import data and validation error storage. + * + * @implNote The method performs the following steps: + * 1. Retrieves the ValidationErrors object from the context. + * 2. Iterates through each import row in the context. + * 3. For each row, checks if its Observation Unit ID is in the set of missing entity IDs from the exception. + * 4. If a match is found, adds a validation error for that row, indicating an invalid Observation Unit ID. + * 5. The error is added using the addRowError method, specifying the OBS_UNIT_ID column and using a predefined error message. + */ + public static void addValidationErrorsForObsUnitsNotFound(EntityNotFoundException e, AppendOverwriteMiddlewareContext context) { + ValidationErrors validationErrors = context.getAppendOverwriteWorkflowContext().getValidationErrors(); + List errors = new ArrayList<>(); - return referenceOUIds; + for (int rowNum = 0; rowNum < context.getImportContext().getImportRows().size(); rowNum++) { + String rowObsUnitId = ((ExperimentObservation)context.getImportContext().getImportRows().get(rowNum)).getObsUnitID(); + if (e.getMissingEntityIds().contains(rowObsUnitId)) { + addRowError(ExperimentObservation.Columns.OBS_UNIT_ID, ExperimentUtilities.INVALID_OBS_UNIT_ID_ERROR, validationErrors, rowNum); + } + } } /** diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java deleted file mode 100644 index 61e7fc299..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/MissingValuesException.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.breedinginsight.brapps.importer.services.processors.experiment; - -import lombok.Getter; - -import java.util.Set; - -@Getter -public class MissingValuesException extends Exception { - private Set missingIds; - - public MissingValuesException(Set missingIds) { this.missingIds = missingIds; } -} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java index 436ad2938..2702f9c7a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/BrAPIAction.java @@ -20,6 +20,7 @@ import org.brapi.client.v2.model.exceptions.ApiException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.BrAPIState; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.entity.ExperimentImportEntity; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; @@ -43,7 +44,7 @@ public interface BrAPIAction { * @return An Optional containing the relevant BrAPI state after executing the action. * @throws ApiException if an error occurs during the execution of the action. */ - Optional> execute() throws ApiException, MissingRequiredInfoException, UnprocessableEntityException, DoesNotExistException, ValidatorException; + Optional> execute() throws ApiException, MissingRequiredInfoException, UnprocessableEntityException, DoesNotExistException, EntityNotFoundException; /** * Get the BrAPI entity being acted on based on the provided ExpUnitMiddlewareContext. diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java index 4e1f62142..198c9c1ba 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/action/WorkflowReadInitialization.java @@ -23,6 +23,7 @@ import org.brapi.client.v2.model.exceptions.ApiException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.BrAPIState; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.entity.ExperimentImportEntity; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.services.exceptions.ValidatorException; import org.breedinginsight.utilities.Utilities; @@ -45,7 +46,7 @@ protected WorkflowReadInitialization(ExperimentImportEntity entity) { * @return an Optional containing the BrAPIState representing the completed read workflow * @throws ApiException if an error occurs during execution */ - public Optional> execute() throws ApiException, ValidatorException { + public Optional> execute() throws ApiException, EntityNotFoundException { try { List fetchedMembers = entity.brapiRead(); entity.initializeWorkflow(fetchedMembers); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/ProcessedDataFactory.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/ProcessedDataFactory.java index 84f8bcf75..6775e6d03 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/ProcessedDataFactory.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/ProcessedDataFactory.java @@ -112,6 +112,10 @@ public static EmptyData emptyData(String brapiReferenceSource, return new EmptyData(brapiReferenceSource, isCommit, germplasmName, study, phenoColumnName, trialId, studyId, unitId, studyYear, observationUnit, user, program, studyService, observationService); } + public static UndefinedDataset undefinedDataset() { + return new UndefinedDataset(); + } + @Bean @Prototype public InitialData initialDataBean(String brapiReferenceSource, @@ -173,5 +177,11 @@ public EmptyData emptyDataBean(String brapiReferenceSource, Program program) { return emptyData(brapiReferenceSource, isCommit, germplasmName, study, phenoColumnName, trialId, studyId, unitId, studyYear, observationUnit, user, program, studyService, observationService); } + + @Bean + @Prototype + public UndefinedDataset undefinedDatasetBean() { + return undefinedDataset(); + } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java new file mode 100644 index 000000000..85c739a60 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java @@ -0,0 +1,26 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.data; + +import org.brapi.v2.model.pheno.BrAPIObservation; +import org.breedinginsight.api.model.v1.response.ValidationError; +import org.breedinginsight.brapps.importer.model.response.PendingImportObject; +import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware.process.AppendStatistic; + +import java.util.List; +import java.util.Optional; + +public class UndefinedDataset extends VisitedObservationData { + @Override + public Optional> getValidationErrors() { + return Optional.empty(); + } + + @Override + public PendingImportObject constructPendingObservation() { + return null; + } + + @Override + public void updateTally(AppendStatistic statistic) { + + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java index 3bb33d78f..e4b2a4aa2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/ExperimentImportEntity.java @@ -19,6 +19,7 @@ import org.brapi.client.v2.model.exceptions.ApiException; import org.breedinginsight.brapps.importer.model.response.ImportObjectState; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; @@ -44,7 +45,7 @@ public interface ExperimentImportEntity { * @return List of fetched entities * @throws ApiException if there is an issue with the API call */ - public List brapiRead() throws ApiException, ValidatorException; + public List brapiRead() throws ApiException, EntityNotFoundException; /** * Commit objects changed by the workflow to the BrAPI service. diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java index f4e458520..f9ec45a2b 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/entity/PendingObservationUnit.java @@ -21,14 +21,12 @@ import org.apache.commons.lang3.StringUtils; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.v2.model.pheno.BrAPIObservationUnit; -import org.breedinginsight.api.model.v1.response.ValidationErrors; import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapi.v2.dao.BrAPIObservationUnitDAO; -import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.brapps.importer.model.response.ImportObjectState; import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; -import org.breedinginsight.brapps.importer.services.processors.experiment.MissingValuesException; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteWorkflowContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.model.ImportContext; @@ -36,7 +34,6 @@ import org.breedinginsight.services.exceptions.DoesNotExistException; import org.breedinginsight.services.exceptions.MissingRequiredInfoException; import org.breedinginsight.services.exceptions.UnprocessableEntityException; -import org.breedinginsight.services.exceptions.ValidatorException; import org.breedinginsight.utilities.Utilities; import java.util.*; @@ -98,26 +95,12 @@ public List brapiPost(List members) * @throws ApiException if there is an issue with the API call */ @Override - public List brapiRead() throws ApiException, ValidatorException { + public List brapiRead() throws ApiException, EntityNotFoundException { // Collect deltabreed-generated obs unit ids listed in the import Set obsUnitIds = cache.getReferenceOUIds(); - try { - // For each id fetch the observation unit from the brapi data store - return observationUnitService.getObservationUnitsByDbId(new HashSet<>(obsUnitIds), importContext.getProgram()); - } - catch (MissingValuesException e) { - ValidationErrors validationErrors = new ValidationErrors(); - - // Build a detailed tabular error. - for (int rowNum = 0; rowNum < importContext.getImportRows().size(); rowNum++) { - String rowObsUnitId = ((ExperimentObservation)importContext.getImportRows().get(rowNum)).getObsUnitID(); - if (e.getMissingIds().contains(rowObsUnitId)) { - ExperimentUtilities.addRowError(ExperimentObservation.Columns.OBS_UNIT_ID, ExperimentUtilities.INVALID_OBS_UNIT_ID_ERROR, validationErrors, rowNum); - } - } - throw new ValidatorException(validationErrors); - } + // For each id fetch the observation unit from the brapi data store + return observationUnitService.getObservationUnitsById(new HashSet<>(obsUnitIds), importContext.getProgram()); } /** diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java index 64f471b88..a2edbdf65 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/AppendOverwriteIDValidation.java @@ -18,25 +18,70 @@ package org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.middleware; import io.micronaut.context.annotation.Prototype; -import io.micronaut.http.exceptions.HttpStatusException; import lombok.extern.slf4j.Slf4j; +import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.v2.model.pheno.BrAPIObservationUnit; +import org.breedinginsight.api.model.v1.response.ValidationErrors; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; +import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.action.BrAPIReadFactory; +import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.action.WorkflowReadInitialization; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; +import org.breedinginsight.services.exceptions.ValidatorException; + +import javax.inject.Inject; +import java.util.Optional; +import java.util.Set; @Slf4j @Prototype public class AppendOverwriteIDValidation extends AppendOverwriteMiddleware { + WorkflowReadInitialization brAPIObservationUnitReadWorkflowInitialization; + BrAPIReadFactory brAPIReadFactory; + + @Inject + public AppendOverwriteIDValidation(BrAPIReadFactory brAPIReadFactory) { + this.brAPIReadFactory = brAPIReadFactory; + } @Override public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { + brAPIObservationUnitReadWorkflowInitialization = brAPIReadFactory.observationUnitWorkflowReadInitializationBean(context); + // Initialize the validation error collection + Optional.ofNullable(context.getAppendOverwriteWorkflowContext().getValidationErrors()).orElseGet(() -> { + context.getAppendOverwriteWorkflowContext().setValidationErrors(new ValidationErrors()); + return new ValidationErrors(); + }); + ValidationErrors validationErrors = context.getAppendOverwriteWorkflowContext().getValidationErrors(); + ExperimentUtilities.validateReferenceOUIdValues(context); // Check for missing or duplicate OU ids + Set uniqueOUIds = ExperimentUtilities.collateUniqueOUIds(context); + context.getAppendOverwriteWorkflowContext().setReferenceOUIds(uniqueOUIds); try { - context.getAppendOverwriteWorkflowContext().setReferenceOUIds(ExperimentUtilities.collateReferenceOUIds(context)); - } catch (HttpStatusException | IllegalStateException e) { + brAPIObservationUnitReadWorkflowInitialization.execute(); // Fetch the obs units from the BrAPi service + if (validationErrors.hasErrors()) { + throw new ValidatorException(validationErrors); + } + return processNext(context); + } catch (EntityNotFoundException e) { + /** + * Return an error response with a list of rows where the unique OU id was not found in the BrAPI service in + * addition to rows where there are missing or duplicate OU ids + */ + ExperimentUtilities.addValidationErrorsForObsUnitsNotFound(e, context); + context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(new ValidatorException(validationErrors))); + return this.compensate(context); + } catch (ApiException | ValidatorException e) { + /** + * If OUs were fetched for all unique reference ids but some of the reference ids failed validation, + * return an error response and a list of rows with duplicate or missing ids + * + * Return an error response if there was a problem connecting to the BrAPI service + */ context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); return this.compensate(context); } - return processNext(context); + } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java index 40e0ea301..2aa889fc2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/initialize/WorkflowInitialization.java @@ -30,6 +30,7 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddleware; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.AppendOverwriteMiddlewareContext; import org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.model.MiddlewareException; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.model.ProgramLocation; import org.breedinginsight.services.exceptions.ValidatorException; @@ -38,7 +39,6 @@ @Slf4j @Prototype public class WorkflowInitialization extends AppendOverwriteMiddleware { - WorkflowReadInitialization brAPIObservationUnitReadWorkflowInitialization; WorkflowReadInitialization brAPITrialReadWorkflowInitialization; WorkflowReadInitialization brAPIStudyReadWorkflowInitialization; WorkflowReadInitialization locationReadWorkflowInitialization; @@ -52,7 +52,6 @@ public WorkflowInitialization(BrAPIReadFactory brAPIReadFactory) { } @Override public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext context) { - brAPIObservationUnitReadWorkflowInitialization = brAPIReadFactory.observationUnitWorkflowReadInitializationBean(context); brAPITrialReadWorkflowInitialization = brAPIReadFactory.trialWorkflowReadInitializationBean(context); brAPIStudyReadWorkflowInitialization = brAPIReadFactory.studyWorkflowReadInitializationBean(context); locationReadWorkflowInitialization = brAPIReadFactory.locationWorkflowReadInitializationBean(context); @@ -61,15 +60,17 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext log.debug("reading required BrAPI data from BrAPI service"); try { - brAPIObservationUnitReadWorkflowInitialization.execute(); brAPITrialReadWorkflowInitialization.execute(); brAPIStudyReadWorkflowInitialization.execute(); locationReadWorkflowInitialization.execute(); brAPIDatasetReadWorkflowInitialization.execute(); brAPIGermplasmReadWorkflowInitialization.execute(); - } catch (ApiException | ValidatorException e) { + } catch (ApiException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); return this.compensate(context); + } catch (EntityNotFoundException e) { + // TODO: handle edge cases of missing brapi entities as needed + return this.compensate(context); } return processNext(context); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java index 914633769..770576b67 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/middleware/process/ImportTableProcess.java @@ -225,6 +225,7 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext for (int i = 0; i < context.getImportContext().getImportRows().size(); i++) { Integer rowNum = i; ExperimentObservation row = (ExperimentObservation) context.getImportContext().getImportRows().get(rowNum); + VisitedObservationData processedData = null; // Construct the pending import for the row Optional.ofNullable(context.getImportContext().getMappedBrAPIImport()).orElseGet(() -> { @@ -233,18 +234,28 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext }); PendingImport mappedImportRow = context.getImportContext().getMappedBrAPIImport().getOrDefault(rowNum, new PendingImport()); String unitId = row.getObsUnitID(); + String studyName = context.getAppendOverwriteWorkflowContext().getPendingStudyByOUId().get(unitId).getBrAPIObject().getStudyName(); mappedImportRow.setTrial(context.getAppendOverwriteWorkflowContext().getPendingTrialByOUId().get(unitId)); mappedImportRow.setLocation(context.getAppendOverwriteWorkflowContext().getPendingLocationByOUId().get(unitId)); mappedImportRow.setStudy(context.getAppendOverwriteWorkflowContext().getPendingStudyByOUId().get(unitId)); mappedImportRow.setObservationUnit(context.getAppendOverwriteWorkflowContext().getPendingObsUnitByOUId().get(unitId)); mappedImportRow.setGermplasm(context.getAppendOverwriteWorkflowContext().getPendingGermplasmByOUId().get(unitId)); + /** + * Handle the edge case where a user imports with the append/overwrite workflow for an experiment + * without a dataset defined (i.e. no observation variables headers) and the import does not + * actually have new data to append + */ + if (phenotypeCols.isEmpty()) { + processedData = processedDataFactory.undefinedDatasetBean(); + updatePreviewStatistics(processedData, context, studyName, unitId); + } + // Assemble the pending observation data for all phenotypes for (Column column : phenotypeCols) { String cellData = column.getString(rowNum); // Generate hash for looking up prior observation data - String studyName = context.getAppendOverwriteWorkflowContext().getPendingStudyByOUId().get(unitId).getBrAPIObject().getStudyName(); String unitName = context.getAppendOverwriteWorkflowContext().getPendingObsUnitByOUId().get(unitId).getBrAPIObject().getObservationUnitName(); String phenoColumnName = column.name(); String observationHash = observationService.getObservationHash(unitName, phenoColumnName, studyName); @@ -266,8 +277,6 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext } - VisitedObservationData processedData = null; - // Is there prior observation data for this unit + var? if (observationByObsHash.containsKey(observationHash)) { @@ -275,9 +284,7 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext BrAPIObservation observation = gson.fromJson(gson.toJson(observationByObsHash.get(observationHash)), BrAPIObservation.class); // Is there a change to the prior data? - if ( - isChanged(cellData, observation, cell.timestamp) - ) { + if (isChanged(cellData, observation, cell.timestamp)) { // Is prior data protected? /** @@ -356,13 +363,7 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext processedData.getValidationErrors().ifPresent(errList -> errList.forEach(e -> validationErrors.addError(rowNum + 2, e))); // +2 to account for header row and excel file 1-based row index // Update import preview statistics and set in the context - processedData.updateTally(statistic); - statistic.addEnvironmentName(studyName); - // TODO: change null values to actual data - // TODO: change signature to take two args, studyName and unitName - statistic.addObservationUnitId(null); - statistic.addGid(context.getAppendOverwriteWorkflowContext().getPendingGermplasmByOUId().get(unitId).getBrAPIObject().getAccessionNumber()); - context.getAppendOverwriteWorkflowContext().setStatistic(statistic); + updatePreviewStatistics(processedData, context, studyName, unitId); // Construct a pending observation Optional> pendingProcessedData = Optional.ofNullable(processedData.constructPendingObservation()); @@ -386,11 +387,6 @@ public AppendOverwriteMiddlewareContext process(AppendOverwriteMiddlewareContext // Add the pending observation map to the context for use in processing the import context.getAppendOverwriteWorkflowContext().setPendingObservationByHash(pendingObservationByHash); - // Make sure the workflow statistic is not null. - if (context.getAppendOverwriteWorkflowContext().getStatistic() == null) { - context.getAppendOverwriteWorkflowContext().setStatistic(statistic); - } - return processNext(context); } catch (DoesNotExistException | ApiException | UnprocessableEntityException | ValidatorException | IllegalStateException e) { context.getAppendOverwriteWorkflowContext().setProcessError(new MiddlewareException(e)); @@ -407,4 +403,34 @@ private boolean isChanged(String cellData, BrAPIObservation observation, String } return !observationService.parseDateTime(newTimestamp).equals(observation.getObservationTimeStamp()); } + + /** + * Updates the preview statistics for processed observation data. + * + * This method updates various statistical metrics related to the processed + * observation data and stores them in the provided context. + * + * @param processedData The VisitedObservationData object containing the processed observation data. + * @param context The AppendOverwriteMiddlewareContext object where the updated statistics will be stored. + * @param studyName The name of the study associated with the observation data. + * @param unitId The identifier of the observation unit. + * + * @implNote This method performs the following operations: + * 1. Updates the tally in the processedData object. + * 2. Adds the study name to the statistics. + * 3. Adds the observation unit ID to the statistics. + * 4. Adds the germplasm ID (GID) to the statistics, retrieved from the pending germplasm data in the context. + * 5. Sets the updated statistics in the context. + */ + private void updatePreviewStatistics(VisitedObservationData processedData, + AppendOverwriteMiddlewareContext context, + String studyName, + String unitId) { + // Update import preview statistics and set in the context + processedData.updateTally(statistic); + statistic.addEnvironmentName(studyName); + statistic.addObservationUnitId(unitId); + statistic.addGid(context.getAppendOverwriteWorkflowContext().getPendingGermplasmByOUId().get(unitId).getBrAPIObject().getAccessionNumber()); + context.getAppendOverwriteWorkflowContext().setStatistic(statistic); + } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java new file mode 100644 index 000000000..3872e73db --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java @@ -0,0 +1,11 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment.model; + +import lombok.Getter; + +import java.util.Set; +@Getter +public class EntityNotFoundException extends Throwable { + private Set missingEntityIds; + + public EntityNotFoundException(Set missingEntityIds) { this.missingEntityIds = missingEntityIds; } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java index b4f7caf90..fa400d133 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java @@ -2,11 +2,8 @@ import com.fasterxml.jackson.annotation.JsonValue; import io.micronaut.context.annotation.Property; -import io.micronaut.context.annotation.Value; import lombok.extern.slf4j.Slf4j; -import javax.annotation.PostConstruct; - @Slf4j public class ExpImportProcessConstants { @@ -18,8 +15,11 @@ public class ExpImportProcessConstants { public enum ErrMessage { MULTIPLE_EXP_TITLES("File contains more than one Experiment Title"), - MISSING_OBS_UNIT_ID_ERROR("Required field is blank"), - PREEXISTING_EXPERIMENT_TITLE("Experiment Title already exists"); + MISSING_OBS_UNIT_ID("Invalid ObsUnitID"), + PREEXISTING_EXPERIMENT_TITLE("Experiment Title already exists"), + UNMATCHED_COLUMN("Ontology term(s) not found: "), + OBS_UNIT_NOT_FOUND("Invalid ObsUnitID"), + DUPLICATE_OBS_UNIT_ID("ObsUnitId is repeated"); private String value; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java index f34808f7f..d66507558 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/service/ObservationUnitService.java @@ -26,7 +26,7 @@ import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities; -import org.breedinginsight.brapps.importer.services.processors.experiment.MissingValuesException; +import org.breedinginsight.brapps.importer.services.processors.experiment.model.EntityNotFoundException; import org.breedinginsight.model.Program; import org.breedinginsight.utilities.Utilities; @@ -59,21 +59,26 @@ public ObservationUnitService(BrAPIObservationUnitDAO brAPIObservationUnitDAO) { * @throws ApiException if an error occurs during the retrieval of observation units * @throws IllegalStateException if the retrieved observation units do not match the provided observation unit IDs */ - public List getObservationUnitsByDbId(Set obsUnitIds, Program program) throws ApiException, IllegalStateException, MissingValuesException { + public List getObservationUnitsById(Set obsUnitIds, Program program) throws ApiException, IllegalStateException, EntityNotFoundException { List brapiUnits = null; // Retrieve reference Observation Units based on IDs brapiUnits = brAPIObservationUnitDAO.getObservationUnitsById(obsUnitIds, program); - // If no BrAPI units are found, throw an IllegalStateException with an error message + // If no BrAPI units are found, throw an EntityNotFoundException with an error message if (obsUnitIds.size() != brapiUnits.size()) { Set missingIds = new HashSet<>(obsUnitIds); // Calculate missing IDs based on retrieved BrAPI units - missingIds.removeAll(brapiUnits.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toSet())); + //missingIds.removeAll(brapiUnits.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toSet())); + missingIds.removeAll(brapiUnits.stream() + .map(unit -> Utilities.getExternalReference(unit.getExternalReferences(), BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.OBSERVATION_UNITS)) + .filter(Optional::isPresent) + .map(Optional::get) + .map(BrAPIExternalReference::getReferenceId).collect(Collectors.toSet())); // Throw exception with missing IDs information - throw new MissingValuesException(missingIds); + throw new EntityNotFoundException(missingIds); } return brapiUnits; From 62776129d24dd2a9ab403c2dbdcc29c335738398 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Tue, 11 Feb 2025 15:49:51 -0500 Subject: [PATCH 7/8] [BI-2156-qa] - added notice to new files --- .../factory/data/UndefinedDataset.java | 17 +++++++++++++++++ .../model/EntityNotFoundException.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java index 85c739a60..d30d917ec 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/appendoverwrite/factory/data/UndefinedDataset.java @@ -1,3 +1,20 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.breedinginsight.brapps.importer.services.processors.experiment.appendoverwrite.factory.data; import org.brapi.v2.model.pheno.BrAPIObservation; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java index 3872e73db..c6a915833 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/EntityNotFoundException.java @@ -1,3 +1,20 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.breedinginsight.brapps.importer.services.processors.experiment.model; import lombok.Getter; From 3883e85eac8f623c99091ef9e38a3a6f4429f5c5 Mon Sep 17 00:00:00 2001 From: mlm483 <128052931+mlm483@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:34:44 -0500 Subject: [PATCH 8/8] [BI-2156-qa] - added notice --- .../model/ExpImportProcessConstants.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java index fa400d133..2c0ae2e53 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/model/ExpImportProcessConstants.java @@ -1,3 +1,20 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.breedinginsight.brapps.importer.services.processors.experiment.model; import com.fasterxml.jackson.annotation.JsonValue;