diff --git a/api/src/org/labkey/api/query/AbstractQueryImportAction.java b/api/src/org/labkey/api/query/AbstractQueryImportAction.java index d79e2088c89..51ecac86358 100644 --- a/api/src/org/labkey/api/query/AbstractQueryImportAction.java +++ b/api/src/org/labkey/api/query/AbstractQueryImportAction.java @@ -69,6 +69,7 @@ import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.api.webdav.WebdavResource; import org.labkey.api.webdav.WebdavService; +import org.labkey.api.workflow.WorkflowService; import org.labkey.vfs.FileLike; import org.springframework.validation.BindException; import org.springframework.web.multipart.MultipartFile; @@ -609,6 +610,11 @@ else if (!dataFileDir.exists()) .setAllowLineageColumns(allowLineageColumns()) .setJobDescription(getQueryImportDescription()) .setJobNotificationProvider(getQueryImportJobNotificationProviderName()); + if (WorkflowService.get() != null) + { + Map workflowParams = WorkflowService.get().getConfigParameters(getViewContext().getRequest()); + importContextBuilder.setWorkflowParams(workflowParams); + } importContextBuilder.setTransactionDetails(transactionDetails); QueryImportPipelineJob job = new QueryImportPipelineJob(getQueryImportProviderName(), info, root, importContextBuilder); diff --git a/api/src/org/labkey/api/query/QueryImportPipelineJob.java b/api/src/org/labkey/api/query/QueryImportPipelineJob.java index 28295ba5041..c40ca372464 100644 --- a/api/src/org/labkey/api/query/QueryImportPipelineJob.java +++ b/api/src/org/labkey/api/query/QueryImportPipelineJob.java @@ -16,6 +16,7 @@ import org.labkey.api.reader.DataLoader; import org.labkey.api.util.URLHelper; import org.labkey.api.view.ViewBackgroundInfo; +import org.labkey.api.workflow.WorkflowService; import org.labkey.vfs.FileLike; import java.util.HashMap; @@ -62,6 +63,7 @@ public static class QueryImportAsyncContextBuilder boolean _allowLineageColumns = false; Map _optionParamsMap = new HashMap<>(); LookupResolutionType _lookupResolutionType = null; + Map _workflowParams = null; String _jobDescription; @@ -212,6 +214,17 @@ public QueryImportAsyncContextBuilder setOptionParamsMap(Map workflowParams) + { + _workflowParams = workflowParams; + return this; + } + + public Map getWorkflowParams() + { + return _workflowParams; + } + public LookupResolutionType getLookupResolutionType() { return _lookupResolutionType; @@ -311,6 +324,10 @@ public void run() DataIteratorContext diContext = createDataIteratorContext(ve, getContainer()); + if (_importContextBuilder.getWorkflowParams() != null && WorkflowService.get() != null) + { + WorkflowService.get().populateConfigParams(_importContextBuilder.getWorkflowParams(), diContext.getConfigParameters()); + } TransactionAuditProvider.TransactionAuditEvent auditEvent = null; if (diContext.isCrossTypeImport() || (_importContextBuilder.getAuditBehaviorType() != null && _importContextBuilder.getAuditBehaviorType() != AuditBehaviorType.NONE)) auditEvent = createTransactionAuditEvent(getContainer(), diContext.getInsertOption().auditAction, _importContextBuilder.getTransactionDetails()); diff --git a/api/src/org/labkey/api/workflow/WorkflowService.java b/api/src/org/labkey/api/workflow/WorkflowService.java index 55e22cb6602..2f0f710e585 100644 --- a/api/src/org/labkey/api/workflow/WorkflowService.java +++ b/api/src/org/labkey/api/workflow/WorkflowService.java @@ -1,13 +1,29 @@ package org.labkey.api.workflow; +import jakarta.servlet.http.HttpServletRequest; import org.jetbrains.annotations.NotNull; -import org.labkey.api.data.Container;import org.labkey.api.security.User;import org.labkey.api.services.ServiceRegistry; +import org.labkey.api.data.Container; +import org.labkey.api.dataiterator.DataIteratorBuilder; +import org.labkey.api.query.ValidationException; +import org.labkey.api.security.User; +import org.labkey.api.services.ServiceRegistry; + +import java.util.Map; public interface WorkflowService { + enum WorkflowConfigs + { + ActionId, + JobId, + } + enum ActionType { - AssayImport("assay types", "Imported assay data"); + AssayImport("assay types", "Imported assay data"), + DeriveSamples("derivation sample type parameters", "Derived samples"), + AliquotSamples("aliquot sample type parameters", "Aliquot samples"), + PoolSamples("pooling sample type parameters", "Pooled samples"); private final String _inputDescription; private final String _auditMessage; @@ -39,6 +55,14 @@ static WorkflowService get() return ServiceRegistry.get().getService(WorkflowService.class); } + void populateConfigParams(Map provided, Map configParameters) throws ValidationException; + + void populateConfigParams(HttpServletRequest request, Map configParameters) throws ValidationException; + Map getConfigParameters(HttpServletRequest request) throws ValidationException; void onActionComplete(@NotNull Container container, @NotNull User user, @NotNull Long actionId); void onActionComplete(@NotNull Container container, @NotNull User user, @NotNull Long taskId, @NotNull ActionType actionType); + + DataIteratorBuilder getSampleCreationDataIteratorBuilder(DataIteratorBuilder data, Container container, User user); + + DataIteratorBuilder getActionAuditDataIteratorBuilder(DataIteratorBuilder data, Container container, User user); } diff --git a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java index fc931100cb3..8d0e8fac75c 100644 --- a/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java +++ b/experiment/src/org/labkey/experiment/api/SampleTypeUpdateServiceDI.java @@ -108,6 +108,7 @@ import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.UnauthorizedException; +import org.labkey.api.workflow.WorkflowService; import org.labkey.experiment.ExpDataIterators; import org.labkey.experiment.SampleTypeAuditProvider; @@ -416,6 +417,15 @@ public DataIteratorBuilder createImportDIB(User user, Container container, DataI if (sampleType.getAutoLinkTargetContainer() != null && StudyPublishService.get() != null && !context.getInsertOption().updateOnly/* TODO support link to study on update? */) dib = LoggingDataIterator.wrap(new ExpDataIterators.AutoLinkToStudyDataIteratorBuilder(dib, getSchema(), userSchema.getContainer(), userSchema.getUser(), sampleType)); + WorkflowService workService = WorkflowService.get(); + if (workService != null) + { + if (context.getConfigParameter(WorkflowService.WorkflowConfigs.ActionId) != null) + { + dib = workService.getSampleCreationDataIteratorBuilder(dib, userSchema.getContainer(), userSchema.getUser()); + dib = workService.getActionAuditDataIteratorBuilder(dib, userSchema.getContainer(), userSchema.getUser()); + } + } } return dib; } diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index ade152c4c0f..64c09400e43 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -178,6 +178,7 @@ import org.labkey.api.query.SchemaKey; import org.labkey.api.query.UserSchema; import org.labkey.api.query.UserSchemaAction; +import org.labkey.api.query.ValidationException; import org.labkey.api.reader.ColumnDescriptor; import org.labkey.api.reader.DataLoader; import org.labkey.api.reader.DataLoaderFactory; @@ -252,6 +253,7 @@ import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.ClientDependency; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.workflow.WorkflowService; import org.labkey.experiment.ChooseExperimentTypeBean; import org.labkey.experiment.ConfirmDeleteView; import org.labkey.experiment.CustomPropertiesView; @@ -4448,6 +4450,17 @@ protected int importData( tInfo = ExperimentService.get().createMaterialTable(new SamplesSchema(getUser(), getContainer()), ContainerFilter.current(this), null); updateService = tInfo.getUpdateService(); } + if (WorkflowService.get() != null) + { + try + { + WorkflowService.get().populateConfigParams(getViewContext().getRequest(), _context.getConfigParameters()); + } + catch (ValidationException e) + { + errors.addRowError(e); + } + } int count = importData(dl, tInfo, updateService, _context, auditEvent, getUser(), getContainer()); diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index ecec0cbb7d6..5c9c92f86aa 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -267,6 +267,7 @@ import org.labkey.api.view.ViewServlet; import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.workflow.WorkflowService; import org.labkey.api.writer.HtmlWriter; import org.labkey.api.writer.ZipFile; import org.labkey.data.xml.ColumnType; @@ -4659,11 +4660,13 @@ protected JSONObject executeJson(JSONObject json, CommandType commandType, boole } } - Map extraContext = json.has("extraContext") ? json.getJSONObject("extraContext").toMap() : new CaseInsensitiveHashMap<>(); + Map extraContext = json.has("extraContext") ? new CaseInsensitiveHashMap<>(json.getJSONObject("extraContext").toMap()) : new CaseInsensitiveHashMap<>(); Map auditDetails = json.has("auditDetails") ? json.getJSONObject("auditDetails").toMap() : new CaseInsensitiveHashMap<>(); Map configParameters = new HashMap<>(); + if (WorkflowService.get() != null) + WorkflowService.get().populateConfigParams(extraContext, configParameters); // Check first if the audit behavior has been defined for the table either in code or through XML. // If not defined there, check for the audit behavior defined in the action form (json).