      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\Common;
     19:
     20: /**
     21:  * The Metadata class represents either Server or Image metadata
     22:  */
     23: class Metadata extends Base implements \Countable
     24: {
     25:     /**
     26:      * @var array Internal data store.
     27:      */
     28:     protected $metadata = array();
     29:
     30:     /**
     31:      * This setter overrides the base one, since the metadata key can be
     32:      * anything
     33:      *
     34:      * @param string $property
     35:      * @param string $value
     36:      * @return void
     37:      */
     38:     public function __set($property, $value)
     39:     {
     40:         return $this->setProperty($property, $value);
     41:     }
     42:
     43:     public function __get($key)
     44:     {
     45:         return $this->getProperty($key);
     46:     }
     47:
     48:     public function propertyExists($property, $allowRetry = true)
     49:     {
     50:         return isset($this->metadata[strtolower($property)])
     51:         || parent::propertyExists($property, $allowRetry);
     52:     }
     53:
     54:     public function getProperty($property)
     55:     {
     56:         return $this->propertyExists($property) ? $this->metadata[strtolower($property)] : null;
     57:     }
     58:
     59:     public function setProperty($property, $value)
     60:     {
     61:         $this->metadata[strtolower($property)] = $value;
     62:     }
     63:
     64:     public function __isset($property)
     65:     {
     66:         return $this->propertyExists($property);
     67:     }
     68:
     69:     /**
     70:      * Returns the list of keys defined
     71:      *
     72:      * @return array
     73:      */
     74:     public function keylist()
     75:     {
     76:         return $this->metadata;
     77:     }
     78:
     79:     /**
     80:      * Sets metadata values from an array, with optional prefix
     81:      *
     82:      * If $prefix is provided, then only array keys that match the prefix
     83:      * are set as metadata values, and $prefix is stripped from the key name.
     84:      *
     85:      * @param array  $values an array of key/value pairs to set
     86:      * @param string $prefix if provided, a prefix that is used to identify
     87:      *                       metadata values. For example, you can set values from headers
     88:      *                       for a Container by using $prefix='X-Container-Meta-'.
     89:      * @return void
     90:      */
     91:     public function setArray($values, $prefix = null)
     92:     {
     93:         if (empty($values)) {
     94:             return false;
     95:         }
     96:
     97:         foreach ($values as $key => $value) {
     98:             if ($prefix && strpos($key, $prefix) === 0) {
     99:                 $key = substr($key, strlen($prefix));
    100:             }
    101:             $this->setProperty($key, $value);
    102:         }
    103:     }
    104:
    105:     public function toArray()
    106:     {
    107:         return $this->metadata;
    108:     }
    109:
    110:     public function count()
    111:     {
    112:         return count($this->metadata);
    113:     }
    114: }
    115: