Passed
Push — static-analysis ( c8fdad...7d02a1 )
by SignpostMarv
03:21
created

SchemaReaderCallbackAbstraction   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 125
Duplicated Lines 0 %

Test Coverage

Coverage 73.91%

Importance

Changes 0
Metric Value
dl 0
loc 125
ccs 51
cts 69
cp 0.7391
rs 10
c 0
b 0
f 0
wmc 15

5 Methods

Rating   Name   Duplication   Size   Complexity  
A runCallbackAgainstDOMNodeList() 0 19 4
B maybeCallCallableWithArgs() 0 27 6
A maybeLoadSequenceFromElementContainer() 0 16 2
A makeCallbackCallback() 0 18 1
A maybeLoadExtensionFromBaseComplexType() 0 18 2
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[][] $methods
42
    *
43
    * @return mixed
44
    */
45 135
    protected function maybeCallCallableWithArgs(
46
        DOMElement $childNode,
47
        array $commonMethods = [],
48
        array $methods = [],
49
        array $commonArguments = []
50
    ) {
51 135
        foreach ($commonMethods as $commonMethodsSpec) {
52 135
            list ($localNames, $callable, $args) = $commonMethodsSpec;
53
54 135
            if (in_array($childNode->localName, $localNames)) {
55 135
                return call_user_func_array($callable, $args);
56
            }
57 45
        }
58 135
        foreach ($commonArguments as $commonArgumentSpec) {
59 135
            list ($callables, $args) = $commonArgumentSpec;
60
61 135
            if (isset($callables[$childNode->localName])) {
62 135
                return call_user_func_array(
63 135
                    $callables[$childNode->localName],
64 90
                    $args
65 45
                );
66
            }
67 45
        }
68 135
        if (isset($methods[$childNode->localName])) {
69 135
            list ($callable, $args) = $methods[$childNode->localName];
70
71 135
            return call_user_func_array($callable, $args);
72
        }
73 135
    }
74
75 135
    protected function maybeLoadSequenceFromElementContainer(
76
        BaseComplexType $type,
77
        DOMElement $childNode
78
    ) {
79 135
        if (! ($type instanceof ElementContainer)) {
80
            throw new RuntimeException(
81
                '$type passed to ' .
82
                __FUNCTION__ .
83
                'expected to be an instance of ' .
84
                ElementContainer::class .
85
                ' when child node localName is "group", ' .
86
                get_class($type) .
87
                ' given.'
88
            );
89
        }
90 135
        $this->loadSequence($type, $childNode);
91 135
    }
92
93
    /**
94
    * @param Closure|null $callback
95
    *
96
    * @return Closure
97
    */
98
    protected function makeCallbackCallback(
99
        Type $type,
100
        DOMElement $node,
101
        Closure $callbackCallback,
102
        $callback = null
103
    ) {
104 135
        return function (
105
        ) use (
106 135
            $type,
107 135
            $node,
108 135
            $callbackCallback,
109 135
            $callback
110
        ) {
111 135
            $this->runCallbackAgainstDOMNodeList(
112 135
                $type,
113 135
                $node,
114 135
                $callbackCallback,
115 90
                $callback
116 45
            );
117 135
        };
118
    }
119
120
    /**
121
    * @param Closure|null $callback
122
    */
123 135
    protected function runCallbackAgainstDOMNodeList(
124
        Type $type,
125
        DOMElement $node,
126
        Closure $againstNodeList,
127
        $callback = null
128
    ) {
129 135
        $this->fillTypeNode($type, $node, true);
130
131 135
        foreach ($node->childNodes as $childNode) {
132 135
            if ($childNode instanceof DOMElement) {
133 135
                $againstNodeList(
134 135
                    $node,
135 90
                    $childNode
136 45
                );
137 45
            }
138 45
        }
139
140 135
        if ($callback) {
141 135
            call_user_func($callback, $type);
142 45
        }
143 135
    }
144
145 135
    protected function maybeLoadExtensionFromBaseComplexType(
146
        Type $type,
147
        DOMElement $childNode
148
    ) {
149 135
        if (! ($type instanceof BaseComplexType)) {
150
            throw new RuntimeException(
151
                'Argument 1 passed to ' .
152
                __METHOD__ .
153
                ' needs to be an instance of ' .
154
                BaseComplexType::class .
155
                ' when passed onto ' .
156
                static::class .
157
                '::loadExtension(), ' .
158
                get_class($type) .
159
                ' given.'
160
            );
161
        }
162 135
        $this->loadExtension($type, $childNode);
163 135
    }
164
}
165