Completed
Push — master ( 58d0b6...f4d8f3 )
by Nikola
01:55
created

SaxParser   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 95.45%

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 6
dl 0
loc 84
ccs 21
cts 22
cp 0.9545
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A getDocumentStream() 0 14 4
A factory() 0 8 1
A addStreamAdapter() 0 5 1
A parse() 0 5 2
1
<?php
2
/*
3
 * This file is part of the runopencode/sax, an RunOpenCode project.
4
 *
5
 * (c) 2017 RunOpenCode
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace RunOpenCode\Sax;
11
12
use Psr\Http\Message\StreamInterface;
13
use RunOpenCode\Sax\Contract\SaxHandlerInterface;
14
use RunOpenCode\Sax\Contract\StreamAdapterInterface;
15
use RunOpenCode\Sax\Exception\RuntimeException;
16
use RunOpenCode\Sax\StreamAdapter\DomDocumentAdapter;
17
use RunOpenCode\Sax\StreamAdapter\ResourceAdapter;
18
use RunOpenCode\Sax\StreamAdapter\SimpleXmlAdapter;
19
20
/**
21
 * Class SaxParser
22
 *
23
 * Utility class for working with SAX handler and XML document.
24
 *
25
 * @package RunOpenCode\Sax
26
 */
27
class SaxParser
28
{
29
    /**
30
     * @var StreamAdapterInterface[]
31
     */
32
    private $streamAdapters;
33
34
    /**
35
     * SaxParser constructor.
36
     *
37
     * @param StreamAdapterInterface[] $streamAdapters Stream adapters to register to parser.
38
     */
39 2
    public function __construct(array $streamAdapters = array())
40
    {
41 2
        $this->streamAdapters = array();
42
43 2
        foreach ($streamAdapters as $streamAdapter) {
44 1
            $this->addStreamAdapter($streamAdapter);
45
        }
46 2
    }
47
48
    /**
49
     * Register stream adapter to parser.
50
     *
51
     * @param StreamAdapterInterface $streamAdapter Stream adapter to register.
52
     * @return SaxParser $this Fluent interface.
53
     */
54 2
    public function addStreamAdapter(StreamAdapterInterface $streamAdapter)
55
    {
56 2
        $this->streamAdapters[] = $streamAdapter;
57 2
        return $this;
58
    }
59
60
    /**
61
     * Parse XML document using provided SAX handler.
62
     *
63
     * @param SaxHandlerInterface $saxHandler Handler to user for parsing document.
64
     * @param mixed $xmlDocument XML document source.
65
     * @param callable|null $onResult Callable to execute when parsing is done.
66
     */
67 2
    public function parse(SaxHandlerInterface $saxHandler, $xmlDocument, callable $onResult = null)
68
    {
69 2
        $xmlDocument = ($xmlDocument instanceof StreamInterface) ? $xmlDocument : $this->getDocumentStream($xmlDocument);
70 2
        $saxHandler->parse($xmlDocument, $onResult);
71 2
    }
72
73
    /**
74
     * Convert XML document to stream source.
75
     *
76
     * @param mixed $xmlDocument XML document source.
77
     * @return StreamInterface Converted XML document to stream.
78
     *
79
     * @throws \RuntimeException
80
     */
81 2
    private function getDocumentStream($xmlDocument)
82
    {
83
        /**
84
         * @var StreamAdapterInterface $streamAdapter
85
         */
86 2
        foreach ($this->streamAdapters as $streamAdapter) {
87
88 2
            if ($streamAdapter->supports($xmlDocument)) {
89 2
                return $streamAdapter->convert($xmlDocument);
90
            }
91
        }
92
93
        throw new RuntimeException(sprintf('Suitable XML document stream adapter is not registered for XML document of type "%s".', is_object($xmlDocument) ? get_class($xmlDocument) : gettype($xmlDocument)));
94
    }
95
96
    /**
97
     * Default SAX parser factory.
98
     *
99
     * @param string $streamClass FQCN to use when converting to XML document source to stream.
100
     * @return SaxParser New SAX parser instance.
101
     */
102 1
    public static function factory($streamClass = 'GuzzleHttp\\Psr7\\Stream')
103
    {
104 1
        return new static(array(
105 1
            new ResourceAdapter($streamClass),
106 1
            new DomDocumentAdapter($streamClass),
107 1
            new SimpleXmlAdapter($streamClass)
108
        ));
109
    }
110
}
111