      1: <?php
      2: /**
      3:  * Copyright 2012-2014 Rackspace US, Inc.
      4:  *
      5:  * Licensed under the Apache License, Version 2.0 (the "License");
      6:  * you may not use this file except in compliance with the License.
      7:  * You may obtain a copy of the License at
      8:  *
      9:  * http://www.apache.org/licenses/LICENSE-2.0
     10:  *
     11:  * Unless required by applicable law or agreed to in writing, software
     12:  * distributed under the License is distributed on an "AS IS" BASIS,
     13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14:  * See the License for the specific language governing permissions and
     15:  * limitations under the License.
     16:  */
     17:
     18: namespace OpenCloud\Image\Resource\JsonPatch;
     19:
     20: use OpenCloud\Image\Enum\OperationType as Type;
     21: use OpenCloud\Image\Resource\Schema\Property;
     22: use OpenCloud\Image\Resource\Schema\Schema;
     23:
     24: /**
     25:  * Class that represents a JSON Patch operation. It utilizes the JSON pointer syntax, in line with RFC 6902.
     26:  *
     27:  * @see http://tools.ietf.org/html/rfc6901
     28:  * @package OpenCloud\Images\Resource\JsonPatch
     29:  */
     30: class Operation
     31: {
     32:     /**
     33:      * Allowed operation types
     34:      *
     35:      * @var array
     36:      * @see http://tools.ietf.org/html/rfc6902#section-4
     37:      */
     38:     private $allowedTypes = array(
     39:         Type::ADD, Type::REMOVE, Type::REPLACE,
     40:         Type::MOVE, Type::COPY, Type::TEST
     41:     );
     42:
     43:     /** @var Schema The JSON schema this operation is acting on */
     44:     protected $schema;
     45:
     46:     /** @var string The type of operation */
     47:     protected $type;
     48:
     49:     /** @var string The JSON pointer value */
     50:     protected $path;
     51:
     52:     /** @var mixed The value for this JSON property */
     53:     protected $value;
     54:
     55:     /**
     56:      * @param Schema   $schema
     57:      * @param Property $property
     58:      * @param string $operationType
     59:      * @return Operation
     60:      */
     61:     public static function factory(Schema $schema, Property $property, $operationType)
     62:     {
     63:         $operation = new self();
     64:
     65:         $operation->setType($operationType);
     66:         $operation->setSchema($schema);
     67:         $operation->setPath($property->getPath());
     68:         $operation->setValue($property->getValue());
     69:
     70:         return $operation;
     71:     }
     72:
     73:     /**
     74:      * @param $type string
     75:      */
     76:     public function setType($type)
     77:     {
     78:        $this->type = $type;
     79:     }
     80:
     81:     /**
     82:      * @return string
     83:      */
     84:     public function getType()
     85:     {
     86:         return $this->type;
     87:     }
     88:
     89:     /**
     90:      * @param Schema $schema
     91:      */
     92:     public function setSchema(Schema $schema)
     93:     {
     94:         $this->schema = $schema;
     95:     }
     96:
     97:     /**
     98:      * @return Schema
     99:      */
    100:     public function getSchema()
    101:     {
    102:         return $this->schema;
    103:     }
    104:
    105:     /**
    106:      * @param $path
    107:      */
    108:     public function setPath($path)
    109:     {
    110:         $this->path = $path;
    111:     }
    112:
    113:     /**
    114:      * @return string
    115:      */
    116:     public function getPath()
    117:     {
    118:         return $this->path;
    119:     }
    120:
    121:     /**
    122:      * @param $value
    123:      */
    124:     public function setValue($value)
    125:     {
    126:         $this->value = $value;
    127:     }
    128:
    129:     /**
    130:      * @return mixed
    131:      */
    132:     public function getValue()
    133:     {
    134:         return $this->value;
    135:     }
    136:
    137:     /**
    138:      * Validates that this operation is of an allowed type
    139:      *
    140:      * @throws \RuntimeException if not
    141:      */
    142:     public function validate()
    143:     {
    144:         if (!in_array($this->type, $this->allowedTypes)) {
    145:             throw new \RuntimeException(sprintf("%s is not an allowed JSON PATCH operation type", $this->type));
    146:         }
    147:     }
    148: }
    149: