Skip to content

Commit 72eaccb

Browse files
authored
Merge pull request #245 from trojanc/marshal_variables
Marshal variables
2 parents 49b98ab + f55802d commit 72eaccb

File tree

9 files changed

+83
-30
lines changed

9 files changed

+83
-30
lines changed

pkg/bpmn_engine/engine.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"sort"
66
"time"
77

8-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
9-
108
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/exporter"
119
"github.com/nitram509/lib-bpmn-engine/pkg/spec/BPMN20"
1210
)
@@ -74,7 +72,7 @@ func (state *BpmnEngineState) CreateInstance(processKey int64, variableContext m
7472
processInstanceInfo := processInstanceInfo{
7573
ProcessInfo: process,
7674
InstanceKey: state.generateKey(),
77-
VariableHolder: var_holder.New(nil, variableContext),
75+
VariableHolder: NewVarHolder(nil, variableContext),
7876
CreatedAt: time.Now(),
7977
State: Ready,
8078
}
@@ -369,7 +367,7 @@ func (state *BpmnEngineState) handleIntermediateCatchEvent(process *ProcessInfo,
369367
}
370368
throwLinkName := (*originActivity.Element()).(BPMN20.TIntermediateThrowEvent).LinkEventDefinition.Name
371369
catchLinkName := ice.LinkEventDefinition.Name
372-
elementVarHolder := var_holder.New(&instance.VariableHolder, nil)
370+
elementVarHolder := NewVarHolder(&instance.VariableHolder, nil)
373371
if err := propagateProcessInstanceVariables(&elementVarHolder, ice.Output); err != nil {
374372
msg := fmt.Sprintf("Can't evaluate expression in element id=%s name=%s", ice.Id, ice.Name)
375373
err = &ExpressionEvaluationError{Msg: msg, Err: err}

pkg/bpmn_engine/expressions.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"strings"
55

66
"github.com/antonmedv/expr"
7-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
87
"github.com/nitram509/lib-bpmn-engine/pkg/spec/BPMN20/extensions"
98
)
109

@@ -14,13 +13,13 @@ func evaluateExpression(expression string, variableContext map[string]interface{
1413
return expr.Eval(expression, variableContext)
1514
}
1615

17-
func evaluateLocalVariables(varHolder *var_holder.VariableHolder, mappings []extensions.TIoMapping) error {
16+
func evaluateLocalVariables(varHolder *VariableHolder, mappings []extensions.TIoMapping) error {
1817
return mapVariables(varHolder, mappings, func(key string, value interface{}) {
1918
varHolder.SetVariable(key, value)
2019
})
2120
}
2221

23-
func propagateProcessInstanceVariables(varHolder *var_holder.VariableHolder, mappings []extensions.TIoMapping) error {
22+
func propagateProcessInstanceVariables(varHolder *VariableHolder, mappings []extensions.TIoMapping) error {
2423
if len(mappings) == 0 {
2524
for k, v := range varHolder.Variables() {
2625
varHolder.PropagateVariable(k, v)
@@ -31,7 +30,7 @@ func propagateProcessInstanceVariables(varHolder *var_holder.VariableHolder, map
3130
})
3231
}
3332

34-
func mapVariables(varHolder *var_holder.VariableHolder, mappings []extensions.TIoMapping, setVarFunc func(key string, value interface{})) error {
33+
func mapVariables(varHolder *VariableHolder, mappings []extensions.TIoMapping, setVarFunc func(key string, value interface{})) error {
3534
for _, mapping := range mappings {
3635
evalResult, err := evaluateExpression(mapping.Source, varHolder.Variables())
3736
if err != nil {

pkg/bpmn_engine/jobs.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package bpmn_engine
33
import (
44
"time"
55

6-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
7-
86
"github.com/nitram509/lib-bpmn-engine/pkg/spec/BPMN20"
97
)
108

@@ -36,7 +34,7 @@ func (state *BpmnEngineState) handleServiceTask(process *ProcessInfo, instance *
3634
handler := state.findTaskHandler(element)
3735
if handler != nil {
3836
job.JobState = Active
39-
variableHolder := var_holder.New(&instance.VariableHolder, nil)
37+
variableHolder := NewVarHolder(&instance.VariableHolder, nil)
4038
activatedJob := &activatedJob{
4139
processInstanceInfo: instance,
4240
failHandler: func(reason string) { job.JobState = Failed },

pkg/bpmn_engine/jobs_activated.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package bpmn_engine
22

33
import (
44
"time"
5-
6-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
75
)
86

97
// ActivatedJob is a struct to provide information for registered task handler
@@ -18,7 +16,7 @@ type activatedJob struct {
1816
processDefinitionKey int64
1917
elementId string
2018
createdAt time.Time
21-
variableHolder var_holder.VariableHolder
19+
variableHolder VariableHolder
2220
}
2321

2422
// ActivatedJob represents an abstraction for the activated job

pkg/bpmn_engine/links.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"strings"
66

7-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
87
"github.com/nitram509/lib-bpmn-engine/pkg/spec/BPMN20"
98
)
109

@@ -19,7 +18,7 @@ func (state *BpmnEngineState) handleIntermediateThrowEvent(process *ProcessInfo,
1918
}
2019
for _, ice := range process.definitions.Process.IntermediateCatchEvent {
2120
if ice.LinkEventDefinition.Name == linkName {
22-
elementVarHolder := var_holder.New(&instance.VariableHolder, nil)
21+
elementVarHolder := NewVarHolder(&instance.VariableHolder, nil)
2322
if err := propagateProcessInstanceVariables(&elementVarHolder, ite.Output); err != nil {
2423
msg := fmt.Sprintf("Can't evaluate expression in element id=%s name=%s", ite.Id, ite.Name)
2524
nextCommands = []command{errorCommand{

pkg/bpmn_engine/marshalling.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import (
44
"encoding/hex"
55
"encoding/json"
66
"fmt"
7-
8-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
97
"github.com/nitram509/lib-bpmn-engine/pkg/spec/BPMN20"
108
)
119

@@ -48,6 +46,36 @@ type messageSubscriptionAdapter struct {
4846
*messageSubscriptionAlias
4947
}
5048

49+
type variableHolderAdapter struct {
50+
Parent *VariableHolder `json:"p,omitempty"`
51+
Variables map[string]interface{} `json:"v,omitempty"`
52+
}
53+
54+
func (vh *VariableHolder) MarshalJSON() ([]byte, error) {
55+
56+
adapter := variableHolderAdapter{
57+
Parent: vh.parent,
58+
Variables: vh.variables,
59+
}
60+
return json.Marshal(adapter)
61+
}
62+
63+
func (vh *VariableHolder) UnmarshalJSON(data []byte) error {
64+
vha := variableHolderAdapter{}
65+
if err := json.Unmarshal(data, &vha); err != nil {
66+
return err
67+
}
68+
vh.parent = vha.Parent
69+
70+
vars := vha.Variables
71+
if vars == nil {
72+
vars = make(map[string]interface{})
73+
}
74+
75+
vh.variables = vars
76+
return nil
77+
}
78+
5179
type activityAdapterType int
5280

5381
const (
@@ -196,6 +224,7 @@ func (pii *processInstanceInfo) UnmarshalJSON(data []byte) error {
196224
return err
197225
}
198226
pii.ProcessInfo = &ProcessInfo{ProcessKey: adapter.ProcessKey}
227+
pii.VariableHolder = adapter.VariableHolder
199228
recoverProcessInstanceActivitiesPart1(pii, adapter)
200229
return nil
201230
}
@@ -373,7 +402,7 @@ func recoverProcessInstances(state *BpmnEngineState) error {
373402
}
374403
}
375404
state.processInstances[i].ProcessInfo = process
376-
state.processInstances[i].VariableHolder = var_holder.New(nil, nil)
405+
state.processInstances[i].VariableHolder = pi.VariableHolder
377406
}
378407
return nil
379408
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package bpmn_engine
2+
3+
import (
4+
"fmt"
5+
"github.com/corbym/gocrest/is"
6+
"testing"
7+
8+
"github.com/corbym/gocrest/then"
9+
)
10+
11+
func Test_MarshallEngine(t *testing.T) {
12+
bpmnEngine := New()
13+
process, _ := bpmnEngine.LoadFromFile("../../test-cases/simple_task-with_output_mapping.bpmn")
14+
bpmnEngine.NewTaskHandler().Id("id").Handler(func(job ActivatedJob) {
15+
job.SetVariable("valueFromHandler", true)
16+
job.SetVariable("otherVariable", "value")
17+
job.Complete()
18+
})
19+
variableContext := make(map[string]interface{})
20+
variableContext["hello"] = "world"
21+
variableContext["john"] = "doe"
22+
23+
_, _ = bpmnEngine.CreateAndRunInstance(process.ProcessKey, variableContext)
24+
25+
data := bpmnEngine.Marshal()
26+
27+
fmt.Println(string(data))
28+
29+
bpmnEngine, _ = Unmarshal(data)
30+
vars := bpmnEngine.ProcessInstances()[0].VariableHolder
31+
then.AssertThat(t, vars.GetVariable("hello"), is.EqualTo("world"))
32+
then.AssertThat(t, vars.GetVariable("john"), is.EqualTo("doe"))
33+
then.AssertThat(t, vars.GetVariable("valueFromHandler"), is.EqualTo(true))
34+
}

pkg/bpmn_engine/process_instance.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@ package bpmn_engine
22

33
import (
44
"time"
5-
6-
"github.com/nitram509/lib-bpmn-engine/pkg/bpmn_engine/var_holder"
75
)
86

97
// FIXME: shall this be exported?
108
type processInstanceInfo struct {
11-
ProcessInfo *ProcessInfo `json:"-"`
12-
InstanceKey int64 `json:"ik"`
13-
VariableHolder var_holder.VariableHolder `json:"vh,omitempty"`
14-
CreatedAt time.Time `json:"c"`
15-
State ActivityState `json:"s"`
16-
CaughtEvents []catchEvent `json:"ce,omitempty"`
9+
ProcessInfo *ProcessInfo `json:"-"`
10+
InstanceKey int64 `json:"ik"`
11+
VariableHolder VariableHolder `json:"vh,omitempty"`
12+
CreatedAt time.Time `json:"c"`
13+
State ActivityState `json:"s"`
14+
CaughtEvents []catchEvent `json:"ce,omitempty"`
1715
activities []activity
1816
}
1917

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
package var_holder
1+
package bpmn_engine
22

33
type VariableHolder struct {
44
parent *VariableHolder
55
variables map[string]interface{}
66
}
77

8-
// New creates a new VariableHolder with a given parent and variables map.
8+
// NewVarHolder creates a new VariableHolder with a given parent and variables map.
99
// All variables from parent holder are copied into this one.
1010
// (hint: the copy is necessary, due to the fact we need to have all variables for expression evaluation in one map)
11-
func New(parent *VariableHolder, variables map[string]interface{}) VariableHolder {
11+
func NewVarHolder(parent *VariableHolder, variables map[string]interface{}) VariableHolder {
1212
if variables == nil {
1313
variables = make(map[string]interface{})
1414
}

0 commit comments

Comments
 (0)