Passed
Push — master ( 9213a8...e174b6 )
by Kevin
02:14
created

ExtensionHandlerRegistry::afterTask()   B

Complexity

Conditions 7
Paths 13

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 7.0368

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
c 1
b 0
f 0
dl 0
loc 19
ccs 10
cts 11
cp 0.9091
rs 8.8333
cc 7
nc 13
nop 1
crap 7.0368
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Schedule\Extension;
4
5
use Zenstruck\ScheduleBundle\Schedule\Extension;
6
use Zenstruck\ScheduleBundle\Schedule\ScheduleRunContext;
7
use Zenstruck\ScheduleBundle\Schedule\Task\TaskRunContext;
8
9
/**
10
 * @author Kevin Bond <[email protected]>
11
 */
12
final class ExtensionHandlerRegistry
13
{
14
    private $handlers;
15
    private $handlerCache = [];
16
17
    /**
18
     * @param ExtensionHandler[] $handlers
19
     */
20 62
    public function __construct(iterable $handlers)
21
    {
22 62
        $this->handlers = $handlers;
23 62
    }
24
25 27
    public function handlerFor(Extension $extension): ExtensionHandler
26
    {
27 27
        $class = \get_class($extension);
28
29 27
        if (isset($this->handlerCache[$class])) {
30 20
            return $this->handlerCache[$class];
31
        }
32
33 27
        foreach ($this->handlers as $handler) {
34 25
            if ($handler->supports($extension)) {
35 23
                return $this->handlerCache[$class] = $handler;
36
            }
37
        }
38
39 4
        $message = \sprintf('No extension handler registered for "%s: %s".', \get_class($extension), $extension);
40
41 4
        if ($extension instanceof HasMissingHandlerMessage) {
42 4
            $message = $extension->getMissingHandlerMessage();
43
        }
44
45 4
        throw new \LogicException($message);
46
    }
47
48 39
    public function beforeSchedule(ScheduleRunContext $context): void
49
    {
50 39
        foreach ($context->schedule()->getExtensions() as $extension) {
51 14
            $this->handlerFor($extension)->filterSchedule($context, $extension);
52
        }
53
54 34
        foreach ($context->schedule()->getExtensions() as $extension) {
55 9
            $this->handlerFor($extension)->beforeSchedule($context, $extension);
56
        }
57 34
    }
58
59 34
    public function afterSchedule(ScheduleRunContext $context): void
60
    {
61 34
        foreach ($context->schedule()->getExtensions() as $extension) {
62 9
            $this->handlerFor($extension)->afterSchedule($context, $extension);
63
        }
64
65 34
        if ($context->isSuccessful()) {
66 17
            foreach ($context->schedule()->getExtensions() as $extension) {
67 4
                $this->handlerFor($extension)->onScheduleSuccess($context, $extension);
68
            }
69
        }
70
71 34
        if ($context->isFailure()) {
72 17
            foreach ($context->schedule()->getExtensions() as $extension) {
73 5
                $this->handlerFor($extension)->onScheduleFailure($context, $extension);
74
            }
75
        }
76 34
    }
77
78 30
    public function beforeTask(TaskRunContext $context): void
79
    {
80 30
        foreach ($context->task()->getExtensions() as $extension) {
81 15
            $this->handlerFor($extension)->filterTask($context, $extension);
82
        }
83
84 29
        foreach ($context->task()->getExtensions() as $extension) {
85 14
            $this->handlerFor($extension)->beforeTask($context, $extension);
86
        }
87 29
    }
88
89 30
    public function afterTask(TaskRunContext $context): void
90
    {
91 30
        if (!$context->hasRun()) {
92
            return;
93
        }
94
95 30
        foreach ($context->task()->getExtensions() as $extension) {
96 15
            $this->handlerFor($extension)->afterTask($context, $extension);
97
        }
98
99 30
        if ($context->isSuccessful()) {
100 19
            foreach ($context->task()->getExtensions() as $extension) {
101 6
                $this->handlerFor($extension)->onTaskSuccess($context, $extension);
102
            }
103
        }
104
105 30
        if ($context->isFailure()) {
106 17
            foreach ($context->task()->getExtensions() as $extension) {
107 8
                $this->handlerFor($extension)->onTaskFailure($context, $extension);
108
            }
109
        }
110 29
    }
111
}
112