Passed
Push — php-7.1 ( ed6d10...451fb2 )
by SignpostMarv
02:49
created

maybeLoadThingFromThing()   B

Complexity

Conditions 2
Paths 1

Size

Total Lines 27
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 3.8204

Importance

Changes 0
Metric Value
cc 2
eloc 15
c 0
b 0
f 0
nc 1
nop 4
dl 0
loc 27
ccs 3
cts 13
cp 0.2308
crap 3.8204
rs 8.8571
1
<?php
2
namespace GoetasWebservices\XML\XSDReader;
3
4
use Closure;
5
use DOMDocument;
6
use DOMElement;
7
use DOMNode;
8
use DOMNodeList;
9
use GoetasWebservices\XML\XSDReader\Exception\IOException;
10
use GoetasWebservices\XML\XSDReader\Exception\TypeException;
11
use GoetasWebservices\XML\XSDReader\Schema\Attribute\Attribute;
12
use GoetasWebservices\XML\XSDReader\Schema\Attribute\AttributeDef;
13
use GoetasWebservices\XML\XSDReader\Schema\Attribute\AttributeItem;
14
use GoetasWebservices\XML\XSDReader\Schema\Attribute\Group as AttributeGroup;
15
use GoetasWebservices\XML\XSDReader\Schema\Element\Element;
16
use GoetasWebservices\XML\XSDReader\Schema\Element\ElementContainer;
17
use GoetasWebservices\XML\XSDReader\Schema\Element\ElementDef;
18
use GoetasWebservices\XML\XSDReader\Schema\Element\ElementItem;
19
use GoetasWebservices\XML\XSDReader\Schema\Element\ElementRef;
20
use GoetasWebservices\XML\XSDReader\Schema\Element\Group;
21
use GoetasWebservices\XML\XSDReader\Schema\Element\GroupRef;
22
use GoetasWebservices\XML\XSDReader\Schema\Element\InterfaceSetMinMax;
23
use GoetasWebservices\XML\XSDReader\Schema\Exception\TypeNotFoundException;
24
use GoetasWebservices\XML\XSDReader\Schema\Inheritance\Base;
25
use GoetasWebservices\XML\XSDReader\Schema\Inheritance\Extension;
26
use GoetasWebservices\XML\XSDReader\Schema\Inheritance\Restriction;
27
use GoetasWebservices\XML\XSDReader\Schema\Item;
28
use GoetasWebservices\XML\XSDReader\Schema\Schema;
29
use GoetasWebservices\XML\XSDReader\Schema\SchemaItem;
30
use GoetasWebservices\XML\XSDReader\Schema\Type\BaseComplexType;
31
use GoetasWebservices\XML\XSDReader\Schema\Type\ComplexType;
32
use GoetasWebservices\XML\XSDReader\Schema\Type\ComplexTypeSimpleContent;
33
use GoetasWebservices\XML\XSDReader\Schema\Type\SimpleType;
34
use GoetasWebservices\XML\XSDReader\Schema\Type\Type;
35
use GoetasWebservices\XML\XSDReader\Utils\UrlUtils;
36
use RuntimeException;
37
38
abstract class SchemaReaderCallbackAbstraction extends AbstractSchemaReader
39
{
40
    /**
41
    * @param mixed[][] $commonMethods
42
    * @param mixed[][] $methods
43
    * @param mixed[][] $commonArguments
44
    *
45
    * @return mixed
46
    */
47 45
    protected function maybeCallCallableWithArgs(
48
        DOMElement $childNode,
49
        array $commonMethods = [],
50
        array $methods = [],
51
        array $commonArguments = []
52
    ) {
53 45
        foreach ($commonMethods as $commonMethodsSpec) {
54 45
            list ($localNames, $callable, $args) = $commonMethodsSpec;
55
56
            /**
57
            * @var string[] $localNames
58
            */
59 45
            $localNames = $localNames;
60
61
            /**
62
            * @var callable $callable
63
            */
64 45
            $callable = $callable;
65
66
            /**
67
            * @var mixed[] $args
68
            */
69 45
            $args = $args;
70
71 45
            if (in_array($childNode->localName, $localNames)) {
72 45
                return call_user_func_array($callable, $args);
73
            }
74
        }
75 45
        foreach ($commonArguments as $commonArgumentSpec) {
76
            /**
77
            * @var mixed[] $commonArgumentSpec
78
            */
79 45
            list ($callables, $args) = $commonArgumentSpec;
80
81
            /**
82
            * @var callable[] $callables
83
            */
84 45
            $callables = $callables;
85
86
            /**
87
            * @var mixed[]
88
            */
89 45
            $args = $args;
90
91 45
            if (isset($callables[$childNode->localName])) {
92 45
                return call_user_func_array(
93 45
                    $callables[$childNode->localName],
94 45
                    $args
95
                );
96
            }
97
        }
98 45
        if (isset($methods[$childNode->localName])) {
99 45
            list ($callable, $args) = $methods[$childNode->localName];
100
101
            /**
102
            * @var callable $callable
103
            */
104 45
            $callable = $callable;
105
106
            /**
107
            * @var mixed[] $args
108
            */
109 45
            $args = $args;
110
111 45
            return call_user_func_array($callable, $args);
112
        }
113 45
    }
114
115 45
    protected function maybeLoadSequenceFromElementContainer(
116
        BaseComplexType $type,
117
        DOMElement $childNode
118
    ) : void {
119 45
        $this->maybeLoadThingFromThing(
120 45
            $type,
121 45
            $childNode,
122 45
            ElementContainer::class,
123 45
            'loadSequence'
124
        );
125 45
    }
126
127
    /**
128
    * @param string $instanceof
129
    * @param string $passTo
130
    */
131 45
    protected function maybeLoadThingFromThing(
132
        Type $type,
133
        DOMElement $childNode,
134
        $instanceof,
135
        $passTo
136
    ) : void {
137 45
        if (! is_a($type, $instanceof, true)) {
138
            /**
139
            * @var string $class
140
            */
141
            $class = static::class;
142
            throw new RuntimeException(
143
                'Argument 1 passed to ' .
144
                __METHOD__ .
145
                ' needs to be an instance of ' .
146
                $instanceof .
147
                ' when passed onto ' .
148
                $class .
149
                '::' .
150
                $passTo .
151
                '(), ' .
152
                (string) get_class($type) .
153
                ' given.'
154
            );
155
        }
156
157 45
        $this->$passTo($type, $childNode);
158 45
    }
159
160
    protected function makeCallbackCallback(
161
        Type $type,
162
        DOMElement $node,
163
        Closure $callbackCallback,
164
        Closure $callback = null
165
    ) : Closure {
166 45
        return function (
167
        ) use (
168 45
            $type,
169 45
            $node,
170 45
            $callbackCallback,
171 45
            $callback
172
        ) : void {
173 45
            $this->runCallbackAgainstDOMNodeList(
174 45
                $type,
175 45
                $node,
176 45
                $callbackCallback,
177 45
                $callback
178
            );
179 45
        };
180
    }
181
182 45
    protected function runCallbackAgainstDOMNodeList(
183
        Type $type,
184
        DOMElement $node,
185
        Closure $againstNodeList,
186
        Closure $callback = null
187
    ) : void {
188 45
        $this->fillTypeNode($type, $node, true);
189
190 45
        static::againstDOMNodeList($node, $againstNodeList);
191
192 45
        if ($callback) {
193 45
            call_user_func($callback, $type);
194
        }
195 45
    }
196
197 45
    protected function maybeLoadExtensionFromBaseComplexType(
198
        Type $type,
199
        DOMElement $childNode
200
    ) : void {
201 45
        $this->maybeLoadThingFromThing(
202 45
            $type,
203 45
            $childNode,
204 45
            BaseComplexType::class,
205 45
            'loadExtension'
206
        );
207 45
    }
208
}
209