Completed
Push — master ( bc91aa...cd6df5 )
by Eric
115:14 queued 112:36
created

DirectoryClassMetadataLoader::createLoader()   C

Complexity

Conditions 7
Paths 15

Size

Total Lines 32
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 7.0052

Importance

Changes 0
Metric Value
dl 0
loc 32
ccs 20
cts 21
cp 0.9524
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 17
nc 15
nop 0
crap 7.0052
1
<?php
2
3
/*
4
 * This file is part of the Ivory Serializer package.
5
 *
6
 * (c) Eric GELOEN <[email protected]>
7
 *
8
 * For the full copyright and license information, please read the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Ivory\Serializer\Mapping\Loader;
13
14
use Ivory\Serializer\Mapping\ClassMetadataInterface;
15
use Ivory\Serializer\Type\Parser\TypeParser;
16
use Ivory\Serializer\Type\Parser\TypeParserInterface;
17
18
/**
19
 * @author GeLo <[email protected]>
20
 */
21
class DirectoryClassMetadataLoader implements MappedClassMetadataLoaderInterface
22
{
23
    /**
24
     * @var string[]
25
     */
26
    private $directories;
27
28
    /**
29
     * @var TypeParserInterface
30
     */
31
    private $typeParser;
32
33
    /**
34
     * @var MappedClassMetadataLoaderInterface|null
35
     */
36
    private $loader;
37
38
    /**
39
     * @var bool
40
     */
41
    private $initialized = false;
42
43
    /**
44
     * @param string|string[]          $directories
45
     * @param TypeParserInterface|null $typeParser
46
     */
47 204
    public function __construct($directories, TypeParserInterface $typeParser = null)
48
    {
49 204
        $directories = is_array($directories) ? $directories : [$directories];
50
51 204
        foreach ($directories as $directory) {
52 204
            if (!is_dir($directory)) {
53 44
                throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist.', $directory));
54
            }
55
56 204
            if (!is_readable($directory)) {
57 102
                throw new \InvalidArgumentException(sprintf('The directory "%s" is not readable.', $directory));
58
            }
59 102
        }
60
61 204
        $this->directories = $directories;
62 204
        $this->typeParser = $typeParser ?: new TypeParser();
63 204
    }
64
65
    /**
66
     * {@inheritdoc}
67
     */
68 156
    public function loadClassMetadata(ClassMetadataInterface $classMetadata)
69
    {
70 156
        return ($loader = $this->getLoader()) !== null && $loader->loadClassMetadata($classMetadata);
71
    }
72
73
    /**
74
     * {@inheritdoc}
75
     */
76 80
    public function getMappedClasses()
77
    {
78 80
        return ($loader = $this->getLoader()) !== null ? $loader->getMappedClasses() : [];
79
    }
80
81
    /**
82
     * @return MappedClassMetadataLoaderInterface|null
83
     */
84 156
    private function getLoader()
85
    {
86 156
        if (!$this->initialized) {
87 156
            $this->createLoader();
88 156
            $this->initialized = true;
89 78
        }
90
91 156
        return $this->loader;
92
    }
93
94 156
    private function createLoader()
95
    {
96
        $extensions = [
97 156
            FileClassMetadataLoader::EXTENSION_JSON,
98 156
            FileClassMetadataLoader::EXTENSION_XML,
99 156
            FileClassMetadataLoader::EXTENSION_YAML,
100 78
        ];
101
102 156
        $loaders = [];
103
104 156
        foreach ($this->directories as $directory) {
105 156
            $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));
106
107 156
            foreach ($iterator as $file) {
108 156
                if ($file->isDir()) {
109 156
                    continue;
110
                }
111
112 156
                $path = $file->getRealPath();
113
114 156
                if (!in_array(pathinfo($path, PATHINFO_EXTENSION), $extensions, true)) {
115
                    continue;
116
                }
117
118 156
                $loaders[] = new FileClassMetadataLoader($path, $this->typeParser);
119 78
            }
120 78
        }
121
122 156
        if (!empty($loaders)) {
123 156
            $this->loader = count($loaders) > 1 ? new ChainClassMetadataLoader($loaders) : array_shift($loaders);
124 78
        }
125 156
    }
126
}
127