Skip to content

Commit d8417be

Browse files
Thierry Habarthabarthierry-hue
authored andcommitted
Ticket ## : Fix the repetition rule
1 parent f48f73d commit d8417be

42 files changed

Lines changed: 1201 additions & 720 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/CaseManagement.CMMN/Builders/CMMNHumanTaskBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@
22

33
namespace CaseManagement.CMMN.Builders
44
{
5-
public class CMMNHumanTaskBuilder : CMMNPlanItemBuilder
5+
public class CMMNHumanTaskBuilder : CMMNWorkflowElementBuilder
66
{
77
public CMMNHumanTaskBuilder(CMMNPlanItemDefinition planItem) : base(planItem)
88
{
99
}
1010

1111
public CMMNHumanTaskBuilder SetIsBlocking(bool isBlocking)
1212
{
13-
var cmmnTask = PlanItem.PlanItemDefinitionHumanTask;
13+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionHumanTask;
1414
cmmnTask.IsBlocking = isBlocking;
1515
return this;
1616
}
1717

1818
public CMMNHumanTaskBuilder SetFormId(string formId)
1919
{
20-
var cmmnTask = PlanItem.PlanItemDefinitionHumanTask;
20+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionHumanTask;
2121
cmmnTask.FormId = formId;
2222
return this;
2323
}

src/CaseManagement.CMMN/Builders/CMMNPlanItemBuilder.cs

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/CaseManagement.CMMN/Builders/CMMNProcessTaskBuilder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22

33
namespace CaseManagement.CMMN.Builders
44
{
5-
public class CMMNProcessTaskBuilder : CMMNPlanItemBuilder
5+
public class CMMNProcessTaskBuilder : CMMNWorkflowElementBuilder
66
{
77
public CMMNProcessTaskBuilder(CMMNPlanItemDefinition planItem) : base(planItem)
88
{
99
}
1010

1111
public CMMNProcessTaskBuilder SetIsBlocking(bool isBlocking)
1212
{
13-
var cmmnTask = PlanItem.PlanItemDefinitionProcessTask;
13+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionProcessTask;
1414
cmmnTask.IsBlocking = isBlocking;
1515
return this;
1616
}
1717

1818
public CMMNProcessTaskBuilder SetProcessRef(string processRef)
1919
{
20-
var cmmnTask = PlanItem.PlanItemDefinitionProcessTask;
20+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionProcessTask;
2121
cmmnTask.ProcessRef = processRef;
2222
return this;
2323
}
2424

2525
public CMMNProcessTaskBuilder AddMapping(string sourceRef, string targetRef)
2626
{
27-
var cmmnTask = PlanItem.PlanItemDefinitionProcessTask;
27+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionProcessTask;
2828
cmmnTask.Mappings.Add(new CMMNParameterMapping
2929
{
3030
SourceRef = new CMMNParameter { Name = sourceRef },
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using CaseManagement.CMMN.Domains;
2+
using System;
3+
using System.Collections.Generic;
4+
5+
namespace CaseManagement.CMMN.Builders
6+
{
7+
public class CMMNStageBuilder : CMMNWorkflowElementBuilder
8+
{
9+
public CMMNStageBuilder(CMMNStageDefinition stageDefinition) : base(stageDefinition)
10+
{
11+
}
12+
13+
public CMMNStageBuilder AddElement(CMMNWorkflowElementDefinition element)
14+
{
15+
(WorkflowElementDefinition as CMMNStageDefinition).Elements.Add(element);
16+
return this;
17+
}
18+
19+
public CMMNStageBuilder AddCMMNStage(string id, string name, Action<CMMNStageBuilder> callback)
20+
{
21+
var stage = new CMMNStageDefinition(id, name);
22+
var builder = new CMMNStageBuilder(stage);
23+
callback(builder);
24+
AddElement(stage);
25+
return this;
26+
}
27+
28+
public CMMNStageBuilder AddCMMNTask(string id, string name, Action<CMMNTaskBuilder> callback)
29+
{
30+
var planItemDef = new CMMNTask(name);
31+
var processTask = CMMNPlanItemDefinition.New(id, name, planItemDef);
32+
callback(new CMMNTaskBuilder(processTask));
33+
AddElement(processTask);
34+
return this;
35+
}
36+
37+
public CMMNStageBuilder AddCMMNHumanTask(string id, string name, Action<CMMNHumanTaskBuilder> callback)
38+
{
39+
var planItemDef = new CMMNHumanTask(name);
40+
var humanTask = CMMNPlanItemDefinition.New(id, name, planItemDef);
41+
callback(new CMMNHumanTaskBuilder(humanTask));
42+
AddElement(humanTask);
43+
return this;
44+
}
45+
46+
public CMMNStageBuilder AddCMMNProcessTask(string id, string name, Action<CMMNProcessTaskBuilder> callback)
47+
{
48+
var planItemDef = new CMMNProcessTask(name);
49+
var processTask = CMMNPlanItemDefinition.New(id, name, planItemDef);
50+
callback(new CMMNProcessTaskBuilder(processTask));
51+
AddElement(processTask);
52+
return this;
53+
}
54+
}
55+
}

src/CaseManagement.CMMN/Builders/CMMNTaskBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
namespace CaseManagement.CMMN.Builders
44
{
5-
public class CMMNTaskBuilder : CMMNPlanItemBuilder
5+
public class CMMNTaskBuilder : CMMNWorkflowElementBuilder
66
{
77
public CMMNTaskBuilder(CMMNPlanItemDefinition planItem) : base(planItem)
88
{
99
}
1010

1111
public CMMNTaskBuilder SetIsBlocking(bool isBlocking)
1212
{
13-
var cmmnTask = PlanItem.PlanItemDefinitionTask;
13+
var cmmnTask = (WorkflowElementDefinition as CMMNPlanItemDefinition).PlanItemDefinitionTask;
1414
cmmnTask.IsBlocking = isBlocking;
1515
return this;
1616
}

src/CaseManagement.CMMN/Builders/CMMNWorkflowBuilder.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,29 @@ namespace CaseManagement.CMMN.Builders
66
{
77
public class CMMNWorkflowBuilder
88
{
9-
private string _processFlowTemplateId;
10-
private string _processFlowName;
11-
private ICollection<CMMNPlanItemDefinition> _planItems { get; set; }
9+
private readonly string _processFlowTemplateId;
10+
private readonly string _processFlowName;
11+
private ICollection<CMMNWorkflowElementDefinition> _elements { get; set; }
1212

1313
private CMMNWorkflowBuilder(string processFlowTemplateId, string processFlowName)
1414
{
1515
_processFlowTemplateId = processFlowTemplateId;
1616
_processFlowName = processFlowName;
17-
_planItems = new List<CMMNPlanItemDefinition>();
17+
_elements = new List<CMMNWorkflowElementDefinition>();
1818
}
1919

2020
public CMMNWorkflowBuilder AddCMMNPlanItem(CMMNPlanItemDefinition planItem)
2121
{
22-
_planItems.Add(planItem);
22+
_elements.Add(planItem);
23+
return this;
24+
}
25+
26+
public CMMNWorkflowBuilder AddCMMNStage(string id, string name, Action<CMMNStageBuilder> callback)
27+
{
28+
var stage = new CMMNStageDefinition(id, name);
29+
var builder = new CMMNStageBuilder(stage);
30+
callback(builder);
31+
_elements.Add(stage);
2332
return this;
2433
}
2534

@@ -52,7 +61,7 @@ public CMMNWorkflowBuilder AddCMMNProcessTask(string id, string name, Action<CMM
5261

5362
public CMMNWorkflowDefinition Build()
5463
{
55-
return CMMNWorkflowDefinition.New(_processFlowTemplateId, _processFlowTemplateId, "", _planItems);
64+
return CMMNWorkflowDefinition.New(_processFlowTemplateId, _processFlowTemplateId, "", _elements);
5665
}
5766

5867
public static CMMNWorkflowBuilder New(string id, string name)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using CaseManagement.CMMN.Domains;
2+
using System;
3+
4+
namespace CaseManagement.CMMN.Builders
5+
{
6+
public class CMMNWorkflowElementBuilder
7+
{
8+
public CMMNWorkflowElementBuilder(CMMNWorkflowElementDefinition workflowElementDef)
9+
{
10+
WorkflowElementDefinition = workflowElementDef;
11+
}
12+
13+
protected CMMNWorkflowElementDefinition WorkflowElementDefinition { get; private set; }
14+
15+
public CMMNWorkflowElementBuilder AddEntryCriterion(string name, Action<CMMNSEntryBuilder> callback)
16+
{
17+
var sEntry = new CMMNSEntry(name);
18+
var entryCriterion = new CMMNCriterion(name) { SEntry = sEntry };
19+
callback(new CMMNSEntryBuilder(sEntry));
20+
WorkflowElementDefinition.EntryCriterions.Add(entryCriterion);
21+
return this;
22+
}
23+
24+
public CMMNWorkflowElementBuilder AddExitCriterion(string name, Action<CMMNSEntryBuilder> callback)
25+
{
26+
var sEntry = new CMMNSEntry(name);
27+
var entryCriterion = new CMMNCriterion(name) { SEntry = sEntry };
28+
callback(new CMMNSEntryBuilder(sEntry));
29+
WorkflowElementDefinition.ExitCriterions.Add(entryCriterion);
30+
return this;
31+
}
32+
33+
public CMMNWorkflowElementBuilder SetManualActivationRule(string name, CMMNExpression expression)
34+
{
35+
var manualActivationRule = new CMMNManualActivationRule(name, expression);
36+
WorkflowElementDefinition.SetManualActivationRule(manualActivationRule);
37+
return this;
38+
}
39+
40+
public CMMNWorkflowElementBuilder SetRepetitionRule(string name, CMMNExpression expression)
41+
{
42+
var repetitionRule = new CMMNRepetitionRule(name, expression);
43+
WorkflowElementDefinition.SetRepetitionRule(repetitionRule);
44+
return this;
45+
}
46+
}
47+
}

src/CaseManagement.CMMN/CaseInstance/Processors/BaseCMMNTaskProcessor.cs

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,82 @@ namespace CaseManagement.CMMN.CaseInstance.Processors
88
{
99
public abstract class BaseCMMNTaskProcessor : ICMMNPlanItemProcessor
1010
{
11-
public abstract CMMNPlanItemDefinitionTypes Type { get; }
11+
public abstract CMMNWorkflowElementTypes Type { get; }
1212

1313
public Task Handle(PlanItemProcessorParameter parameter, CancellationToken token)
1414
{
15-
var task = new Task(() => HandleTask(parameter, token), token, TaskCreationOptions.LongRunning);
15+
var cancellationTokenSource = new CancellationTokenSource();
16+
var task = new Task(() => HandleTask(parameter, cancellationTokenSource), token, TaskCreationOptions.LongRunning);
1617
task.Start();
1718
return task;
1819
}
1920

2021
protected abstract Task Run(PlanItemProcessorParameter parameter, CancellationToken token);
2122

22-
private void HandleTask(PlanItemProcessorParameter parameter, CancellationToken token)
23+
private async void HandleTask(PlanItemProcessorParameter parameter, CancellationTokenSource tokenSource)
2324
{
2425
CMMNCriterionListener.Listen(parameter);
2526
var isManuallyActivated = CMMNManualActivationListener.Listen(parameter);
26-
/*
2727
if (!isManuallyActivated)
2828
{
29-
pf.StartPlanItem(cmmnPlanItem);
29+
parameter.WorkflowInstance.MakeTransition(parameter.WorkflowElementInstance.Id, CMMNTransitions.Start);
3030
}
3131

32-
cmmnPlanItem.StateChanged += HandleSuspend;
33-
cmmnPlanItem.StateChanged += HandleResume;
34-
Thread.Sleep(100);
35-
Run(context, token).Wait();
36-
*/
37-
}
38-
39-
private void HandleSuspend(object obj, string state)
40-
{
41-
var name = Enum.GetName(typeof(CMMNPlanItemTransitions), CMMNPlanItemTransitions.Suspend);
42-
if (name != state)
32+
bool isSuspend = false;
33+
bool isTerminate = false;
34+
bool isOperationExecuted = false;
35+
bool continueExecution = true;
36+
var resumeEvtListener = CMMNPlanItemTransitionListener.Listen(parameter, CMMNTransitions.Resume, () =>
4337
{
44-
return;
45-
}
46-
47-
// _processTaskTokenSource.Cancel();
48-
}
49-
50-
private void HandleResume(object obj, string state)
51-
{
52-
var name = Enum.GetName(typeof(CMMNPlanItemTransitions), CMMNPlanItemTransitions.Resume);
53-
if (name != state)
38+
tokenSource = new CancellationTokenSource();
39+
isSuspend = false;
40+
isOperationExecuted = false;
41+
});
42+
var suspendEvtListener = CMMNPlanItemTransitionListener.Listen(parameter, CMMNTransitions.Suspend, () =>
43+
{
44+
isSuspend = true;
45+
tokenSource.Cancel();
46+
});
47+
var terminateEvtListener = CMMNPlanItemTransitionListener.Listen(parameter, CMMNTransitions.Terminate, () =>
5448
{
55-
return;
49+
isTerminate = true;
50+
tokenSource.Cancel();
51+
});
52+
while (continueExecution)
53+
{
54+
Thread.Sleep(100);
55+
if (isSuspend)
56+
{
57+
continue;
58+
}
59+
60+
if (!isOperationExecuted)
61+
{
62+
isOperationExecuted = true;
63+
try
64+
{
65+
await Run(parameter, tokenSource.Token);
66+
tokenSource.Token.ThrowIfCancellationRequested();
67+
continueExecution = false;
68+
}
69+
catch (OperationCanceledException)
70+
{
71+
if (isTerminate)
72+
{
73+
continueExecution = false;
74+
}
75+
}
76+
catch(Exception)
77+
{
78+
parameter.WorkflowInstance.MakeTransition(parameter.WorkflowElementInstance.Id, CMMNTransitions.Fault);
79+
isSuspend = true;
80+
}
81+
}
5682
}
57-
58-
// _processTask.Start();
83+
84+
suspendEvtListener.Unsubscribe();
85+
terminateEvtListener.Unsubscribe();
86+
resumeEvtListener.Unsubscribe();
5987
}
6088
}
6189
}

0 commit comments

Comments
 (0)