Skip to content

Commit 6edb0bc

Browse files
Ticket ## : Add UT with one blocked SENTRY + can stop "casefileitem" watcher + a processtask can read casefile
1 parent dd36be9 commit 6edb0bc

File tree

23 files changed

+691
-288
lines changed

23 files changed

+691
-288
lines changed

src/CaseManagement.CMMN.Host/CaseManagement.CMMN.Host.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
<ProjectReference Include="..\CaseManagement.CMMN\CaseManagement.CMMN.csproj" />
1111
</ItemGroup>
1212
<ItemGroup>
13+
<None Update="Cmmns\caseWithOneBlockedSEntry.cmmn">
14+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
15+
</None>
1316
<None Update="Cmmns\caseWithOneFailProcessTask.cmmn">
1417
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
1518
</None>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<cmmn:definitions xmlns:dc="http://www.omg.org/spec/CMMN/20151109/DC" xmlns:cmmndi="http://www.omg.org/spec/CMMN/20151109/CMMNDI" xmlns:cmmn="http://www.omg.org/spec/CMMN/20151109/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/CMMN/20151109/DI" xmlns:case="https://github.com/simpleidserver/CaseManagement" id="caseWithCaseFileItem" targetNamespace="http://bpmn.io/schema/cmmn" exporter="cmmn-js (https://demo.bpmn.io/cmmn)" exporterVersion="0.19.2">
3+
<cmmn:caseFileItemDefinition id="CaseFileItemDefinition_1gxrx35" name="Document" definitionType="https://github.com/simpleidserver/casemanagement/directory" />
4+
<cmmn:case id="testCase" name="One Process Task Case">
5+
<cmmn:casePlanModel id="CasePlanModel_1" name="Case with one blocked SEntry">
6+
<cmmn:planItem id="PlanItem_0s8tly3" definitionRef="Task_1vmjwpa">
7+
<cmmn:entryCriterion id="EntryCriterion_1a075f4" sentryRef="Sentry_0f4my3g" />
8+
</cmmn:planItem>
9+
<cmmn:planItem id="PlanItem_18sdiyp" definitionRef="Task_0mysw12" />
10+
<cmmn:sentry id="Sentry_0f4my3g">
11+
<cmmn:planItemOnPart id="PlanItemOnPart_0tuf377" sourceRef="PlanItem_18sdiyp">
12+
<cmmn:standardEvent>fault</cmmn:standardEvent>
13+
</cmmn:planItemOnPart>
14+
</cmmn:sentry>
15+
<cmmn:task id="Task_1vmjwpa" name="Second task" />
16+
<cmmn:task id="Task_0mysw12" name="First Task" />
17+
</cmmn:casePlanModel>
18+
</cmmn:case>
19+
<cmmndi:CMMNDI>
20+
<cmmndi:CMMNDiagram id="CMMNDiagram_1">
21+
<cmmndi:Size width="500" height="500" />
22+
<cmmndi:CMMNShape id="DI_CasePlanModel_1" cmmnElementRef="CasePlanModel_1">
23+
<dc:Bounds x="156" y="99" width="477" height="236" />
24+
<cmmndi:CMMNLabel />
25+
</cmmndi:CMMNShape>
26+
<cmmndi:CMMNShape id="PlanItem_0s8tly3_di" cmmnElementRef="PlanItem_0s8tly3">
27+
<dc:Bounds x="479" y="165" width="100" height="80" />
28+
<cmmndi:CMMNLabel />
29+
</cmmndi:CMMNShape>
30+
<cmmndi:CMMNShape id="EntryCriterion_1a075f4_di" cmmnElementRef="EntryCriterion_1a075f4">
31+
<dc:Bounds x="469" y="192" width="20" height="28" />
32+
<cmmndi:CMMNLabel />
33+
</cmmndi:CMMNShape>
34+
<cmmndi:CMMNEdge id="PlanItemOnPart_0tuf377_di" cmmnElementRef="PlanItemOnPart_0tuf377" targetCMMNElementRef="EntryCriterion_1a075f4" isStandardEventVisible="true">
35+
<di:waypoint x="305" y="205" />
36+
<di:waypoint x="387" y="205" />
37+
<di:waypoint x="387" y="206" />
38+
<di:waypoint x="469" y="206" />
39+
<cmmndi:CMMNLabel>
40+
<dc:Bounds x="361" y="195.5" width="51" height="12" />
41+
</cmmndi:CMMNLabel>
42+
</cmmndi:CMMNEdge>
43+
<cmmndi:CMMNShape id="PlanItem_0q1rtjv_di" cmmnElementRef="PlanItem_18sdiyp">
44+
<dc:Bounds x="205" y="165" width="100" height="80" />
45+
<cmmndi:CMMNLabel />
46+
</cmmndi:CMMNShape>
47+
</cmmndi:CMMNDiagram>
48+
</cmmndi:CMMNDI>
49+
</cmmn:definitions>

src/CaseManagement.CMMN.Host/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
111111
{
112112
app.UseAuthentication();
113113
app.UseCors("AllowAll");
114-
app.UseCMMN();
114+
app.UseMvc();
115115
}
116116
}
117117
}

src/CaseManagement.CMMN/ApplicationBuilderExtensions.cs

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

src/CaseManagement.CMMN/Builders/ProcessTaskBuilder.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,16 @@ public ProcessTaskBuilder AddMapping(string sourceRef, string targetRef)
3232
});
3333
return this;
3434
}
35+
36+
public ProcessTaskBuilder AddCaseInstanceIdInputMapping()
37+
{
38+
var cmmnTask = (WorkflowElementDefinition as PlanItemDefinition).PlanItemDefinitionProcessTask;
39+
cmmnTask.Mappings.Add(new ParameterMapping
40+
{
41+
SourceRef = new CMMNParameter { Name = CMMNConstants.StandardProcessMappingVariables.CaseInstanceId },
42+
TargetRef = new CMMNParameter { Name = CMMNConstants.StandardProcessMappingVariables.CaseInstanceId }
43+
});
44+
return this;
45+
}
3546
}
3647
}

src/CaseManagement.CMMN/CMMNConstants.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
public static class CMMNConstants
44
{
55
public const int WAIT_INTERVAL_MS = 20;
6-
public const int MONITORING_INTERVAL_MS = 1000;
6+
7+
public static class StandardProcessMappingVariables
8+
{
9+
public const string CaseInstanceId = "$caseinstanceid$";
10+
}
711

812
public static class RouteNames
913
{

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using CaseManagement.CMMN.Domains;
55
using CaseManagement.CMMN.Infrastructures;
66
using System.Collections.Generic;
7-
using System.Linq;
87
using System.Threading;
98
using System.Threading.Tasks;
109

@@ -53,28 +52,31 @@ private async Task HandleProcess(ProcessorParameter parameter, CancellationToken
5352

5453
foreach (var mapping in processTask.Mappings)
5554
{
56-
if (!parameter.CaseInstance.ContainsVariable(mapping.SourceRef.Name))
55+
56+
string variableValue;
57+
if (mapping.SourceRef.Name == CMMNConstants.StandardProcessMappingVariables.CaseInstanceId)
5758
{
58-
continue;
59+
variableValue = parameter.CaseInstance.Id;
5960
}
60-
61-
var variableValue = parameter.CaseInstance.GetVariable(mapping.SourceRef.Name);
62-
if (mapping.Transformation != null)
61+
else
6362
{
64-
variableValue = ExpressionParser.GetStringEvaluation(mapping.Transformation.Body, parameter.CaseInstance, (i) =>
63+
if (!parameter.CaseInstance.ContainsVariable(mapping.SourceRef.Name))
6564
{
66-
i.SetVariable("sourceValue", variableValue);
67-
});
65+
continue;
66+
}
67+
68+
variableValue = parameter.CaseInstance.GetVariable(mapping.SourceRef.Name);
69+
if (mapping.Transformation != null)
70+
{
71+
variableValue = ExpressionParser.GetStringEvaluation(mapping.Transformation.Body, parameter.CaseInstance, (i) =>
72+
{
73+
i.SetVariable("sourceValue", variableValue);
74+
});
75+
}
6876
}
6977

7078
parameters.Add(mapping.TargetRef.Name, variableValue);
7179
}
72-
73-
if (!string.IsNullOrWhiteSpace(processTask.SourceRef))
74-
{
75-
// var caseFileItem = pf.GetCaseFileItem(processTask.SourceRef);
76-
// parameters.Add("caseFileItem", JsonConvert.SerializeObject(caseFileItem));
77-
}
7880

7981
await _caseLaunchProcessCommandHandler.Handle(new LaunchCaseProcessCommand(processRef, parameters), (resp) =>
8082
{

src/CaseManagement.CMMN/CaseInstance/Processors/CaseFileItem/DirectoryCaseFileItemListener.cs

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using CaseManagement.CMMN.CaseInstance.Repositories;
2-
using CaseManagement.CMMN.Domains;
32
using System.IO;
43
using System.Threading;
54
using System.Threading.Tasks;
@@ -18,55 +17,66 @@ public DirectoryCaseFileItemListener(ICaseFileItemRepository caseFileItemReposit
1817
public const string CASE_FILE_ITEM_TYPE = "https://github.com/simpleidserver/casemanagement/directory";
1918
public string CaseFileItemType => CASE_FILE_ITEM_TYPE;
2019

21-
public async Task Start(ProcessorParameter parameter, CancellationToken token)
20+
public Task Start(ProcessorParameter parameter, CancellationToken token)
2221
{
23-
var result = await _caseFileItemRepository.GetCaseFileItemInstance(parameter.CaseElementInstance.Id);
22+
return BuildTask(parameter, token);
23+
}
24+
25+
private Task BuildTask(ProcessorParameter processorParameter, CancellationToken token)
26+
{
27+
var task = new Task(async () => await HandleTask(processorParameter, token), token, TaskCreationOptions.LongRunning);
28+
task.Start();
29+
return task;
30+
}
31+
32+
private async Task HandleTask(ProcessorParameter processorParameter, CancellationToken token)
33+
{
34+
bool isNewDirectory = false;
35+
var result = await _caseFileItemRepository.FindByCaseElementInstance(processorParameter.CaseElementInstance.Id);
2436
string tmpDirectory;
2537
if (result == null)
2638
{
39+
isNewDirectory = true;
2740
tmpDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
2841
Directory.CreateDirectory(tmpDirectory);
29-
await _caseFileItemRepository.AddCaseFileItem(parameter.CaseElementInstance.Id, tmpDirectory);
3042
}
3143
else
3244
{
33-
tmpDirectory = result.Id;
45+
tmpDirectory = result.Value;
3446
}
3547

36-
BuildTask(tmpDirectory, parameter, token);
37-
}
38-
39-
private Task BuildTask(string directoryPath, ProcessorParameter processorParameter, CancellationToken token)
40-
{
41-
var task = new Task(() => HandleTask(directoryPath, processorParameter, token), token, TaskCreationOptions.LongRunning);
42-
task.Start();
43-
return task;
44-
}
45-
46-
private void HandleTask(string directoryPath, ProcessorParameter processorParameter, CancellationToken token)
47-
{
48-
var cancellationTokenSource = new CancellationTokenSource();
4948
var fileSystemWatcher = new FileSystemWatcher
5049
{
51-
Path = directoryPath
50+
Path = tmpDirectory
5251
};
53-
fileSystemWatcher.Created += (s, e) => HandleFileCreated(processorParameter);
54-
fileSystemWatcher.EnableRaisingEvents = true;
55-
while (!cancellationTokenSource.Token.IsCancellationRequested)
52+
try
5653
{
57-
Thread.Sleep(1000);
58-
try
54+
var cancellationTokenSource = new CancellationTokenSource();
55+
fileSystemWatcher.Created += (s, e) => HandleFileCreated(processorParameter);
56+
fileSystemWatcher.EnableRaisingEvents = true;
57+
if (isNewDirectory)
5958
{
60-
token.ThrowIfCancellationRequested();
59+
await _caseFileItemRepository.AddCaseFileItem(processorParameter.CaseInstance.Id, processorParameter.CaseElementInstance.Id, processorParameter.CaseElementInstance.CaseElementDefinitionId, tmpDirectory);
6160
}
62-
catch
61+
62+
while (!cancellationTokenSource.Token.IsCancellationRequested)
6363
{
64-
cancellationTokenSource.Cancel();
64+
Thread.Sleep(CMMNConstants.WAIT_INTERVAL_MS);
65+
try
66+
{
67+
token.ThrowIfCancellationRequested();
68+
}
69+
catch
70+
{
71+
cancellationTokenSource.Cancel();
72+
}
6573
}
6674
}
67-
68-
fileSystemWatcher.EnableRaisingEvents = false;
69-
fileSystemWatcher.Dispose();
75+
finally
76+
{
77+
fileSystemWatcher.EnableRaisingEvents = false;
78+
fileSystemWatcher.Dispose();
79+
}
7080
}
7181

7282
private void HandleFileCreated(ProcessorParameter parameter)

src/CaseManagement.CMMN/CaseInstance/Repositories/CaseFileItem.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public CaseFileItem(string id)
1010
}
1111

1212
public string Id { get; set; }
13+
public string CaseInstanceId { get; set; }
14+
public string CaseElementInstanceId { get; set; }
15+
public string CaseElementDefinitionId { get; set; }
16+
public string Value { get; set; }
1317
public abstract string ReadContent();
1418
public abstract IEnumerable<CaseFileItem> GetChildren();
1519
}

src/CaseManagement.CMMN/CaseInstance/Repositories/Impl/DirectoryCaseFileItem.cs renamed to src/CaseManagement.CMMN/CaseInstance/Repositories/DirectoryCaseFileItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ public DirectoryCaseFileItem(string id) : base(id) { }
99

1010
public override IEnumerable<CaseFileItem> GetChildren()
1111
{
12-
foreach(var file in Directory.EnumerateFiles(Id))
12+
foreach(var file in Directory.EnumerateFiles(Value))
1313
{
1414
yield return new FileCaseFileItem(file);
1515
}
1616

17-
foreach(var directory in Directory.EnumerateDirectories(Id))
17+
foreach(var directory in Directory.EnumerateDirectories(Value))
1818
{
1919
yield return new DirectoryCaseFileItem(directory);
2020
}

0 commit comments

Comments
 (0)