ReferenceImpl::findReferenceSourceElements()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 7
rs 10
1
<?php
2
3
namespace Xml\Impl\Type\Reference;
4
5
use Xml\Type\Reference\ReferenceInterface;
6
use Xml\Instance\ModelElementInstanceInterface;
7
use Xml\Exception\ModelReferenceException;
8
use Xml\Type\Attribute\AttributeInterface;
9
use Xml\Impl\Type\Attribute\AttributeImpl;
10
use Xml\Impl\Type\ModelElementTypeImpl;
11
12
abstract class ReferenceImpl implements ReferenceInterface
13
{
14
    protected $referenceTargetAttribute;
15
16
    private $referenceTargetElementType;
17
18
    abstract protected function setReferenceIdentifier(
19
        ModelElementInstanceInterface $referenceSourceElement,
20
        string $referenceIdentifier
21
    ): void;
22
23
    /**
24
     * @return mixed
25
     */
26
    public function getReferenceTargetElement(ModelElementInstanceInterface $referenceSourceElement)
27
    {
28
        $identifier = $this->getReferenceIdentifier($referenceSourceElement);
29
        $referenceTargetElement = $referenceSourceElement->getModelInstance()->getModelElementById($identifier);
30
        return $referenceTargetElement;
31
    }
32
33
    /**
34
     * @param ModelElementInstanceInterface $referenceSourceElement
35
     * @param mixed $referenceTargetElement
36
     */
37
    public function setReferenceTargetElement(
38
        ModelElementInstanceInterface $referenceSourceElement,
39
        $referenceTargetElement
40
    ): void {
41
        $modelInstance = $referenceSourceElement->getModelInstance();
42
        $referenceTargetIdentifier = $this->referenceTargetAttribute->getValue($referenceTargetElement);
43
        $xml = $modelInstance->getDocument()->getDomSource()->saveXML();
0 ignored issues
show
Unused Code introduced by
The assignment to $xml is dead and can be removed.
Loading history...
44
        $existingElement = $modelInstance->getModelElementById($referenceTargetIdentifier);
45
        if ($existingElement === null || !$existingElement->equals($referenceTargetElement)) {
46
            throw new ModelReferenceException("Cannot create reference to model element");
47
        } else {
48
            $this->setReferenceIdentifier($referenceSourceElement, $referenceTargetIdentifier);
49
        }
50
    }
51
52
    public function setReferenceTargetAttribute(AttributeImpl $referenceTargetAttribute): void
53
    {
54
        $this->referenceTargetAttribute = $referenceTargetAttribute;
55
    }
56
57
    public function getReferenceTargetAttribute(): AttributeInterface
58
    {
59
        return $this->referenceTargetAttribute;
60
    }
61
62
    public function setReferenceTargetElementType(ModelElementTypeImpl $referenceTargetElementType): void
63
    {
64
        $this->referenceTargetElementType = $referenceTargetElementType;
65
    }
66
67
    public function findReferenceSourceElements(ModelElementInstanceInterface $referenceTargetElement): array
68
    {
69
        if ($this->referenceTargetElementType->isBaseTypeOf($referenceTargetElement->getElementType())) {
70
            $owningElementType = $this->getReferenceSourceElementType();
71
            return $referenceTargetElement->getModelInstance()->getModelElementsByType($owningElementType);
72
        } else {
73
            return [];
74
        }
75
    }
76
77
    abstract protected function updateReference(
78
        ModelElementInstanceInterface $referenceSourceElement,
79
        ?string $oldIdentifier,
80
        string $newIdentifier
81
    ): void;
82
83
    public function referencedElementUpdated(
84
        ModelElementInstanceInterface $referenceTargetElement,
85
        ?string $oldIdentifier,
86
        string $newIdentifier
87
    ): void {
88
        foreach ($this->findReferenceSourceElements($referenceTargetElement) as $referenceSourceElement) {
89
            $this->updateReference($referenceSourceElement, $oldIdentifier, $newIdentifier);
90
        }
91
    }
92
93
    abstract protected function removeReference(
94
        ModelElementInstanceInterface $referenceSourceElement,
95
        ModelElementInstanceInterface $referenceTargetElement
96
    ): void;
97
98
    /**
99
     * @param ModelElementInstanceInterface $referenceTargetElement
100
     * @param mixed $referenceIdentifier
101
     */
102
    public function referencedElementRemoved(
103
        ModelElementInstanceInterface $referenceTargetElement,
104
        $referenceIdentifier
105
    ): void {
106
        foreach ($this->findReferenceSourceElements($referenceTargetElement) as $referenceSourceElement) {
107
            if ($referenceIdentifier == $this->getReferenceIdentifier($referenceSourceElement)) {
108
                $this->removeReference($referenceSourceElement, $referenceTargetElement);
109
            }
110
        }
111
    }
112
}
113