Completed
Push — master ( d0194b...ae48f4 )
by Matthew
07:32
created

DtcQueueListener::prePersist()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 8
cts 8
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 3
nop 1
crap 3
1
<?php
2
3
namespace Dtc\QueueBundle\Doctrine;
4
5
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
6
use Doctrine\ODM\MongoDB\DocumentManager;
7
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
8
use Doctrine\ORM\EntityManager;
9
use Doctrine\ORM\Id\AssignedGenerator;
10
use Dtc\QueueBundle\Model\RetryableJob;
11
use Dtc\QueueBundle\Model\Run;
12
use Dtc\QueueBundle\ODM\JobManager;
13
use Dtc\QueueBundle\Util\Util;
14
15
class DtcQueueListener
16
{
17
    private $jobArchiveClass;
18
    private $runArchiveClass;
19
    private $objectManager;
20
21 10
    public function __construct($jobArchiveClass, $runArchiveClass)
22
    {
23 10
        $this->jobArchiveClass = $jobArchiveClass;
24 10
        $this->runArchiveClass = $runArchiveClass;
25 10
    }
26
27 28
    public function preRemove(LifecycleEventArgs $eventArgs)
28
    {
29 28
        $this->objectManager = $eventArgs->getObjectManager();
30 28
        $object = $eventArgs->getObject();
31
32 28
        if ($object instanceof \Dtc\QueueBundle\Model\Job) {
33 25
            $this->processJob($object);
34 9
        } elseif ($object instanceof Run) {
35 9
            $this->processRun($object);
36
        }
37 28
    }
38
39 9
    public function processRun(Run $object)
40
    {
41 9
        $runArchiveClass = $this->runArchiveClass;
42 9
        if ($object instanceof $runArchiveClass) {
43
            return;
44
        }
45
46 9
        $runArchive = new $runArchiveClass();
47 9
        Util::copy($object, $runArchive);
48 9
        $objectManager = $this->objectManager;
49 9
        $metadata = $objectManager->getClassMetadata($runArchiveClass);
50 9
        $this->adjustIdGenerator($metadata);
51 9
        $objectManager->persist($runArchive);
52 9
    }
53
54
    /**
55
     * @param $metadata
56
     */
57 28
    protected function adjustIdGenerator($metadata)
58
    {
59 28
        $objectManager = $this->objectManager;
60 28
        if ($objectManager instanceof EntityManager) {
61
            /* @var \Doctrine\ORM\Mapping\ClassMetadata $metadata */
62 12
            $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
63 12
            $metadata->setIdGenerator(new AssignedGenerator());
64 16
        } elseif ($objectManager instanceof DocumentManager) {
65
            /* @var ClassMetadata $metadata */
66 16
            $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
67
        }
68 28
    }
69
70 25
    public function processJob(\Dtc\QueueBundle\Model\Job $object)
71
    {
72 25
        if ($object instanceof \Dtc\QueueBundle\Document\Job ||
73 25
            $object instanceof \Dtc\QueueBundle\Entity\Job) {
74
            /** @var JobManager $jobManager */
75 25
            $archiveObjectName = $this->jobArchiveClass;
76 25
            $objectManager = $this->objectManager;
77 25
            $repository = $objectManager->getRepository($archiveObjectName);
78 25
            $className = $repository->getClassName();
79 25
            $metadata = $objectManager->getClassMetadata($className);
80 25
            $this->adjustIdGenerator($metadata);
81
82
            /** @var RetryableJob $jobArchive */
83 25
            $jobArchive = new $className();
84 25
            Util::copy($object, $jobArchive);
85 25
            $jobArchive->setUpdatedAt(new \DateTime());
86 25
            $objectManager->persist($jobArchive);
87
        }
88 25
    }
89
90 19
    public function preUpdate(LifecycleEventArgs $eventArgs)
91
    {
92 19
        $object = $eventArgs->getObject();
93 19
        if ($object instanceof \Dtc\QueueBundle\Model\RetryableJob) {
94 17
            $dateTime = new \DateTime();
95 17
            $object->setUpdatedAt($dateTime);
96
        }
97 19
    }
98
99 34
    public function prePersist(LifecycleEventArgs $eventArgs)
100
    {
101 34
        $object = $eventArgs->getObject();
102
103 34
        if ($object instanceof \Dtc\QueueBundle\Model\RetryableJob) {
104 31
            $dateTime = new \DateTime();
105 31
            if (!$object->getCreatedAt()) {
106 31
                $object->setCreatedAt($dateTime);
107
            }
108 31
            $object->setUpdatedAt($dateTime);
109
        }
110 34
    }
111
}
112