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

Skip to content

Commit 8a68a05

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

File tree

3 files changed

+35
-27
lines changed

3 files changed

+35
-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: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,7 @@ public function can($subject, $transitionName)
9292
continue;
9393
}
9494

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

10197
if ($transitionBlockerList->isEmpty()) {
10298
return true;
@@ -113,20 +109,26 @@ public function buildTransitionBlockerList($subject, string $transitionName): Tr
113109
{
114110
$transitions = $this->definition->getTransitions();
115111
$marking = $this->getMarking($subject);
112+
116113
$transitionBlockerList = null;
117114

118115
foreach ($transitions as $transition) {
119116
if ($transition->getName() !== $transitionName) {
120117
continue;
121118
}
122119

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

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

@@ -153,15 +155,11 @@ public function apply($subject, $transitionName)
153155
continue;
154156
}
155157

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;
158+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
159+
if (!$transitionBlockerList->isEmpty()) {
160+
continue;
164161
}
162+
$approvedTransitionQueue[] = $transition;
165163
}
166164

167165
foreach ($approvedTransitionQueue as $transition) {
@@ -202,12 +200,7 @@ public function getEnabledTransitions($subject)
202200
$marking = $this->getMarking($subject);
203201

204202
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-
203+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
211204
if ($transitionBlockerList->isEmpty()) {
212205
$enabledTransitions[] = $transition;
213206
}
@@ -252,7 +245,9 @@ private function buildTransitionBlockerListForTransition($subject, Marking $mark
252245
{
253246
foreach ($transition->getFroms() as $place) {
254247
if (!$marking->has($place)) {
255-
throw new NotEnabledTransitionException($subject, $transition->getName(), $this, new TransitionBlockerList(array(TransitionBlocker::createBlockedByMarking($marking))));
248+
return new TransitionBlockerList(array(
249+
TransitionBlocker::createBlockedByMarking($marking),
250+
));
256251
}
257252
}
258253

0 commit comments

Comments
 (0)