WithoutOverlappingHandler::__construct()   A
last analyzed

Complexity

Conditions 4
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 4.25

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 7
ccs 3
cts 4
cp 0.75
rs 10
cc 4
nc 2
nop 1
crap 4.25
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Schedule\Extension\Handler;
4
5
use Symfony\Component\Lock\LockFactory;
6
use Symfony\Component\Lock\PersistingStoreInterface;
7
use Symfony\Component\Lock\Store\FlockStore;
8
use Symfony\Component\Lock\Store\SemaphoreStore;
9
use Zenstruck\ScheduleBundle\Schedule\Exception\MissingDependency;
10
use Zenstruck\ScheduleBundle\Schedule\Exception\SkipTask;
11
use Zenstruck\ScheduleBundle\Schedule\Extension\ExtensionHandler;
12
use Zenstruck\ScheduleBundle\Schedule\Extension\WithoutOverlappingExtension;
13
use Zenstruck\ScheduleBundle\Schedule\Task\TaskRunContext;
14
15
/**
16
 * @author Kevin Bond <[email protected]>
17
 */
18
final class WithoutOverlappingHandler extends ExtensionHandler
19
{
20
    /** @var LockFactory */
21
    private $lockFactory;
22 2
23
    public function __construct(?LockFactory $lockFactory = null)
24 2
    {
25
        if (null === $lockFactory && !\class_exists(LockFactory::class)) {
26
            throw new MissingDependency(WithoutOverlappingExtension::getMissingDependencyMessage());
27
        }
28 2
29 2
        $this->lockFactory = $lockFactory ?: new LockFactory(self::createLocalStore());
30
    }
31
32
    /**
33
     * @param WithoutOverlappingExtension $extension
34 2
     */
35
    public function filterTask(TaskRunContext $context, object $extension): void
36 2
    {
37 1
        if (!$extension->acquireLock($this->lockFactory, $context->getTask()->getId())) {
38
            throw new SkipTask('Task running in another process.');
39 2
        }
40
    }
41
42
    /**
43
     * @param WithoutOverlappingExtension $extension
44 1
     */
45
    public function afterTask(TaskRunContext $context, object $extension): void
46 1
    {
47 1
        $extension->releaseLock();
48
    }
49 1
50
    public function supports(object $extension): bool
51 1
    {
52
        return $extension instanceof WithoutOverlappingExtension;
53
    }
54 1
55
    private static function createLocalStore(): PersistingStoreInterface
56 1
    {
57 1
        if (SemaphoreStore::isSupported()) {
58
            return new SemaphoreStore();
59
        }
60
61
        return new FlockStore();
62
    }
63
}
64