Passed
Pull Request — master (#4)
by Kevin
07:28
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 60
    public function __construct(iterable $handlers)
21
    {
22 60
        $this->handlers = $handlers;
23 60
    }
24
25 26
    public function handlerFor(Extension $extension): ExtensionHandler
26
    {
27 26
        $class = \get_class($extension);
28
29 26
        if (isset($this->handlerCache[$class])) {
30 19
            return $this->handlerCache[$class];
31
        }
32
33 26
        foreach ($this->handlers as $handler) {
34 24
            if ($handler->supports($extension)) {
35 22
                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 37
    public function beforeSchedule(ScheduleRunContext $context): void
49
    {
50 37
        foreach ($context->schedule()->getExtensions() as $extension) {
51 14
            $this->handlerFor($extension)->filterSchedule($context, $extension);
52
        }
53
54 32
        foreach ($context->schedule()->getExtensions() as $extension) {
55 9
            $this->handlerFor($extension)->beforeSchedule($context, $extension);
56
        }
57 32
    }
58
59 32
    public function afterSchedule(ScheduleRunContext $context): void
60
    {
61 32
        foreach ($context->schedule()->getExtensions() as $extension) {
62 9
            $this->handlerFor($extension)->afterSchedule($context, $extension);
63
        }
64
65 32
        if ($context->isSuccessful()) {
66 15
            foreach ($context->schedule()->getExtensions() as $extension) {
67 4
                $this->handlerFor($extension)->onScheduleSuccess($context, $extension);
68
            }
69
        }
70
71 32
        if ($context->isFailure()) {
72 17
            foreach ($context->schedule()->getExtensions() as $extension) {
73 5
                $this->handlerFor($extension)->onScheduleFailure($context, $extension);
74
            }
75
        }
76 32
    }
77
78 28
    public function beforeTask(TaskRunContext $context): void
79
    {
80 28
        foreach ($context->task()->getExtensions() as $extension) {
81 14
            $this->handlerFor($extension)->filterTask($context, $extension);
82
        }
83
84 27
        foreach ($context->task()->getExtensions() as $extension) {
85 13
            $this->handlerFor($extension)->beforeTask($context, $extension);
86
        }
87 27
    }
88
89 28
    public function afterTask(TaskRunContext $context): void
90
    {
91 28
        if (!$context->hasRun()) {
92
            return;
93
        }
94
95 28
        foreach ($context->task()->getExtensions() as $extension) {
96 14
            $this->handlerFor($extension)->afterTask($context, $extension);
97
        }
98
99 28
        if ($context->isSuccessful()) {
100 17
            foreach ($context->task()->getExtensions() as $extension) {
101 5
                $this->handlerFor($extension)->onTaskSuccess($context, $extension);
102
            }
103
        }
104
105 28
        if ($context->isFailure()) {
106 17
            foreach ($context->task()->getExtensions() as $extension) {
107 8
                $this->handlerFor($extension)->onTaskFailure($context, $extension);
108
            }
109
        }
110 27
    }
111
}
112