ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:27:22 2017 +0800
Revision:
44:c1d8923072ba
?

Who changed what in which revision?

UserRevisionLine numberNew 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 }