Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cb5d853

Browse files
committed
[Workflow] Made code simpler
1 parent db69ccc commit cb5d853

File tree

3 files changed

+36
-27
lines changed

3 files changed

+36
-27
lines changed

src/Symfony/Component/Workflow/Tests/StateMachineTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ public function testBuildTransitionBlockerListReturnsExpectedReasonOnBranchMerge
8787
// that are not enabled by the marking are evaluated.
8888
// see https://github.com/symfony/symfony/issues/28432
8989

90-
// Test if when you are in place "a" applying transition "t1" then returned blocker list contains guard blocker instead blockedByMarking
90+
// Test if when you are in place "a"trying transition "t1" then returned
91+
// blocker list contains guard blocker instead blockedByMarking
9192
$subject->marking = 'a';
9293
$transitionBlockerList = $net->buildTransitionBlockerList($subject, 't1');
9394
$this->assertCount(1, $transitionBlockerList);
@@ -96,7 +97,8 @@ public function testBuildTransitionBlockerListReturnsExpectedReasonOnBranchMerge
9697
$this->assertSame('Transition blocker of place a', $blockers[0]->getMessage());
9798
$this->assertSame('blocker', $blockers[0]->getCode());
9899

99-
// Test if when you are in place "d" applying transition "t1" then returned blocker list contains guard blocker instead blockedByMarking
100+
// Test if when you are in place "d" trying transition "t1" then
101+
// returned blocker list contains guard blocker instead blockedByMarking
100102
$subject->marking = 'd';
101103
$transitionBlockerList = $net->buildTransitionBlockerList($subject, 't1');
102104
$this->assertCount(1, $transitionBlockerList);

src/Symfony/Component/Workflow/TransitionBlockerList.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ public function add(TransitionBlocker $blocker): void
3737
$this->blockers[] = $blocker;
3838
}
3939

40+
public function has(string $code): bool
41+
{
42+
foreach ($this->blockers as $blocker) {
43+
if ($code === $blocker->getCode()) {
44+
return true;
45+
}
46+
}
47+
48+
return false;
49+
}
50+
4051
public function clear(): void
4152
{
4253
$this->blockers = array();

src/Symfony/Component/Workflow/Workflow.php

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
2121
use Symfony\Component\Workflow\MarkingStore\MultipleStateMarkingStore;
2222
use Symfony\Component\Workflow\Metadata\MetadataStoreInterface;
23+
use Symfony\Component\Workflow\TransitionBlocker;
2324

2425
/**
2526
* @author Fabien Potencier <[email protected]>
@@ -92,11 +93,7 @@ public function can($subject, $transitionName)
9293
continue;
9394
}
9495

95-
try {
96-
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
97-
} catch (NotEnabledTransitionException $e) {
98-
$transitionBlockerList = $e->getTransitionBlockerList();
99-
}
96+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
10097

10198
if ($transitionBlockerList->isEmpty()) {
10299
return true;
@@ -113,20 +110,26 @@ public function buildTransitionBlockerList($subject, string $transitionName): Tr
113110
{
114111
$transitions = $this->definition->getTransitions();
115112
$marking = $this->getMarking($subject);
113+
116114
$transitionBlockerList = null;
117115

118116
foreach ($transitions as $transition) {
119117
if ($transition->getName() !== $transitionName) {
120118
continue;
121119
}
122120

123-
try {
124-
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
121+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
122+
123+
if ($transitionBlockerList->isEmpty()) {
124+
return $transitionBlockerList;
125+
}
125126

127+
// We prefer to return transitions blocker by something else than
128+
// marking. Because it means the marking was OK Transition are
129+
// deterministic : it's not possible to have many transition enabled
130+
// at the same time that match the same marking with the same name
131+
if (!$transitionBlockerList->has(TransitionBlocker::BLOCKED_BY_MARKING)) {
126132
return $transitionBlockerList;
127-
} catch (NotEnabledTransitionException $e) {
128-
// a transition with the same name is defined for other places too
129-
$transitionBlockerList = $e->getTransitionBlockerList();
130133
}
131134
}
132135

@@ -153,15 +156,11 @@ public function apply($subject, $transitionName)
153156
continue;
154157
}
155158

156-
try {
157-
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
158-
} catch (NotEnabledTransitionException $e) {
159-
$transitionBlockerList = $e->getTransitionBlockerList();
160-
}
161-
162-
if ($transitionBlockerList->isEmpty()) {
163-
$approvedTransitionQueue[] = $transition;
159+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
160+
if (!$transitionBlockerList->isEmpty()) {
161+
continue;
164162
}
163+
$approvedTransitionQueue[] = $transition;
165164
}
166165

167166
foreach ($approvedTransitionQueue as $transition) {
@@ -202,12 +201,7 @@ public function getEnabledTransitions($subject)
202201
$marking = $this->getMarking($subject);
203202

204203
foreach ($this->definition->getTransitions() as $transition) {
205-
try {
206-
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
207-
} catch (NotEnabledTransitionException $e) {
208-
$transitionBlockerList = $e->getTransitionBlockerList();
209-
}
210-
204+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
211205
if ($transitionBlockerList->isEmpty()) {
212206
$enabledTransitions[] = $transition;
213207
}
@@ -252,7 +246,9 @@ private function buildTransitionBlockerListForTransition($subject, Marking $mark
252246
{
253247
foreach ($transition->getFroms() as $place) {
254248
if (!$marking->has($place)) {
255-
throw new NotEnabledTransitionException($subject, $transition->getName(), $this, new TransitionBlockerList(array(TransitionBlocker::createBlockedByMarking($marking))));
249+
return new TransitionBlockerList(array(
250+
TransitionBlocker::createBlockedByMarking($marking),
251+
));
256252
}
257253
}
258254

0 commit comments

Comments
 (0)