Failed Conditions
Push — master ( ddb3cd...4476ec )
by Marco
11:47
created

DriverChain::loadMetadataForClass()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 19
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 8
nc 5
nop 3
dl 0
loc 19
ccs 0
cts 16
cp 0
crap 20
rs 9.2
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\ORM\Mapping\Driver;
6
7
use Doctrine\ORM\Mapping;
8
9
/**
10
 * The DriverChain allows you to add multiple other mapping drivers for
11
 * certain namespaces.
12
 */
13
class DriverChain implements MappingDriver
14
{
15
    /**
16
     * The default driver.
17
     *
18
     * @var MappingDriver|null
19
     */
20
    private $defaultDriver;
21
22
    /**
23
     * @var MappingDriver[]
24
     */
25
    private $drivers = [];
26
27
    /**
28
     * Gets the default driver.
29
     *
30
     * @return MappingDriver|null
31
     */
32
    public function getDefaultDriver()
33
    {
34
        return $this->defaultDriver;
35
    }
36
37
    /**
38
     * Set the default driver.
39
     */
40
    public function setDefaultDriver(MappingDriver $driver)
41
    {
42
        $this->defaultDriver = $driver;
43
    }
44
45
    /**
46
     * Adds a nested driver.
47
     *
48
     * @param string $namespace
49
     */
50
    public function addDriver(MappingDriver $nestedDriver, $namespace)
51
    {
52
        $this->drivers[$namespace] = $nestedDriver;
53
    }
54
55
    /**
56
     * Gets the array of nested drivers.
57
     *
58
     * @return MappingDriver[] $drivers
59
     */
60
    public function getDrivers()
61
    {
62
        return $this->drivers;
63
    }
64
65
    /**
66
     * {@inheritDoc}
67
     */
68
    public function loadMetadataForClass(
69
        string $className,
70
        Mapping\ClassMetadata $metadata,
71
        Mapping\ClassMetadataBuildingContext $metadataBuildingContext
72
    ) {
73
        /* @var $driver MappingDriver */
74
        foreach ($this->drivers as $namespace => $driver) {
75
            if (strpos($className, $namespace) === 0) {
76
                $driver->loadMetadataForClass($className, $metadata, $metadataBuildingContext);
77
                return;
78
            }
79
        }
80
81
        if ($this->defaultDriver !== null) {
82
            $this->defaultDriver->loadMetadataForClass($className, $metadata, $metadataBuildingContext);
83
            return;
84
        }
85
86
        throw Mapping\MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers));
87
    }
88
89
    /**
90
     * {@inheritDoc}
91
     */
92
    public function getAllClassNames()
93
    {
94
        $classNames    = [];
95
        $driverClasses = [];
96
97
        /* @var $driver MappingDriver */
98
        foreach ($this->drivers as $namespace => $driver) {
99
            $oid = spl_object_id($driver);
100
101
            if (! isset($driverClasses[$oid])) {
102
                $driverClasses[$oid] = $driver->getAllClassNames();
103
            }
104
105
            foreach ($driverClasses[$oid] as $className) {
106
                if (strpos($className, $namespace) === 0) {
107
                    $classNames[$className] = true;
108
                }
109
            }
110
        }
111
112
        if ($this->defaultDriver !== null) {
113
            foreach ($this->defaultDriver->getAllClassNames() as $className) {
114
                $classNames[$className] = true;
115
            }
116
        }
117
118
        return array_keys($classNames);
119
    }
120
121
    /**
122
     * {@inheritDoc}
123
     */
124
    public function isTransient($className)
125
    {
126
        /* @var $driver MappingDriver */
127
        foreach ($this->drivers as $namespace => $driver) {
128
            if (strpos($className, $namespace) === 0) {
129
                return $driver->isTransient($className);
130
            }
131
        }
132
133
        if ($this->defaultDriver !== null) {
134
            return $this->defaultDriver->isTransient($className);
135
        }
136
137
        return true;
138
    }
139
}
140