Passed
Push — master ( f8574f...0e1b55 )
by Julien
08:17 queued 05:08
created

XmlSchemaValidator::getErrors()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 1
c 1
b 0
f 1
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
1
<?php declare(strict_types=1);
2
3
4
namespace Pitchart\Phlunit\Validator;
5
6
use Pitchart\Phlunit\Constraint\Xml\XmlUtility;
7
use function Pitchart\Transformer\transform;
8
9
class XmlSchemaValidator
10
{
11
    /**
12
     * @var array|ValidationError[]
13
     * @psalm-var array<ValidationError>
14
     */
15
    private $errors = [];
16
17
    /**
18
     * @var \DOMDocument
19
     */
20
    private $schema;
21
22
    /**
23
     * XmlSchemaValidator constructor.
24
     *
25
     * @param string|\DOMDocument $schema
26
     */
27 21
    public function __construct($schema)
28
    {
29 21
        $this->schema = $this->asDomdocument($schema);
30 21
    }
31
32
    /**
33
     * @return ValidationError[]
34
     */
35 4
    public function getErrors(): array
36
    {
37 4
        return $this->errors;
38
    }
39
40
    /**
41
     * @param string|\DOMDocument $xml
42
     *
43
     * @return bool
44
     */
45 19
    public function validate($xml): bool
46
    {
47
        try {
48 19
            $xml = $this->asDomDocument($xml);
49 2
        } catch (\Exception $e) {
50 2
            $this->errors[] = ValidationError::emptyXml();
51 2
            return false;
52
        }
53
54 17
        $internalErrors = \libxml_use_internal_errors(true);
55 17
        \libxml_clear_errors();
56
57 17
        $e = null;
0 ignored issues
show
Unused Code introduced by
The assignment to $e is dead and can be removed.
Loading history...
58
59 17
        $valid = $xml->schemaValidateSource($this->schema->saveXML());
60
61 17
        if (!$valid) {
62 5
            $this->errors  = $this->convertXmlErrors();
63
        }
64
65 17
        \libxml_clear_errors();
66 17
        \libxml_use_internal_errors($internalErrors);
67
68 17
        return $valid;
69
    }
70
71 5
    private function convertXmlErrors(): array
72
    {
73 5
        return transform(\libxml_get_errors())
74 5
            ->map(function(\LibXMLError $error): ValidationError {
75 5
                return ValidationError::fromLibXmlError($error);
76 5
            })->toArray();
77
    }
78
79
    /**
80
     * @param string|\DOMDocument $schema
81
     *
82
     * @return \DOMDocument
83
     */
84 21
    private function asDomDocument($schema): \DOMDocument
85
    {
86 21
        if (\is_string($schema) && \file_exists($schema) && \is_file($schema)) {
87 4
            return XmlUtility::loadFile($schema);
88
        }
89 21
        return  XmlUtility::load($schema);
90
    }
91
}
92