Completed
Push — master ( 260504...c2ab20 )
by Alex
18s queued 11s
created

Map::reset()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
2
namespace AlgoWeb\PODataLaravel\Models\ObjectMap;
3
4
use AlgoWeb\PODataLaravel\Models\ObjectMap\Entities\Associations\Association;
5
use AlgoWeb\PODataLaravel\Models\ObjectMap\Entities\Associations\AssociationMonomorphic;
6
use AlgoWeb\PODataLaravel\Models\ObjectMap\Entities\EntityGubbins;
7
8
class Map
9
{
10
    /**
11
     * @var EntityGubbins[]
12
     */
13
    private $entities = [];
14
15
    /**
16
     * @var Association[]
17
     */
18
    private $associations = [];
19
20
    /**
21
     * @param EntityGubbins $entity
22
     */
23
    public function addEntity(EntityGubbins $entity)
24
    {
25
        $this->entities[$entity->getClassName()] = $entity;
26
    }
27
28
    /**
29
     * @return EntityGubbins[]
30
     */
31
    public function getEntities()
32
    {
33
        return $this->entities;
34
    }
35
36
    public function resolveEntity($entityClassName)
37
    {
38
        return array_key_exists($entityClassName, $this->entities) ? $this->entities[$entityClassName] : null;
39
    }
40
41
    /**
42
     * @param EntityGubbins[] $entities
43
     */
44
    public function setEntities(array $entities)
45
    {
46
        $this->entities = [];
47
        foreach ($entities as $entity) {
48
            if (!$entity instanceof EntityGubbins) {
49
                throw new \InvalidArgumentException('Entities array must contain only EntityGubbins objects');
50
            }
51
        }
52
        foreach ($entities as $entity) {
53
            $this->entities[$entity->getClassName()] = $entity;
54
        }
55
    }
56
57
    /**
58
     * @param  Association[]                            $associations
59
     * @throws \POData\Common\InvalidOperationException
60
     */
61
    public function setAssociations(array $associations)
62
    {
63
        foreach ($associations as $association) {
64
            $this->addAssociation($association);
65
        }
66
    }
67
68
    /**
69
     * @param  Association                              $association
70
     * @throws \POData\Common\InvalidOperationException
71
     */
72
    public function addAssociation(Association $association)
73
    {
74
        if ($association instanceof AssociationMonomorphic) {
75
            $this->addAssociationMonomorphic($association);
76
        } else {
77
            throw new \InvalidArgumentException('Association type not yet handled');
78
        }
79
        $this->associations[] = $association;
80
    }
81
82
    /**
83
     * @return Association[]
84
     */
85
    public function getAssociations()
86
    {
87
        return $this->associations;
88
    }
89
90
    /**
91
     * @return bool
92
     */
93
    public function isOK()
94
    {
95
        foreach ($this->entities as $entity) {
96
            if (!$entity->isOK()) {
97
                return false;
98
            }
99
        }
100
        return true;
101
    }
102
103
    /**
104
     * @param  AssociationMonomorphic                   $association
105
     * @throws \POData\Common\InvalidOperationException
106
     */
107
    private function addAssociationMonomorphic(AssociationMonomorphic $association)
108
    {
109
        $firstClass = $this->entities[$association->getFirst()->getBaseType()];
110
        $secondClass = $this->entities[$association->getLast()->getBaseType()];
111
        $firstClass->addAssociation($association);
112
        $secondClass->addAssociation($association, false);
113
    }
114
}
115