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 /*
TMBOY 44:c1d8923072ba 4 * This file is part of the JsonSchema package.
TMBOY 44:c1d8923072ba 5 *
TMBOY 44:c1d8923072ba 6 * For the full copyright and license information, please view the LICENSE
TMBOY 44:c1d8923072ba 7 * file that was distributed with this source code.
TMBOY 44:c1d8923072ba 8 */
TMBOY 44:c1d8923072ba 9
TMBOY 44:c1d8923072ba 10 namespace JsonSchema\Constraints;
TMBOY 44:c1d8923072ba 11
TMBOY 44:c1d8923072ba 12 use JsonSchema\SchemaStorage;
TMBOY 44:c1d8923072ba 13 use JsonSchema\Uri\UriRetriever;
TMBOY 44:c1d8923072ba 14 use JsonSchema\UriRetrieverInterface;
TMBOY 44:c1d8923072ba 15 use JsonSchema\Entity\JsonPointer;
TMBOY 44:c1d8923072ba 16
TMBOY 44:c1d8923072ba 17 /**
TMBOY 44:c1d8923072ba 18 * The Base Constraints, all Validators should extend this class
TMBOY 44:c1d8923072ba 19 *
TMBOY 44:c1d8923072ba 20 * @author Robert Schönthal <seroscho@googlemail.com>
TMBOY 44:c1d8923072ba 21 * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
TMBOY 44:c1d8923072ba 22 */
TMBOY 44:c1d8923072ba 23 abstract class Constraint implements ConstraintInterface
TMBOY 44:c1d8923072ba 24 {
TMBOY 44:c1d8923072ba 25 protected $errors = array();
TMBOY 44:c1d8923072ba 26 protected $inlineSchemaProperty = '$schema';
TMBOY 44:c1d8923072ba 27
TMBOY 44:c1d8923072ba 28 const CHECK_MODE_NORMAL = 0x00000001;
TMBOY 44:c1d8923072ba 29 const CHECK_MODE_TYPE_CAST = 0x00000002;
TMBOY 44:c1d8923072ba 30 const CHECK_MODE_COERCE = 0x00000004;
TMBOY 44:c1d8923072ba 31
TMBOY 44:c1d8923072ba 32 /**
TMBOY 44:c1d8923072ba 33 * @var Factory
TMBOY 44:c1d8923072ba 34 */
TMBOY 44:c1d8923072ba 35 protected $factory;
TMBOY 44:c1d8923072ba 36
TMBOY 44:c1d8923072ba 37 /**
TMBOY 44:c1d8923072ba 38 * @param Factory $factory
TMBOY 44:c1d8923072ba 39 */
TMBOY 44:c1d8923072ba 40 public function __construct(Factory $factory = null)
TMBOY 44:c1d8923072ba 41 {
TMBOY 44:c1d8923072ba 42 $this->factory = $factory ? : new Factory();
TMBOY 44:c1d8923072ba 43 }
TMBOY 44:c1d8923072ba 44
TMBOY 44:c1d8923072ba 45 /**
TMBOY 44:c1d8923072ba 46 * {@inheritDoc}
TMBOY 44:c1d8923072ba 47 */
TMBOY 44:c1d8923072ba 48 public function addError(JsonPointer $path = null, $message, $constraint='', array $more=null)
TMBOY 44:c1d8923072ba 49 {
TMBOY 44:c1d8923072ba 50 $error = array(
TMBOY 44:c1d8923072ba 51 'property' => $this->convertJsonPointerIntoPropertyPath($path ?: new JsonPointer('')),
TMBOY 44:c1d8923072ba 52 'pointer' => ltrim(strval($path ?: new JsonPointer('')), '#'),
TMBOY 44:c1d8923072ba 53 'message' => $message,
TMBOY 44:c1d8923072ba 54 'constraint' => $constraint,
TMBOY 44:c1d8923072ba 55 );
TMBOY 44:c1d8923072ba 56
TMBOY 44:c1d8923072ba 57 if (is_array($more) && count($more) > 0)
TMBOY 44:c1d8923072ba 58 {
TMBOY 44:c1d8923072ba 59 $error += $more;
TMBOY 44:c1d8923072ba 60 }
TMBOY 44:c1d8923072ba 61
TMBOY 44:c1d8923072ba 62 $this->errors[] = $error;
TMBOY 44:c1d8923072ba 63 }
TMBOY 44:c1d8923072ba 64
TMBOY 44:c1d8923072ba 65 /**
TMBOY 44:c1d8923072ba 66 * {@inheritDoc}
TMBOY 44:c1d8923072ba 67 */
TMBOY 44:c1d8923072ba 68 public function addErrors(array $errors)
TMBOY 44:c1d8923072ba 69 {
TMBOY 44:c1d8923072ba 70 if ($errors) {
TMBOY 44:c1d8923072ba 71 $this->errors = array_merge($this->errors, $errors);
TMBOY 44:c1d8923072ba 72 }
TMBOY 44:c1d8923072ba 73 }
TMBOY 44:c1d8923072ba 74
TMBOY 44:c1d8923072ba 75 /**
TMBOY 44:c1d8923072ba 76 * {@inheritDoc}
TMBOY 44:c1d8923072ba 77 */
TMBOY 44:c1d8923072ba 78 public function getErrors()
TMBOY 44:c1d8923072ba 79 {
TMBOY 44:c1d8923072ba 80 return $this->errors;
TMBOY 44:c1d8923072ba 81 }
TMBOY 44:c1d8923072ba 82
TMBOY 44:c1d8923072ba 83 /**
TMBOY 44:c1d8923072ba 84 * {@inheritDoc}
TMBOY 44:c1d8923072ba 85 */
TMBOY 44:c1d8923072ba 86 public function isValid()
TMBOY 44:c1d8923072ba 87 {
TMBOY 44:c1d8923072ba 88 return !$this->getErrors();
TMBOY 44:c1d8923072ba 89 }
TMBOY 44:c1d8923072ba 90
TMBOY 44:c1d8923072ba 91 /**
TMBOY 44:c1d8923072ba 92 * Clears any reported errors. Should be used between
TMBOY 44:c1d8923072ba 93 * multiple validation checks.
TMBOY 44:c1d8923072ba 94 */
TMBOY 44:c1d8923072ba 95 public function reset()
TMBOY 44:c1d8923072ba 96 {
TMBOY 44:c1d8923072ba 97 $this->errors = array();
TMBOY 44:c1d8923072ba 98 }
TMBOY 44:c1d8923072ba 99
TMBOY 44:c1d8923072ba 100 /**
TMBOY 44:c1d8923072ba 101 * Bubble down the path
TMBOY 44:c1d8923072ba 102 *
TMBOY 44:c1d8923072ba 103 * @param JsonPointer|null $path Current path
TMBOY 44:c1d8923072ba 104 * @param mixed $i What to append to the path
TMBOY 44:c1d8923072ba 105 *
TMBOY 44:c1d8923072ba 106 * @return JsonPointer;
TMBOY 44:c1d8923072ba 107 */
TMBOY 44:c1d8923072ba 108 protected function incrementPath(JsonPointer $path = null, $i)
TMBOY 44:c1d8923072ba 109 {
TMBOY 44:c1d8923072ba 110 $path = $path ?: new JsonPointer('');
TMBOY 44:c1d8923072ba 111 $path = $path->withPropertyPaths(
TMBOY 44:c1d8923072ba 112 array_merge(
TMBOY 44:c1d8923072ba 113 $path->getPropertyPaths(),
TMBOY 44:c1d8923072ba 114 array_filter(array($i), 'strlen')
TMBOY 44:c1d8923072ba 115 )
TMBOY 44:c1d8923072ba 116 );
TMBOY 44:c1d8923072ba 117 return $path;
TMBOY 44:c1d8923072ba 118 }
TMBOY 44:c1d8923072ba 119
TMBOY 44:c1d8923072ba 120 /**
TMBOY 44:c1d8923072ba 121 * Validates an array
TMBOY 44:c1d8923072ba 122 *
TMBOY 44:c1d8923072ba 123 * @param mixed $value
TMBOY 44:c1d8923072ba 124 * @param mixed $schema
TMBOY 44:c1d8923072ba 125 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 126 * @param mixed $i
TMBOY 44:c1d8923072ba 127 */
TMBOY 44:c1d8923072ba 128 protected function checkArray($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 129 {
TMBOY 44:c1d8923072ba 130 $validator = $this->factory->createInstanceFor('collection');
TMBOY 44:c1d8923072ba 131 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 132
TMBOY 44:c1d8923072ba 133 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 134 }
TMBOY 44:c1d8923072ba 135
TMBOY 44:c1d8923072ba 136 /**
TMBOY 44:c1d8923072ba 137 * Validates an object
TMBOY 44:c1d8923072ba 138 *
TMBOY 44:c1d8923072ba 139 * @param mixed $value
TMBOY 44:c1d8923072ba 140 * @param mixed $schema
TMBOY 44:c1d8923072ba 141 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 142 * @param mixed $i
TMBOY 44:c1d8923072ba 143 * @param mixed $patternProperties
TMBOY 44:c1d8923072ba 144 */
TMBOY 44:c1d8923072ba 145 protected function checkObject($value, $schema = null, JsonPointer $path = null, $i = null, $patternProperties = null)
TMBOY 44:c1d8923072ba 146 {
TMBOY 44:c1d8923072ba 147 $validator = $this->factory->createInstanceFor('object');
TMBOY 44:c1d8923072ba 148 $validator->check($value, $schema, $path, $i, $patternProperties);
TMBOY 44:c1d8923072ba 149
TMBOY 44:c1d8923072ba 150 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 151 }
TMBOY 44:c1d8923072ba 152
TMBOY 44:c1d8923072ba 153 /**
TMBOY 44:c1d8923072ba 154 * Validates the type of a property
TMBOY 44:c1d8923072ba 155 *
TMBOY 44:c1d8923072ba 156 * @param mixed $value
TMBOY 44:c1d8923072ba 157 * @param mixed $schema
TMBOY 44:c1d8923072ba 158 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 159 * @param mixed $i
TMBOY 44:c1d8923072ba 160 */
TMBOY 44:c1d8923072ba 161 protected function checkType($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 162 {
TMBOY 44:c1d8923072ba 163 $validator = $this->factory->createInstanceFor('type');
TMBOY 44:c1d8923072ba 164 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 165
TMBOY 44:c1d8923072ba 166 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 167 }
TMBOY 44:c1d8923072ba 168
TMBOY 44:c1d8923072ba 169 /**
TMBOY 44:c1d8923072ba 170 * Checks a undefined element
TMBOY 44:c1d8923072ba 171 *
TMBOY 44:c1d8923072ba 172 * @param mixed $value
TMBOY 44:c1d8923072ba 173 * @param mixed $schema
TMBOY 44:c1d8923072ba 174 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 175 * @param mixed $i
TMBOY 44:c1d8923072ba 176 */
TMBOY 44:c1d8923072ba 177 protected function checkUndefined($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 178 {
TMBOY 44:c1d8923072ba 179 $validator = $this->factory->createInstanceFor('undefined');
TMBOY 44:c1d8923072ba 180
TMBOY 44:c1d8923072ba 181 $validator->check($value, $this->factory->getSchemaStorage()->resolveRefSchema($schema), $path, $i);
TMBOY 44:c1d8923072ba 182
TMBOY 44:c1d8923072ba 183 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 184 }
TMBOY 44:c1d8923072ba 185
TMBOY 44:c1d8923072ba 186 /**
TMBOY 44:c1d8923072ba 187 * Checks a string element
TMBOY 44:c1d8923072ba 188 *
TMBOY 44:c1d8923072ba 189 * @param mixed $value
TMBOY 44:c1d8923072ba 190 * @param mixed $schema
TMBOY 44:c1d8923072ba 191 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 192 * @param mixed $i
TMBOY 44:c1d8923072ba 193 */
TMBOY 44:c1d8923072ba 194 protected function checkString($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 195 {
TMBOY 44:c1d8923072ba 196 $validator = $this->factory->createInstanceFor('string');
TMBOY 44:c1d8923072ba 197 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 198
TMBOY 44:c1d8923072ba 199 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 200 }
TMBOY 44:c1d8923072ba 201
TMBOY 44:c1d8923072ba 202 /**
TMBOY 44:c1d8923072ba 203 * Checks a number element
TMBOY 44:c1d8923072ba 204 *
TMBOY 44:c1d8923072ba 205 * @param mixed $value
TMBOY 44:c1d8923072ba 206 * @param mixed $schema
TMBOY 44:c1d8923072ba 207 * @param JsonPointer $path
TMBOY 44:c1d8923072ba 208 * @param mixed $i
TMBOY 44:c1d8923072ba 209 */
TMBOY 44:c1d8923072ba 210 protected function checkNumber($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 211 {
TMBOY 44:c1d8923072ba 212 $validator = $this->factory->createInstanceFor('number');
TMBOY 44:c1d8923072ba 213 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 214
TMBOY 44:c1d8923072ba 215 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 216 }
TMBOY 44:c1d8923072ba 217
TMBOY 44:c1d8923072ba 218 /**
TMBOY 44:c1d8923072ba 219 * Checks a enum element
TMBOY 44:c1d8923072ba 220 *
TMBOY 44:c1d8923072ba 221 * @param mixed $value
TMBOY 44:c1d8923072ba 222 * @param mixed $schema
TMBOY 44:c1d8923072ba 223 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 224 * @param mixed $i
TMBOY 44:c1d8923072ba 225 */
TMBOY 44:c1d8923072ba 226 protected function checkEnum($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 227 {
TMBOY 44:c1d8923072ba 228 $validator = $this->factory->createInstanceFor('enum');
TMBOY 44:c1d8923072ba 229 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 230
TMBOY 44:c1d8923072ba 231 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 232 }
TMBOY 44:c1d8923072ba 233
TMBOY 44:c1d8923072ba 234 /**
TMBOY 44:c1d8923072ba 235 * Checks format of an element
TMBOY 44:c1d8923072ba 236 *
TMBOY 44:c1d8923072ba 237 * @param mixed $value
TMBOY 44:c1d8923072ba 238 * @param mixed $schema
TMBOY 44:c1d8923072ba 239 * @param JsonPointer|null $path
TMBOY 44:c1d8923072ba 240 * @param mixed $i
TMBOY 44:c1d8923072ba 241 */
TMBOY 44:c1d8923072ba 242 protected function checkFormat($value, $schema = null, JsonPointer $path = null, $i = null)
TMBOY 44:c1d8923072ba 243 {
TMBOY 44:c1d8923072ba 244 $validator = $this->factory->createInstanceFor('format');
TMBOY 44:c1d8923072ba 245 $validator->check($value, $schema, $path, $i);
TMBOY 44:c1d8923072ba 246
TMBOY 44:c1d8923072ba 247 $this->addErrors($validator->getErrors());
TMBOY 44:c1d8923072ba 248 }
TMBOY 44:c1d8923072ba 249
TMBOY 44:c1d8923072ba 250 /**
TMBOY 44:c1d8923072ba 251 * Get the type check based on the set check mode.
TMBOY 44:c1d8923072ba 252 *
TMBOY 44:c1d8923072ba 253 * @return TypeCheck\TypeCheckInterface
TMBOY 44:c1d8923072ba 254 */
TMBOY 44:c1d8923072ba 255 protected function getTypeCheck()
TMBOY 44:c1d8923072ba 256 {
TMBOY 44:c1d8923072ba 257 return $this->factory->getTypeCheck();
TMBOY 44:c1d8923072ba 258 }
TMBOY 44:c1d8923072ba 259
TMBOY 44:c1d8923072ba 260 /**
TMBOY 44:c1d8923072ba 261 * @param JsonPointer $pointer
TMBOY 44:c1d8923072ba 262 * @return string property path
TMBOY 44:c1d8923072ba 263 */
TMBOY 44:c1d8923072ba 264 protected function convertJsonPointerIntoPropertyPath(JsonPointer $pointer)
TMBOY 44:c1d8923072ba 265 {
TMBOY 44:c1d8923072ba 266 $result = array_map(
TMBOY 44:c1d8923072ba 267 function($path) {
TMBOY 44:c1d8923072ba 268 return sprintf(is_numeric($path) ? '[%d]' : '.%s', $path);
TMBOY 44:c1d8923072ba 269 },
TMBOY 44:c1d8923072ba 270 $pointer->getPropertyPaths()
TMBOY 44:c1d8923072ba 271 );
TMBOY 44:c1d8923072ba 272 return trim(implode('', $result), '.');
TMBOY 44:c1d8923072ba 273 }
TMBOY 44:c1d8923072ba 274 }