File indexing completed on 2024-12-29 05:28:04
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Service_WindowsAzure 0017 * @subpackage Storage 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id$ 0021 */ 0022 0023 /** 0024 * @category Zend 0025 * @package Zend_Service_WindowsAzure 0026 * @subpackage Storage 0027 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0028 * @license http://framework.zend.com/license/new-bsd New BSD License 0029 */ 0030 class Zend_Service_WindowsAzure_Storage_TableEntity 0031 { 0032 /** 0033 * Partition key 0034 * 0035 * @var string 0036 */ 0037 protected $_partitionKey; 0038 0039 /** 0040 * Row key 0041 * 0042 * @var string 0043 */ 0044 protected $_rowKey; 0045 0046 /** 0047 * Timestamp 0048 * 0049 * @var string 0050 */ 0051 protected $_timestamp; 0052 0053 /** 0054 * Etag 0055 * 0056 * @var string 0057 */ 0058 protected $_etag = ''; 0059 0060 /** 0061 * Constructor 0062 * 0063 * @param string $partitionKey Partition key 0064 * @param string $rowKey Row key 0065 */ 0066 public function __construct($partitionKey = '', $rowKey = '') 0067 { 0068 $this->_partitionKey = $partitionKey; 0069 $this->_rowKey = $rowKey; 0070 } 0071 0072 /** 0073 * Get partition key 0074 * 0075 * @azure PartitionKey 0076 * @return string 0077 */ 0078 public function getPartitionKey() 0079 { 0080 return $this->_partitionKey; 0081 } 0082 0083 /** 0084 * Set partition key 0085 * 0086 * @azure PartitionKey 0087 * @param string $value 0088 */ 0089 public function setPartitionKey($value) 0090 { 0091 $this->_partitionKey = $value; 0092 } 0093 0094 /** 0095 * Get row key 0096 * 0097 * @azure RowKey 0098 * @return string 0099 */ 0100 public function getRowKey() 0101 { 0102 return $this->_rowKey; 0103 } 0104 0105 /** 0106 * Set row key 0107 * 0108 * @azure RowKey 0109 * @param string $value 0110 */ 0111 public function setRowKey($value) 0112 { 0113 $this->_rowKey = $value; 0114 } 0115 0116 /** 0117 * Get timestamp 0118 * 0119 * @azure Timestamp Edm.DateTime 0120 * @return string 0121 */ 0122 public function getTimestamp() 0123 { 0124 if (null === $this->_timestamp) { 0125 $this->setTimestamp(new DateTime()); 0126 } 0127 return $this->_timestamp; 0128 } 0129 0130 /** 0131 * Set timestamp 0132 * 0133 * @azure Timestamp Edm.DateTime 0134 * @param DateTime $value 0135 */ 0136 public function setTimestamp(DateTime $value) 0137 { 0138 $this->_timestamp = $value; 0139 } 0140 0141 /** 0142 * Get etag 0143 * 0144 * @return string 0145 */ 0146 public function getEtag() 0147 { 0148 return $this->_etag; 0149 } 0150 0151 /** 0152 * Set etag 0153 * 0154 * @param string $value 0155 */ 0156 public function setEtag($value = '') 0157 { 0158 $this->_etag = $value; 0159 } 0160 0161 /** 0162 * Get Azure values 0163 * 0164 * @return array 0165 */ 0166 public function getAzureValues() 0167 { 0168 // Get accessors 0169 $accessors = self::getAzureAccessors(get_class($this)); 0170 0171 // Loop accessors and retrieve values 0172 $returnValue = array(); 0173 foreach ($accessors as $accessor) { 0174 if ($accessor->EntityType == 'ReflectionProperty') { 0175 $property = $accessor->EntityAccessor; 0176 $returnValue[] = (object)array( 0177 'Name' => $accessor->AzurePropertyName, 0178 'Type' => $accessor->AzurePropertyType, 0179 'Value' => $this->$property, 0180 ); 0181 } else if ($accessor->EntityType == 'ReflectionMethod' && substr(strtolower($accessor->EntityAccessor), 0, 3) == 'get') { 0182 $method = $accessor->EntityAccessor; 0183 $returnValue[] = (object)array( 0184 'Name' => $accessor->AzurePropertyName, 0185 'Type' => $accessor->AzurePropertyType, 0186 'Value' => $this->$method(), 0187 ); 0188 } 0189 } 0190 0191 // Return 0192 return $returnValue; 0193 } 0194 0195 /** 0196 * Set Azure values 0197 * 0198 * @param array $values 0199 * @param boolean $throwOnError Throw Zend_Service_WindowsAzure_Exception when a property is not specified in $values? 0200 * @throws Zend_Service_WindowsAzure_Exception 0201 */ 0202 public function setAzureValues($values = array(), $throwOnError = false) 0203 { 0204 // Get accessors 0205 $accessors = self::getAzureAccessors(get_class($this)); 0206 0207 // Loop accessors and set values 0208 $returnValue = array(); 0209 foreach ($accessors as $accessor) { 0210 if (isset($values[$accessor->AzurePropertyName])) { 0211 // Cast to correct type 0212 if ($accessor->AzurePropertyType != '') { 0213 switch (strtolower($accessor->AzurePropertyType)) { 0214 case 'edm.int32': 0215 case 'edm.int64': 0216 $values[$accessor->AzurePropertyName] = intval($values[$accessor->AzurePropertyName]); break; 0217 case 'edm.boolean': 0218 if ($values[$accessor->AzurePropertyName] == 'true' || $values[$accessor->AzurePropertyName] == '1') 0219 $values[$accessor->AzurePropertyName] = true; 0220 else 0221 $values[$accessor->AzurePropertyName] = false; 0222 break; 0223 case 'edm.double': 0224 $values[$accessor->AzurePropertyName] = floatval($values[$accessor->AzurePropertyName]); break; 0225 case 'edm.datetime': 0226 $values[$accessor->AzurePropertyName] = $this->_convertToDateTime($values[$accessor->AzurePropertyName]); break; 0227 } 0228 } 0229 0230 // Assign value 0231 if ($accessor->EntityType == 'ReflectionProperty') { 0232 $property = $accessor->EntityAccessor; 0233 $this->$property = $values[$accessor->AzurePropertyName]; 0234 } else if ($accessor->EntityType == 'ReflectionMethod' && substr(strtolower($accessor->EntityAccessor), 0, 3) == 'set') { 0235 $method = $accessor->EntityAccessor; 0236 $this->$method($values[$accessor->AzurePropertyName]); 0237 } 0238 } else if ($throwOnError) { 0239 // require_once 'Zend/Service/WindowsAzure/Exception.php'; 0240 throw new Zend_Service_WindowsAzure_Exception("Property '" . $accessor->AzurePropertyName . "' was not found in \$values array"); 0241 } 0242 } 0243 0244 // Return 0245 return $returnValue; 0246 } 0247 0248 /** 0249 * Get Azure accessors from class 0250 * 0251 * @param string $className Class to get accessors for 0252 * @return array 0253 */ 0254 public static function getAzureAccessors($className = '') 0255 { 0256 // List of accessors 0257 $azureAccessors = array(); 0258 0259 // Get all types 0260 $type = new ReflectionClass($className); 0261 0262 // Loop all properties 0263 $properties = $type->getProperties(); 0264 foreach ($properties as $property) { 0265 $accessor = self::getAzureAccessor($property); 0266 if (!is_null($accessor)) { 0267 $azureAccessors[] = $accessor; 0268 } 0269 } 0270 0271 // Loop all methods 0272 $methods = $type->getMethods(); 0273 foreach ($methods as $method) { 0274 $accessor = self::getAzureAccessor($method); 0275 if (!is_null($accessor)) { 0276 $azureAccessors[] = $accessor; 0277 } 0278 } 0279 0280 // Return 0281 return $azureAccessors; 0282 } 0283 0284 /** 0285 * Get Azure accessor from reflection member 0286 * 0287 * @param ReflectionProperty|ReflectionMethod $member 0288 * @return object 0289 */ 0290 public static function getAzureAccessor($member) 0291 { 0292 // Get comment 0293 $docComment = $member->getDocComment(); 0294 0295 // Check for Azure comment 0296 if (strpos($docComment, '@azure') === false) 0297 { 0298 return null; 0299 } 0300 0301 // Search for @azure contents 0302 $azureComment = ''; 0303 $commentLines = explode("\n", $docComment); 0304 foreach ($commentLines as $commentLine) { 0305 if (strpos($commentLine, '@azure') !== false) { 0306 $azureComment = trim(substr($commentLine, strpos($commentLine, '@azure') + 6)); 0307 while (strpos($azureComment, ' ') !== false) { 0308 $azureComment = str_replace(' ', ' ', $azureComment); 0309 } 0310 break; 0311 } 0312 } 0313 0314 // Fetch @azure properties 0315 $azureProperties = explode(' ', $azureComment); 0316 return (object)array( 0317 'EntityAccessor' => $member->getName(), 0318 'EntityType' => get_class($member), 0319 'AzurePropertyName' => $azureProperties[0], 0320 'AzurePropertyType' => isset($azureProperties[1]) ? $azureProperties[1] : '' 0321 ); 0322 } 0323 0324 /** 0325 * Converts a string to a DateTime object. Returns false on failure. 0326 * 0327 * @param string $value The string value to parse 0328 * @return DateTime|boolean 0329 */ 0330 protected function _convertToDateTime($value = '') 0331 { 0332 if ($value === '') { 0333 return false; 0334 } 0335 0336 if ($value instanceof DateTime) { 0337 return $value; 0338 } 0339 0340 if (@strtotime($value) !== false) { 0341 try { 0342 if (substr($value, -1) == 'Z') { 0343 $value = substr($value, 0, strlen($value) - 1); 0344 } 0345 return new DateTime($value, new DateTimeZone('UTC')); 0346 } 0347 catch (Exception $ex) { 0348 return false; 0349 } 0350 } 0351 0352 return false; 0353 } 0354 }