ex
Fork of mbed-os-example-mbed5-blinky by
dumi_doc-master/schema/vendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.php@44:c1d8923072ba, 2017-07-18 (annotated)
- Committer:
- TMBOY
- Date:
- Tue Jul 18 16:27:22 2017 +0800
- Revision:
- 44:c1d8923072ba
?
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| TMBOY | 44:c1d8923072ba | 1 | <?php |
| TMBOY | 44:c1d8923072ba | 2 | |
| TMBOY | 44:c1d8923072ba | 3 | namespace JsonSchema; |
| TMBOY | 44:c1d8923072ba | 4 | |
| TMBOY | 44:c1d8923072ba | 5 | use JsonSchema\Entity\JsonPointer; |
| TMBOY | 44:c1d8923072ba | 6 | use JsonSchema\Exception\UnresolvableJsonPointerException; |
| TMBOY | 44:c1d8923072ba | 7 | use JsonSchema\Iterator\ObjectIterator; |
| TMBOY | 44:c1d8923072ba | 8 | use JsonSchema\Uri\UriResolver; |
| TMBOY | 44:c1d8923072ba | 9 | use JsonSchema\Uri\UriRetriever; |
| TMBOY | 44:c1d8923072ba | 10 | |
| TMBOY | 44:c1d8923072ba | 11 | class SchemaStorage |
| TMBOY | 44:c1d8923072ba | 12 | { |
| TMBOY | 44:c1d8923072ba | 13 | protected $uriRetriever; |
| TMBOY | 44:c1d8923072ba | 14 | protected $uriResolver; |
| TMBOY | 44:c1d8923072ba | 15 | protected $schemas = array(); |
| TMBOY | 44:c1d8923072ba | 16 | |
| TMBOY | 44:c1d8923072ba | 17 | public function __construct( |
| TMBOY | 44:c1d8923072ba | 18 | UriRetrieverInterface $uriRetriever = null, |
| TMBOY | 44:c1d8923072ba | 19 | UriResolverInterface $uriResolver = null |
| TMBOY | 44:c1d8923072ba | 20 | ) { |
| TMBOY | 44:c1d8923072ba | 21 | $this->uriRetriever = $uriRetriever ?: new UriRetriever; |
| TMBOY | 44:c1d8923072ba | 22 | $this->uriResolver = $uriResolver ?: new UriResolver; |
| TMBOY | 44:c1d8923072ba | 23 | } |
| TMBOY | 44:c1d8923072ba | 24 | |
| TMBOY | 44:c1d8923072ba | 25 | /** |
| TMBOY | 44:c1d8923072ba | 26 | * @return UriRetrieverInterface |
| TMBOY | 44:c1d8923072ba | 27 | */ |
| TMBOY | 44:c1d8923072ba | 28 | public function getUriRetriever() |
| TMBOY | 44:c1d8923072ba | 29 | { |
| TMBOY | 44:c1d8923072ba | 30 | return $this->uriRetriever; |
| TMBOY | 44:c1d8923072ba | 31 | } |
| TMBOY | 44:c1d8923072ba | 32 | |
| TMBOY | 44:c1d8923072ba | 33 | /** |
| TMBOY | 44:c1d8923072ba | 34 | * @return UriResolverInterface |
| TMBOY | 44:c1d8923072ba | 35 | */ |
| TMBOY | 44:c1d8923072ba | 36 | public function getUriResolver() |
| TMBOY | 44:c1d8923072ba | 37 | { |
| TMBOY | 44:c1d8923072ba | 38 | return $this->uriResolver; |
| TMBOY | 44:c1d8923072ba | 39 | } |
| TMBOY | 44:c1d8923072ba | 40 | |
| TMBOY | 44:c1d8923072ba | 41 | /** |
| TMBOY | 44:c1d8923072ba | 42 | * @param string $id |
| TMBOY | 44:c1d8923072ba | 43 | * @param object $schema |
| TMBOY | 44:c1d8923072ba | 44 | */ |
| TMBOY | 44:c1d8923072ba | 45 | public function addSchema($id, $schema = null) |
| TMBOY | 44:c1d8923072ba | 46 | { |
| TMBOY | 44:c1d8923072ba | 47 | if (is_null($schema)) { |
| TMBOY | 44:c1d8923072ba | 48 | $schema = $this->uriRetriever->retrieve($id); |
| TMBOY | 44:c1d8923072ba | 49 | } |
| TMBOY | 44:c1d8923072ba | 50 | $objectIterator = new ObjectIterator($schema); |
| TMBOY | 44:c1d8923072ba | 51 | foreach ($objectIterator as $toResolveSchema) { |
| TMBOY | 44:c1d8923072ba | 52 | if (property_exists($toResolveSchema, '$ref') && is_string($toResolveSchema->{'$ref'})) { |
| TMBOY | 44:c1d8923072ba | 53 | $jsonPointer = new JsonPointer($this->uriResolver->resolve($toResolveSchema->{'$ref'}, $id)); |
| TMBOY | 44:c1d8923072ba | 54 | $toResolveSchema->{'$ref'} = (string)$jsonPointer; |
| TMBOY | 44:c1d8923072ba | 55 | } |
| TMBOY | 44:c1d8923072ba | 56 | } |
| TMBOY | 44:c1d8923072ba | 57 | $this->schemas[$id] = $schema; |
| TMBOY | 44:c1d8923072ba | 58 | } |
| TMBOY | 44:c1d8923072ba | 59 | |
| TMBOY | 44:c1d8923072ba | 60 | /** |
| TMBOY | 44:c1d8923072ba | 61 | * @param string $id |
| TMBOY | 44:c1d8923072ba | 62 | * @return object |
| TMBOY | 44:c1d8923072ba | 63 | */ |
| TMBOY | 44:c1d8923072ba | 64 | public function getSchema($id) |
| TMBOY | 44:c1d8923072ba | 65 | { |
| TMBOY | 44:c1d8923072ba | 66 | if (!array_key_exists($id, $this->schemas)) { |
| TMBOY | 44:c1d8923072ba | 67 | $this->addSchema($id); |
| TMBOY | 44:c1d8923072ba | 68 | } |
| TMBOY | 44:c1d8923072ba | 69 | |
| TMBOY | 44:c1d8923072ba | 70 | return $this->schemas[$id]; |
| TMBOY | 44:c1d8923072ba | 71 | } |
| TMBOY | 44:c1d8923072ba | 72 | |
| TMBOY | 44:c1d8923072ba | 73 | public function resolveRef($ref) |
| TMBOY | 44:c1d8923072ba | 74 | { |
| TMBOY | 44:c1d8923072ba | 75 | $jsonPointer = new JsonPointer($ref); |
| TMBOY | 44:c1d8923072ba | 76 | $refSchema = $this->getSchema($jsonPointer->getFilename()); |
| TMBOY | 44:c1d8923072ba | 77 | |
| TMBOY | 44:c1d8923072ba | 78 | foreach ($jsonPointer->getPropertyPaths() as $path) { |
| TMBOY | 44:c1d8923072ba | 79 | if (is_object($refSchema) && property_exists($refSchema, $path)) { |
| TMBOY | 44:c1d8923072ba | 80 | $refSchema = $this->resolveRefSchema($refSchema->{$path}); |
| TMBOY | 44:c1d8923072ba | 81 | } elseif (is_array($refSchema) && array_key_exists($path, $refSchema)) { |
| TMBOY | 44:c1d8923072ba | 82 | $refSchema = $this->resolveRefSchema($refSchema[$path]); |
| TMBOY | 44:c1d8923072ba | 83 | } else { |
| TMBOY | 44:c1d8923072ba | 84 | throw new UnresolvableJsonPointerException(sprintf( |
| TMBOY | 44:c1d8923072ba | 85 | 'File: %s is found, but could not resolve fragment: %s', |
| TMBOY | 44:c1d8923072ba | 86 | $jsonPointer->getFilename(), |
| TMBOY | 44:c1d8923072ba | 87 | $jsonPointer->getPropertyPathAsString() |
| TMBOY | 44:c1d8923072ba | 88 | )); |
| TMBOY | 44:c1d8923072ba | 89 | } |
| TMBOY | 44:c1d8923072ba | 90 | } |
| TMBOY | 44:c1d8923072ba | 91 | |
| TMBOY | 44:c1d8923072ba | 92 | return $refSchema; |
| TMBOY | 44:c1d8923072ba | 93 | } |
| TMBOY | 44:c1d8923072ba | 94 | |
| TMBOY | 44:c1d8923072ba | 95 | /** |
| TMBOY | 44:c1d8923072ba | 96 | * @param $refSchema |
| TMBOY | 44:c1d8923072ba | 97 | * @return object |
| TMBOY | 44:c1d8923072ba | 98 | */ |
| TMBOY | 44:c1d8923072ba | 99 | public function resolveRefSchema($refSchema) |
| TMBOY | 44:c1d8923072ba | 100 | { |
| TMBOY | 44:c1d8923072ba | 101 | if (is_object($refSchema) && property_exists($refSchema, '$ref') && is_string($refSchema->{'$ref'})) { |
| TMBOY | 44:c1d8923072ba | 102 | $newSchema = $this->resolveRef($refSchema->{'$ref'}); |
| TMBOY | 44:c1d8923072ba | 103 | $refSchema = (object) (get_object_vars($refSchema) + get_object_vars($newSchema)); |
| TMBOY | 44:c1d8923072ba | 104 | unset($refSchema->{'$ref'}); |
| TMBOY | 44:c1d8923072ba | 105 | } |
| TMBOY | 44:c1d8923072ba | 106 | |
| TMBOY | 44:c1d8923072ba | 107 | return $refSchema; |
| TMBOY | 44:c1d8923072ba | 108 | } |
| TMBOY | 44:c1d8923072ba | 109 | } |
