web/lib/Zend/Cloud/DocumentService/Document.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/Cloud/DocumentService/Document.php	Fri Mar 11 15:05:35 2011 +0100
@@ -0,0 +1,248 @@
+<?php
+/**
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Cloud
+ * @subpackage DocumentService
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+
+/**
+ * Class encapsulating documents. Fields are stored in a name/value
+ * array. Data are represented as strings.
+ *
+ * TODO Can fields be large enough to warrant support for streams?
+ *
+ * @category   Zend
+ * @package    Zend_Cloud
+ * @subpackage DocumentService
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+class Zend_Cloud_DocumentService_Document 
+    implements ArrayAccess, IteratorAggregate, Countable
+{
+    /** key in document denoting identifier */
+    const KEY_FIELD = '_id';
+
+    /**
+     * ID of this document.
+     * @var mixed
+     */
+    protected $_id;
+
+    /**
+     * Name/value array of field names to values.
+     * @var array
+     */
+    protected $_fields;
+
+    /**
+     * Construct an instance of Zend_Cloud_DocumentService_Document.
+     *
+     * If no identifier is provided, but a field matching KEY_FIELD is present,
+     * then that field's value will be used as the document identifier.
+     *
+     * @param  array $fields
+     * @param  mixed $id Document identifier
+     * @return void
+     */
+    public function __construct($fields, $id = null)
+    {
+        if (!is_array($fields) && !$fields instanceof ArrayAccess) {
+            require_once 'Zend/Cloud/DocumentService/Exception.php';
+            throw new Zend_Cloud_DocumentService_Exception('Fields must be an array or implement ArrayAccess');
+        }
+
+        if (isset($fields[self::KEY_FIELD])) {
+            $id = $fields[self::KEY_FIELD];
+            unset($fields[self::KEY_FIELD]);
+        }
+
+        $this->_fields = $fields;
+        $this->setId($id);
+    }
+
+    /**
+     * Set document identifier
+     * 
+     * @param  mixed $id 
+     * @return Zend_Cloud_DocumentService_Document
+     */
+    public function setId($id)
+    {
+        $this->_id = $id;
+        return $this;
+    }
+
+    /**
+     * Get ID name.
+     *
+     * @return string
+     */
+    public function getId() 
+    {
+        return $this->_id;
+    }
+
+    /**
+     * Get fields as array.
+     *
+     * @return array
+     */
+    public function getFields() 
+    {
+        return $this->_fields;
+    }
+
+    /**
+     * Get field by name.
+     *
+     * @param  string $name
+     * @return mixed
+     */
+    public function getField($name)
+    {
+        if (isset($this->_fields[$name])) {
+            return $this->_fields[$name];
+        }
+        return null;
+    }
+    
+    /**
+     * Set field by name.
+     *
+     * @param  string $name
+     * @param  mixed $value
+     * @return Zend_Cloud_DocumentService_Document
+     */
+    public function setField($name, $value) 
+    {
+        $this->_fields[$name] = $value;
+        return $this;
+    }
+    
+    /**
+     * Overloading: get value
+     * 
+     * @param  string $name 
+     * @return mixed
+     */
+    public function __get($name)
+    {
+        return $this->getField($name);
+    }
+
+    /**
+     * Overloading: set field
+     * 
+     * @param  string $name 
+     * @param  mixed $value 
+     * @return void
+     */
+    public function __set($name, $value)
+    {
+        $this->setField($name, $value);
+    }
+    
+    /**
+     * ArrayAccess: does field exist?
+     * 
+     * @param  string $name 
+     * @return bool
+     */
+    public function offsetExists($name)
+    {
+        return isset($this->_fields[$name]);
+    }
+    
+    /**
+     * ArrayAccess: get field by name
+     * 
+     * @param  string $name 
+     * @return mixed
+     */
+    public function offsetGet($name)
+    {
+        return $this->getField($name);
+    }
+    
+    /**
+     * ArrayAccess: set field to value
+     * 
+     * @param  string $name 
+     * @param  mixed $value 
+     * @return void
+     */
+    public function offsetSet($name, $value)
+    {
+        $this->setField($name, $value);
+    }
+    
+    /**
+     * ArrayAccess: remove field from document
+     * 
+     * @param  string $name 
+     * @return void
+     */
+    public function offsetUnset($name)
+    {
+        if ($this->offsetExists($name)) {
+            unset($this->_fields[$name]);
+        }
+    }
+    
+    /**
+     * Overloading: retrieve and set fields by name
+     * 
+     * @param  string $name 
+     * @param  mixed $args 
+     * @return mixed
+     */
+    public function __call($name, $args)
+    {
+        $prefix = substr($name, 0, 3);
+        if ($prefix == 'get') {
+            // Get value
+            $option = substr($name, 3);
+            return $this->getField($option);
+        } elseif ($prefix == 'set') {
+            // set value
+            $option = substr($name, 3);
+            return $this->setField($option, $args[0]);
+        }
+
+        require_once 'Zend/Cloud/OperationNotAvailableException.php';
+        throw new Zend_Cloud_OperationNotAvailableException("Unknown operation $name");
+    }
+
+    /**
+     * Countable: return count of fields in document
+     * 
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->_fields);
+    }
+
+    /**
+     * IteratorAggregate: return iterator for iterating over fields
+     * 
+     * @return Iterator
+     */
+    public function getIterator()
+    {
+        return new ArrayIterator($this->_fields);
+    }
+}