Skip to content

Commit ae7b98b

Browse files
Ticket #116 : Check Input & Output tokens
1 parent 6469d2e commit ae7b98b

24 files changed

+109
-58
lines changed

src/CaseManagement.BPMN.Host/Delegates/GetWeatherInformationDelegate.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using CaseManagement.BPMN.Domains;
2+
using CaseManagement.BPMN.ProcessInstance.Processors;
23
using Newtonsoft.Json.Linq;
34
using System;
45
using System.Collections.Generic;
@@ -9,13 +10,13 @@ namespace CaseManagement.BPMN.Host.Delegates
910
{
1011
public class GetWeatherInformationDelegate : IDelegateHandler
1112
{
12-
public Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
13+
public Task<ICollection<MessageToken>> Execute(BPMNExecutionContext context, ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
1314
{
1415
ICollection<MessageToken> result = new List<MessageToken>();
1516
var rnd = new Random();
1617
var degree = rnd.Next(0, 40);
1718

18-
result.Add(MessageToken.NewMessage("weatherInformation", new JObject
19+
result.Add(MessageToken.NewMessage(context.Pointer.InstanceFlowNodeId, "weatherInformation", new JObject
1920
{
2021
{ "city", "Bruxelles" },
2122
{ "degree", degree }

src/CaseManagement.BPMN.Host/Delegates/SendEmailDelegate.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using CaseManagement.BPMN.Domains;
22
using CaseManagement.BPMN.Exceptions;
3-
using Newtonsoft.Json.Linq;
3+
using CaseManagement.BPMN.ProcessInstance.Processors;
44
using System.Collections.Generic;
55
using System.Linq;
66
using System.Net;
@@ -12,17 +12,20 @@ namespace CaseManagement.BPMN.Host.Delegates
1212
{
1313
public class SendEmailDelegate : IDelegateHandler
1414
{
15-
public Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
15+
public Task<ICollection<MessageToken>> Execute(BPMNExecutionContext context, ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
1616
{
17-
var humanTaskInstanceCreated = incoming.FirstOrDefault(i => i.Name == "humanTaskCreated");
18-
if (humanTaskInstanceCreated == null)
17+
var user = incoming.FirstOrDefault(i => i.Name == "user");
18+
if (user == null)
1919
{
20-
throw new BPMNProcessorException("humanTaskCreated must be passed in the request");
20+
throw new BPMNProcessorException("user must be passed in the request");
21+
}
22+
23+
var email = user.GetProperty("email");
24+
if (string.IsNullOrWhiteSpace(email))
25+
{
26+
throw new BPMNProcessorException("email is not passed in the request");
2127
}
2228

23-
var inc = humanTaskInstanceCreated.JObjMessageContent.SelectToken("$.incoming[?(@.Name == 'user')].MessageContent");
24-
var messageContent = JObject.Parse(inc.ToString());
25-
var email = messageContent["email"].ToString();
2629
var parameter = SendDelegateParameter.Build(delegateConfiguration);
2730
using (var smtpClient = new SmtpClient())
2831
{
@@ -40,11 +43,15 @@ public Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incomin
4043
IsBodyHtml = true
4144
};
4245

43-
mailMessage.To.Add(email);
46+
mailMessage.To.Add(email.ToString());
4447
smtpClient.Send(mailMessage);
4548
}
4649

47-
return Task.FromResult(incoming);
50+
ICollection<MessageToken> result = new List<MessageToken>
51+
{
52+
MessageToken.EmptyMessage(context.Pointer.InstanceFlowNodeId, "sendEmail")
53+
};
54+
return Task.FromResult(result);
4855
}
4956

5057
private class SendDelegateParameter

src/CaseManagement.BPMN.Host/Delegates/UpdateUserPasswordDelegate.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using CaseManagement.BPMN.Domains;
22
using CaseManagement.BPMN.Exceptions;
3+
using CaseManagement.BPMN.ProcessInstance.Processors;
34
using IdentityModel.Client;
45
using Newtonsoft.Json.Linq;
56
using System;
@@ -16,7 +17,7 @@ public class UpdateUserPasswordDelegate : IDelegateHandler
1617
{
1718
private const string ActivityName = "Activity_0fhwdxz";
1819

19-
public async Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
20+
public async Task<ICollection<MessageToken>> Execute(BPMNExecutionContext context, ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
2021
{
2122
var user = incoming.FirstOrDefault(i => i.Name == "user");
2223
if (user == null)
@@ -69,7 +70,11 @@ public async Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> i
6970
httpResponse.EnsureSuccessStatusCode();
7071
}
7172

72-
return incoming;
73+
ICollection<MessageToken> result = new List<MessageToken>
74+
{
75+
MessageToken.EmptyMessage(context.Pointer.InstanceFlowNodeId, "updatePassword")
76+
};
77+
return result;
7378
}
7479

7580
private class UpdateUserPasswordParameter

src/CaseManagement.BPMN.SqlServer.Host/Delegates/GetWeatherInformationDelegate.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using CaseManagement.BPMN.Domains;
2+
using CaseManagement.BPMN.ProcessInstance.Processors;
23
using Newtonsoft.Json.Linq;
34
using System;
45
using System.Collections.Generic;
@@ -9,13 +10,13 @@ namespace CaseManagement.BPMN.SqlServer.Host.Delegates
910
{
1011
public class GetWeatherInformationDelegate : IDelegateHandler
1112
{
12-
public Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
13+
public Task<ICollection<MessageToken>> Execute(BPMNExecutionContext context, ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken)
1314
{
1415
ICollection<MessageToken> result = new List<MessageToken>();
1516
var rnd = new Random();
1617
var degree = rnd.Next(0, 40);
1718

18-
result.Add(MessageToken.NewMessage("weatherInformation", new JObject
19+
result.Add(MessageToken.NewMessage(context.Pointer.InstanceFlowNodeId, "weatherInformation", new JObject
1920
{
2021
{ "city", "Bruxelles" },
2122
{ "degree", degree }

src/CaseManagement.BPMN/Domains/ProcessInstance/Defs/Events/EventDefs/MessageEventDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class MessageEventDefinition : BaseEventDefinition
1616

1717
public override bool IsSatisfied(ProcessInstanceAggregate processInstance, MessageToken token)
1818
{
19-
return processInstance.IsMessageCorrect(token);
19+
return processInstance.IsMessageCorrect(MessageRef, token);
2020
}
2121

2222
public override object Clone()

src/CaseManagement.BPMN/Domains/ProcessInstance/Executions/ExecutionPointer.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@ public void AddIncoming(IEnumerable<MessageToken> tokens)
4242

4343
foreach(var token in tokens)
4444
{
45+
if (Tokens.Any(t => t.Id == token.Id))
46+
{
47+
continue;
48+
}
49+
4550
Tokens.Add(new MessageToken
4651
{
52+
Id = token.Id,
4753
MessageContent = token.MessageContent,
4854
Name = token.Name,
4955
Type = MessageTokenTypes.INCOMING
@@ -60,8 +66,14 @@ public void AddOutgoing(IEnumerable<MessageToken> tokens)
6066

6167
foreach(var token in tokens)
6268
{
69+
if (Tokens.Any(t => t.Id == token.Id))
70+
{
71+
continue;
72+
}
73+
6374
Tokens.Add(new MessageToken
6475
{
76+
Id = token.Id,
6577
MessageContent = token.MessageContent,
6678
Name = token.Name,
6779
Type = MessageTokenTypes.OUTGOING

src/CaseManagement.BPMN/Domains/ProcessInstance/MessageToken.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace CaseManagement.BPMN.Domains
88
[Serializable]
99
public class MessageToken : ICloneable
1010
{
11+
public string Id { get; set; }
1112
public string Name { get; set; }
1213
public string MessageContent { get; set; }
1314
public MessageTokenTypes Type { get; set; }
@@ -52,22 +53,28 @@ public object Clone()
5253
{
5354
var result = new MessageToken
5455
{
56+
Id = Id,
5557
Name = Name,
5658
MessageContent = MessageContent,
5759
Type = Type
5860
};
5961
return result;
6062
}
6163

62-
public static MessageToken EmptyMessage()
64+
public static MessageToken EmptyMessage(string id, string name)
6365
{
64-
return new MessageToken();
66+
return new MessageToken
67+
{
68+
Id = id,
69+
Name = name
70+
};
6571
}
6672

67-
public static MessageToken NewMessage(string name, string content)
73+
public static MessageToken NewMessage(string id, string name, string content)
6874
{
6975
return new MessageToken
7076
{
77+
Id = id,
7178
MessageContent = content,
7279
Name = name
7380
};

src/CaseManagement.BPMN/Domains/ProcessInstance/ProcessInstanceAggregate.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public ICollection<BaseFlowNode> ElementDefs
4848

4949
#region Getters
5050

51+
public bool IsEvent(string elementId)
52+
{
53+
return GetDefinition(elementId) as BaseEvent != null;
54+
}
55+
5156
public bool IsIncomingSatisfied(SequenceFlow incomingSequence, IEnumerable<MessageToken> incomingTokens)
5257
{
5358
if (!string.IsNullOrWhiteSpace(incomingSequence.ConditionExpression))
@@ -115,10 +120,10 @@ public ItemDefinition GetItem(string itemRef)
115120
return ItemDefs.FirstOrDefault(_ => _.EltId == itemRef);
116121
}
117122

118-
public bool IsMessageCorrect(MessageToken messageToken)
123+
public bool IsMessageCorrect(string messageRef, MessageToken messageToken)
119124
{
120125
var message = GetMessageByName(messageToken.Name);
121-
if (message == null || messageToken.Name != messageToken.Name)
126+
if (message == null || messageToken.Name != message.Name || message.EltId != messageRef)
122127
{
123128
return false;
124129
}
@@ -195,12 +200,12 @@ public ICollection<string> CompleteExecutionPointer(ExecutionPointer pointer, IC
195200
return result;
196201
}
197202

198-
public void LaunchBoundaryEvts(string pathId, List<string> evts)
203+
public void LaunchBoundaryEvts(string pathId, List<string> evts, List<MessageToken> incomingTokens)
199204
{
200205
var items = evts.Select(e => GetDefinition(e));
201206
foreach(var item in items)
202207
{
203-
TryAddExecutionPointer(pathId, item);
208+
TryAddExecutionPointer(pathId, item, incomingTokens);
204209
}
205210
}
206211

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using CaseManagement.BPMN.Domains;
2+
using CaseManagement.BPMN.ProcessInstance.Processors;
23
using System.Collections.Generic;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -7,6 +8,6 @@ namespace CaseManagement.BPMN
78
{
89
public interface IDelegateHandler
910
{
10-
Task<ICollection<MessageToken>> Execute(ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken);
11+
Task<ICollection<MessageToken>> Execute(BPMNExecutionContext context, ICollection<MessageToken> incoming, DelegateConfigurationAggregate delegateConfiguration, CancellationToken cancellationToken);
1112
}
1213
}

src/CaseManagement.BPMN/ProcessInstance/Commands/Handlers/ConsumeMessageProcessInstanceCommandHandler.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using MassTransit;
66
using MediatR;
77
using Microsoft.Extensions.Logging;
8+
using System;
89
using System.Threading;
910
using System.Threading.Tasks;
1011

@@ -40,13 +41,16 @@ public async Task<bool> Handle(ConsumeMessageInstanceCommand request, Cancellati
4041

4142
processInstance.ConsumeMessage(new Domains.MessageToken
4243
{
44+
Id = Guid.NewGuid().ToString(),
4345
Name = request.Name,
4446
MessageContent = request.MessageContent == null ? string.Empty : request.MessageContent.ToString()
4547
});
4648
var isRestarted = await _processInstanceProcessor.Execute(processInstance, cancellationToken);
4749
if (isRestarted)
4850
{
4951
var evt = processInstance.Restart();
52+
await _processInstanceCommandRepository.Update(processInstance, cancellationToken);
53+
await _processInstanceCommandRepository.SaveChanges(cancellationToken);
5054
await _busControl.Publish(evt, cancellationToken);
5155
}
5256

0 commit comments

Comments
 (0)