-
-
Notifications
You must be signed in to change notification settings - Fork 841
/
XmlPropertyNameCollectionFactory.php
96 lines (79 loc) · 3.03 KB
/
XmlPropertyNameCollectionFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace ApiPlatform\Core\Metadata\Property\Factory;
use ApiPlatform\Core\Exception\InvalidArgumentException;
use ApiPlatform\Core\Exception\ResourceClassNotFoundException;
use ApiPlatform\Core\Metadata\Property\PropertyNameCollection;
use Symfony\Component\Config\Util\XmlUtils;
/**
* Creates a property name collection from XML {@see Property} configuration files.
*
* @author Baptiste Meyer <baptiste.meyer@gmail.com>
*/
class XmlPropertyNameCollectionFactory implements PropertyNameCollectionFactoryInterface
{
const RESOURCE_SCHEMA = __DIR__.'/../../schema/metadata.xsd';
private $paths;
private $decorated;
/**
* @param array $paths
* @param PropertyNameCollectionFactoryInterface|null $decorated
*/
public function __construct(array $paths, PropertyNameCollectionFactoryInterface $decorated = null)
{
$this->paths = $paths;
$this->decorated = $decorated;
}
/**
* {@inheritdoc}
*
* @throws InvalidArgumentException
*/
public function create(string $resourceClass, array $options = []) : PropertyNameCollection
{
if ($this->decorated) {
try {
$propertyNameCollection = $this->decorated->create($resourceClass, $options);
} catch (ResourceClassNotFoundException $resourceClassNotFoundException) {
// Ignore not found exceptions from parent
}
}
if (!class_exists($resourceClass)) {
if (isset($propertyNameCollection)) {
return $propertyNameCollection;
}
throw new ResourceClassNotFoundException(sprintf('The resource class "%s" does not exist.', $resourceClass));
}
$propertyNames = [];
foreach ($this->paths as $path) {
try {
$domDocument = XmlUtils::loadFile($path, self::RESOURCE_SCHEMA);
} catch (\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
$properties = (new \DOMXPath($domDocument))->query(sprintf('//resources/resource[@class="%s"]/property', $resourceClass));
if (false === $properties || 0 >= $properties->length) {
continue;
}
foreach ($properties as $property) {
if ('' === $propertyName = $property->getAttribute('name')) {
continue;
}
$propertyNames[$propertyName] = true;
}
}
if (isset($propertyNameCollection)) {
foreach ($propertyNameCollection as $propertyName) {
$propertyNames[$propertyName] = true;
}
}
return new PropertyNameCollection(array_keys($propertyNames));
}
}