Passed
Push — master ( ae3156...6fb22a )
by Esteban De La Fuente
03:24
created

ManagerWorker   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 22
c 1
b 0
f 0
dl 0
loc 71
ccs 0
cts 15
cp 0
rs 10
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getRepository() 0 23 4
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Package\Prime\Component\Entity\Worker;
26
27
use Derafu\Lib\Core\Foundation\Abstract\AbstractWorker;
28
use Derafu\Lib\Core\Package\Prime\Component\Entity\Contract\ManagerWorkerInterface;
29
use Derafu\Lib\Core\Package\Prime\Component\Entity\Contract\RepositoryInterface;
30
use Derafu\Lib\Core\Package\Prime\Component\Entity\Entity\Entity;
31
use Derafu\Lib\Core\Package\Prime\Component\Entity\Exception\ManagerException;
32
use Derafu\Lib\Core\Package\Prime\Component\Entity\Repository\Repository;
33
34
/**
35
 * Worker "prime.entity.manager".
36
 */
37
class ManagerWorker extends AbstractWorker implements ManagerWorkerInterface
38
{
39
    /**
40
     * Esquema de configuración del worker.
41
     *
42
     * @var array
43
     */
44
    protected array $configurationSchema = [
45
        'entity' => [
46
            'types' => 'array',
47
            'default' => [],
48
            'schema' => [
49
                'normalizationName' => [
50
                    'types' => 'string',
51
                    'default' => 'name',
52
                ],
53
            ],
54
        ],
55
    ];
56
57
    /**
58
     * Listado de fuentes de datos de repositorios de entidades.
59
     *
60
     * @var array
61
     */
62
    private array $sources;
63
64
    /**
65
     * Listado de repositorios que ya han sido cargados desde sus fuentes de
66
     * datos.
67
     *
68
     * @var array
69
     */
70
    private array $repositories = [];
71
72
    /**
73
     * Constructor del worker.
74
     *
75
     * @param array $sources
76
     */
77
    public function __construct(array $sources = [])
78
    {
79
        $this->sources = $sources;
80
    }
81
82
    /**
83
     * {@inheritdoc}
84
     */
85
    public function getRepository(string $source): RepositoryInterface
86
    {
87
        // Si el repositorio no está cargado se trata de cargar.
88
        if (!isset($this->repositories[$source])) {
89
            // Si no hay fuente de datos para el repositorio se genera un error.
90
            if (!isset($this->sources[$source])) {
91
                throw new ManagerException(sprintf(
92
                    'No existe una fuente de datos configurada para crear un repositorio de %s.',
93
                    $source
94
                ));
95
            }
96
97
            // Se tratará de crear el repositorio a partir de la fuente de datos
98
            // asignada.
99
            $this->repositories[$source] = new Repository(
100
                class_exists($source) ? $source : Entity::class,
101
                $this->sources[$source],
102
                $this->getConfiguration()->get('entity.normalizationName')
103
            );
104
        }
105
106
        // Retornar el repositorio solicitado.
107
        return $this->repositories[$source];
108
    }
109
}
110