Completed
Push — master ( 6dc464...8b1d35 )
by Mike
03:37
created

XmlMerger::getSingleVariableType()   A

Complexity

Conditions 5
Paths 16

Size

Total Lines 19
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5.025

Importance

Changes 0
Metric Value
cc 5
eloc 9
nc 16
nop 1
dl 0
loc 19
ccs 9
cts 10
cp 0.9
crap 5.025
rs 9.6111
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
5
namespace Xervice\DataProvider\Business\Model\Parser;
6
7
use Xervice\DataProvider\Business\Model\DataProvider\AnyDataProvider;
8
use Xervice\DataProvider\Business\Model\DataProvider\DataProviderInterface;
9
10
class XmlMerger implements XmlMergerInterface
11
{
12
    /**
13
     * @var array
14
     */
15
    private $mergedXml = [];
16
17
    /**
18
     * @param string $xmlContent
19
     */
20 5
    public function addXml(string $xmlContent): void
21
    {
22 5
        $xml = \simplexml_load_string($xmlContent);
23
24 5
        foreach ($xml->DataProvider as $xmlDataProvider) {
25 5
            $dataProvider = $this->parseDataProvider($xmlDataProvider);
26
27 5
            foreach ($xmlDataProvider->DataElement as $element) {
28 5
                $fieldName = (string)$element->attributes()['name'];
29
30 5
                if (isset($this->mergedXml[$dataProvider][$fieldName])) {
31
                    $this->mergedXml[$dataProvider][$fieldName] = array_merge(
32
                        $this->mergedXml[$dataProvider][$fieldName],
33
                        $this->getElementData($element)
34
                    );
35
                } else {
36 5
                    $this->mergedXml[$dataProvider][$fieldName] = $this->getElementData($element);
37
                }
38
            }
39
        }
40
41
42 5
    }
43
44
    /**
45
     * @return array
46
     */
47 5
    public function getData(): array
48
    {
49 5
        return $this->mergedXml;
50
    }
51
52
    /**
53
     * @param \SimpleXMLElement $xmlDataProvider
54
     *
55
     * @return string
56
     */
57 5
    private function parseDataProvider(\SimpleXMLElement $xmlDataProvider): string
58
    {
59 5
        $dataProvider = (string)$xmlDataProvider->attributes()['name'];
60 5
        if (!isset($this->mergedXml[$dataProvider])) {
61 5
            $this->mergedXml[$dataProvider] = [];
62
        }
63
64 5
        return $dataProvider;
65
    }
66
67
    /**
68
     * @param \SimpleXMLElement $element
69
     *
70
     * @return array
71
     */
72 5
    private function getElementData(\SimpleXMLElement $element): array
73
    {
74 5
        $type = (string)$element->attributes()['type'];
75
76
        $data = [
77 5
            'name'      => (string)$element->attributes()['name'],
78 5
            'allownull'      => (bool)$element->attributes()['allownull'],
79 5
            'default'      => (string)$element->attributes()['default'],
80 5
            'type'      => $this->getVariableType($type),
81 5
            'is_collection'  => $this->isCollection($type),
82 5
            'is_dataprovider' => $this->isDataProvider($type)
83
        ];
84
85 5
        $singleton = (string)$element->attributes()['singleton'];
86 5
        if ($singleton !== '') {
87 5
            $data['singleton'] = (string)$element->attributes()['singleton'];
88 5
            $data['singleton_type'] = $this->getSingleVariableType($type);
89
        }
90
91 5
        return $data;
92
    }
93
94
    /**
95
     * @param string $type
96
     *
97
     * @return bool
98
     */
99 5
    private function isDataProvider(string $type) : bool
100
    {
101 5
        return (!$this->isSimpleType($type) && !$this->isCollection($type));
102
    }
103
104
    /**
105
     * @param string $type
106
     *
107
     * @return bool
108
     */
109 5
    private function isCollection(string $type) : bool
110
    {
111 5
        return strpos($type, '[]') !== false;
112
    }
113
114
    /**
115
     * @param string $type
116
     *
117
     * @return bool
118
     */
119 5
    private function isSimpleType(string $type): bool
120
    {
121
        $validTypes = [
122 5
            'int',
123
            'string',
124
            'bool',
125
            'double',
126
            'float',
127
            'array',
128
            'DataProviderInterface',
129
            'DataProviderInterface[]',
130
            DataProviderInterface::class,
131
            DataProviderInterface::class . '[]'
132
        ];
133
134 5
        return \in_array($type, $validTypes, true);
135
    }
136
137
    /**
138
     * @param string $type
139
     *
140
     * @return string
141
     */
142 5
    private function getVariableType(string $type): string
143
    {
144 5
        if (!$this->isSimpleType($type)) {
145 5
            $type = '\DataProvider\\' . $type . 'DataProvider';
146
        }
147
148 5
        if ($type === 'DataProviderInterface') {
149 5
            $type = '\\' . DataProviderInterface::class;
150
        }
151
152 5
        if ($type === 'DataProviderInterface[]') {
153 5
            $type = '\\' . DataProviderInterface::class . '[]';
154
        }
155
156 5
        if (strpos($type, '[]') !== false) {
157 5
            $type = str_replace('[]', '', $type) . '[]';
158
        }
159
160 5
        return $type;
161
    }
162
163
    /**
164
     * @param string $type
165
     *
166
     * @return string
167
     */
168 5
    private function getSingleVariableType(string $type): string
169
    {
170 5
        if (!$this->isSimpleType($type)) {
171 5
            $type = '\DataProvider\\' . $type . 'DataProvider';
172
        }
173
174 5
        if ($type === 'DataProviderInterface') {
175
            $type = '\\' . DataProviderInterface::class;
176
        }
177
178 5
        if ($type === 'DataProviderInterface[]') {
179 5
            $type = '\\' . DataProviderInterface::class . '[]';
180
        }
181
182 5
        if (strpos($type, '[]') !== false) {
183 5
            $type = str_replace('[]', '', $type);
184
        }
185
186 5
        return $type;
187
    }
188
}