Skip to content

Commit 885d08c

Browse files
committed
bug symfony#31331 [Workflow] Fixed dumping when many transition with same name exist (lyrixx)
This PR was merged into the 3.4 branch. Discussion ---------- [Workflow] Fixed dumping when many transition with same name exist | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no> | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | --- With this configuration: ```yaml framework: workflows: foobar: type: workflow supports: - stdClass initial_place: a places: - a - b - c - cancelled transitions: - name: a-b from: a to: b - name: b-c from: b to: c - name: cancel from: a to: cancelled - name: cancel from: b to: cancelled - name: cancel from: c to: cancelled ``` before: ![workflow-broken](https://user-images.githubusercontent.com/408368/56969037-a0315500-6b64-11e9-917e-4c45820938cc.png) After: ![workflow-fixed](https://user-images.githubusercontent.com/408368/56969047-a4f60900-6b64-11e9-8f07-30e701a4978f.png) Commits ------- 312a456 [Workflow] Fixed dumping when many transition with same name exist
2 parents 46645ec + 312a456 commit 885d08c

File tree

2 files changed

+68
-61
lines changed

2 files changed

+68
-61
lines changed

src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ protected function addTransitions(array $transitions)
120120
{
121121
$code = '';
122122

123-
foreach ($transitions as $place) {
124-
$code .= sprintf(" transition_%s [label=\"%s\", shape=box%s];\n", $this->dotize($place['name']), $place['name'], $this->addAttributes($place['attributes']));
123+
foreach ($transitions as $i => $place) {
124+
$code .= sprintf(" transition_%d [label=\"%s\", shape=box%s];\n", $this->dotize($i), $place['name'], $this->addAttributes($place['attributes']));
125125
}
126126

127127
return $code;
@@ -134,19 +134,21 @@ protected function findEdges(Definition $definition)
134134
{
135135
$dotEdges = [];
136136

137-
foreach ($definition->getTransitions() as $transition) {
137+
foreach ($definition->getTransitions() as $i => $transition) {
138138
foreach ($transition->getFroms() as $from) {
139139
$dotEdges[] = [
140140
'from' => $from,
141141
'to' => $transition->getName(),
142142
'direction' => 'from',
143+
'transition_number' => $i,
143144
];
144145
}
145146
foreach ($transition->getTos() as $to) {
146147
$dotEdges[] = [
147148
'from' => $transition->getName(),
148149
'to' => $to,
149150
'direction' => 'to',
151+
'transition_number' => $i,
150152
];
151153
}
152154
}
@@ -162,12 +164,17 @@ protected function addEdges(array $edges)
162164
$code = '';
163165

164166
foreach ($edges as $edge) {
165-
$code .= sprintf(" %s_%s -> %s_%s [style=\"solid\"];\n",
166-
'from' === $edge['direction'] ? 'place' : 'transition',
167-
$this->dotize($edge['from']),
168-
'from' === $edge['direction'] ? 'transition' : 'place',
169-
$this->dotize($edge['to'])
170-
);
167+
if ('from' === $edge['direction']) {
168+
$code .= sprintf(" place_%s -> transition_%d [style=\"solid\"];\n",
169+
$this->dotize($edge['from']),
170+
$this->dotize($edge['transition_number'])
171+
);
172+
} else {
173+
$code .= sprintf(" transition_%d -> place_%s [style=\"solid\"];\n",
174+
$this->dotize($edge['transition_number']),
175+
$this->dotize($edge['to'])
176+
);
177+
}
171178
}
172179

173180
return $code;

src/Symfony/Component/Workflow/Tests/Dumper/GraphvizDumperTest.php

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -73,26 +73,26 @@ public function createComplexWorkflowDefinitionDumpWithMarking()
7373
place_e [label="e", shape=circle];
7474
place_f [label="f", shape=circle];
7575
place_g [label="g", shape=circle];
76-
transition_t1 [label="t1", shape=box, shape="box", regular="1"];
77-
transition_t2 [label="t2", shape=box, shape="box", regular="1"];
78-
transition_t3 [label="t3", shape=box, shape="box", regular="1"];
79-
transition_t4 [label="t4", shape=box, shape="box", regular="1"];
80-
transition_t5 [label="t5", shape=box, shape="box", regular="1"];
81-
transition_t6 [label="t6", shape=box, shape="box", regular="1"];
82-
place_a -> transition_t1 [style="solid"];
83-
transition_t1 -> place_b [style="solid"];
84-
transition_t1 -> place_c [style="solid"];
85-
place_b -> transition_t2 [style="solid"];
86-
place_c -> transition_t2 [style="solid"];
87-
transition_t2 -> place_d [style="solid"];
88-
place_d -> transition_t3 [style="solid"];
89-
transition_t3 -> place_e [style="solid"];
90-
place_d -> transition_t4 [style="solid"];
91-
transition_t4 -> place_f [style="solid"];
92-
place_e -> transition_t5 [style="solid"];
93-
transition_t5 -> place_g [style="solid"];
94-
place_f -> transition_t6 [style="solid"];
95-
transition_t6 -> place_g [style="solid"];
76+
transition_0 [label="t1", shape=box, shape="box", regular="1"];
77+
transition_1 [label="t2", shape=box, shape="box", regular="1"];
78+
transition_2 [label="t3", shape=box, shape="box", regular="1"];
79+
transition_3 [label="t4", shape=box, shape="box", regular="1"];
80+
transition_4 [label="t5", shape=box, shape="box", regular="1"];
81+
transition_5 [label="t6", shape=box, shape="box", regular="1"];
82+
place_a -> transition_0 [style="solid"];
83+
transition_0 -> place_b [style="solid"];
84+
transition_0 -> place_c [style="solid"];
85+
place_b -> transition_1 [style="solid"];
86+
place_c -> transition_1 [style="solid"];
87+
transition_1 -> place_d [style="solid"];
88+
place_d -> transition_2 [style="solid"];
89+
transition_2 -> place_e [style="solid"];
90+
place_d -> transition_3 [style="solid"];
91+
transition_3 -> place_f [style="solid"];
92+
place_e -> transition_4 [style="solid"];
93+
transition_4 -> place_g [style="solid"];
94+
place_f -> transition_5 [style="solid"];
95+
transition_5 -> place_g [style="solid"];
9696
}
9797
';
9898
}
@@ -107,12 +107,12 @@ public function createSimpleWorkflowDumpWithMarking()
107107
place_a [label="a", shape=circle, style="filled"];
108108
place_b [label="b", shape=circle];
109109
place_c [label="c", shape=circle, color="#FF0000", shape="doublecircle"];
110-
transition_t1 [label="t1", shape=box, shape="box", regular="1"];
111-
transition_t2 [label="t2", shape=box, shape="box", regular="1"];
112-
place_a -> transition_t1 [style="solid"];
113-
transition_t1 -> place_b [style="solid"];
114-
place_b -> transition_t2 [style="solid"];
115-
transition_t2 -> place_c [style="solid"];
110+
transition_0 [label="t1", shape=box, shape="box", regular="1"];
111+
transition_1 [label="t2", shape=box, shape="box", regular="1"];
112+
place_a -> transition_0 [style="solid"];
113+
transition_0 -> place_b [style="solid"];
114+
place_b -> transition_1 [style="solid"];
115+
transition_1 -> place_c [style="solid"];
116116
}
117117
';
118118
}
@@ -131,26 +131,26 @@ public function provideComplexWorkflowDumpWithoutMarking()
131131
place_e [label="e", shape=circle];
132132
place_f [label="f", shape=circle];
133133
place_g [label="g", shape=circle];
134-
transition_t1 [label="t1", shape=box, shape="box", regular="1"];
135-
transition_t2 [label="t2", shape=box, shape="box", regular="1"];
136-
transition_t3 [label="t3", shape=box, shape="box", regular="1"];
137-
transition_t4 [label="t4", shape=box, shape="box", regular="1"];
138-
transition_t5 [label="t5", shape=box, shape="box", regular="1"];
139-
transition_t6 [label="t6", shape=box, shape="box", regular="1"];
140-
place_a -> transition_t1 [style="solid"];
141-
transition_t1 -> place_b [style="solid"];
142-
transition_t1 -> place_c [style="solid"];
143-
place_b -> transition_t2 [style="solid"];
144-
place_c -> transition_t2 [style="solid"];
145-
transition_t2 -> place_d [style="solid"];
146-
place_d -> transition_t3 [style="solid"];
147-
transition_t3 -> place_e [style="solid"];
148-
place_d -> transition_t4 [style="solid"];
149-
transition_t4 -> place_f [style="solid"];
150-
place_e -> transition_t5 [style="solid"];
151-
transition_t5 -> place_g [style="solid"];
152-
place_f -> transition_t6 [style="solid"];
153-
transition_t6 -> place_g [style="solid"];
134+
transition_0 [label="t1", shape=box, shape="box", regular="1"];
135+
transition_1 [label="t2", shape=box, shape="box", regular="1"];
136+
transition_2 [label="t3", shape=box, shape="box", regular="1"];
137+
transition_3 [label="t4", shape=box, shape="box", regular="1"];
138+
transition_4 [label="t5", shape=box, shape="box", regular="1"];
139+
transition_5 [label="t6", shape=box, shape="box", regular="1"];
140+
place_a -> transition_0 [style="solid"];
141+
transition_0 -> place_b [style="solid"];
142+
transition_0 -> place_c [style="solid"];
143+
place_b -> transition_1 [style="solid"];
144+
place_c -> transition_1 [style="solid"];
145+
transition_1 -> place_d [style="solid"];
146+
place_d -> transition_2 [style="solid"];
147+
transition_2 -> place_e [style="solid"];
148+
place_d -> transition_3 [style="solid"];
149+
transition_3 -> place_f [style="solid"];
150+
place_e -> transition_4 [style="solid"];
151+
transition_4 -> place_g [style="solid"];
152+
place_f -> transition_5 [style="solid"];
153+
transition_5 -> place_g [style="solid"];
154154
}
155155
';
156156
}
@@ -165,12 +165,12 @@ public function provideSimpleWorkflowDumpWithoutMarking()
165165
place_a [label="a", shape=circle, style="filled"];
166166
place_b [label="b", shape=circle];
167167
place_c [label="c", shape=circle];
168-
transition_t1 [label="t1", shape=box, shape="box", regular="1"];
169-
transition_t2 [label="t2", shape=box, shape="box", regular="1"];
170-
place_a -> transition_t1 [style="solid"];
171-
transition_t1 -> place_b [style="solid"];
172-
place_b -> transition_t2 [style="solid"];
173-
transition_t2 -> place_c [style="solid"];
168+
transition_0 [label="t1", shape=box, shape="box", regular="1"];
169+
transition_1 [label="t2", shape=box, shape="box", regular="1"];
170+
place_a -> transition_0 [style="solid"];
171+
transition_0 -> place_b [style="solid"];
172+
place_b -> transition_1 [style="solid"];
173+
transition_1 -> place_c [style="solid"];
174174
}
175175
';
176176
}

0 commit comments

Comments
 (0)