web/enmi/Zend/Rest/Client/Result.php
changeset 19 1c2f13fd785c
parent 0 4eba9c11703f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/enmi/Zend/Rest/Client/Result.php	Thu Jan 20 19:30:54 2011 +0100
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * 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_Rest
+ * @subpackage Client
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: Result.php 20096 2010-01-06 02:05:09Z bkarwin $
+ */
+
+/**
+ * @category   Zend
+ * @package    Zend_Rest
+ * @subpackage Client
+ * @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_Rest_Client_Result implements IteratorAggregate {
+    /**
+     * @var SimpleXMLElement
+     */
+    protected $_sxml;
+
+    /**
+     * error information
+     * @var string
+     */
+    protected $_errstr;
+
+    /**
+     * Constructor
+     *
+     * @param string $data XML Result
+     * @return void
+     */
+    public function __construct($data)
+    {
+        set_error_handler(array($this, 'handleXmlErrors'));
+        $this->_sxml = simplexml_load_string($data);
+        restore_error_handler();
+        if($this->_sxml === false) {
+            if ($this->_errstr === null) {
+                $message = "An error occured while parsing the REST response with simplexml.";
+            } else {
+                $message = "REST Response Error: " . $this->_errstr;
+                $this->_errstr = null;
+            }
+            require_once "Zend/Rest/Client/Result/Exception.php";
+            throw new Zend_Rest_Client_Result_Exception($message);
+        }
+    }
+
+    /**
+     * Temporary error handler for parsing REST responses.
+     *
+     * @param int    $errno
+     * @param string $errstr
+     * @param string $errfile
+     * @param string $errline
+     * @param array  $errcontext
+     * @return true
+     */
+    public function handleXmlErrors($errno, $errstr, $errfile = null, $errline = null, array $errcontext = null)
+    {
+        $this->_errstr = $errstr;
+        return true;
+    }
+
+    /**
+     * Casts a SimpleXMLElement to its appropriate PHP value
+     *
+     * @param SimpleXMLElement $value
+     * @return mixed
+     */
+    public function toValue(SimpleXMLElement $value)
+    {
+        $node = dom_import_simplexml($value);
+        return $node->nodeValue;
+    }
+
+    /**
+     * Get Property Overload
+     *
+     * @param string $name
+     * @return null|SimpleXMLElement|array Null if not found, SimpleXMLElement if only one value found, array of Zend_Rest_Client_Result objects otherwise
+     */
+    public function __get($name)
+    {
+        if (isset($this->_sxml->{$name})) {
+            return $this->_sxml->{$name};
+        }
+
+        $result = $this->_sxml->xpath("//$name");
+        $count  = count($result);
+
+        if ($count == 0) {
+            return null;
+        } elseif ($count == 1) {
+            return $result[0];
+        } else {
+            return $result;
+        }
+    }
+
+    /**
+     * Cast properties to PHP values
+     *
+     * For arrays, loops through each element and casts to a value as well.
+     *
+     * @param string $method
+     * @param array $args
+     * @return mixed
+     */
+    public function __call($method, $args)
+    {
+        if (null !== ($value = $this->__get($method))) {
+            if (!is_array($value)) {
+                return $this->toValue($value);
+            } else {
+                $return = array();
+                foreach ($value as $element) {
+                    $return[] = $this->toValue($element);
+                }
+                return $return;
+            }
+        }
+
+        return null;
+    }
+
+
+    /**
+     * Isset Overload
+     *
+     * @param string $name
+     * @return boolean
+     */
+    public function __isset($name)
+    {
+        if (isset($this->_sxml->{$name})) {
+            return true;
+        }
+
+        $result = $this->_sxml->xpath("//$name");
+
+        if (sizeof($result) > 0) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Implement IteratorAggregate::getIterator()
+     *
+     * @return SimpleXMLIterator
+     */
+    public function getIterator()
+    {
+        return $this->_sxml;
+    }
+
+    /**
+     * Get Request Status
+     *
+     * @return boolean
+     */
+    public function getStatus()
+    {
+        $status = $this->_sxml->xpath('//status/text()');
+
+        $status = strtolower($status[0]);
+
+        if (ctype_alpha($status) && $status == 'success') {
+            return true;
+        } elseif (ctype_alpha($status) && $status != 'success') {
+            return false;
+        } else {
+            return (bool) $status;
+        }
+    }
+
+    public function isError()
+    {
+        $status = $this->getStatus();
+        if ($status) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    public function isSuccess()
+    {
+        $status = $this->getStatus();
+        if ($status) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * toString overload
+     *
+     * Be sure to only call this when the result is a single value!
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        if (!$this->getStatus()) {
+            $message = $this->_sxml->xpath('//message');
+            return (string) $message[0];
+        } else {
+            $result = $this->_sxml->xpath('//response');
+            if (sizeof($result) > 1) {
+                return (string) "An error occured.";
+            } else {
+                return (string) $result[0];
+            }
+        }
+    }
+}