Skip to content

Commit 986f496

Browse files
Ticket #106 : Finish to pass tokens in the case management
1 parent 3335b81 commit 986f496

28 files changed

Lines changed: 766 additions & 244 deletions

src/CaseManagement.CMMN.Persistence.EF/DomainMapping/CasePlanInstanceMapper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ public static CasePlanInstanceAggregate ToDomain(this CasePlanInstanceModel reco
2727
Roles = record.Roles.Select(_ => ToCasePlanInstanceRoleDomain(_)).ToList(),
2828
Files = new ConcurrentBag<CasePlanInstanceFileItem>(record.Files.Select(_ => ToDomain(_)).ToList()),
2929
WorkerTasks = new ConcurrentBag<CasePlanInstanceWorkerTask>(record.WorkerTasks.Select(_ => ToDomain(_)).ToArray()),
30-
Children = new ConcurrentBag<BaseCaseEltInstance>(record.Children.Where(_ => _.ParentId == null).Select(c => c.ToElementInstance()).ToList()),
30+
Children = new ConcurrentBag<BaseCaseEltDef>(record.Children.Where(_ => _.ParentId == null).Select(c => c.ToElementInstance()).ToList()),
3131
CreateDateTime = record.CreateDateTime,
3232
UpdateDateTime = record.UpdateDateTime
3333
};
3434
}
3535

36-
public static BaseCaseEltInstance ToElementInstance(this CasePlanElementInstanceModel model)
36+
public static BaseCaseEltDef ToElementInstance(this CasePlanElementInstanceModel model)
3737
{
3838
var type = (CasePlanElementInstanceTypes)model.Type;
3939
switch(type)
@@ -138,7 +138,7 @@ public static CasePlanElementInstanceModel ToModel(this StageElementInstance sta
138138
};
139139
}
140140

141-
public static CasePlanElementInstanceModel ToModel(this BaseCaseEltInstance casePlanElementInstance, string casePlanInstanceId)
141+
public static CasePlanElementInstanceModel ToModel(this BaseCaseEltDef casePlanElementInstance, string casePlanInstanceId)
142142
{
143143
var stage = casePlanElementInstance as StageElementInstance;
144144
if (stage != null)

src/CaseManagement.CMMN/CasePlanInstance/CasePlanInstanceEventHandler.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public class CasePlanInstanceEventHandler : IDomainEvtConsumerGeneric<CasePlanIn
1515
IDomainEvtConsumerGeneric<CaseFileItemAddedEvent>,
1616
IDomainEvtConsumerGeneric<CaseInstanceWorkerTaskRemovedEvent>,
1717
IDomainEvtConsumerGeneric<VariableUpdatedEvent>,
18-
IDomainEvtConsumerGeneric<CasePlanItemInstanceCreatedEvent>
18+
IDomainEvtConsumerGeneric<CasePlanItemInstanceCreatedEvent>,
19+
IDomainEvtConsumerGeneric<OnPartEvtConsumedEvent>
1920
{
2021
private readonly ICasePlanInstanceCommandRepository _casePlanInstanceCommandRepository;
2122
private readonly ICasePlanInstanceQueryRepository _casePlanInstanceQueryRepository;
@@ -96,5 +97,13 @@ public async Task Handle(CasePlanItemInstanceCreatedEvent message, CancellationT
9697
await _casePlanInstanceCommandRepository.Update(record, token);
9798
await _casePlanInstanceCommandRepository.SaveChanges(token);
9899
}
100+
101+
public async Task Handle(OnPartEvtConsumedEvent message, CancellationToken token)
102+
{
103+
var record = await _casePlanInstanceQueryRepository.Get(message.AggregateId, token);
104+
record.Handle(message);
105+
await _casePlanInstanceCommandRepository.Update(record, token);
106+
await _casePlanInstanceCommandRepository.SaveChanges(token);
107+
}
99108
}
100109
}

src/CaseManagement.CMMN/CasePlanInstance/Processors/BaseCaseEltInstanceProcessor.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ public BaseCaseEltInstanceProcessor(ISubscriberRepository subscriberRepository)
1616

1717
public async Task<ExecutionResult> Execute(CMMNExecutionContext executionContext, TElt elt, CancellationToken cancellationToken)
1818
{
19-
if (elt.LatestTransition == null)
20-
{
21-
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Create);
22-
}
23-
2419
await Handle(executionContext, elt, cancellationToken);
2520
return ExecutionResult.Next();
2621
}

src/CaseManagement.CMMN/CasePlanInstance/Processors/BaseCasePlanItemProcessor.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using CaseManagement.CMMN.Domains;
22
using CaseManagement.CMMN.Infrastructure.ExternalEvts;
3+
using System.Linq;
34
using System.Threading;
45
using System.Threading.Tasks;
56

@@ -19,13 +20,21 @@ protected override async Task Handle(CMMNExecutionContext executionContext, T el
1920
return;
2021
}
2122

23+
bool firstInstance = false;
24+
if (elt.LatestTransition == null)
25+
{
26+
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Create);
27+
firstInstance = true;
28+
}
29+
2230
var newExecutionContext = executionContext.NewExecutionContext(entryCriteria.Data);
23-
var createNewOccurrence = await Process(executionContext, elt, cancellationToken);
24-
if (createNewOccurrence && newExecutionContext.Instance.IsRepetitionRuleSatisfied(elt))
31+
if (firstInstance && newExecutionContext.Instance.IsRepetitionRuleSatisfied(elt))
2532
{
2633
var result = newExecutionContext.Instance.TryCreateInstance(elt) as T;
2734
await Handle(newExecutionContext, result, cancellationToken);
2835
}
36+
37+
await Process(executionContext, elt, cancellationToken);
2938
}
3039

3140
protected abstract Task<bool> Process(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);

src/CaseManagement.CMMN/CasePlanInstance/Processors/CMMNExecutionContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ namespace CaseManagement.CMMN.CasePlanInstance.Processors
66
{
77
public class CMMNExecutionContext : ExecutionContext<CasePlanInstanceAggregate>
88
{
9-
public List<KeyValuePair<string, string>> IncomingTokens { get; set; }
9+
public Dictionary<string, string> IncomingTokens { get; set; }
1010

11-
public CMMNExecutionContext NewExecutionContext(List<KeyValuePair<string, string>> incomingTokens)
11+
public CMMNExecutionContext NewExecutionContext(Dictionary<string, string> incomingTokens)
1212
{
1313
var result = new CMMNExecutionContext
1414
{

src/CaseManagement.CMMN/CasePlanInstance/Processors/CaseFileItemInstanceProcessor.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public CaseFileItemInstanceProcessor(ISubscriberRepository subscriberRepository,
2020

2121
protected override async Task Handle(CMMNExecutionContext executionContext, CaseFileItemInstance elt, CancellationToken cancellationToken)
2222
{
23+
if (elt.LatestTransition == null)
24+
{
25+
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Create);
26+
}
27+
2328
var update = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Update, cancellationToken);
2429
var replace = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Replace, cancellationToken);
2530
var removeChild = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.RemoveChild, cancellationToken);
@@ -40,50 +45,78 @@ protected override async Task Handle(CMMNExecutionContext executionContext, Case
4045
{
4146
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Update, cancellationToken);
4247
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Update, incomingTokens: MergeParameters(executionContext, sub.Parameters));
48+
ConsumeTransitionEvts(executionContext, elt);
4349
return;
4450
}
4551

4652
if (replace.IsCaptured)
4753
{
4854
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Replace, cancellationToken);
4955
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Replace, incomingTokens: MergeParameters(executionContext, sub.Parameters));
56+
ConsumeTransitionEvts(executionContext, elt);
5057
return;
5158
}
5259

5360
if (removeChild.IsCaptured)
5461
{
5562
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.RemoveChild, cancellationToken);
5663
executionContext.Instance.MakeTransition(elt, CMMNTransitions.RemoveChild, incomingTokens: MergeParameters(executionContext, sub.Parameters));
64+
ConsumeTransitionEvts(executionContext, elt);
5765
return;
5866
}
5967

6068
if (addChild.IsCaptured)
6169
{
6270
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.AddChild, cancellationToken);
6371
executionContext.Instance.MakeTransition(elt, CMMNTransitions.AddChild, incomingTokens: MergeParameters(executionContext, sub.Parameters));
72+
ConsumeTransitionEvts(executionContext, elt);
6473
return;
6574
}
6675

6776
if (addReference.IsCaptured)
6877
{
6978
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.AddReference, cancellationToken);
7079
executionContext.Instance.MakeTransition(elt, CMMNTransitions.AddReference, incomingTokens: MergeParameters(executionContext, sub.Parameters));
80+
ConsumeTransitionEvts(executionContext, elt);
7181
return;
7282
}
7383

7484
if (removeReference.IsCaptured)
7585
{
7686
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.RemoveReference, cancellationToken);
7787
executionContext.Instance.MakeTransition(elt, CMMNTransitions.RemoveReference, incomingTokens: MergeParameters(executionContext, sub.Parameters));
88+
ConsumeTransitionEvts(executionContext, elt);
7889
return;
7990
}
8091

8192
if (delete.IsCaptured)
8293
{
8394
var sub = await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Delete, cancellationToken);
8495
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Delete, incomingTokens: MergeParameters(executionContext, sub.Parameters));
96+
ConsumeTransitionEvts(executionContext, elt);
97+
return;
8598
}
8699
}
87100
}
101+
102+
private void ConsumeTransitionEvts(CMMNExecutionContext executionContext, CaseFileItemInstance node)
103+
{
104+
var domainEvts = executionContext.Instance.DomainEvents.Where((evt) =>
105+
{
106+
var r = evt as CaseElementTransitionRaisedEvent;
107+
if (r == null)
108+
{
109+
return false;
110+
}
111+
112+
return r.ElementId == node.Id;
113+
}).Cast<CaseElementTransitionRaisedEvent>()
114+
.Select(_ => new IncomingTransition(_.Transition, _.IncomingTokens)).ToList();
115+
var nextNodes = executionContext.Instance.GetNextCasePlanItems(node);
116+
foreach (var nextNode in nextNodes)
117+
{
118+
executionContext.Instance.ConsumeTransitionEvts(nextNode, node.Id, domainEvts);
119+
}
120+
}
88121
}
89122
}

src/CaseManagement.CMMN/CasePlanInstance/Processors/CasePlanInstanceProcessor.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ public async Task Execute(CasePlanInstanceAggregate casePlanInstance, Cancellati
2828
if (casePlanInstance.State == CaseStates.Active)
2929
{
3030
var executionContext = new CMMNExecutionContext { Instance = casePlanInstance };
31-
foreach(var child in casePlanInstance.Children)
31+
foreach (var fileItem in casePlanInstance.FileItems)
3232
{
33-
await _processorFactory.Execute(executionContext, child, cancellationToken);
33+
await _processorFactory.Execute(executionContext, fileItem , cancellationToken);
3434
}
3535

36+
await _processorFactory.Execute(executionContext, casePlanInstance.StageContent, cancellationToken);
3637
if (casePlanInstance.StageContent.State == TaskStageStates.Completed)
3738
{
3839
casePlanInstance.MakeTransition(CMMNTransitions.Complete, false);

src/CaseManagement.CMMN/CasePlanInstance/Processors/StageProcessor.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using CaseManagement.CMMN.Domains;
22
using CaseManagement.CMMN.Infrastructure.ExternalEvts;
33
using CaseManagement.Common.Processors;
4-
using System.Collections.Generic;
54
using System.Linq;
65
using System.Threading;
76
using System.Threading.Tasks;
@@ -19,8 +18,12 @@ public StageProcessor(ISubscriberRepository subscriberRepository, IProcessorFact
1918

2019
protected override async Task<bool> ProtectedProcess(CMMNExecutionContext executionContext, StageElementInstance stageElt, CancellationToken cancellationToken)
2120
{
22-
var executionBranch = ExecutionBranch.Build(stageElt.Children);
23-
await ExecuteBranch(executionContext, executionBranch, cancellationToken);
21+
var rootNodes = stageElt.Children.Where(_ => _.IsLeaf()).ToList();
22+
foreach(var rootNode in rootNodes)
23+
{
24+
await ExecuteNode(executionContext, rootNode, cancellationToken);
25+
}
26+
2427
if (stageElt.Children.All(_ => IsElementCompleted(_)))
2528
{
2629
executionContext.Instance.MakeTransition(stageElt, CMMNTransitions.Complete);
@@ -36,26 +39,28 @@ protected override async Task<bool> ProtectedProcess(CMMNExecutionContext execut
3639
return false;
3740
}
3841

39-
private async Task ExecuteBranch(CMMNExecutionContext executionContext, BaseExecutionBranch<BaseCasePlanItemInstance> branch, CancellationToken cancellationToken)
42+
private async Task ExecuteNode(CMMNExecutionContext executionContext, BaseCasePlanItemInstance node, CancellationToken token)
4043
{
41-
var taskLst = new List<Task>();
42-
foreach (var node in branch.Nodes)
44+
await _processorFactory.Execute(executionContext, node, token);
45+
var domainEvts = executionContext.Instance.DomainEvents.Where((evt) =>
4346
{
44-
taskLst.Add(HandleCasePlan(executionContext, node, cancellationToken));
45-
}
47+
var r = evt as CaseElementTransitionRaisedEvent;
48+
if (r == null)
49+
{
50+
return false;
51+
}
4652

47-
await Task.WhenAll(taskLst);
48-
if (branch.NextBranch != null)
53+
return r.ElementId == node.Id;
54+
}).Cast<CaseElementTransitionRaisedEvent>()
55+
.Select(_ => new IncomingTransition(_.Transition, _.IncomingTokens)).ToList();
56+
var nextNodes = executionContext.Instance.GetNextCasePlanItems(node);
57+
foreach(var nextNode in nextNodes)
4958
{
50-
await ExecuteBranch(executionContext, branch.NextBranch, cancellationToken);
59+
executionContext.Instance.ConsumeTransitionEvts(nextNode, node.Id, domainEvts);
60+
await ExecuteNode(executionContext, nextNode, token);
5161
}
5262
}
5363

54-
private async Task HandleCasePlan(CMMNExecutionContext executionContext, BaseCasePlanItemInstance casePlanElementInstance, CancellationToken token)
55-
{
56-
await _processorFactory.Execute(executionContext, casePlanElementInstance, token);
57-
}
58-
5964
private bool IsElementCompleted(BaseCasePlanItemInstance planElementInstance)
6065
{
6166
var stageOrTask = planElementInstance as BaseTaskOrStageElementInstance;

src/CaseManagement.CMMN/CasePlanInstance/Results/CasePlanInstanceResult.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,16 +131,14 @@ public class TransitionHistoryResult
131131
public string Transition { get; set; }
132132
public DateTime ExecutionDateTime { get; set; }
133133
public string Message { get; set; }
134-
public Dictionary<string, string> IncomingTokens { get; set; }
135134

136135
public static TransitionHistoryResult ToDto(CasePlanElementInstanceTransitionHistory history)
137136
{
138137
return new TransitionHistoryResult
139138
{
140139
ExecutionDateTime = history.ExecutionDateTime,
141140
Message = history.Message,
142-
Transition = Enum.GetName(typeof(CMMNTransitions), history.Transition),
143-
IncomingTokens = history.IncomingTokens
141+
Transition = Enum.GetName(typeof(CMMNTransitions), history.Transition)
144142
};
145143
}
146144
}

src/CaseManagement.CMMN/Domains/CasePlanInstance/BaseCaseEltInstance.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public BaseCaseEltInstance()
2626

2727
#region Update state
2828

29-
public void MakeTransition(CMMNTransitions transition, string message, Dictionary<string, string> incomingTokens, DateTime executionDateTime)
29+
public void MakeTransition(CMMNTransitions transition, string message, DateTime executionDateTime)
3030
{
3131
UpdateTransition(transition, executionDateTime);
32-
TransitionHistories.Add(new CasePlanElementInstanceTransitionHistory { Message = message, ExecutionDateTime = executionDateTime, Transition = transition, IncomingTokens = incomingTokens });
32+
TransitionHistories.Add(new CasePlanElementInstanceTransitionHistory { Message = message, ExecutionDateTime = executionDateTime, Transition = transition });
3333
}
3434

3535
protected abstract void UpdateTransition(CMMNTransitions transition, DateTime executionDateTime);

0 commit comments

Comments
 (0)