Completed
Push — master ( f18951...94bfb9 )
by Randy
03:34
created

Hydrator::dehydrate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Dgame\Soap\Hydrator\Dom;
4
5
use Dgame\Soap\Dom\Translator;
6
use Dgame\Soap\Element;
7
use Dgame\Soap\Hydrator\ClassMapper;
8
use Dgame\Soap\Hydrator\HydrateProcedure;
9
use DOMDocument;
10
use DOMNode;
11
12
/**
13
 * Class Hydrator
14
 * @package Dgame\Soap\Hydrator\Dom
15
 */
16
final class Hydrator
17
{
18
    /**
19
     * @var ClassMapper
20
     */
21
    private $mapper;
22
23
    /**
24
     * Hydrator constructor.
25
     *
26
     * @param ClassMapper $mapper
27
     */
28 6
    public function __construct(ClassMapper $mapper)
29
    {
30 6
        $this->mapper = $mapper;
31 6
    }
32
33
    /**
34
     * @param DOMDocument $document
35
     *
36
     * @return array
37
     */
38 6
    public function hydrateDocument(DOMDocument $document): array
39
    {
40 6
        $elements = Translator::new()->translateDocument($document);
41
42 6
        $output = [];
43 6
        foreach ($elements as $element) {
44 6
            $procedure = $this->hydrate($element);
45 6
            if ($procedure->isValid()) {
46 6
                $output[] = $procedure->getHydrate()->getObject();
47
            }
48
        }
49
50 6
        return $output;
51
    }
52
53
    /**
54
     * @param DOMNode $node
55
     *
56
     * @return HydrateProcedure
57
     */
58
    public function hydrateNode(DOMNode $node): HydrateProcedure
59
    {
60
        $element = Translator::new()->translateNode($node);
61
        if ($element === null) {
62
            return new HydrateProcedure($this->mapper);
63
        }
64
65
        return $this->hydrate($element);
66
    }
67
68
    /**
69
     * @param AssemblableInterface $assemblable
70
     * @param DOMNode|null         $node
71
     *
72
     * @return DOMNode
73
     */
74 1
    public function assemble(AssemblableInterface $assemblable, DOMNode $node = null): DOMNode
75
    {
76 1
        return $this->dehydrate($assemblable->assemble(), $node);
77
    }
78
79
    /**
80
     * @param Element      $element
81
     * @param DOMNode|null $node
82
     *
83
     * @return DOMNode
84
     */
85 1
    public function dehydrate(Element $element, DOMNode $node = null): DOMNode
86
    {
87 1
        $node      = $node ?? new DOMDocument('1.0', 'utf-8');
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $node. This often makes code more readable.
Loading history...
88 1
        $assembler = new Assembler($node);
89
90 1
        $element->accept($assembler);
91
92 1
        return $node;
93
    }
94
95
    /**
96
     * @param Element $element
97
     *
98
     * @return HydrateProcedure
99
     */
100 6
    private function hydrate(Element $element): HydrateProcedure
101
    {
102 6
        $procedure = new HydrateProcedure($this->mapper);
103 6
        $element->accept($procedure);
104
105 6
        return $procedure;
106
    }
107
}