Skip to content

Commit

Permalink
MAJOR: process: use context single document to to resolve lookup cont…
Browse files Browse the repository at this point in the history
…ext values

i.e. when resolving context variables if not found we shall fallback to
context document

#142
  • Loading branch information
teosarca committed Sep 14, 2017
1 parent 38a6de2 commit 7430de4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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()
{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
{
Expand Down Expand Up @@ -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;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -230,7 +231,7 @@ private ProcessInfo createProcessInfo(@NonNull final CreateProcessInstanceReques
}

//
if(viewDocumentIds.isEmpty())
if (viewDocumentIds.isEmpty())
{
sqlWhereClause = null;
}
Expand Down Expand Up @@ -343,7 +344,8 @@ public <R> 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);
Expand All @@ -368,7 +370,8 @@ public <R> 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.
Expand Down

0 comments on commit 7430de4

Please sign in to comment.