From 314d0b129d6f563b2b2bf34cbebe51f8fb7bf0a5 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Mon, 6 May 2024 17:07:01 -0400 Subject: [PATCH 01/25] Added db migration to create workflows --- .../V1.22.0__add_experiment_workflows.sql | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql diff --git a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql new file mode 100644 index 000000000..a78947c38 --- /dev/null +++ b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql @@ -0,0 +1,41 @@ +/* + * 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. + */ + +CREATE TABLE importer_mapping_workflow +( + like base_entity INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES, + mapping_id UUID NOT NULL, + name TEXT +); + +ALTER TABLE importer_mapping_workflow + ADD FOREIGN KEY (mapping_id) REFERENCES importer_mapping (id); + +DO +$$ +DECLARE + exp_mapping_id UUID; +BEGIN + exp_mapping_id := (SELECT id FROM importer_mapping WHERE name = 'ExperimentsTemplateMap'); + +INSERT INTO public.importer_mapping_workflow (mapping_id, name) +VALUES + (exp_mapping_id, 'Create new experiment'), + (exp_mapping_id, 'Append experimental dataset'), + (exp_mapping_id, 'Create new experimental environment'); +END +$$; \ No newline at end of file From 8fc2f31a33698340a15d42dd8c80da7561c76684 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 7 May 2024 11:33:56 -0400 Subject: [PATCH 02/25] Added bean mapping for factory producing appropriate workflow --- .../migration/V1.22.0__add_experiment_workflows.sql | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql index a78947c38..d5c4b9556 100644 --- a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql +++ b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql @@ -19,7 +19,8 @@ CREATE TABLE importer_mapping_workflow ( like base_entity INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES, mapping_id UUID NOT NULL, - name TEXT + name TEXT NOT NULL, + bean TEXT NOT NULL ); ALTER TABLE importer_mapping_workflow @@ -32,10 +33,10 @@ DECLARE BEGIN exp_mapping_id := (SELECT id FROM importer_mapping WHERE name = 'ExperimentsTemplateMap'); -INSERT INTO public.importer_mapping_workflow (mapping_id, name) +INSERT INTO public.importer_mapping_workflow (mapping_id, name, bean) VALUES - (exp_mapping_id, 'Create new experiment'), - (exp_mapping_id, 'Append experimental dataset'), - (exp_mapping_id, 'Create new experimental environment'); + (exp_mapping_id, 'Create new experiment', 'CreateNewExperimentWorkflow'), + (exp_mapping_id, 'Append experimental dataset', 'AppendOverwritePhenotypesWorkflow'), + (exp_mapping_id, 'Create new experimental environment', 'CreateNewEnvironmentWorkflow'); END $$; \ No newline at end of file From 4b61708eaa9ece75443f6608b20bdf389b165c93 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 7 May 2024 11:36:12 -0400 Subject: [PATCH 03/25] Added endpoint for retrieving workflows for given mapping id --- .../controllers/ImportController.java | 18 +++++++ .../daos/ImportMappingWorkflowDAO.java | 46 ++++++++++++++++ .../model/workflow/ImportMappingWorkflow.java | 52 +++++++++++++++++++ .../importer/services/FileImportService.java | 14 ++++- 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java 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 e0a61117a..5c9ac0ca1 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java @@ -37,6 +37,7 @@ import org.breedinginsight.api.model.v1.response.metadata.StatusCode; import org.breedinginsight.api.v1.controller.metadata.AddMetadata; import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; +import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; import org.breedinginsight.brapps.importer.services.ImportConfigManager; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; import org.breedinginsight.brapps.importer.services.FileImportService; @@ -208,4 +209,21 @@ public HttpResponse>> getSystemMappings(@Nu Response> response = new Response(metadata, new DataResponse<>(result)); return HttpResponse.ok(response); } + + @Get("/import/mappings/{mappingId}/workflows") + @Produces(MediaType.APPLICATION_JSON) + @AddMetadata + @Secured(SecurityRule.IS_ANONYMOUS) + public HttpResponse>> getWorkflowsForSystemMapping(@PathVariable UUID mappingId) { + + List workflows = fileImportService.getWorkflowsForSystemMapping(mappingId); + + List metadataStatus = new ArrayList<>(); + metadataStatus.add(new Status(StatusCode.INFO, "Successful Query")); + Pagination pagination = new Pagination(workflows.size(), workflows.size(), 1, 0); + Metadata metadata = new Metadata(pagination, metadataStatus); + + Response> response = new Response(metadata, new DataResponse<>(workflows)); + return HttpResponse.ok(response); + } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java new file mode 100644 index 000000000..e6a0a7104 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java @@ -0,0 +1,46 @@ +package org.breedinginsight.brapps.importer.daos; + +import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; +import org.breedinginsight.dao.db.tables.daos.ImporterMappingWorkflowDao; +import org.jooq.Configuration; +import org.jooq.DSLContext; +import org.jooq.Record; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.breedinginsight.dao.db.Tables.*; + +public class ImportMappingWorkflowDAO extends ImporterMappingWorkflowDao { + + private DSLContext dsl; + + @Inject + public ImportMappingWorkflowDAO(Configuration config, DSLContext dsl) { + super(config); + this.dsl = dsl; + } + + /** + * Retrieves a list of ImportMappingWorkflow objects associated with the given mappingId. + * + * @param mappingId The UUID of the mapping to retrieve the workflows for. + * @return A list of ImportMappingWorkflow objects. + */ + public List getWorkflowsByImportMappingId(UUID mappingId) { + + List records = dsl.select() + .from(IMPORTER_MAPPING_WORKFLOW) + .where(IMPORTER_MAPPING_WORKFLOW.MAPPING_ID.eq(mappingId)) + .fetch(); + + List workflows = new ArrayList<>(); + for (Record record: records) { + workflows.add(ImportMappingWorkflow.parseSQLRecord(record)); + } + return workflows; + } + +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java new file mode 100644 index 000000000..51a70bb5a --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java @@ -0,0 +1,52 @@ +/* + * 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.model.workflow; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; +import lombok.experimental.SuperBuilder; + +import org.breedinginsight.dao.db.tables.pojos.ImporterMappingWorkflowEntity; +import org.jooq.Record; + +import static org.breedinginsight.dao.db.tables.ImporterMappingWorkflowTable.IMPORTER_MAPPING_WORKFLOW; + +@Getter +@Setter +@Accessors(chain=true) +@ToString +@NoArgsConstructor +@SuperBuilder() +public class ImportMappingWorkflow extends ImporterMappingWorkflowEntity { + + public ImportMappingWorkflow(ImporterMappingWorkflowEntity importMappingWorkflowEntity) { + this.setId(importMappingWorkflowEntity.getId()); + this.setName(importMappingWorkflowEntity.getName()); + } + + public static ImportMappingWorkflow parseSQLRecord(Record record) { + + return ImportMappingWorkflow.builder() + .id(record.getValue(IMPORTER_MAPPING_WORKFLOW.ID)) + .name(record.getValue(IMPORTER_MAPPING_WORKFLOW.NAME)) + .build(); + } +} 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 05c48601d..950465459 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.http.HttpStatus; +import io.micronaut.http.annotation.PathVariable; import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.http.multipart.CompletedFileUpload; import io.micronaut.http.server.exceptions.InternalServerException; @@ -32,6 +33,7 @@ import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.brapps.importer.daos.ImportDAO; import org.breedinginsight.brapps.importer.daos.ImportMappingProgramDAO; +import org.breedinginsight.brapps.importer.daos.ImportMappingWorkflowDAO; import org.breedinginsight.brapps.importer.model.ImportProgress; import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; @@ -40,8 +42,10 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.response.ImportResponse; import org.breedinginsight.brapps.importer.daos.ImportMappingDAO; +import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingEntity; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingProgramEntity; +import org.breedinginsight.dao.db.tables.pojos.ImporterMappingWorkflowEntity; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import org.breedinginsight.services.ProgramService; @@ -80,12 +84,13 @@ public class FileImportService { private final ImportDAO importDAO; private final DSLContext dsl; private final ImportMappingProgramDAO importMappingProgramDAO; + private final ImportMappingWorkflowDAO importMappingWorkflowDAO; @Inject FileImportService(ProgramUserService programUserService, ProgramService programService, MimeTypeParser mimeTypeParser, ImportMappingDAO importMappingDAO, ObjectMapper objectMapper, MappingManager mappingManager, ImportConfigManager configManager, ImportDAO importDAO, DSLContext dsl, ImportMappingProgramDAO importMappingProgramDAO, - UserService userService) { + ImportMappingWorkflowDAO importMappingWorkflowDAO, UserService userService) { this.programUserService = programUserService; this.programService = programService; this.mimeTypeParser = mimeTypeParser; @@ -97,6 +102,7 @@ public class FileImportService { this.dsl = dsl; this.importMappingProgramDAO = importMappingProgramDAO; this.userService = userService; + this.importMappingWorkflowDAO = importMappingWorkflowDAO; } public List getAllImportTypeConfigs() { @@ -559,4 +565,10 @@ public List getSystemMappingByName(String name) { List importMappings = importMappingDAO.getSystemMappingByName(name); return importMappings; } + + public List getWorkflowsForSystemMapping(UUID mappingId) { + return importMappingWorkflowDAO.getWorkflowsByImportMappingId(mappingId); + } + + } From c1fe8fa55d4b4170cf52c3b82fef2f18f5c5c765 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 7 May 2024 17:25:02 -0400 Subject: [PATCH 04/25] Simplify record mapping --- .../importer/daos/ImportMappingWorkflowDAO.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java index e6a0a7104..c2ad58c23 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java @@ -30,17 +30,10 @@ public ImportMappingWorkflowDAO(Configuration config, DSLContext dsl) { * @return A list of ImportMappingWorkflow objects. */ public List getWorkflowsByImportMappingId(UUID mappingId) { - - List records = dsl.select() + return dsl.select() .from(IMPORTER_MAPPING_WORKFLOW) .where(IMPORTER_MAPPING_WORKFLOW.MAPPING_ID.eq(mappingId)) - .fetch(); - - List workflows = new ArrayList<>(); - for (Record record: records) { - workflows.add(ImportMappingWorkflow.parseSQLRecord(record)); - } - return workflows; + .fetch(ImportMappingWorkflow::parseSQLRecord); } } From 3ca1a30a4ddc76a172d14d2685e242ed4ada7d2b Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Fri, 10 May 2024 12:05:09 -0400 Subject: [PATCH 05/25] Pass workflow id through to import services --- .../controllers/UploadController.java | 57 ++++++++++++++++++- .../model/imports/BrAPIImportService.java | 13 +---- .../model/imports/ImportServiceContext.java | 25 ++++++++ .../ExperimentImportService.java | 15 ++++- .../germplasm/GermplasmImportService.java | 11 +++- .../sample/SampleSubmissionImportService.java | 16 +++--- .../importer/services/FileImportService.java | 22 +++++-- 7 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java index f9d55bd20..053f1dc3c 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java @@ -114,7 +114,7 @@ public HttpResponse> commitData(@PathVariable UUID prog @PathVariable UUID uploadId, @Body @Nullable Map userInput) { try { AuthenticatedUser actingUser = securityService.getUser(); - ImportResponse result = fileImportService.updateUpload(programId, uploadId, actingUser, userInput, true); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, null, actingUser, userInput, true); Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { @@ -140,7 +140,60 @@ public HttpResponse> previewData(@PathVariable UUID pro @PathVariable UUID uploadId) { try { AuthenticatedUser actingUser = securityService.getUser(); - ImportResponse result = fileImportService.updateUpload(programId, uploadId, actingUser, null, false); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, null, actingUser, null, false); + Response response = new Response(result); + return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); + } catch (DoesNotExistException e) { + log.error(e.getMessage(), e); + return HttpResponse.notFound(); + } catch (AuthorizationException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.FORBIDDEN, e.getMessage()); + } catch (UnprocessableEntityException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, e.getMessage()); + } catch (HttpStatusException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(e.getStatus(), e.getMessage()); + } + } + + @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflowId}/data/{uploadId}/preview") + @Produces(MediaType.APPLICATION_JSON) + @AddMetadata + @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) + public HttpResponse> previewData(@PathVariable UUID programId, @PathVariable UUID mappingId, + @PathVariable UUID workflowId, @PathVariable UUID uploadId) { + try { + AuthenticatedUser actingUser = securityService.getUser(); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflowId, actingUser, null, false); + Response response = new Response(result); + return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); + } catch (DoesNotExistException e) { + log.error(e.getMessage(), e); + return HttpResponse.notFound(); + } catch (AuthorizationException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.FORBIDDEN, e.getMessage()); + } catch (UnprocessableEntityException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, e.getMessage()); + } catch (HttpStatusException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(e.getStatus(), e.getMessage()); + } + } + + @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflowId}/data/{uploadId}/commit") + @Produces(MediaType.APPLICATION_JSON) + @AddMetadata + @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) + public HttpResponse> commitData(@PathVariable UUID programId, @PathVariable UUID mappingId, + @PathVariable UUID workflowId, @PathVariable UUID uploadId, + @Body @Nullable Map userInput) { + try { + AuthenticatedUser actingUser = securityService.getUser(); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflowId, actingUser, userInput, true); Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { 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 1d520371c..d06454c30 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 @@ -17,18 +17,7 @@ package org.breedinginsight.brapps.importer.model.imports; -import org.brapi.client.v2.model.exceptions.ApiException; -import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; -import org.breedinginsight.model.Program; -import org.breedinginsight.model.User; -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 tech.tablesaw.api.Table; - -import java.util.List; public interface BrAPIImportService { String getImportTypeId(); @@ -48,6 +37,6 @@ default String getMissingUserInputMsg(String fieldName) { default String getWrongUserInputDataTypeMsg(String fieldName, String typeName) { return String.format("User input, \"%s\" must be an %s", fieldName, typeName); } - ImportPreviewResponse process(List brAPIImports, Table data, Program program, ImportUpload upload, User user, Boolean commit) + ImportPreviewResponse process(ImportServiceContext context) throws Exception; } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java new file mode 100644 index 000000000..ef7639c2f --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java @@ -0,0 +1,25 @@ +package org.breedinginsight.brapps.importer.model.imports; + +import lombok.*; +import org.breedinginsight.brapps.importer.model.ImportUpload; +import org.breedinginsight.model.Program; +import org.breedinginsight.model.User; +import tech.tablesaw.api.Table; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class ImportServiceContext { + private UUID workflowId; + private List brAPIImports; + private Table data; + private Program program; + private ImportUpload upload; + private User user; + private boolean commit; +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index cd795564a..965a7d20f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -21,6 +21,7 @@ import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.Processor; @@ -66,12 +67,22 @@ public String getMissingColumnMsg(String columnName) { } @Override - public ImportPreviewResponse process(List brAPIImports, Table data, Program program, ImportUpload upload, User user, Boolean commit) + public ImportPreviewResponse process(ImportServiceContext context) throws Exception { ImportPreviewResponse response = null; List processors = List.of(experimentProcessorProvider.get()); - response = processorManagerProvider.get().process(brAPIImports, processors, data, program, upload, user, commit); + // TODO: change to calling process directly on processor (not using processor manager and pass along workflowId) + if (context.getWorkflowId() != null) { + log.info("Workflow UUID: " + context.getWorkflowId()); + } + response = processorManagerProvider.get().process(context.getBrAPIImports(), + processors, + context.getData(), + context.getProgram(), + context.getUpload(), + context.getUser(), + context.isCommit()); return response; } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java index b4eac6b96..ce52f483f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java @@ -21,6 +21,7 @@ import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.services.processors.GermplasmProcessor; import org.breedinginsight.brapps.importer.services.processors.Processor; @@ -62,12 +63,18 @@ public String getImportTypeId() { } @Override - public ImportPreviewResponse process(List brAPIImports, Table data, Program program, ImportUpload upload, User user, Boolean commit) + public ImportPreviewResponse process(ImportServiceContext context) throws Exception { ImportPreviewResponse response = null; List processors = List.of(germplasmProcessorProvider.get()); - response = processorManagerProvider.get().process(brAPIImports, processors, data, program, upload, user, commit); + response = processorManagerProvider.get().process(context.getBrAPIImports(), + processors, + context.getData(), + context.getProgram(), + context.getUpload(), + context.getUser(), + context.isCommit()); return response; } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java index 434626e68..2c8e8b7b5 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java @@ -21,6 +21,7 @@ import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.services.processors.Processor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; @@ -59,13 +60,14 @@ public BrAPIImport getImportClass() { } @Override - public ImportPreviewResponse process(List brAPIImports, - Table data, - Program program, - ImportUpload upload, - User user, - Boolean commit) throws Exception { + public ImportPreviewResponse process(ImportServiceContext context) throws Exception { List processors = List.of(sampleProcessorProvider.get()); - return processorManagerProvider.get().process(brAPIImports, processors, data, program, upload, user, commit); + return processorManagerProvider.get().process(context.getBrAPIImports(), + processors, + context.getData(), + context.getProgram(), + context.getUpload(), + context.getUser(), + context.isCommit()); } } 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 950465459..960a8077f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -38,6 +38,7 @@ import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.response.ImportResponse; @@ -328,7 +329,7 @@ public ImportResponse uploadData(UUID programId, UUID mappingId, AuthenticatedUs return response; } - public ImportResponse updateUpload(UUID programId, UUID uploadId, AuthenticatedUser actingUser, Map userInput, Boolean commit) throws + public ImportResponse updateUpload(UUID programId, UUID uploadId, UUID workflowId, AuthenticatedUser actingUser, Map userInput, Boolean commit) throws DoesNotExistException, UnprocessableEntityException, AuthorizationException { Program program = validateRequest(programId, actingUser); @@ -378,7 +379,7 @@ public ImportResponse updateUpload(UUID programId, UUID uploadId, AuthenticatedU } else { brAPIImportList = mappingManager.map(mappingConfig, data); } - processFile(brAPIImportList, data, program, upload, user, commit, importService, actingUser); + processFile(workflowId, brAPIImportList, data, program, upload, user, commit, importService, actingUser); } catch (UnprocessableEntityException e) { log.error(e.getMessage(), e); ImportProgress progress = upload.getProgress(); @@ -424,13 +425,22 @@ public ImportUpload setDynamicColumns(ImportUpload newUpload, Table data, Import return newUpload; } - private void processFile(List finalBrAPIImportList, Table data, Program program, - ImportUpload upload, User user, Boolean commit, BrAPIImportService importService, - AuthenticatedUser actingUser) { + private void processFile(UUID workflowId, List finalBrAPIImportList, Table data, Program program, + ImportUpload upload, User user, Boolean commit, BrAPIImportService importService, + AuthenticatedUser actingUser) { // Spin off new process for processing the file CompletableFuture.supplyAsync(() -> { try { - importService.process(finalBrAPIImportList, data, program, upload, user, commit); + ImportServiceContext context = ImportServiceContext.builder() + .workflowId(workflowId) + .brAPIImports(finalBrAPIImportList) + .data(data) + .program(program) + .upload(upload) + .user(user) + .commit(commit) + .build(); + importService.process(context); } catch (UnprocessableEntityException e) { log.error(e.getMessage(), e); ImportProgress progress = upload.getProgress(); From c8e0bfe736957eb5b3ddd5186cd7ab6096580c4a Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Mon, 13 May 2024 16:45:25 -0400 Subject: [PATCH 06/25] Add workflow factory to create workflows from ids --- .../daos/ImportMappingWorkflowDAO.java | 12 +++ .../model/imports/ImportServiceContext.java | 21 ++++- .../ExperimentImportService.java | 8 +- .../model/workflow/ImportContext.java | 47 +++++++++++ .../model/workflow/ImportMappingWorkflow.java | 2 - .../model/workflow/ProcessedData.java | 31 +++++++ .../importer/model/workflow/Workflow.java | 36 ++++++++ .../importer/services/FileImportService.java | 14 +++- .../workflow/CreateNewExperimentWorkflow.java | 50 +++++++++++ .../services/workflow/WorkflowFactory.java | 84 +++++++++++++++++++ 10 files changed, 296 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportContext.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java index c2ad58c23..21aca395a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java @@ -9,6 +9,7 @@ import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.UUID; import static org.breedinginsight.dao.db.Tables.*; @@ -36,4 +37,15 @@ public List getWorkflowsByImportMappingId(UUID mappingId) .fetch(ImportMappingWorkflow::parseSQLRecord); } + /** + * Retrieves a workflow by its ID. + * + * @param workflowId The ID of the workflow to retrieve. + * @return An Optional containing the ImportMappingWorkflow if found, otherwise an empty Optional. + */ + public Optional getWorkflowById(UUID workflowId) { + return Optional.ofNullable(fetchOneById(workflowId)) + .map(ImportMappingWorkflow::new); + } + } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java index ef7639c2f..45393f67c 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java @@ -1,12 +1,29 @@ +/* + * 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.model.imports; import lombok.*; import org.breedinginsight.brapps.importer.model.ImportUpload; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import tech.tablesaw.api.Table; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -15,7 +32,7 @@ @AllArgsConstructor @NoArgsConstructor public class ImportServiceContext { - private UUID workflowId; + private Workflow workflow; private List brAPIImports; private Table data; private Program program; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index 965a7d20f..c6f68b251 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -72,10 +72,12 @@ public ImportPreviewResponse process(ImportServiceContext context) ImportPreviewResponse response = null; List processors = List.of(experimentProcessorProvider.get()); - // TODO: change to calling process directly on processor (not using processor manager and pass along workflowId) - if (context.getWorkflowId() != null) { - log.info("Workflow UUID: " + context.getWorkflowId()); + + if (context.getWorkflow() != null) { + log.info("Workflow: " + context.getWorkflow().getName()); } + + // TODO: change to calling workflow process instead of processor manager response = processorManagerProvider.get().process(context.getBrAPIImports(), processors, context.getData(), diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportContext.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportContext.java new file mode 100644 index 000000000..121ef6b19 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportContext.java @@ -0,0 +1,47 @@ +/* + * 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.model.workflow; + +import lombok.*; +import org.breedinginsight.brapps.importer.model.ImportUpload; +import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; +import org.breedinginsight.brapps.importer.model.imports.PendingImport; +import org.breedinginsight.model.Program; +import org.breedinginsight.model.User; +import tech.tablesaw.api.Table; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class ImportContext { + private UUID workflowId; + private ImportUpload upload; + private List importRows; + private Map mappedBrAPIImport; + private Table data; + private Program program; + private User user; + private boolean commit; +} \ No newline at end of file diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java index 51a70bb5a..0a23e1aae 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java @@ -36,12 +36,10 @@ @NoArgsConstructor @SuperBuilder() public class ImportMappingWorkflow extends ImporterMappingWorkflowEntity { - public ImportMappingWorkflow(ImporterMappingWorkflowEntity importMappingWorkflowEntity) { this.setId(importMappingWorkflowEntity.getId()); this.setName(importMappingWorkflowEntity.getName()); } - public static ImportMappingWorkflow parseSQLRecord(Record record) { return ImportMappingWorkflow.builder() diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java new file mode 100644 index 000000000..e73d6ad48 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java @@ -0,0 +1,31 @@ +/* + * 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.model.workflow; + +import lombok.*; +import org.breedinginsight.brapps.importer.model.response.ImportPreviewStatistics; + +import java.util.Map; + +@Data +@Builder +@ToString +@NoArgsConstructor +public class ProcessedData { + private Map statistics; +} \ No newline at end of file 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 new file mode 100644 index 000000000..9ea0e7bf9 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java @@ -0,0 +1,36 @@ +/* + * 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.model.workflow; + +public interface Workflow { + + /** + * Processes the given import context and returns the processed data. + * + * @param context the import context containing the necessary data for processing + * @return the processed data + */ + ProcessedData process(ImportContext context); + + /** + * Retrieves the name of the Workflow for logging display purposes. + * + * @return the name of the Workflow + */ + String getName(); +} 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 960a8077f..2c3f7854f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -44,6 +44,8 @@ import org.breedinginsight.brapps.importer.model.response.ImportResponse; import org.breedinginsight.brapps.importer.daos.ImportMappingDAO; import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; +import org.breedinginsight.brapps.importer.services.workflow.WorkflowFactory; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingEntity; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingProgramEntity; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingWorkflowEntity; @@ -86,12 +88,13 @@ public class FileImportService { private final DSLContext dsl; private final ImportMappingProgramDAO importMappingProgramDAO; private final ImportMappingWorkflowDAO importMappingWorkflowDAO; + private final WorkflowFactory workflowFactory; @Inject FileImportService(ProgramUserService programUserService, ProgramService programService, MimeTypeParser mimeTypeParser, ImportMappingDAO importMappingDAO, ObjectMapper objectMapper, MappingManager mappingManager, ImportConfigManager configManager, ImportDAO importDAO, DSLContext dsl, ImportMappingProgramDAO importMappingProgramDAO, - ImportMappingWorkflowDAO importMappingWorkflowDAO, UserService userService) { + ImportMappingWorkflowDAO importMappingWorkflowDAO, WorkflowFactory workflowFactory, UserService userService) { this.programUserService = programUserService; this.programService = programService; this.mimeTypeParser = mimeTypeParser; @@ -104,6 +107,7 @@ public class FileImportService { this.importMappingProgramDAO = importMappingProgramDAO; this.userService = userService; this.importMappingWorkflowDAO = importMappingWorkflowDAO; + this.workflowFactory = workflowFactory; } public List getAllImportTypeConfigs() { @@ -431,8 +435,14 @@ private void processFile(UUID workflowId, List finalBrAPIImportList // Spin off new process for processing the file CompletableFuture.supplyAsync(() -> { try { + Workflow workflow = null; + if (workflowId != null) { + Optional optionalWorkflow = workflowFactory.getWorkflow(workflowId); + workflow = optionalWorkflow.orElse(null); + } + ImportServiceContext context = ImportServiceContext.builder() - .workflowId(workflowId) + .workflow(workflow) .brAPIImports(finalBrAPIImportList) .data(data) .program(program) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java new file mode 100644 index 000000000..6f6ab661a --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java @@ -0,0 +1,50 @@ +/* + * 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.create.workflow; + +import io.micronaut.context.annotation.Prototype; +import org.breedinginsight.brapps.importer.model.workflow.ImportContext; +import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; + +import javax.inject.Named; + +/** + * This class represents a workflow for creating a new experiment. The bean name must match the appropriate bean column + * value in the import_mapping_workflow db table + */ +@Prototype +@Named("CreateNewExperimentWorkflow") +public class CreateNewExperimentWorkflow implements Workflow { + + @Override + public ProcessedData process(ImportContext context) { + // TODO + return null; + } + + /** + * Retrieves the name of the workflow. This is used for logging display purposes. + * + * @return the name of the workflow + */ + @Override + public String getName() { + return "CreateNewExperimentWorkflow"; + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java new file mode 100644 index 000000000..60a2fd884 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java @@ -0,0 +1,84 @@ +/* + * 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.workflow; + +import io.micronaut.context.ApplicationContext; +import io.micronaut.context.annotation.Factory; +import io.micronaut.context.exceptions.NoSuchBeanException; +import io.micronaut.inject.qualifiers.Qualifiers; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.brapps.importer.daos.ImportMappingWorkflowDAO; +import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; + +import javax.inject.Inject; +import java.util.Optional; +import java.util.UUID; + +@Factory +@Slf4j +public class WorkflowFactory { + + private final ImportMappingWorkflowDAO importMappingWorkflowDAO; + private final ApplicationContext applicationContext; + + @Inject + public WorkflowFactory(ImportMappingWorkflowDAO importMappingWorkflowDAO, + ApplicationContext applicationContext) { + this.importMappingWorkflowDAO = importMappingWorkflowDAO; + this.applicationContext = applicationContext; + } + + /** + * Produces the appropriate workflow instance based on the import context + * + * @param context the import context + * @return an Optional containing the workflow if found, otherwise an empty Optional + * + * @throws IllegalStateException + * @throws NoSuchBeanException + */ + public Optional getWorkflow(UUID workflowId) { + + if (workflowId != null) { + // construct workflow from db record + Optional workflowOptional = importMappingWorkflowDAO.getWorkflowById(workflowId); + if (workflowOptional.isPresent()) { + ImportMappingWorkflow importMappingworkflow = workflowOptional.orElseThrow(() -> { + String msg = "Must have record in db for workflowId"; + log.error(msg); + return new IllegalStateException(msg); + }); + + // newer versions of micronaut have fancier ways to do this using annotations with provider but as + // far as I can tell it's not available in 2.5 + Workflow workflow; + try { + workflow = applicationContext.getBean(Workflow.class, Qualifiers.byName(importMappingworkflow.getBean())); + } catch (NoSuchBeanException e) { + log.error("Could not find workflow class implementation for bean: " + importMappingworkflow.getBean()); + throw e; + } + + return Optional.of(workflow); + } + } + + return Optional.empty(); + } +} From 4391479ee6e2d257e0713c6c6b7cbfc631ee030c Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Mon, 13 May 2024 16:50:45 -0400 Subject: [PATCH 07/25] Add missing file header --- .../daos/ImportMappingWorkflowDAO.java | 19 +++++++++++++++++-- .../importer/services/FileImportService.java | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java index 21aca395a..216506b5c 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java @@ -1,13 +1,28 @@ +/* + * 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.daos; import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; import org.breedinginsight.dao.db.tables.daos.ImporterMappingWorkflowDao; import org.jooq.Configuration; import org.jooq.DSLContext; -import org.jooq.Record; import javax.inject.Inject; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; 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 2c3f7854f..ef6c5f884 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -440,7 +440,7 @@ private void processFile(UUID workflowId, List finalBrAPIImportList Optional optionalWorkflow = workflowFactory.getWorkflow(workflowId); workflow = optionalWorkflow.orElse(null); } - + ImportServiceContext context = ImportServiceContext.builder() .workflow(workflow) .brAPIImports(finalBrAPIImportList) From 87ffdb53d134b43b0955aacee063c351d29d5cfd Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Mon, 13 May 2024 17:08:39 -0400 Subject: [PATCH 08/25] Add bean to import mapping workflow model --- .../brapps/importer/model/workflow/ImportMappingWorkflow.java | 4 ++++ .../brapps/importer/model/workflow/ProcessedData.java | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java index 0a23e1aae..4ea2a888b 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java @@ -36,15 +36,19 @@ @NoArgsConstructor @SuperBuilder() public class ImportMappingWorkflow extends ImporterMappingWorkflowEntity { + + public ImportMappingWorkflow(ImporterMappingWorkflowEntity importMappingWorkflowEntity) { this.setId(importMappingWorkflowEntity.getId()); this.setName(importMappingWorkflowEntity.getName()); + this.setBean(importMappingWorkflowEntity.getBean()); } public static ImportMappingWorkflow parseSQLRecord(Record record) { return ImportMappingWorkflow.builder() .id(record.getValue(IMPORTER_MAPPING_WORKFLOW.ID)) .name(record.getValue(IMPORTER_MAPPING_WORKFLOW.NAME)) + .bean(record.getValue(IMPORTER_MAPPING_WORKFLOW.BEAN)) .build(); } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java index e73d6ad48..f9f8196c2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ProcessedData.java @@ -23,7 +23,6 @@ import java.util.Map; @Data -@Builder @ToString @NoArgsConstructor public class ProcessedData { From 1c1df39b03dd513adff46bc8bd7e8d9dde19bff7 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 14 May 2024 10:29:04 -0400 Subject: [PATCH 09/25] Added position column to workflows for explicit ordering --- .../daos/ImportMappingWorkflowDAO.java | 4 +++- .../model/workflow/ImportMappingWorkflow.java | 2 ++ .../services/workflow/WorkflowFactory.java | 4 +++- .../V1.22.0__add_experiment_workflows.sql | 19 ++++++++++++++----- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java index 216506b5c..1b60bda45 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java @@ -40,7 +40,8 @@ public ImportMappingWorkflowDAO(Configuration config, DSLContext dsl) { } /** - * Retrieves a list of ImportMappingWorkflow objects associated with the given mappingId. + * Retrieves a list of ImportMappingWorkflow objects associated with the given mappingId. They are ordered by + * position for proper ordering on the front end. * * @param mappingId The UUID of the mapping to retrieve the workflows for. * @return A list of ImportMappingWorkflow objects. @@ -49,6 +50,7 @@ public List getWorkflowsByImportMappingId(UUID mappingId) return dsl.select() .from(IMPORTER_MAPPING_WORKFLOW) .where(IMPORTER_MAPPING_WORKFLOW.MAPPING_ID.eq(mappingId)) + .orderBy(IMPORTER_MAPPING_WORKFLOW.POSITION.asc()) .fetch(ImportMappingWorkflow::parseSQLRecord); } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java index 4ea2a888b..8dc5800bc 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java @@ -42,6 +42,7 @@ public ImportMappingWorkflow(ImporterMappingWorkflowEntity importMappingWorkflow this.setId(importMappingWorkflowEntity.getId()); this.setName(importMappingWorkflowEntity.getName()); this.setBean(importMappingWorkflowEntity.getBean()); + this.setPosition(importMappingWorkflowEntity.getPosition()); } public static ImportMappingWorkflow parseSQLRecord(Record record) { @@ -49,6 +50,7 @@ public static ImportMappingWorkflow parseSQLRecord(Record record) { .id(record.getValue(IMPORTER_MAPPING_WORKFLOW.ID)) .name(record.getValue(IMPORTER_MAPPING_WORKFLOW.NAME)) .bean(record.getValue(IMPORTER_MAPPING_WORKFLOW.BEAN)) + .position(record.getValue(IMPORTER_MAPPING_WORKFLOW.POSITION)) .build(); } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java index 60a2fd884..d265b66a0 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java @@ -48,7 +48,7 @@ public WorkflowFactory(ImportMappingWorkflowDAO importMappingWorkflowDAO, * Produces the appropriate workflow instance based on the import context * * @param context the import context - * @return an Optional containing the workflow if found, otherwise an empty Optional + * @return an Optional containing the workflow if id is not null, otherwise an empty Optional * * @throws IllegalStateException * @throws NoSuchBeanException @@ -58,6 +58,8 @@ public Optional getWorkflow(UUID workflowId) { if (workflowId != null) { // construct workflow from db record Optional workflowOptional = importMappingWorkflowDAO.getWorkflowById(workflowId); + + // TODO: look at this optional handling if (workflowOptional.isPresent()) { ImportMappingWorkflow importMappingworkflow = workflowOptional.orElseThrow(() -> { String msg = "Must have record in db for workflowId"; diff --git a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql index d5c4b9556..2c9d4d547 100644 --- a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql +++ b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql @@ -15,12 +15,21 @@ * limitations under the License. */ +/** + Table maps workflows to import mappings and provides required configuration options + + mapping_id - link to importer_mapping that this provides a workflow for + name - name that will be displayed on front end + bean - must match @Named("") annotation on Workflow class + position - for ordering records explicitly, wanted for front end default option and order + */ CREATE TABLE importer_mapping_workflow ( like base_entity INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES, mapping_id UUID NOT NULL, name TEXT NOT NULL, - bean TEXT NOT NULL + bean TEXT NOT NULL, + position INTEGER NOT NULL ); ALTER TABLE importer_mapping_workflow @@ -33,10 +42,10 @@ DECLARE BEGIN exp_mapping_id := (SELECT id FROM importer_mapping WHERE name = 'ExperimentsTemplateMap'); -INSERT INTO public.importer_mapping_workflow (mapping_id, name, bean) +INSERT INTO public.importer_mapping_workflow (mapping_id, name, bean, position) VALUES - (exp_mapping_id, 'Create new experiment', 'CreateNewExperimentWorkflow'), - (exp_mapping_id, 'Append experimental dataset', 'AppendOverwritePhenotypesWorkflow'), - (exp_mapping_id, 'Create new experimental environment', 'CreateNewEnvironmentWorkflow'); + (exp_mapping_id, 'Create new experiment', 'CreateNewExperimentWorkflow', 0), + (exp_mapping_id, 'Append experimental dataset', 'AppendOverwritePhenotypesWorkflow', 1), + (exp_mapping_id, 'Create new experimental environment', 'CreateNewEnvironmentWorkflow', 2); END $$; \ No newline at end of file From 36944a510a2dade39bd1dff565621a1b2f6f6e41 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 14 May 2024 10:45:35 -0400 Subject: [PATCH 10/25] Added additional workflow skeletons --- .../AppendOverwritePhenotypesWorkflow.java | 50 +++++++++++++++++++ .../CreateNewEnvironmentWorkflow.java | 50 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java new file mode 100644 index 000000000..21df19be6 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java @@ -0,0 +1,50 @@ +/* + * 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.append.workflow; + +import io.micronaut.context.annotation.Prototype; +import org.breedinginsight.brapps.importer.model.workflow.ImportContext; +import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; + +import javax.inject.Named; + +/** + * This class represents a workflow for appending and overwriting phenotypes. The bean name must match the appropriate + * bean column value in the import_mapping_workflow db table + */ + +@Prototype +@Named("AppendOverwritePhenotypesWorkflow") +public class AppendOverwritePhenotypesWorkflow implements Workflow { + @Override + public ProcessedData process(ImportContext context) { + // TODO + return null; + } + + /** + * Retrieves the name of the workflow. This is used for logging display purposes. + * + * @return the name of the workflow + */ + @Override + public String getName() { + return "AppendOverwritePhenotypesWorkflow"; + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java new file mode 100644 index 000000000..5776ab59b --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java @@ -0,0 +1,50 @@ +/* + * 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.newenv.workflow; + +import io.micronaut.context.annotation.Prototype; +import org.breedinginsight.brapps.importer.model.workflow.ImportContext; +import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; + +import javax.inject.Named; + +/** + * This class represents a workflow for adding new environments to an existing experiment. The bean name must match + * the appropriate bean column value in the import_mapping_workflow db table + */ + +@Prototype +@Named("CreateNewEnvironmentWorkflow") +public class CreateNewEnvironmentWorkflow implements Workflow { + @Override + public ProcessedData process(ImportContext context) { + // TODO + return null; + } + + /** + * Retrieves the name of the workflow. This is used for logging display purposes. + * + * @return the name of the workflow + */ + @Override + public String getName() { + return "CreateNewEnvironmentWorkflow"; + } +} From 7a9af10ed0356559c6a27de474c86697f0e38f58 Mon Sep 17 00:00:00 2001 From: Nick <53413353+nickpalladino@users.noreply.github.com> Date: Tue, 14 May 2024 14:01:41 -0400 Subject: [PATCH 11/25] Clean up factory code --- .../services/workflow/WorkflowFactory.java | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java index d265b66a0..17d6fe64e 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java @@ -59,26 +59,23 @@ public Optional getWorkflow(UUID workflowId) { // construct workflow from db record Optional workflowOptional = importMappingWorkflowDAO.getWorkflowById(workflowId); - // TODO: look at this optional handling - if (workflowOptional.isPresent()) { - ImportMappingWorkflow importMappingworkflow = workflowOptional.orElseThrow(() -> { - String msg = "Must have record in db for workflowId"; - log.error(msg); - return new IllegalStateException(msg); - }); + ImportMappingWorkflow importMappingworkflow = workflowOptional.orElseThrow(() -> { + String msg = "Must have record in db for workflowId"; + log.error(msg); + return new IllegalStateException(msg); + }); - // newer versions of micronaut have fancier ways to do this using annotations with provider but as - // far as I can tell it's not available in 2.5 - Workflow workflow; - try { - workflow = applicationContext.getBean(Workflow.class, Qualifiers.byName(importMappingworkflow.getBean())); - } catch (NoSuchBeanException e) { - log.error("Could not find workflow class implementation for bean: " + importMappingworkflow.getBean()); - throw e; - } - - return Optional.of(workflow); + // newer versions of micronaut have fancier ways to do this using annotations with provider but as + // far as I can tell it's not available in 2.5 + Workflow workflow; + try { + workflow = applicationContext.getBean(Workflow.class, Qualifiers.byName(importMappingworkflow.getBean())); + } catch (NoSuchBeanException e) { + log.error("Could not find workflow class implementation for bean: " + importMappingworkflow.getBean()); + throw e; } + + return Optional.of(workflow); } return Optional.empty(); From 5564ca1e97a7509d0ef6edc353462471ee61ee47 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 22 May 2024 18:17:05 -0400 Subject: [PATCH 12/25] create micronaut composite pattern classes for experiment import workflow --- .../model/imports/ImportServiceContext.java | 1 + .../ExperimentImportService.java | 27 ++++----- .../importer/model/workflow/Action.java | 29 +++++++++ .../model/workflow/ImportWorkflow.java | 12 ++++ .../model/workflow/ImportWorkflowResult.java | 33 +++++++++++ .../importer/services/FileImportService.java | 10 ++-- .../experiment/ExperimentImportWorkflow.java | 59 +++++++++++++++++++ .../AppendOverwriteObservationWorkflow.java | 53 +++++++++++++++++ .../workflow/NewExperimentWorkflow.java | 54 +++++++++++++++++ .../workflow/NewEnvironmentWorkflow.java | 53 +++++++++++++++++ 10 files changed, 309 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java index 45393f67c..c5a479e90 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java @@ -32,6 +32,7 @@ @AllArgsConstructor @NoArgsConstructor public class ImportServiceContext { + private String action; private Workflow workflow; private List brAPIImports; private Table data; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index c6f68b251..de7d54961 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -23,9 +23,11 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.Processor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import tech.tablesaw.api.Table; @@ -34,6 +36,7 @@ import javax.inject.Provider; import javax.inject.Singleton; import java.util.List; +import java.util.Optional; @Singleton @Slf4j @@ -43,12 +46,16 @@ public class ExperimentImportService implements BrAPIImportService { private final Provider experimentProcessorProvider; private final Provider processorManagerProvider; + private final ExperimentImportWorkflow workflow; @Inject - public ExperimentImportService(Provider experimentProcessorProvider, Provider processorManagerProvider) + public ExperimentImportService(Provider experimentProcessorProvider, + Provider processorManagerProvider, + ExperimentImportWorkflow workflow) { this.experimentProcessorProvider = experimentProcessorProvider; this.processorManagerProvider = processorManagerProvider; + this.workflow = workflow; } @Override @@ -70,23 +77,11 @@ public String getMissingColumnMsg(String columnName) { public ImportPreviewResponse process(ImportServiceContext context) throws Exception { - ImportPreviewResponse response = null; - List processors = List.of(experimentProcessorProvider.get()); - - if (context.getWorkflow() != null) { - log.info("Workflow: " + context.getWorkflow().getName()); + if (!context.getAction().isEmpty()) { + log.info("Workflow: " + context.getAction()); } - // TODO: change to calling workflow process instead of processor manager - response = processorManagerProvider.get().process(context.getBrAPIImports(), - processors, - context.getData(), - context.getProgram(), - context.getUpload(), - context.getUser(), - context.isCommit()); - return response; - + return workflow.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java new file mode 100644 index 000000000..65c3d0cbb --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java @@ -0,0 +1,29 @@ +///* +// * 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.model.workflow; + +import lombok.*; + +@Getter +@Setter +@ToString +@AllArgsConstructor +public class Action { + private String name; + private int order; +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java new file mode 100644 index 000000000..c5dfc1957 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java @@ -0,0 +1,12 @@ +package org.breedinginsight.brapps.importer.model.workflow; + +import io.micronaut.core.order.Ordered; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; + +import java.util.Optional; + +@FunctionalInterface +public interface ImportWorkflow extends Ordered { + Optional process(ImportServiceContext context); +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java new file mode 100644 index 000000000..2e61a6d46 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java @@ -0,0 +1,33 @@ +///* +// * 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.model.workflow; + +import lombok.*; +import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; + +import java.util.Optional; + +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +public class ImportWorkflowResult { + private Action action; + private Optional importPreviewResponse; +} 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 ef6c5f884..59438c696 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -435,14 +435,12 @@ private void processFile(UUID workflowId, List finalBrAPIImportList // Spin off new process for processing the file CompletableFuture.supplyAsync(() -> { try { - Workflow workflow = null; - if (workflowId != null) { - Optional optionalWorkflow = workflowFactory.getWorkflow(workflowId); - workflow = optionalWorkflow.orElse(null); - } + + final Workflow[] workflow = {null}; + Optional.ofNullable(workflowId).ifPresent(id -> workflow[0] = workflowFactory.getWorkflow(id).orElse(null)); ImportServiceContext context = ImportServiceContext.builder() - .workflow(workflow) + .workflow(workflow[0]) .brAPIImports(finalBrAPIImportList) .data(data) .program(program) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java new file mode 100644 index 000000000..e8a7d45da --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java @@ -0,0 +1,59 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment; + +import io.micronaut.context.annotation.Primary; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; + +import javax.inject.Singleton; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Primary +@Singleton +public class ExperimentImportWorkflow implements ImportWorkflow { + private final List workflows; + + public ExperimentImportWorkflow(List workflows) { + this.workflows = workflows; + } + + @Override + public Optional process(ImportServiceContext context) { + return workflows.stream() + .map(workflow->workflow.process(context)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); + } + public List getWorkflows() { + return workflows.stream() + .map(workflow->workflow.process(null)) + .filter(Optional::isPresent) + .map(Optional::get) + .map(result->result.getAction()) + .collect(Collectors.toList()); + } + + public enum ImportAction { + APPEND_OVERWRITE("append-overwrite-observation"), + NEW_OBSERVATION("new-observation"), + APPEND_ENVIRONMENT("append-environment"); + + private String urlFragment; + + ImportAction(String urlFragment) { + this.urlFragment = urlFragment; + } + + public String getUrlFragment() { + return urlFragment; + } + + public boolean isEqual(String value) { + return Optional.ofNullable(urlFragment.equals(value)).orElse(false); + } + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java new file mode 100644 index 000000000..ca5e932ef --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java @@ -0,0 +1,53 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment.append.workflow; + +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; + +import javax.inject.Singleton; +import java.util.Optional; + +@Singleton +public class AppendOverwriteObservationWorkflow implements ImportWorkflow { + private final ExperimentImportWorkflow.ImportAction action; + + public AppendOverwriteObservationWorkflow(){ + this.action = ExperimentImportWorkflow.ImportAction.APPEND_OVERWRITE; + } + + @Override + public Optional process(ImportServiceContext context) { + // Workflow processing the context + Action workflow = new Action(action.getUrlFragment(), this.getOrder()); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .action(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless appending or overwriting observation data + if (context != null && !action.isEqual(context.getAction())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; + } + + @Override + public int getOrder() { + return 2; + } + + public ExperimentImportWorkflow.ImportAction getAction() { + return this.action; + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java new file mode 100644 index 000000000..c29fe9fd5 --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java @@ -0,0 +1,54 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment.create.workflow; + +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; + +import javax.inject.Singleton; +import java.util.Optional; + +@Singleton +public class NewExperimentWorkflow implements ImportWorkflow { + private final ExperimentImportWorkflow.ImportAction action; + + public NewExperimentWorkflow(){ + this.action = ExperimentImportWorkflow.ImportAction.NEW_OBSERVATION; + } + + @Override + public Optional process(ImportServiceContext context) { + // Workflow processing the context + Action workflow = new Action(action.getUrlFragment(), this.getOrder()); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .action(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless creating a new experiment + if (context != null && !action.isEqual(context.getAction())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; + } + + @Override + public int getOrder() { + return 1; + } + + public ExperimentImportWorkflow.ImportAction getAction() { + return this.action; + } +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java new file mode 100644 index 000000000..57ee9790e --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java @@ -0,0 +1,53 @@ +package org.breedinginsight.brapps.importer.services.processors.experiment.newenv.workflow; + +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; + +import javax.inject.Singleton; +import java.util.Optional; + +@Singleton +public class NewEnvironmentWorkflow implements ImportWorkflow { + private final ExperimentImportWorkflow.ImportAction action; + + public NewEnvironmentWorkflow(){ + this.action = ExperimentImportWorkflow.ImportAction.APPEND_ENVIRONMENT; + } + + @Override + public Optional process(ImportServiceContext context) { + // Workflow processing the context + Action workflow = new Action(action.getUrlFragment(), this.getOrder()); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .action(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless appending a new environment + if (context != null && !action.isEqual(context.getAction())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; + } + + @Override + public int getOrder() { + return 3; + } + + public ExperimentImportWorkflow.ImportAction getAction() { + return this.action; + } +} From f726611cef1f5f3b3d82f76fd9b0c3ad5e8c8a01 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 22 May 2024 18:52:39 -0400 Subject: [PATCH 13/25] create FileImportService method for GET workflows --- .../importer/controllers/ImportController.java | 13 ++++++++++--- .../importer/model/imports/BrAPIImportService.java | 4 ++++ .../ExperimentImportService.java | 5 +++++ .../brapps/importer/services/FileImportService.java | 9 +++++++-- 4 files changed, 26 insertions(+), 5 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 5c9ac0ca1..e9e9612e1 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java @@ -37,6 +37,7 @@ import org.breedinginsight.api.model.v1.response.metadata.StatusCode; import org.breedinginsight.api.v1.controller.metadata.AddMetadata; import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; +import org.breedinginsight.brapps.importer.model.workflow.Action; import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; import org.breedinginsight.brapps.importer.services.ImportConfigManager; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; @@ -214,16 +215,22 @@ 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) { - List workflows = fileImportService.getWorkflowsForSystemMapping(mappingId); + List workflows = null; + try { + workflows = fileImportService.getWorkflowsForSystemMapping(mappingId); + } catch (DoesNotExistException e) { + log.error(e.getMessage(), e); + return HttpResponse.status(HttpStatus.UNPROCESSABLE_ENTITY, e.getMessage()); + } List metadataStatus = new ArrayList<>(); metadataStatus.add(new Status(StatusCode.INFO, "Successful Query")); Pagination pagination = new Pagination(workflows.size(), workflows.size(), 1, 0); Metadata metadata = new Metadata(pagination, metadataStatus); - Response> response = new Response(metadata, new DataResponse<>(workflows)); + Response> response = new Response(metadata, new DataResponse<>(workflows)); return HttpResponse.ok(response); } } 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 d06454c30..997155d93 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 @@ -18,10 +18,14 @@ package org.breedinginsight.brapps.importer.model.imports; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.Action; + +import java.util.List; public interface BrAPIImportService { String getImportTypeId(); BrAPIImport getImportClass(); + 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/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index de7d54961..760464d93 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -23,6 +23,7 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.Action; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.Processor; @@ -72,6 +73,10 @@ public String getImportTypeId() { public String getMissingColumnMsg(String columnName) { return "Column heading does not match template or ontology"; } + @Override + public List getWorkflows() { + return workflow.getWorkflows(); + } @Override public ImportPreviewResponse process(ImportServiceContext context) 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 59438c696..7d9ebc0c6 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -43,6 +43,7 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.response.ImportResponse; import org.breedinginsight.brapps.importer.daos.ImportMappingDAO; +import org.breedinginsight.brapps.importer.model.workflow.Action; import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; import org.breedinginsight.brapps.importer.model.workflow.Workflow; import org.breedinginsight.brapps.importer.services.workflow.WorkflowFactory; @@ -584,8 +585,12 @@ public List getSystemMappingByName(String name) { return importMappings; } - public List getWorkflowsForSystemMapping(UUID mappingId) { - return importMappingWorkflowDAO.getWorkflowsByImportMappingId(mappingId); + public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException { + ImportMapping mappingConfig = importMappingDAO.getMapping(mappingId) + .orElseThrow(() -> new DoesNotExistException("Cannot find mapping config associated with upload.")); + BrAPIImportService importService = configManager.getImportServiceById(mappingConfig.getImportTypeId()) + .orElseThrow(() -> new DoesNotExistException("Config with that id does not exist")); + return importService.getWorkflows(); } From f6952dd78f45955706e5adbe25eed24ab7b641e2 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 22 May 2024 19:22:18 -0400 Subject: [PATCH 14/25] delete unused classes --- .../controllers/UploadController.java | 12 +-- .../daos/ImportMappingWorkflowDAO.java | 68 --------------- .../importer/services/FileImportService.java | 24 ++---- .../services/workflow/WorkflowFactory.java | 83 ------------------- 4 files changed, 11 insertions(+), 176 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java index 053f1dc3c..5ee6eb062 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/UploadController.java @@ -158,15 +158,15 @@ public HttpResponse> previewData(@PathVariable UUID pro } } - @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflowId}/data/{uploadId}/preview") + @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflow}/data/{uploadId}/preview") @Produces(MediaType.APPLICATION_JSON) @AddMetadata @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) public HttpResponse> previewData(@PathVariable UUID programId, @PathVariable UUID mappingId, - @PathVariable UUID workflowId, @PathVariable UUID uploadId) { + @PathVariable String workflow, @PathVariable UUID uploadId) { try { AuthenticatedUser actingUser = securityService.getUser(); - ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflowId, actingUser, null, false); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflow, actingUser, null, false); Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { @@ -184,16 +184,16 @@ public HttpResponse> previewData(@PathVariable UUID pro } } - @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflowId}/data/{uploadId}/commit") + @Put("programs/{programId}/import/mappings/{mappingId}/workflows/{workflow}/data/{uploadId}/commit") @Produces(MediaType.APPLICATION_JSON) @AddMetadata @ProgramSecured(roles = {ProgramSecuredRole.BREEDER, ProgramSecuredRole.SYSTEM_ADMIN}) public HttpResponse> commitData(@PathVariable UUID programId, @PathVariable UUID mappingId, - @PathVariable UUID workflowId, @PathVariable UUID uploadId, + @PathVariable String workflow, @PathVariable UUID uploadId, @Body @Nullable Map userInput) { try { AuthenticatedUser actingUser = securityService.getUser(); - ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflowId, actingUser, userInput, true); + ImportResponse result = fileImportService.updateUpload(programId, uploadId, workflow, actingUser, userInput, true); Response response = new Response(result); return HttpResponse.ok(response).status(HttpStatus.ACCEPTED); } catch (DoesNotExistException e) { diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java deleted file mode 100644 index 1b60bda45..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/ImportMappingWorkflowDAO.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.breedinginsight.brapps.importer.daos; - -import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; -import org.breedinginsight.dao.db.tables.daos.ImporterMappingWorkflowDao; -import org.jooq.Configuration; -import org.jooq.DSLContext; - -import javax.inject.Inject; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import static org.breedinginsight.dao.db.Tables.*; - -public class ImportMappingWorkflowDAO extends ImporterMappingWorkflowDao { - - private DSLContext dsl; - - @Inject - public ImportMappingWorkflowDAO(Configuration config, DSLContext dsl) { - super(config); - this.dsl = dsl; - } - - /** - * Retrieves a list of ImportMappingWorkflow objects associated with the given mappingId. They are ordered by - * position for proper ordering on the front end. - * - * @param mappingId The UUID of the mapping to retrieve the workflows for. - * @return A list of ImportMappingWorkflow objects. - */ - public List getWorkflowsByImportMappingId(UUID mappingId) { - return dsl.select() - .from(IMPORTER_MAPPING_WORKFLOW) - .where(IMPORTER_MAPPING_WORKFLOW.MAPPING_ID.eq(mappingId)) - .orderBy(IMPORTER_MAPPING_WORKFLOW.POSITION.asc()) - .fetch(ImportMappingWorkflow::parseSQLRecord); - } - - /** - * Retrieves a workflow by its ID. - * - * @param workflowId The ID of the workflow to retrieve. - * @return An Optional containing the ImportMappingWorkflow if found, otherwise an empty Optional. - */ - public Optional getWorkflowById(UUID workflowId) { - return Optional.ofNullable(fetchOneById(workflowId)) - .map(ImportMappingWorkflow::new); - } - -} 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 7d9ebc0c6..ffaa68614 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.http.HttpStatus; -import io.micronaut.http.annotation.PathVariable; import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.http.multipart.CompletedFileUpload; import io.micronaut.http.server.exceptions.InternalServerException; @@ -33,7 +32,6 @@ import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.brapps.importer.daos.ImportDAO; import org.breedinginsight.brapps.importer.daos.ImportMappingProgramDAO; -import org.breedinginsight.brapps.importer.daos.ImportMappingWorkflowDAO; import org.breedinginsight.brapps.importer.model.ImportProgress; import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; @@ -44,12 +42,8 @@ import org.breedinginsight.brapps.importer.model.response.ImportResponse; import org.breedinginsight.brapps.importer.daos.ImportMappingDAO; import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.Workflow; -import org.breedinginsight.brapps.importer.services.workflow.WorkflowFactory; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingEntity; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingProgramEntity; -import org.breedinginsight.dao.db.tables.pojos.ImporterMappingWorkflowEntity; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import org.breedinginsight.services.ProgramService; @@ -88,14 +82,12 @@ public class FileImportService { private final ImportDAO importDAO; private final DSLContext dsl; private final ImportMappingProgramDAO importMappingProgramDAO; - private final ImportMappingWorkflowDAO importMappingWorkflowDAO; - private final WorkflowFactory workflowFactory; @Inject FileImportService(ProgramUserService programUserService, ProgramService programService, MimeTypeParser mimeTypeParser, ImportMappingDAO importMappingDAO, ObjectMapper objectMapper, MappingManager mappingManager, ImportConfigManager configManager, ImportDAO importDAO, DSLContext dsl, ImportMappingProgramDAO importMappingProgramDAO, - ImportMappingWorkflowDAO importMappingWorkflowDAO, WorkflowFactory workflowFactory, UserService userService) { + UserService userService) { this.programUserService = programUserService; this.programService = programService; this.mimeTypeParser = mimeTypeParser; @@ -107,8 +99,6 @@ public class FileImportService { this.dsl = dsl; this.importMappingProgramDAO = importMappingProgramDAO; this.userService = userService; - this.importMappingWorkflowDAO = importMappingWorkflowDAO; - this.workflowFactory = workflowFactory; } public List getAllImportTypeConfigs() { @@ -334,7 +324,7 @@ public ImportResponse uploadData(UUID programId, UUID mappingId, AuthenticatedUs return response; } - public ImportResponse updateUpload(UUID programId, UUID uploadId, UUID workflowId, AuthenticatedUser actingUser, Map userInput, Boolean commit) throws + public ImportResponse updateUpload(UUID programId, UUID uploadId, String workflow, AuthenticatedUser actingUser, Map userInput, Boolean commit) throws DoesNotExistException, UnprocessableEntityException, AuthorizationException { Program program = validateRequest(programId, actingUser); @@ -384,7 +374,7 @@ public ImportResponse updateUpload(UUID programId, UUID uploadId, UUID workflowI } else { brAPIImportList = mappingManager.map(mappingConfig, data); } - processFile(workflowId, brAPIImportList, data, program, upload, user, commit, importService, actingUser); + processFile(workflow, brAPIImportList, data, program, upload, user, commit, importService, actingUser); } catch (UnprocessableEntityException e) { log.error(e.getMessage(), e); ImportProgress progress = upload.getProgress(); @@ -430,18 +420,14 @@ public ImportUpload setDynamicColumns(ImportUpload newUpload, Table data, Import return newUpload; } - private void processFile(UUID workflowId, List finalBrAPIImportList, Table data, Program program, + private void processFile(String workflow, List finalBrAPIImportList, Table data, Program program, ImportUpload upload, User user, Boolean commit, BrAPIImportService importService, AuthenticatedUser actingUser) { // Spin off new process for processing the file CompletableFuture.supplyAsync(() -> { try { - - final Workflow[] workflow = {null}; - Optional.ofNullable(workflowId).ifPresent(id -> workflow[0] = workflowFactory.getWorkflow(id).orElse(null)); - ImportServiceContext context = ImportServiceContext.builder() - .workflow(workflow[0]) + .action(workflow) .brAPIImports(finalBrAPIImportList) .data(data) .program(program) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java b/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java deleted file mode 100644 index 17d6fe64e..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/services/workflow/WorkflowFactory.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.breedinginsight.brapps.importer.services.workflow; - -import io.micronaut.context.ApplicationContext; -import io.micronaut.context.annotation.Factory; -import io.micronaut.context.exceptions.NoSuchBeanException; -import io.micronaut.inject.qualifiers.Qualifiers; -import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.brapps.importer.daos.ImportMappingWorkflowDAO; -import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.Workflow; - -import javax.inject.Inject; -import java.util.Optional; -import java.util.UUID; - -@Factory -@Slf4j -public class WorkflowFactory { - - private final ImportMappingWorkflowDAO importMappingWorkflowDAO; - private final ApplicationContext applicationContext; - - @Inject - public WorkflowFactory(ImportMappingWorkflowDAO importMappingWorkflowDAO, - ApplicationContext applicationContext) { - this.importMappingWorkflowDAO = importMappingWorkflowDAO; - this.applicationContext = applicationContext; - } - - /** - * Produces the appropriate workflow instance based on the import context - * - * @param context the import context - * @return an Optional containing the workflow if id is not null, otherwise an empty Optional - * - * @throws IllegalStateException - * @throws NoSuchBeanException - */ - public Optional getWorkflow(UUID workflowId) { - - if (workflowId != null) { - // construct workflow from db record - Optional workflowOptional = importMappingWorkflowDAO.getWorkflowById(workflowId); - - ImportMappingWorkflow importMappingworkflow = workflowOptional.orElseThrow(() -> { - String msg = "Must have record in db for workflowId"; - log.error(msg); - return new IllegalStateException(msg); - }); - - // newer versions of micronaut have fancier ways to do this using annotations with provider but as - // far as I can tell it's not available in 2.5 - Workflow workflow; - try { - workflow = applicationContext.getBean(Workflow.class, Qualifiers.byName(importMappingworkflow.getBean())); - } catch (NoSuchBeanException e) { - log.error("Could not find workflow class implementation for bean: " + importMappingworkflow.getBean()); - throw e; - } - - return Optional.of(workflow); - } - - return Optional.empty(); - } -} From 5e31aa6f363f7b1767b49fe59b79c793cd10a373 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 22 May 2024 20:33:43 -0400 Subject: [PATCH 15/25] clean up and renaming --- .../controllers/ImportController.java | 9 +-- .../model/imports/BrAPIImportService.java | 4 +- .../model/imports/ImportServiceContext.java | 5 +- .../ExperimentImportService.java | 22 ++--- .../importer/model/workflow/Action.java | 29 ------- .../model/workflow/ImportWorkflow.java | 35 ++++++-- .../model/workflow/ImportWorkflowResult.java | 2 +- .../importer/model/workflow/Workflow.java | 37 ++------- .../importer/services/FileImportService.java | 6 +- ...tWorkflow.java => ExperimentWorkflow.java} | 26 +++--- .../AppendOverwriteObservationWorkflow.java | 53 ------------ .../AppendOverwritePhenotypesWorkflow.java | 81 ++++++++++--------- .../workflow/CreateNewExperimentWorkflow.java | 79 +++++++++--------- .../workflow/NewExperimentWorkflow.java | 54 ------------- .../CreateNewEnvironmentWorkflow.java | 81 ++++++++++--------- .../workflow/NewEnvironmentWorkflow.java | 53 ------------ .../V1.22.0__add_experiment_workflows.sql | 51 ------------ 17 files changed, 195 insertions(+), 432 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java rename src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/{ExperimentImportWorkflow.java => ExperimentWorkflow.java} (61%) delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java delete mode 100644 src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql 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 e9e9612e1..1a16dadd7 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java +++ b/src/main/java/org/breedinginsight/brapps/importer/controllers/ImportController.java @@ -37,8 +37,7 @@ import org.breedinginsight.api.model.v1.response.metadata.StatusCode; import org.breedinginsight.api.v1.controller.metadata.AddMetadata; import org.breedinginsight.brapps.importer.model.mapping.ImportMapping; -import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportMappingWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.services.ImportConfigManager; import org.breedinginsight.brapps.importer.model.config.ImportConfigResponse; import org.breedinginsight.brapps.importer.services.FileImportService; @@ -215,9 +214,9 @@ 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) { - List workflows = null; + List workflows = null; try { workflows = fileImportService.getWorkflowsForSystemMapping(mappingId); } catch (DoesNotExistException e) { @@ -230,7 +229,7 @@ public HttpResponse>> getWorkflowsForSystemMapping Pagination pagination = new Pagination(workflows.size(), workflows.size(), 1, 0); Metadata metadata = new Metadata(pagination, metadataStatus); - Response> response = new Response(metadata, new DataResponse<>(workflows)); + Response> response = new Response(metadata, new DataResponse<>(workflows)); return HttpResponse.ok(response); } } 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 997155d93..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 @@ -18,14 +18,14 @@ package org.breedinginsight.brapps.importer.model.imports; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; -import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import java.util.List; public interface BrAPIImportService { String getImportTypeId(); BrAPIImport getImportClass(); - List getWorkflows(); + 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/ImportServiceContext.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java index c5a479e90..4d052cd33 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/ImportServiceContext.java @@ -19,10 +19,10 @@ import lombok.*; import org.breedinginsight.brapps.importer.model.ImportUpload; -import org.breedinginsight.brapps.importer.model.workflow.Workflow; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import tech.tablesaw.api.Table; + import java.util.List; @Getter @@ -32,8 +32,7 @@ @AllArgsConstructor @NoArgsConstructor public class ImportServiceContext { - private String action; - private Workflow workflow; + private String workflow; private List brAPIImports; private Table data; private Program program; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index 760464d93..df60e9782 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -18,26 +18,18 @@ package org.breedinginsight.brapps.importer.model.imports.experimentObservation; import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.brapps.importer.model.ImportUpload; -import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; -import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; -import org.breedinginsight.brapps.importer.services.processors.Processor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; -import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; -import org.breedinginsight.model.Program; -import org.breedinginsight.model.User; -import tech.tablesaw.api.Table; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflow; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import java.util.List; -import java.util.Optional; @Singleton @Slf4j @@ -47,12 +39,12 @@ public class ExperimentImportService implements BrAPIImportService { private final Provider experimentProcessorProvider; private final Provider processorManagerProvider; - private final ExperimentImportWorkflow workflow; + private final ExperimentWorkflow workflow; @Inject public ExperimentImportService(Provider experimentProcessorProvider, Provider processorManagerProvider, - ExperimentImportWorkflow workflow) + ExperimentWorkflow workflow) { this.experimentProcessorProvider = experimentProcessorProvider; this.processorManagerProvider = processorManagerProvider; @@ -74,7 +66,7 @@ public String getMissingColumnMsg(String columnName) { return "Column heading does not match template or ontology"; } @Override - public List getWorkflows() { + public List getWorkflows() { return workflow.getWorkflows(); } @@ -82,8 +74,8 @@ public List getWorkflows() { public ImportPreviewResponse process(ImportServiceContext context) throws Exception { - if (!context.getAction().isEmpty()) { - log.info("Workflow: " + context.getAction()); + if (!context.getWorkflow().isEmpty()) { + log.info("Workflow: " + context.getWorkflow()); } return workflow.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java deleted file mode 100644 index 65c3d0cbb..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Action.java +++ /dev/null @@ -1,29 +0,0 @@ -///* -// * See the NOTICE file distributed with this work for additional information -// * regarding copyright ownership. -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ - -package org.breedinginsight.brapps.importer.model.workflow; - -import lombok.*; - -@Getter -@Setter -@ToString -@AllArgsConstructor -public class Action { - private String name; - private int order; -} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java index c5dfc1957..b26a886bd 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java @@ -1,12 +1,31 @@ -package org.breedinginsight.brapps.importer.model.workflow; +///* +// * 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. +// */ -import io.micronaut.core.order.Ordered; -import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +package org.breedinginsight.brapps.importer.model.workflow; -import java.util.Optional; +import lombok.*; -@FunctionalInterface -public interface ImportWorkflow extends Ordered { - Optional process(ImportServiceContext context); +@Getter +@Setter +@Builder +@ToString +@AllArgsConstructor +public class ImportWorkflow { + private String urlFragment; + private String displayName; + private int order; } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java index 2e61a6d46..9304c1ce2 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflowResult.java @@ -28,6 +28,6 @@ @ToString @AllArgsConstructor public class ImportWorkflowResult { - private Action action; + private ImportWorkflow workflow; private Optional importPreviewResponse; } 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 9ea0e7bf9..8bc19120e 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 @@ -1,36 +1,11 @@ -/* - * 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.model.workflow; -public interface Workflow { +import io.micronaut.core.order.Ordered; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; - /** - * Processes the given import context and returns the processed data. - * - * @param context the import context containing the necessary data for processing - * @return the processed data - */ - ProcessedData process(ImportContext context); +import java.util.Optional; - /** - * Retrieves the name of the Workflow for logging display purposes. - * - * @return the name of the Workflow - */ - String getName(); +@FunctionalInterface +public interface Workflow extends Ordered { + Optional process(ImportServiceContext context); } 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 ffaa68614..6a1914ab9 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -41,7 +41,7 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImport; import org.breedinginsight.brapps.importer.model.response.ImportResponse; import org.breedinginsight.brapps.importer.daos.ImportMappingDAO; -import org.breedinginsight.brapps.importer.model.workflow.Action; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingEntity; import org.breedinginsight.dao.db.tables.pojos.ImporterMappingProgramEntity; import org.breedinginsight.model.Program; @@ -427,7 +427,7 @@ private void processFile(String workflow, List finalBrAPIImportList CompletableFuture.supplyAsync(() -> { try { ImportServiceContext context = ImportServiceContext.builder() - .action(workflow) + .workflow(workflow) .brAPIImports(finalBrAPIImportList) .data(data) .program(program) @@ -571,7 +571,7 @@ public List getSystemMappingByName(String name) { return importMappings; } - public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException { + public List getWorkflowsForSystemMapping(UUID mappingId) throws DoesNotExistException { ImportMapping mappingConfig = importMappingDAO.getMapping(mappingId) .orElseThrow(() -> new DoesNotExistException("Cannot find mapping config associated with upload.")); BrAPIImportService importService = configManager.getImportServiceById(mappingConfig.getImportTypeId()) diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java similarity index 61% rename from src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java rename to src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java index e8a7d45da..04bbc4fc1 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentImportWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java @@ -2,8 +2,8 @@ import io.micronaut.context.annotation.Primary; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.brapps.importer.model.workflow.Action; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import javax.inject.Singleton; @@ -13,10 +13,10 @@ @Primary @Singleton -public class ExperimentImportWorkflow implements ImportWorkflow { - private final List workflows; +public class ExperimentWorkflow implements Workflow { + private final List workflows; - public ExperimentImportWorkflow(List workflows) { + public ExperimentWorkflow(List workflows) { this.workflows = workflows; } @@ -28,29 +28,33 @@ public Optional process(ImportServiceContext context) { .map(Optional::get) .findFirst(); } - public List getWorkflows() { + public List getWorkflows() { return workflows.stream() .map(workflow->workflow.process(null)) .filter(Optional::isPresent) .map(Optional::get) - .map(result->result.getAction()) + .map(result->result.getWorkflow()) .collect(Collectors.toList()); } - public enum ImportAction { - APPEND_OVERWRITE("append-overwrite-observation"), - NEW_OBSERVATION("new-observation"), - APPEND_ENVIRONMENT("append-environment"); + public enum Workflow { + NEW_OBSERVATION("new-experiment","Create new experiment"), + APPEND_OVERWRITE("append-dataset", "Append experimental dataset"), + APPEND_ENVIRONMENT("append-environment", "Create new experimental environment"); private String urlFragment; + private String displayName; + + Workflow(String urlFragment, String displayName) { - ImportAction(String urlFragment) { this.urlFragment = urlFragment; + this.displayName = displayName; } public String getUrlFragment() { return urlFragment; } + public String getDisplayName() { return displayName; } public boolean isEqual(String value) { return Optional.ofNullable(urlFragment.equals(value)).orElse(false); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java deleted file mode 100644 index ca5e932ef..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwriteObservationWorkflow.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.breedinginsight.brapps.importer.services.processors.experiment.append.workflow; - -import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; -import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; - -import javax.inject.Singleton; -import java.util.Optional; - -@Singleton -public class AppendOverwriteObservationWorkflow implements ImportWorkflow { - private final ExperimentImportWorkflow.ImportAction action; - - public AppendOverwriteObservationWorkflow(){ - this.action = ExperimentImportWorkflow.ImportAction.APPEND_OVERWRITE; - } - - @Override - public Optional process(ImportServiceContext context) { - // Workflow processing the context - Action workflow = new Action(action.getUrlFragment(), this.getOrder()); - - // No-preview result - Optional result = Optional.of(ImportWorkflowResult.builder() - .action(workflow) - .importPreviewResponse(Optional.empty()) - .build()); - - // Skip this workflow unless appending or overwriting observation data - if (context != null && !action.isEqual(context.getAction())) { - return Optional.empty(); - } - - // Skip processing if no context, but return no-preview result for this workflow - if (context == null) { - return result; - } - - // Start processing the import... - return result; - } - - @Override - public int getOrder() { - return 2; - } - - public ExperimentImportWorkflow.ImportAction getAction() { - return this.action; - } -} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java index 21df19be6..44fb575bf 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java @@ -1,50 +1,55 @@ -/* - * 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.append.workflow; -import io.micronaut.context.annotation.Prototype; -import org.breedinginsight.brapps.importer.model.workflow.ImportContext; -import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import lombok.Getter; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +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.brapps.importer.services.processors.experiment.ExperimentWorkflow; -import javax.inject.Named; - -/** - * This class represents a workflow for appending and overwriting phenotypes. The bean name must match the appropriate - * bean column value in the import_mapping_workflow db table - */ +import javax.inject.Singleton; +import java.util.Optional; -@Prototype -@Named("AppendOverwritePhenotypesWorkflow") +@Getter +@Singleton public class AppendOverwritePhenotypesWorkflow implements Workflow { + private final ExperimentWorkflow.Workflow workflow; + + public AppendOverwritePhenotypesWorkflow(){ + this.workflow = ExperimentWorkflow.Workflow.APPEND_OVERWRITE; + } + @Override - public ProcessedData process(ImportContext context) { - // TODO - return null; + public Optional process(ImportServiceContext context) { + // Workflow processing the context + ImportWorkflow workflow = ImportWorkflow.builder() + .urlFragment(getWorkflow().getUrlFragment()) + .displayName(getWorkflow().getDisplayName()) + .build(); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .workflow(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless appending or overwriting observation data + if (context != null && !this.workflow.isEqual(context.getWorkflow())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; } - /** - * Retrieves the name of the workflow. This is used for logging display purposes. - * - * @return the name of the workflow - */ @Override - public String getName() { - return "AppendOverwritePhenotypesWorkflow"; + public int getOrder() { + return 2; } + } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java index 6f6ab661a..3c593ac74 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java @@ -1,50 +1,55 @@ -/* - * 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.create.workflow; -import io.micronaut.context.annotation.Prototype; -import org.breedinginsight.brapps.importer.model.workflow.ImportContext; -import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import lombok.Getter; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +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.brapps.importer.services.processors.experiment.ExperimentWorkflow; -import javax.inject.Named; +import javax.inject.Singleton; +import java.util.Optional; -/** - * This class represents a workflow for creating a new experiment. The bean name must match the appropriate bean column - * value in the import_mapping_workflow db table - */ -@Prototype -@Named("CreateNewExperimentWorkflow") +@Getter +@Singleton public class CreateNewExperimentWorkflow implements Workflow { + private final ExperimentWorkflow.Workflow workflow; + + public CreateNewExperimentWorkflow(){ + this.workflow = ExperimentWorkflow.Workflow.NEW_OBSERVATION; + } @Override - public ProcessedData process(ImportContext context) { - // TODO - return null; + public Optional process(ImportServiceContext context) { + // Workflow processing the context + ImportWorkflow workflow = ImportWorkflow.builder() + .urlFragment(getWorkflow().getUrlFragment()) + .displayName(getWorkflow().getDisplayName()) + .build(); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .workflow(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless creating a new experiment + if (context != null && !this.workflow.isEqual(context.getWorkflow())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; } - /** - * Retrieves the name of the workflow. This is used for logging display purposes. - * - * @return the name of the workflow - */ @Override - public String getName() { - return "CreateNewExperimentWorkflow"; + public int getOrder() { + return 1; } + } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java deleted file mode 100644 index c29fe9fd5..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/NewExperimentWorkflow.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.breedinginsight.brapps.importer.services.processors.experiment.create.workflow; - -import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; -import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; -import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; - -import javax.inject.Singleton; -import java.util.Optional; - -@Singleton -public class NewExperimentWorkflow implements ImportWorkflow { - private final ExperimentImportWorkflow.ImportAction action; - - public NewExperimentWorkflow(){ - this.action = ExperimentImportWorkflow.ImportAction.NEW_OBSERVATION; - } - - @Override - public Optional process(ImportServiceContext context) { - // Workflow processing the context - Action workflow = new Action(action.getUrlFragment(), this.getOrder()); - - // No-preview result - Optional result = Optional.of(ImportWorkflowResult.builder() - .action(workflow) - .importPreviewResponse(Optional.empty()) - .build()); - - // Skip this workflow unless creating a new experiment - if (context != null && !action.isEqual(context.getAction())) { - return Optional.empty(); - } - - // Skip processing if no context, but return no-preview result for this workflow - if (context == null) { - return result; - } - - // Start processing the import... - return result; - } - - @Override - public int getOrder() { - return 1; - } - - public ExperimentImportWorkflow.ImportAction getAction() { - return this.action; - } -} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java index 5776ab59b..fe0b90c1f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java @@ -1,50 +1,55 @@ -/* - * 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.newenv.workflow; -import io.micronaut.context.annotation.Prototype; -import org.breedinginsight.brapps.importer.model.workflow.ImportContext; -import org.breedinginsight.brapps.importer.model.workflow.ProcessedData; +import lombok.Getter; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +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.brapps.importer.services.processors.experiment.ExperimentWorkflow; -import javax.inject.Named; - -/** - * This class represents a workflow for adding new environments to an existing experiment. The bean name must match - * the appropriate bean column value in the import_mapping_workflow db table - */ +import javax.inject.Singleton; +import java.util.Optional; -@Prototype -@Named("CreateNewEnvironmentWorkflow") +@Getter +@Singleton public class CreateNewEnvironmentWorkflow implements Workflow { + private final ExperimentWorkflow.Workflow workflow; + + public CreateNewEnvironmentWorkflow(){ + this.workflow = ExperimentWorkflow.Workflow.APPEND_ENVIRONMENT; + } + @Override - public ProcessedData process(ImportContext context) { - // TODO - return null; + public Optional process(ImportServiceContext context) { + // Workflow processing the context + ImportWorkflow workflow = ImportWorkflow.builder() + .urlFragment(getWorkflow().getUrlFragment()) + .displayName(getWorkflow().getDisplayName()) + .build(); + + // No-preview result + Optional result = Optional.of(ImportWorkflowResult.builder() + .workflow(workflow) + .importPreviewResponse(Optional.empty()) + .build()); + + // Skip this workflow unless appending a new environment + if (context != null && !this.workflow.isEqual(context.getWorkflow())) { + return Optional.empty(); + } + + // Skip processing if no context, but return no-preview result for this workflow + if (context == null) { + return result; + } + + // Start processing the import... + return result; } - /** - * Retrieves the name of the workflow. This is used for logging display purposes. - * - * @return the name of the workflow - */ @Override - public String getName() { - return "CreateNewEnvironmentWorkflow"; + public int getOrder() { + return 3; } + } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java deleted file mode 100644 index 57ee9790e..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/NewEnvironmentWorkflow.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.breedinginsight.brapps.importer.services.processors.experiment.newenv.workflow; - -import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; -import org.breedinginsight.brapps.importer.model.workflow.Action; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; -import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentImportWorkflow; - -import javax.inject.Singleton; -import java.util.Optional; - -@Singleton -public class NewEnvironmentWorkflow implements ImportWorkflow { - private final ExperimentImportWorkflow.ImportAction action; - - public NewEnvironmentWorkflow(){ - this.action = ExperimentImportWorkflow.ImportAction.APPEND_ENVIRONMENT; - } - - @Override - public Optional process(ImportServiceContext context) { - // Workflow processing the context - Action workflow = new Action(action.getUrlFragment(), this.getOrder()); - - // No-preview result - Optional result = Optional.of(ImportWorkflowResult.builder() - .action(workflow) - .importPreviewResponse(Optional.empty()) - .build()); - - // Skip this workflow unless appending a new environment - if (context != null && !action.isEqual(context.getAction())) { - return Optional.empty(); - } - - // Skip processing if no context, but return no-preview result for this workflow - if (context == null) { - return result; - } - - // Start processing the import... - return result; - } - - @Override - public int getOrder() { - return 3; - } - - public ExperimentImportWorkflow.ImportAction getAction() { - return this.action; - } -} diff --git a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql b/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql deleted file mode 100644 index 2c9d4d547..000000000 --- a/src/main/resources/db/migration/V1.22.0__add_experiment_workflows.sql +++ /dev/null @@ -1,51 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - Table maps workflows to import mappings and provides required configuration options - - mapping_id - link to importer_mapping that this provides a workflow for - name - name that will be displayed on front end - bean - must match @Named("") annotation on Workflow class - position - for ordering records explicitly, wanted for front end default option and order - */ -CREATE TABLE importer_mapping_workflow -( - like base_entity INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES, - mapping_id UUID NOT NULL, - name TEXT NOT NULL, - bean TEXT NOT NULL, - position INTEGER NOT NULL -); - -ALTER TABLE importer_mapping_workflow - ADD FOREIGN KEY (mapping_id) REFERENCES importer_mapping (id); - -DO -$$ -DECLARE - exp_mapping_id UUID; -BEGIN - exp_mapping_id := (SELECT id FROM importer_mapping WHERE name = 'ExperimentsTemplateMap'); - -INSERT INTO public.importer_mapping_workflow (mapping_id, name, bean, position) -VALUES - (exp_mapping_id, 'Create new experiment', 'CreateNewExperimentWorkflow', 0), - (exp_mapping_id, 'Append experimental dataset', 'AppendOverwritePhenotypesWorkflow', 1), - (exp_mapping_id, 'Create new experimental environment', 'CreateNewEnvironmentWorkflow', 2); -END -$$; \ No newline at end of file From 708793dae1c11e78ece376f1a5fdd3813fcc821d Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Wed, 22 May 2024 20:38:09 -0400 Subject: [PATCH 16/25] add overrides to import services --- .../model/imports/germplasm/GermplasmImportService.java | 6 ++++++ .../model/imports/sample/SampleSubmissionImportService.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java index ce52f483f..3c3a65b4d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java @@ -23,6 +23,7 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.services.processors.GermplasmProcessor; import org.breedinginsight.brapps.importer.services.processors.Processor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; @@ -57,6 +58,11 @@ public GermplasmImport getImportClass() { return new GermplasmImport(); } + @Override + public List getWorkflows() { + return null; + } + @Override public String getImportTypeId() { return IMPORT_TYPE_ID; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java index 2c8e8b7b5..55848b0a1 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java @@ -23,6 +23,7 @@ import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.services.processors.Processor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; import org.breedinginsight.brapps.importer.services.processors.SampleSubmissionProcessor; @@ -59,6 +60,11 @@ public BrAPIImport getImportClass() { return new SampleSubmissionImport(); } + @Override + public List getWorkflows() { + return null; + } + @Override public ImportPreviewResponse process(ImportServiceContext context) throws Exception { List processors = List.of(sampleProcessorProvider.get()); From 68bdacb282b335af1874db9ede5ad421de4806ae Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Thu, 23 May 2024 06:33:16 -0400 Subject: [PATCH 17/25] create ExperimentWorkflow interface that extends Workflow interface --- .../ExperimentImportService.java | 12 ++++++------ .../importer/model/workflow/ExperimentWorkflow.java | 6 ++++++ .../brapps/importer/model/workflow/Workflow.java | 11 ----------- ...orkflow.java => ExperimentWorkflowNavigator.java} | 8 ++++---- .../workflow/AppendOverwritePhenotypesWorkflow.java | 10 +++++----- .../create/workflow/CreateNewExperimentWorkflow.java | 10 +++++----- .../workflow/CreateNewEnvironmentWorkflow.java | 10 +++++----- 7 files changed, 31 insertions(+), 36 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ExperimentWorkflow.java delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java rename src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/{ExperimentWorkflow.java => ExperimentWorkflowNavigator.java} (85%) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index df60e9782..c6d191bf0 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -24,7 +24,7 @@ import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; -import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; import javax.inject.Inject; import javax.inject.Provider; @@ -39,16 +39,16 @@ public class ExperimentImportService implements BrAPIImportService { private final Provider experimentProcessorProvider; private final Provider processorManagerProvider; - private final ExperimentWorkflow workflow; + private final ExperimentWorkflowNavigator workflowNavigator; @Inject public ExperimentImportService(Provider experimentProcessorProvider, Provider processorManagerProvider, - ExperimentWorkflow workflow) + ExperimentWorkflowNavigator workflowNavigator) { this.experimentProcessorProvider = experimentProcessorProvider; this.processorManagerProvider = processorManagerProvider; - this.workflow = workflow; + this.workflowNavigator = workflowNavigator; } @Override @@ -67,7 +67,7 @@ public String getMissingColumnMsg(String columnName) { } @Override public List getWorkflows() { - return workflow.getWorkflows(); + return workflowNavigator.getWorkflows(); } @Override @@ -78,7 +78,7 @@ public ImportPreviewResponse process(ImportServiceContext context) log.info("Workflow: " + context.getWorkflow()); } - return workflow.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); + return workflowNavigator.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ExperimentWorkflow.java new file mode 100644 index 000000000..c34794bab --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ExperimentWorkflow.java @@ -0,0 +1,6 @@ +package org.breedinginsight.brapps.importer.model.workflow; + +@FunctionalInterface +public interface ExperimentWorkflow extends Workflow { + +} 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 deleted file mode 100644 index 8bc19120e..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.breedinginsight.brapps.importer.model.workflow; - -import io.micronaut.core.order.Ordered; -import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; - -import java.util.Optional; - -@FunctionalInterface -public interface Workflow extends Ordered { - Optional process(ImportServiceContext context); -} diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java similarity index 85% rename from src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java rename to src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java index 04bbc4fc1..bcf12d543 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/ExperimentWorkflowNavigator.java @@ -3,7 +3,7 @@ import io.micronaut.context.annotation.Primary; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; -import org.breedinginsight.brapps.importer.model.workflow.Workflow; +import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflowResult; import javax.inject.Singleton; @@ -13,10 +13,10 @@ @Primary @Singleton -public class ExperimentWorkflow implements Workflow { - private final List workflows; +public class ExperimentWorkflowNavigator implements ExperimentWorkflow { + private final List workflows; - public ExperimentWorkflow(List workflows) { + public ExperimentWorkflowNavigator(List workflows) { this.workflows = workflows; } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java index 44fb575bf..e64a2f88a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java @@ -4,19 +4,19 @@ import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; 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.brapps.importer.services.processors.experiment.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; import javax.inject.Singleton; import java.util.Optional; @Getter @Singleton -public class AppendOverwritePhenotypesWorkflow implements Workflow { - private final ExperimentWorkflow.Workflow workflow; +public class AppendOverwritePhenotypesWorkflow implements ExperimentWorkflow { + private final ExperimentWorkflowNavigator.Workflow workflow; public AppendOverwritePhenotypesWorkflow(){ - this.workflow = ExperimentWorkflow.Workflow.APPEND_OVERWRITE; + this.workflow = ExperimentWorkflowNavigator.Workflow.APPEND_OVERWRITE; } @Override diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java index 3c593ac74..022727c5a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java @@ -4,19 +4,19 @@ import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; 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.brapps.importer.services.processors.experiment.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; import javax.inject.Singleton; import java.util.Optional; @Getter @Singleton -public class CreateNewExperimentWorkflow implements Workflow { - private final ExperimentWorkflow.Workflow workflow; +public class CreateNewExperimentWorkflow implements ExperimentWorkflow { + private final ExperimentWorkflowNavigator.Workflow workflow; public CreateNewExperimentWorkflow(){ - this.workflow = ExperimentWorkflow.Workflow.NEW_OBSERVATION; + this.workflow = ExperimentWorkflowNavigator.Workflow.NEW_OBSERVATION; } @Override diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java index fe0b90c1f..a5695e7f8 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java @@ -4,19 +4,19 @@ import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; 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.brapps.importer.services.processors.experiment.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.ExperimentWorkflow; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; import javax.inject.Singleton; import java.util.Optional; @Getter @Singleton -public class CreateNewEnvironmentWorkflow implements Workflow { - private final ExperimentWorkflow.Workflow workflow; +public class CreateNewEnvironmentWorkflow implements ExperimentWorkflow { + private final ExperimentWorkflowNavigator.Workflow workflow; public CreateNewEnvironmentWorkflow(){ - this.workflow = ExperimentWorkflow.Workflow.APPEND_ENVIRONMENT; + this.workflow = ExperimentWorkflowNavigator.Workflow.APPEND_ENVIRONMENT; } @Override From 0e022f12675712ad57574d4b7a27e2e5cac6700f Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Thu, 23 May 2024 06:48:39 -0400 Subject: [PATCH 18/25] create interfaces for germplasm and sample workflows --- .../model/workflow/ImportMappingWorkflow.java | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java deleted file mode 100644 index 8dc5800bc..000000000 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportMappingWorkflow.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.breedinginsight.brapps.importer.model.workflow; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import lombok.experimental.Accessors; -import lombok.experimental.SuperBuilder; - -import org.breedinginsight.dao.db.tables.pojos.ImporterMappingWorkflowEntity; -import org.jooq.Record; - -import static org.breedinginsight.dao.db.tables.ImporterMappingWorkflowTable.IMPORTER_MAPPING_WORKFLOW; - -@Getter -@Setter -@Accessors(chain=true) -@ToString -@NoArgsConstructor -@SuperBuilder() -public class ImportMappingWorkflow extends ImporterMappingWorkflowEntity { - - - public ImportMappingWorkflow(ImporterMappingWorkflowEntity importMappingWorkflowEntity) { - this.setId(importMappingWorkflowEntity.getId()); - this.setName(importMappingWorkflowEntity.getName()); - this.setBean(importMappingWorkflowEntity.getBean()); - this.setPosition(importMappingWorkflowEntity.getPosition()); - } - public static ImportMappingWorkflow parseSQLRecord(Record record) { - - return ImportMappingWorkflow.builder() - .id(record.getValue(IMPORTER_MAPPING_WORKFLOW.ID)) - .name(record.getValue(IMPORTER_MAPPING_WORKFLOW.NAME)) - .bean(record.getValue(IMPORTER_MAPPING_WORKFLOW.BEAN)) - .position(record.getValue(IMPORTER_MAPPING_WORKFLOW.POSITION)) - .build(); - } -} From f2a1034abf7ab01abf784255e4dd09f60c7c77b0 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Thu, 23 May 2024 08:14:51 -0400 Subject: [PATCH 19/25] create interfaces --- .../importer/model/workflow/GermplasmWorkflow.java | 6 ++++++ .../model/workflow/SampleSubmissionWorkflow.java | 6 ++++++ .../brapps/importer/model/workflow/Workflow.java | 11 +++++++++++ 3 files changed, 23 insertions(+) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/GermplasmWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/SampleSubmissionWorkflow.java create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/GermplasmWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/GermplasmWorkflow.java new file mode 100644 index 000000000..f26342d3b --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/GermplasmWorkflow.java @@ -0,0 +1,6 @@ +package org.breedinginsight.brapps.importer.model.workflow; + +@FunctionalInterface +public interface GermplasmWorkflow extends Workflow { + +} diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/SampleSubmissionWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/SampleSubmissionWorkflow.java new file mode 100644 index 000000000..19be9bdcc --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/SampleSubmissionWorkflow.java @@ -0,0 +1,6 @@ +package org.breedinginsight.brapps.importer.model.workflow; + +@FunctionalInterface +public interface SampleSubmissionWorkflow extends Workflow { + +} 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 new file mode 100644 index 000000000..8bc19120e --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/Workflow.java @@ -0,0 +1,11 @@ +package org.breedinginsight.brapps.importer.model.workflow; + +import io.micronaut.core.order.Ordered; +import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; + +import java.util.Optional; + +@FunctionalInterface +public interface Workflow extends Ordered { + Optional process(ImportServiceContext context); +} From 402eb5de2dd58f1fa8076db344a88e150a5ed390 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 31 May 2024 10:40:55 -0400 Subject: [PATCH 20/25] create DomainImportService abstract class --- .../model/imports/DomainImportService.java | 72 +++++++++++++++++++ .../ExperimentImportService.java | 32 +++------ .../importer/model/workflow/Workflow.java | 6 ++ 3 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java 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 new file mode 100644 index 000000000..5f89de64a --- /dev/null +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/DomainImportService.java @@ -0,0 +1,72 @@ +/* + * 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.model.imports; + +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; +import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; +import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; +import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; +import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; +import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; +import java.util.List; + +@Singleton +@Slf4j +public abstract class DomainImportService implements BrAPIImportService { + + private final Provider experimentProcessorProvider; + private final Provider processorManagerProvider; + private final Workflow workflowNavigator; + + @Inject + public DomainImportService(Provider experimentProcessorProvider, + Provider processorManagerProvider) + { + this.experimentProcessorProvider = experimentProcessorProvider; + this.processorManagerProvider = processorManagerProvider; + this.workflowNavigator = getNavigator(); + } + + protected abstract Workflow getNavigator(); + @Override + public String getMissingColumnMsg(String columnName) { + return "Column heading does not match template or ontology"; + } + @Override + public List getWorkflows() { + return workflowNavigator.getWorkflows(); + } + + @Override + public ImportPreviewResponse process(ImportServiceContext context) + throws Exception { + + if (!context.getWorkflow().isEmpty()) { + log.info("Workflow: " + context.getWorkflow()); + } + + return workflowNavigator.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); + } +} + diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index c6d191bf0..60fe4bb3b 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -19,9 +19,11 @@ import lombok.extern.slf4j.Slf4j; import org.breedinginsight.brapps.importer.model.imports.BrAPIImportService; +import org.breedinginsight.brapps.importer.model.imports.DomainImportService; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; import org.breedinginsight.brapps.importer.model.workflow.ImportWorkflow; +import org.breedinginsight.brapps.importer.model.workflow.Workflow; import org.breedinginsight.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; import org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentWorkflowNavigator; @@ -33,12 +35,9 @@ @Singleton @Slf4j -public class ExperimentImportService implements BrAPIImportService { +public class ExperimentImportService extends DomainImportService { private final String IMPORT_TYPE_ID = "ExperimentImport"; - - private final Provider experimentProcessorProvider; - private final Provider processorManagerProvider; private final ExperimentWorkflowNavigator workflowNavigator; @Inject @@ -46,10 +45,13 @@ public ExperimentImportService(Provider experimentProcessor Provider processorManagerProvider, ExperimentWorkflowNavigator workflowNavigator) { - this.experimentProcessorProvider = experimentProcessorProvider; - this.processorManagerProvider = processorManagerProvider; + super(experimentProcessorProvider, processorManagerProvider); this.workflowNavigator = workflowNavigator; } + @Override + public Workflow getNavigator() { + return this.workflowNavigator; + } @Override public ExperimentObservation getImportClass() { @@ -61,24 +63,6 @@ public String getImportTypeId() { return IMPORT_TYPE_ID; } - @Override - public String getMissingColumnMsg(String columnName) { - return "Column heading does not match template or ontology"; - } - @Override - public List getWorkflows() { - return workflowNavigator.getWorkflows(); - } - - @Override - public ImportPreviewResponse process(ImportServiceContext context) - throws Exception { - if (!context.getWorkflow().isEmpty()) { - log.info("Workflow: " + context.getWorkflow()); - } - - return workflowNavigator.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); - } } 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 8bc19120e..17f48ee57 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 @@ -3,9 +3,15 @@ import io.micronaut.core.order.Ordered; import org.breedinginsight.brapps.importer.model.imports.ImportServiceContext; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; @FunctionalInterface public interface Workflow extends Ordered { Optional process(ImportServiceContext context); + default List getWorkflows() { + // Default implementation for getWorkflows method + return new ArrayList<>(); + } } From bce2c7fbcce36ee87698257b521b9f87ffd2aa95 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:11:36 -0400 Subject: [PATCH 21/25] change Workflow field names --- .../model/workflow/ImportWorkflow.java | 4 ++-- .../ExperimentWorkflowNavigator.java | 18 +++++++++--------- .../AppendOverwritePhenotypesWorkflow.java | 4 ++-- .../workflow/CreateNewExperimentWorkflow.java | 4 ++-- .../workflow/CreateNewEnvironmentWorkflow.java | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java index b26a886bd..30dbac06a 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/workflow/ImportWorkflow.java @@ -25,7 +25,7 @@ @ToString @AllArgsConstructor public class ImportWorkflow { - private String urlFragment; - private String displayName; + private String id; + private String name; private int order; } 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 bcf12d543..b43b859f5 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 @@ -42,22 +42,22 @@ public enum Workflow { APPEND_OVERWRITE("append-dataset", "Append experimental dataset"), APPEND_ENVIRONMENT("append-environment", "Create new experimental environment"); - private String urlFragment; - private String displayName; + private String id; + private String name; - Workflow(String urlFragment, String displayName) { + Workflow(String id, String name) { - this.urlFragment = urlFragment; - this.displayName = displayName; + this.id = id; + this.name = name; } - public String getUrlFragment() { - return urlFragment; + public String getId() { + return id; } - public String getDisplayName() { return displayName; } + public String getName() { return name; } public boolean isEqual(String value) { - return Optional.ofNullable(urlFragment.equals(value)).orElse(false); + return Optional.ofNullable(id.equals(value)).orElse(false); } } } diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java index e64a2f88a..6ff074059 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/append/workflow/AppendOverwritePhenotypesWorkflow.java @@ -23,8 +23,8 @@ public AppendOverwritePhenotypesWorkflow(){ public Optional process(ImportServiceContext context) { // Workflow processing the context ImportWorkflow workflow = ImportWorkflow.builder() - .urlFragment(getWorkflow().getUrlFragment()) - .displayName(getWorkflow().getDisplayName()) + .id(getWorkflow().getId()) + .name(getWorkflow().getName()) .build(); // No-preview result diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java index 022727c5a..503e4e5f0 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/CreateNewExperimentWorkflow.java @@ -23,8 +23,8 @@ public CreateNewExperimentWorkflow(){ public Optional process(ImportServiceContext context) { // Workflow processing the context ImportWorkflow workflow = ImportWorkflow.builder() - .urlFragment(getWorkflow().getUrlFragment()) - .displayName(getWorkflow().getDisplayName()) + .id(getWorkflow().getId()) + .name(getWorkflow().getName()) .build(); // No-preview result diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java index a5695e7f8..1b7eba9ce 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/newenv/workflow/CreateNewEnvironmentWorkflow.java @@ -23,8 +23,8 @@ public CreateNewEnvironmentWorkflow(){ public Optional process(ImportServiceContext context) { // Workflow processing the context ImportWorkflow workflow = ImportWorkflow.builder() - .urlFragment(getWorkflow().getUrlFragment()) - .displayName(getWorkflow().getDisplayName()) + .id(getWorkflow().getId()) + .name(getWorkflow().getName()) .build(); // No-preview result From 6060fcc990177a9c7e779af2cc66a07937cf33e4 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:29:14 -0400 Subject: [PATCH 22/25] use processorManager until Workflow business logic in place --- .../importer/model/imports/DomainImportService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 5f89de64a..d826033fb 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 @@ -21,6 +21,7 @@ import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.brapps.importer.model.response.ImportPreviewResponse; 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.brapps.importer.services.processors.ExperimentProcessor; import org.breedinginsight.brapps.importer.services.processors.ProcessorManager; @@ -35,6 +36,7 @@ @Slf4j public abstract class DomainImportService implements BrAPIImportService { + // TODO: delete processor fields once WorkflowNavigator is used private final Provider experimentProcessorProvider; private final Provider processorManagerProvider; private final Workflow workflowNavigator; @@ -66,7 +68,15 @@ public ImportPreviewResponse process(ImportServiceContext context) log.info("Workflow: " + context.getWorkflow()); } - return workflowNavigator.process(context).flatMap(r->r.getImportPreviewResponse()).orElse(null); + // TODO: return results from WorkflowNavigator once processing logic is in separate workflows + // return workflowNavigator.process(context).flatMap(ImportWorkflowResult::getImportPreviewResponse).orElse(null); + return processorManagerProvider.get().process(context.getBrAPIImports(), + List.of(experimentProcessorProvider.get()), + context.getData(), + context.getProgram(), + context.getUpload(), + context.getUser(), + context.isCommit()); } } From 90f478becd85cd15db0d47a989ee399fb38d2256 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:29:33 -0400 Subject: [PATCH 23/25] fix workflow navigator injection --- .../importer/model/imports/DomainImportService.java | 8 ++++---- .../experimentObservation/ExperimentImportService.java | 9 ++------- .../model/imports/germplasm/GermplasmImportService.java | 3 ++- .../imports/sample/SampleSubmissionImportService.java | 3 ++- 4 files changed, 10 insertions(+), 13 deletions(-) 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 d826033fb..13719e18d 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 @@ -41,16 +41,16 @@ public abstract class DomainImportService implements BrAPIImportService { private final Provider processorManagerProvider; private final Workflow workflowNavigator; - @Inject + public DomainImportService(Provider experimentProcessorProvider, - Provider processorManagerProvider) + Provider processorManagerProvider, + Workflow workflowNavigator) { this.experimentProcessorProvider = experimentProcessorProvider; this.processorManagerProvider = processorManagerProvider; - this.workflowNavigator = getNavigator(); + this.workflowNavigator = workflowNavigator; } - protected abstract Workflow getNavigator(); @Override public String getMissingColumnMsg(String columnName) { return "Column heading does not match template or ontology"; diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java index 60fe4bb3b..793506c73 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/experimentObservation/ExperimentImportService.java @@ -38,19 +38,14 @@ public class ExperimentImportService extends DomainImportService { private final String IMPORT_TYPE_ID = "ExperimentImport"; - private final ExperimentWorkflowNavigator workflowNavigator; + // TODO: delete processor fields once WorkflowNavigator is used @Inject public ExperimentImportService(Provider experimentProcessorProvider, Provider processorManagerProvider, ExperimentWorkflowNavigator workflowNavigator) { - super(experimentProcessorProvider, processorManagerProvider); - this.workflowNavigator = workflowNavigator; - } - @Override - public Workflow getNavigator() { - return this.workflowNavigator; + super(experimentProcessorProvider, processorManagerProvider, workflowNavigator); } @Override diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java index 3c3a65b4d..0caebe65e 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/germplasm/GermplasmImportService.java @@ -34,6 +34,7 @@ import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; @Singleton @@ -60,7 +61,7 @@ public GermplasmImport getImportClass() { @Override public List getWorkflows() { - return null; + return new ArrayList<>(); } @Override diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java index 55848b0a1..eb7328ecf 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/imports/sample/SampleSubmissionImportService.java @@ -34,6 +34,7 @@ import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; @Singleton @@ -62,7 +63,7 @@ public BrAPIImport getImportClass() { @Override public List getWorkflows() { - return null; + return new ArrayList<>(); } @Override From 62cf9ac438684991bb48358ca46eea1418a280eb Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jun 2024 17:07:33 -0400 Subject: [PATCH 24/25] set the order field for workflows --- .../experiment/ExperimentWorkflowNavigator.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 b43b859f5..63bfcedbd 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 @@ -29,12 +29,21 @@ public Optional process(ImportServiceContext context) { .findFirst(); } public List getWorkflows() { - return workflows.stream() + // Each workflow returns in the field workflow the metadata about the workflow that processed the import context. + // Loop over all workflows, processing a null context, to collect just the metadata + List workflowSummaryList = workflows.stream() .map(workflow->workflow.process(null)) .filter(Optional::isPresent) .map(Optional::get) .map(result->result.getWorkflow()) .collect(Collectors.toList()); + + // The order field for each workflow is set to the order in the list + for (int i = 0; i < workflowSummaryList.size(); i++) { + workflowSummaryList.get(i).setOrder(i); + } + + return workflowSummaryList; } public enum Workflow { From 57f5cfbfc10f937e1099fd5a017997a7102db78f Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Mon, 10 Jun 2024 17:43:08 -0400 Subject: [PATCH 25/25] fix npe --- .../brapps/importer/model/imports/DomainImportService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 13719e18d..af65af238 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 @@ -64,7 +64,7 @@ public List getWorkflows() { public ImportPreviewResponse process(ImportServiceContext context) throws Exception { - if (!context.getWorkflow().isEmpty()) { + if (context.getWorkflow() != null && !context.getWorkflow().isEmpty()) { log.info("Workflow: " + context.getWorkflow()); }