diff --git a/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstanceController.java b/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstanceController.java index 809497223..097d2709c 100644 --- a/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstanceController.java +++ b/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstanceController.java @@ -11,6 +11,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; +import java.util.function.Function; import org.adempiere.ad.dao.IQueryBL; import org.adempiere.ad.dao.IQueryFilter; @@ -58,10 +59,12 @@ import de.metas.ui.web.window.datatypes.json.JSONDocumentChangedEvent; import de.metas.ui.web.window.model.Document; import de.metas.ui.web.window.model.Document.CopyMode; +import de.metas.ui.web.window.model.DocumentCollection; import de.metas.ui.web.window.model.DocumentSaveStatus; import de.metas.ui.web.window.model.IDocumentChangesCollector; import de.metas.ui.web.window.model.IDocumentChangesCollector.ReasonSupplier; import de.metas.ui.web.window.model.IDocumentFieldView; +import de.metas.ui.web.window.model.NullDocumentChangesCollector; /* * #%L @@ -109,6 +112,8 @@ public static final Builder builder() private final IViewsRepository viewsRepo; private final ViewId viewId; private final DocumentIdsSelection viewSelectedDocumentIds; + + private final DocumentPath contextSingleDocumentPath; private boolean executed = false; private ProcessInstanceResult executionResult; @@ -126,6 +131,8 @@ private ADProcessInstanceController(final Builder builder) viewsRepo = builder.viewsRepo; viewId = builder.viewId; viewSelectedDocumentIds = builder.viewSelectedDocumentIds == null ? DocumentIdsSelection.EMPTY : builder.viewSelectedDocumentIds; + + contextSingleDocumentPath = builder.contextSingleDocumentPath; executed = false; executionResult = null; @@ -147,6 +154,8 @@ private ADProcessInstanceController(final ADProcessInstanceController from, fina viewsRepo = from.viewsRepo; viewId = from.viewId; viewSelectedDocumentIds = from.viewSelectedDocumentIds; + + contextSingleDocumentPath = from.contextSingleDocumentPath; executed = from.executed; executionResult = from.executionResult; @@ -192,6 +201,19 @@ public ADProcessInstanceController copy(final CopyMode copyMode, final IDocument { return new ADProcessInstanceController(this, copyMode, changesCollector); } + + public ADProcessInstanceController bindContextSingleDocument(final DocumentCollection documentsCollection) + { + if(contextSingleDocumentPath == null) + { + return this; + } + + final Document contextSingleDocument = documentsCollection.forDocumentReadonly(contextSingleDocumentPath, NullDocumentChangesCollector.instance, Function.identity()); + getParametersDocument().setShadowParentDocumentEvaluatee(contextSingleDocument.asEvaluatee()); + + return this; + } public IAutoCloseable activate() { @@ -263,7 +285,7 @@ public ProcessInstanceResult startProcess(final IViewsRepository viewsRepo) return executionResult; } - private static final ProcessInstanceResult executeADProcess(final DocumentId adPInstanceId, final ProcessDescriptor processDescriptor, IViewsRepository viewsRepo) + private static final ProcessInstanceResult executeADProcess(final DocumentId adPInstanceId, final ProcessDescriptor processDescriptor, final IViewsRepository viewsRepo) { // // Create the process info and execute the process synchronously @@ -551,7 +573,11 @@ public static class Builder private IViewsRepository viewsRepo; private ViewId viewId; private DocumentIdsSelection viewSelectedDocumentIds; + private Object processClassInstance; + + private DocumentPath contextSingleDocumentPath; + private Builder() { @@ -594,11 +620,17 @@ public Builder setView(final ViewId viewId, final DocumentIdsSelection selectedD return this; } - public Builder setProcessClassInstance(Object processClassInstance) + public Builder setProcessClassInstance(final Object processClassInstance) { this.processClassInstance = processClassInstance; return this; } + + public Builder setContextSingleDocumentPath(final DocumentPath contextSingleDocumentPath) + { + this.contextSingleDocumentPath = contextSingleDocumentPath; + return this; + } } } diff --git a/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstancesRepository.java b/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstancesRepository.java index 755f972c5..888d530fc 100644 --- a/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstancesRepository.java +++ b/src/main/java/de/metas/ui/web/process/adprocess/ADProcessInstancesRepository.java @@ -185,6 +185,7 @@ private IProcessInstanceController createNewProcessInstance0( .setViewsRepo(viewsRepo) .setView(request.getViewId(), request.getViewDocumentIds()) .setProcessClassInstance(processClassInstance) + .setContextSingleDocumentPath(request.getSingleDocumentPath()) .build(); processInstances.put(adPInstanceId, pinstance.copy(CopyMode.CheckInReadonly, NullDocumentChangesCollector.instance)); return pinstance; @@ -212,7 +213,7 @@ private ProcessInfo createProcessInfo(@NonNull final CreateProcessInstanceReques { final DocumentId viewSingleDocumentId = viewDocumentIds.getSingleDocumentId(); final TableRecordReference recordRef = view.getTableRecordReferenceOrNull(viewSingleDocumentId); - if(recordRef != null) + if (recordRef != null) { tableName = recordRef.getTableName(); recordId = recordRef.getRecord_ID(); @@ -230,7 +231,7 @@ private ProcessInfo createProcessInfo(@NonNull final CreateProcessInstanceReques } // - if(viewDocumentIds.isEmpty()) + if (viewDocumentIds.isEmpty()) { sqlWhereClause = null; } @@ -343,7 +344,8 @@ public R forProcessInstanceReadonly(final DocumentId pinstanceId, final Func { try (final IAutoCloseable readLock = getOrLoad(pinstanceId).lockForReading()) { - final ADProcessInstanceController processInstance = getOrLoad(pinstanceId); + final ADProcessInstanceController processInstance = getOrLoad(pinstanceId).copy(CopyMode.CheckInReadonly, NullDocumentChangesCollector.instance) + .bindContextSingleDocument(documentsCollection); try (final IAutoCloseable c = processInstance.activate()) { return processor.apply(processInstance); @@ -368,7 +370,8 @@ public R forProcessInstanceWritable(final DocumentId pinstanceId, final IDoc { try (final IAutoCloseable writeLock = getOrLoad(pinstanceId).lockForWriting()) { - final ADProcessInstanceController processInstance = getOrLoad(pinstanceId).copy(CopyMode.CheckOutWritable, changesCollector); + final ADProcessInstanceController processInstance = getOrLoad(pinstanceId).copy(CopyMode.CheckOutWritable, changesCollector) + .bindContextSingleDocument(documentsCollection); // Make sure the process was not already executed. // If it was executed we are not allowed to change it.