Passed
Push — master ( 013e5b...2f64eb )
by Mike
03:53
created

XmlMerger   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 187
Duplicated Lines 0 %

Test Coverage

Coverage 93.75%

Importance

Changes 0
Metric Value
eloc 69
dl 0
loc 187
ccs 60
cts 64
cp 0.9375
rs 10
c 0
b 0
f 0
wmc 24

9 Methods

Rating   Name   Duplication   Size   Complexity  
A addXml() 0 18 4
A parseDataProvider() 0 14 2
A getData() 0 3 1
A getSingleVariableType() 0 19 5
A getElementData() 0 23 3
A isDataProvider() 0 3 2
A isCollection() 0 3 1
A isSimpleType() 0 16 1
A getVariableType() 0 19 5
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 9
    public function addXml(string $xmlContent): void
21
    {
22 9
        $xml = \simplexml_load_string($xmlContent);
23
24 9
        foreach ($xml->DataProvider as $xmlDataProvider) {
25 9
            $dataProvider = $this->parseDataProvider($xmlDataProvider);
26
27 9
            foreach ($xmlDataProvider->DataElement as $element) {
28 9
                $fieldName = (string)$element->attributes()['name'];
29
30 9
                if (isset($this->mergedXml[$dataProvider]['elements'][$fieldName])) {
31
                    $this->mergedXml[$dataProvider]['elements'][$fieldName] = array_merge(
32
                        $this->mergedXml[$dataProvider]['elements'][$fieldName],
33
                        $this->getElementData($element, $this->mergedXml[$dataProvider])
34
                    );
35
                }
36
                else {
37 9
                    $this->mergedXml[$dataProvider]['elements'][$fieldName] = $this->getElementData($element, $this->mergedXml[$dataProvider]);
38
                }
39
            }
40
        }
41
42
43 9
    }
44
45
    /**
46
     * @return array
47
     */
48 9
    public function getData(): array
49
    {
50 9
        return $this->mergedXml;
51
    }
52
53
    /**
54
     * @param \SimpleXMLElement $xmlDataProvider
55
     *
56
     * @return string
57
     */
58 9
    private function parseDataProvider(\SimpleXMLElement $xmlDataProvider): string
59
    {
60 9
        $dataProvider = (string)$xmlDataProvider->attributes()['name'];
61 9
        if (!isset($this->mergedXml[$dataProvider])) {
62 9
            $this->mergedXml[$dataProvider] = [
63 9
                'configs' => [
64 9
                    'convertUnderlines' => (bool)$xmlDataProvider->attributes()['ConvertUnderlines'] ?? false,
65 9
                    'deprecated' => (bool)$xmlDataProvider->attributes()['deprecated'] ?? false
66
                ],
67
                'elements' => []
68
            ];
69
        }
70
71 9
        return $dataProvider;
72
    }
73
74
    /**
75
     * @param \SimpleXMLElement $element
76
     *
77
     * @return array
78
     */
79 9
    private function getElementData(\SimpleXMLElement $element, array $dataProvider): array
80
    {
81 9
        $type = (string)$element->attributes()['type'];
82
83 9
        $type = ($type !== 'double') ? $type : 'float';
84
85
        $data = [
86 9
            'name' => (string)$element->attributes()['name'],
87 9
            'allownull' => (bool)$element->attributes()['allownull'],
88 9
            'default' => (string)$element->attributes()['default'],
89 9
            'type' => $this->getVariableType($type),
90 9
            'is_collection' => $this->isCollection($type),
91 9
            'is_dataprovider' => $this->isDataProvider($type),
92 9
            'isCamelCase' => $dataProvider['configs']['convertUnderlines']
93
        ];
94
95 9
        $singleton = (string)$element->attributes()['singleton'];
96 9
        if ($singleton !== '') {
97 9
            $data['singleton'] = (string)$element->attributes()['singleton'];
98 9
            $data['singleton_type'] = $this->getSingleVariableType($type);
99
        }
100
101 9
        return $data;
102
    }
103
104
    /**
105
     * @param string $type
106
     *
107
     * @return bool
108
     */
109 9
    private function isDataProvider(string $type): bool
110
    {
111 9
        return (!$this->isSimpleType($type) && !$this->isCollection($type));
112
    }
113
114
    /**
115
     * @param string $type
116
     *
117
     * @return bool
118
     */
119 9
    private function isCollection(string $type): bool
120
    {
121 9
        return strpos($type, '[]') !== false;
122
    }
123
124
    /**
125
     * @param string $type
126
     *
127
     * @return bool
128
     */
129 9
    private function isSimpleType(string $type): bool
130
    {
131
        $validTypes = [
132 9
            'int',
133
            'string',
134
            'bool',
135
            'double',
136
            'float',
137
            'array',
138
            'DataProviderInterface',
139
            'DataProviderInterface[]',
140
            DataProviderInterface::class,
141
            DataProviderInterface::class . '[]'
142
        ];
143
144 9
        return \in_array($type, $validTypes, true);
145
    }
146
147
    /**
148
     * @param string $type
149
     *
150
     * @return string
151
     */
152 9
    private function getVariableType(string $type): string
153
    {
154 9
        if (!$this->isSimpleType($type)) {
155 9
            $type = '\DataProvider\\' . $type . 'DataProvider';
156
        }
157
158 9
        if ($type === 'DataProviderInterface') {
159 9
            $type = '\\' . DataProviderInterface::class;
160
        }
161
162 9
        if ($type === 'DataProviderInterface[]') {
163 9
            $type = '\\' . DataProviderInterface::class . '[]';
164
        }
165
166 9
        if (strpos($type, '[]') !== false) {
167 9
            $type = str_replace('[]', '', $type) . '[]';
168
        }
169
170 9
        return $type;
171
    }
172
173
    /**
174
     * @param string $type
175
     *
176
     * @return string
177
     */
178 9
    private function getSingleVariableType(string $type): string
179
    {
180 9
        if (!$this->isSimpleType($type)) {
181 9
            $type = '\DataProvider\\' . $type . 'DataProvider';
182
        }
183
184 9
        if ($type === 'DataProviderInterface') {
185
            $type = '\\' . DataProviderInterface::class;
186
        }
187
188 9
        if ($type === 'DataProviderInterface[]') {
189 9
            $type = '\\' . DataProviderInterface::class . '[]';
190
        }
191
192 9
        if (strpos($type, '[]') !== false) {
193 9
            $type = str_replace('[]', '', $type);
194
        }
195
196 9
        return $type;
197
    }
198
}