GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — dev ( a469da...7bd346 )
by Андрей
02:47
created

Workflow::findActionByNameForEntry()   C

Complexity

Conditions 8
Paths 12

Size

Total Lines 44
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 44
rs 5.3846
cc 8
eloc 30
nc 12
nop 3
1
<?php
2
/**
3
 * @link https://github.com/old-town/workflow-zf2
4
 * @author  Malofeykin Andrey  <[email protected]>
5
 */
6
namespace OldTown\Workflow\ZF2\ServiceEngine;
7
8
use OldTown\Workflow\Loader\WorkflowDescriptor;
9
use OldTown\Workflow\TransientVars\TransientVarsInterface;
10
use OldTown\Workflow\WorkflowInterface;
11
use Zend\EventManager\EventManagerAwareTrait;
12
use Zend\ServiceManager\ServiceLocatorAwareTrait;
13
use Traversable;
14
use Zend\Stdlib\ArrayUtils;
15
use OldTown\Workflow\TransientVars\BaseTransientVars;
16
use OldTown\Workflow\ZF2\Event\WorkflowEvent;
17
use OldTown\Workflow\ZF2\ServiceEngine\Workflow\TransitionResult;
18
use OldTown\Workflow\ZF2\ServiceEngine\Workflow\TransitionResultInterface;
19
use OldTown\Workflow\ZF2\Options\ModuleOptions;
20
use OldTown\Workflow\Loader\ActionDescriptor;
21
22
/**
23
 * Class Workflow
24
 *
25
 * @package OldTown\Workflow\ZF2\ServiceEngine
26
 */
27
class Workflow implements WorkflowServiceInterface
28
{
29
    use ServiceLocatorAwareTrait, EventManagerAwareTrait;
30
31
    /**
32
     * Паттерн для получения имени сервиса workflow
33
     *
34
     * @var string
35
     */
36
    protected $workflowManagerServiceNamePattern = 'workflow.manager.%s';
37
38
    /**
39
     * Конфигурация модуля
40
     *
41
     * @var ModuleOptions
42
     */
43
    protected $moduleOptions;
44
45
    /**
46
     * @param $options
47
     *
48
     * @throws \Zend\Stdlib\Exception\InvalidArgumentException
49
     * @throws \OldTown\Workflow\ZF2\Service\Exception\InvalidArgumentException
50
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidArgumentException
51
     */
52
    public function __construct($options)
53
    {
54
        $this->init($options);
55
    }
56
57
    /**
58
     * Инициализация сервиса
59
     *
60
     * @param $options
61
     *
62
     * @throws \Zend\Stdlib\Exception\InvalidArgumentException
63
     * @throws \OldTown\Workflow\ZF2\Service\Exception\InvalidArgumentException
64
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidArgumentException
65
     */
66
    protected function init($options)
67
    {
68
        if ($options instanceof Traversable) {
69
            $options = ArrayUtils::iteratorToArray($options);
70
        } elseif (!is_array($options)) {
71
            $errMsg = sprintf('%s  expects an array or Traversable config', __METHOD__);
72
            throw new Exception\InvalidArgumentException($errMsg);
73
        }
74
75
        if (!array_key_exists('serviceLocator', $options)) {
76
            $errMsg = 'Argument serviceLocator not found';
77
            throw new Exception\InvalidArgumentException($errMsg);
78
        }
79
        $this->setServiceLocator($options['serviceLocator']);
80
81
        if (!array_key_exists('moduleOptions', $options)) {
82
            $errMsg = 'Argument moduleOptions not found';
83
            throw new Exception\InvalidArgumentException($errMsg);
84
        }
85
        $this->setModuleOptions($options['moduleOptions']);
86
    }
87
88
    /**
89
     * Запуск перехода из отдного состояния в другое
90
     *
91
     * @param                        $managerName
92
     * @param                        $entryId
93
     * @param                        $actionName
94
     *
95
     * @param TransientVarsInterface $transientVars
96
     *
97
     * @return TransitionResultInterface
98
     *
99
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\DoActionException
100
     */
101
    public function doAction($managerName, $entryId, $actionName, TransientVarsInterface $transientVars = null)
102
    {
103
        try {
104
            $event = new WorkflowEvent();
105
            $event->setTarget($this);
106
            $event->setEntryId($entryId);
107
108
            $manager = $this->getWorkflowManager($managerName);
109
            $event->setWorkflowManager($manager);
110
111
            $workflowStore = $manager->getConfiguration()->getWorkflowStore();
112
113
            $entry = $workflowStore->findEntry($entryId);
114
            $workflowName = $entry->getWorkflowName();
115
116
            $wf = $manager->getConfiguration()->getWorkflow($workflowName);
117
            $event->setWorkflow($wf);
118
119
            //$action = $this->getActionByName($wf, $actionName);
0 ignored issues
show
Unused Code Comprehensibility introduced by
65% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
120
            $action = $this->findActionByNameForEntry($managerName, $entryId, $actionName);
121
122
123
            $actionId = $action->getId();
124
125
            if (null === $transientVars) {
126
                $transientVars = new BaseTransientVars();
127
            }
128
129
            $event->setTransientVars($transientVars);
130
131
            $manager->doAction($entryId, $actionId, $transientVars);
132
133
            $this->getEventManager()->trigger(WorkflowEvent::EVENT_DO_ACTION, $this, $event);
134
135
            $viewName = $action->getView();
136 View Code Duplication
            if (null !== $viewName) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
137
                $event->setViewName($viewName);
138
                $event->setName(WorkflowEvent::EVENT_RENDER);
139
                $this->getEventManager()->trigger($event);
140
            }
141
        } catch (\Exception $e) {
142
            throw new Exception\DoActionException($e->getMessage(), $e->getCode(), $e);
143
        }
144
145
        $result = new TransitionResult($entryId, $manager, $wf, $transientVars);
146
        if ($viewName) {
147
            $result->setViewName($viewName);
148
        }
149
150
        return $result;
151
    }
152
153
    /**
154
     * Ишет действие по имени. Поиск происходит в рамках текущего step'a.
155
     *
156
     * @param $managerName
157
     * @param $entryId
158
     * @param $actionName
159
     *
160
     * @return ActionDescriptor|null
161
     *
162
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException
163
     * @throws \Zend\ServiceManager\Exception\ServiceNotFoundException
164
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException
165
     * @throws \OldTown\Workflow\Exception\ArgumentNotNumericException
166
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowActionNameException
167
     * @throws \OldTown\Workflow\Exception\FactoryException
168
     */
169
    public function findActionByNameForEntry($managerName, $entryId, $actionName)
170
    {
171
        $manager = $this->getWorkflowManager($managerName);
172
        $currentSteps = $manager->getCurrentSteps($entryId);
173
174
        $entry = $manager->getConfiguration()->getWorkflowStore()->findEntry($entryId);
175
        $workflowName = $entry->getWorkflowName();
176
177
        $wf = $manager->getConfiguration()->getWorkflow($workflowName);
178
179
        $findActions = [];
180
        foreach ($currentSteps as $currentStep) {
181
            $stepId = $currentStep->getStepId();
182
            $step = $wf->getStep($stepId);
183
            $actions = $step->getActions();
184
185
            foreach ($actions as $action) {
186
                if ($actionName === $action->getName()) {
187
                    $findActions[] = $action;
188
                }
189
            }
190
        }
191
192
        $countActions = count($findActions);
193
        if ($countActions > 1) {
194
            $errMsg = sprintf(
195
                'Found more than one action workflow. Manager name: %s. Workflow name: %s. Name action: %s. Ids: %s',
196
                $managerName,
197
                $workflowName,
198
                $actionName,
199
                implode(',', array_map(function ($action) {
200
                    return is_object($action) && method_exists($action, 'getId') ? call_user_func([$action, 'getId']) : '';
201
                }, $findActions))
202
            );
203
204
            throw new Exception\InvalidWorkflowActionNameException($errMsg);
205
        }
206
        $findAction = null;
207
        if (1 === $countActions) {
208
            reset($findActions);
209
            $findAction = current($findActions);
210
        }
211
        return $findAction;
212
    }
213
214
    /**
215
     * Создание процесса workflow
216
     *
217
     * @param                        $managerName
218
     * @param                        $workflowName
219
     * @param                        $actionName
220
     *
221
     * @param TransientVarsInterface $transientVars
222
     *
223
     * @return TransitionResultInterface
224
     *
225
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidInitializeWorkflowEntryException
226
     */
227
    public function initialize($managerName, $workflowName, $actionName, TransientVarsInterface $transientVars = null)
228
    {
229
        try {
230
            $event = new WorkflowEvent();
231
            $event->setTarget($this);
232
233
            $manager = $this->getWorkflowManager($managerName);
234
            $event->setWorkflowManager($manager);
235
            $wf = $manager->getConfiguration()->getWorkflow($workflowName);
236
            $event->setWorkflow($wf);
237
238
            $actionId = null;
239
            $initialActions = $wf->getInitialActions();
240
241
            foreach ($initialActions as $initialAction) {
242
                if ($actionName === $initialAction->getName()) {
243
                    $actionId = $initialAction->getId();
244
                    break;
245
                }
246
            }
247
248
            if (null === $actionId) {
249
                $errMsg = sprintf('Action %s not found', $actionName);
250
                throw new Exception\ActionNotFoundException($errMsg);
251
            }
252
253
            if (null === $transientVars) {
254
                $transientVars = new BaseTransientVars();
255
            }
256
            $event->setTransientVars($transientVars);
257
            $entryId = $manager->initialize($workflowName, $actionId, $transientVars);
258
            $event->setEntryId($entryId);
259
260
            $this->getEventManager()->trigger(WorkflowEvent::EVENT_WORKFLOW_INITIALIZE, $this, $event);
261
262
263
            $initialActions = $wf->getInitialAction($actionId);
264
            $viewName = $initialActions->getView();
265 View Code Duplication
            if (null !== $viewName) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
266
                $event->setViewName($viewName);
267
                $event->setName(WorkflowEvent::EVENT_RENDER);
268
                $this->getEventManager()->trigger($event);
269
            }
270
        } catch (\Exception $e) {
271
            throw new Exception\InvalidInitializeWorkflowEntryException($e->getMessage(), $e->getCode(), $e);
272
        }
273
274
        $result = new TransitionResult($entryId, $manager, $wf, $transientVars);
275
        if ($viewName) {
276
            $result->setViewName($viewName);
277
        }
278
279
        return $result;
280
    }
281
282
    /**
283
     * Конфигурация модуля
284
     *
285
     * @return ModuleOptions
286
     */
287
    public function getModuleOptions()
288
    {
289
        return $this->moduleOptions;
290
    }
291
292
    /**
293
     * Устанавливает конфигурацию модуля
294
     *
295
     * @param ModuleOptions $moduleOptions
296
     *
297
     * @return $this
298
     */
299
    public function setModuleOptions(ModuleOptions $moduleOptions)
300
    {
301
        $this->moduleOptions = $moduleOptions;
302
303
        return $this;
304
    }
305
306
307
308
    /**
309
     * Получение менеджера workflow по имени
310
     *
311
     * @param string $managerName
312
     *
313
     * @return WorkflowInterface
314
     *
315
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException
316
     * @throws \Zend\ServiceManager\Exception\ServiceNotFoundException
317
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException
318
     */
319
    public function getWorkflowManager($managerName)
320
    {
321
        if (!$this->hasWorkflowManager($managerName)) {
322
            $errMsg = sprintf('Invalid workflow manager name %s', $managerName);
323
            throw new Exception\InvalidManagerNameException($errMsg);
324
        }
325
        $workflowManagerServiceName = $this->getWorkflowManagerServiceName($managerName);
326
327
        $manager =  $this->getServiceLocator()->get($workflowManagerServiceName);
328
329
        if (!$manager instanceof WorkflowInterface) {
330
            $errMsg = sprintf('Workflow manager not implement %s', WorkflowInterface::class);
331
            throw new Exception\InvalidWorkflowManagerException($errMsg);
332
        }
333
334
        return $manager;
335
    }
336
337
338
339
340
    /**
341
     * @param WorkflowDescriptor $wf
342
     * @param                    $actionName
343
     *
344
     * @return null|ActionDescriptor
345
     */
346
    public function getActionByName(WorkflowDescriptor $wf, $actionName)
347
    {
348
        $actionName = (string)$actionName;
349
350
        foreach ($wf->getGlobalActions() as $actionDescriptor) {
351
            if ($actionName === $actionDescriptor->getName()) {
352
                return $actionDescriptor;
353
            }
354
        }
355
356
        foreach ($wf->getSteps() as $stepDescriptor) {
357
            $actions = $stepDescriptor->getActions();
358
            foreach ($actions as $actionDescriptor) {
359
                if ($actionName === $actionDescriptor->getName()) {
360
                    return $actionDescriptor;
361
                }
362
            }
363
        }
364
365
        foreach ($wf->getInitialActions() as $actionDescriptor) {
366
            if ($actionName === $actionDescriptor->getName()) {
367
                return $actionDescriptor;
368
            }
369
        }
370
371
        return null;
372
    }
373
374
    /**
375
     * Проверят есть ли менеджер workflow с заданным именем
376
     *
377
     * @param string $workflowManagerName
378
     *
379
     * @return bool
380
     */
381
    public function hasWorkflowManager($workflowManagerName)
382
    {
383
        $workflowManagerServiceName = $this->getWorkflowManagerServiceName($workflowManagerName);
384
385
        return $this->getServiceLocator()->has($workflowManagerServiceName);
386
    }
387
388
    /**
389
     * Имя сервиса для получения менеджера workflow
390
     *
391
     * @param string $workflowManagerName
392
     *
393
     * @return string
394
     */
395
    public function getWorkflowManagerServiceName($workflowManagerName)
396
    {
397
        return sprintf($this->getWorkflowManagerServiceNamePattern(), $workflowManagerName);
398
    }
399
400
    /**
401
     * @return string
402
     */
403
    public function getWorkflowManagerServiceNamePattern()
404
    {
405
        return $this->workflowManagerServiceNamePattern;
406
    }
407
408
    /**
409
     * @param string $workflowManagerServiceNamePattern
410
     *
411
     * @return $this
412
     */
413
    public function setWorkflowManagerServiceNamePattern($workflowManagerServiceNamePattern)
414
    {
415
        $this->workflowManagerServiceNamePattern = (string)$workflowManagerServiceNamePattern;
416
417
        return $this;
418
    }
419
420
    /**
421
     * Возвращает имя менеджера по его пседовниму
422
     *
423
     * @param $alias
424
     *
425
     * @return string
426
     *
427
     * @throws Exception\InvalidWorkflowManagerAliasException
428
     */
429
    public function getManagerNameByAlias($alias)
430
    {
431
        $aliasMap = $this->getModuleOptions()->getManagerAliases();
432
        if (!array_key_exists($alias, $aliasMap)) {
433
            $errMsg = sprintf('Invalid workflow manager alias: %s', $alias);
434
            throw new Exception\InvalidWorkflowManagerAliasException($errMsg);
435
        }
436
437
        return $aliasMap[$alias];
438
    }
439
440
441
    /**
442
     * Проверяет есть ли псевдоним для менеджера workflow
443
     *
444
     * @param string $alias
445
     *
446
     * @return boolean
447
     */
448
    public function hasWorkflowManagerAlias($alias)
449
    {
450
        $aliasMap = $this->getModuleOptions()->getManagerAliases();
451
        return array_key_exists($alias, $aliasMap);
452
    }
453
454
    /**
455
     * Получение менеджера workflow по его псевдониму
456
     *
457
     * @param $alias
458
     *
459
     * @return WorkflowInterface
460
     *
461
     * @throws Exception\InvalidWorkflowManagerAliasException
462
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidManagerNameException
463
     * @throws \Zend\ServiceManager\Exception\ServiceNotFoundException
464
     * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidWorkflowManagerException
465
     */
466
    public function getWorkflowManagerByAlias($alias)
467
    {
468
        $name = $this->getManagerNameByAlias($alias);
469
        return $this->getWorkflowManager($name);
470
    }
471
}
472