/sabel/Preference.php

https://github.com/reoring/sabel · PHP · 282 lines · 199 code · 62 blank · 21 comment · 39 complexity · c8802830fdb3b3c73fae746787208656 MD5 · raw file

  1. <?php
  2. /**
  3. * Preference
  4. *
  5. * @abstract
  6. * @category Preference
  7. * @package org.sabel.preference
  8. * @author Mori Reo <mori.reo@sabel.jp>
  9. * @copyright 2004-2008 Mori Reo <mori.reo@sabel.jp>
  10. * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  11. */
  12. class Sabel_Preference
  13. {
  14. const TYPE_INT = "int";
  15. const TYPE_STRING = "string";
  16. const TYPE_FLOAT = "float";
  17. const TYPE_BOOLEAN = "boolean";
  18. const TYPE_ARRAY = "array";
  19. const TYPE_OBJECT = "object";
  20. private $backend = null;
  21. public static function create(Sabel_Config $config = null)
  22. {
  23. if (!$config instanceof Sabel_Config) {
  24. return new self();
  25. }
  26. $arrayConfig = $config->configure();
  27. if (!is_array($arrayConfig)) {
  28. $arrayConfig = array();
  29. }
  30. if (isset($arrayConfig["backend"])) {
  31. $backendClass = $arrayConfig["backend"];
  32. if (!class_exists($backendClass)) {
  33. $msg = "specified backend class " . $backendClass . " is not found in any classpath";
  34. throw new Sabel_Exception_ClassNotFound($msg);
  35. }
  36. $backend = new $backendClass($arrayConfig);
  37. return new self($backend);
  38. }
  39. }
  40. public function __construct($backend = null)
  41. {
  42. if ($backend == null) {
  43. $backend = new Sabel_Preference_Xml();
  44. }
  45. $this->backend = $backend;
  46. }
  47. /**
  48. * check backend contains a preference.
  49. *
  50. * @param $key string
  51. */
  52. public function contains($key)
  53. {
  54. return $this->backend->has($key);
  55. }
  56. public function getAll()
  57. {
  58. $map = array();
  59. foreach ($this->backend->getAll() as $key => $set) {
  60. $map[$key] = $this->convertType($set["value"], $set["type"]);
  61. }
  62. return $map;
  63. }
  64. private function convertType($value, $type)
  65. {
  66. switch ($type) {
  67. case self::TYPE_INT: return (int) $value;
  68. case self::TYPE_FLOAT: return (float) $value;
  69. case self::TYPE_STRING: return (string) $value;
  70. case self::TYPE_BOOLEAN: return (boolean) $value;
  71. }
  72. }
  73. public function setInt($key, $value)
  74. {
  75. if (!is_int($value)) {
  76. $value = (int) $value;
  77. }
  78. $this->backend->set($key, $value, self::TYPE_INT);
  79. }
  80. public function getInt($key, $default = null)
  81. {
  82. if ($default !== null && !is_int($default)) {
  83. $default = (int) $default;
  84. }
  85. $result = $this->get($key, $default, self::TYPE_INT);
  86. if (!is_int($result)) {
  87. return (int) $result;
  88. }
  89. return $result;
  90. }
  91. public function setFloat($key, $value)
  92. {
  93. if (!is_float($value)) {
  94. $value = (float) $value;
  95. }
  96. $this->backend->set($key, $value, self::TYPE_FLOAT);
  97. }
  98. public function getFloat($key, $default = null)
  99. {
  100. if ($default !== null && !is_float($default)) {
  101. $default = (float) $default;
  102. }
  103. $result = $this->get($key, $default, self::TYPE_FLOAT);
  104. if (!is_float($result)) {
  105. return (float) $result;
  106. }
  107. return $result;
  108. }
  109. public function setDouble($key, $value)
  110. {
  111. $this->setFloat($key, $vlaue);
  112. }
  113. public function getDouble($key, $default = null)
  114. {
  115. $this->getFloat($key, $default);
  116. }
  117. public function setString($key, $value)
  118. {
  119. if (!is_string($value)) {
  120. $value = (string) $value;
  121. }
  122. $this->backend->set($key, $value, self::TYPE_STRING);
  123. }
  124. public function getString($key, $default = null)
  125. {
  126. if ($default !== null && !is_string($default)) {
  127. $default = (string) $default;
  128. }
  129. $result = $this->get($key, $default, self::TYPE_STRING);
  130. if (!is_string($result)) {
  131. return (string) $result;
  132. }
  133. return $result;
  134. }
  135. public function setBoolean($key, $value)
  136. {
  137. if (!is_bool($value)) {
  138. $value = (bool) $value;
  139. }
  140. $this->backend->set($key, $value, self::TYPE_BOOLEAN);
  141. }
  142. public function getBoolean($key, $default = null)
  143. {
  144. if ($default !== null && !is_bool($default)) {
  145. $default = (boolean) $default;
  146. }
  147. $result = $this->get($key, $default, self::TYPE_BOOLEAN);
  148. if (!is_bool($result)) {
  149. return (boolean) $result;
  150. }
  151. return $result;
  152. }
  153. public function setArray($key, $value)
  154. {
  155. if (!is_array($value)) {
  156. throw new Sabel_Exception_Runtime("setArray value must be an array type");
  157. }
  158. $this->backend->set($key, serialize($value), self::TYPE_ARRAY);
  159. }
  160. public function getArray($key, $default = null)
  161. {
  162. if ($default !== null && !is_array($default)) {
  163. throw new Sabel_Exception_Runtime("setArray value must be an array type");
  164. }
  165. if ($default !== null) {
  166. $this->setArray($key, $default);
  167. return $default;
  168. }
  169. if (!$this->backend->has($key) && $default === null) {
  170. throw new Sabel_Exception_Runtime("preference ${key} not found");
  171. }
  172. return unserialize($this->backend->get($key));
  173. }
  174. public function setObject($key, $value)
  175. {
  176. if (!is_object($value)) {
  177. throw new Sabel_Exception_Runtime("setObject value must be an object type");
  178. }
  179. $this->backend->set($key, base64_encode(serialize($value)), self::TYPE_OBJECT);
  180. }
  181. public function getObject($key, $default = null)
  182. {
  183. if ($default !== null && !is_object($default)) {
  184. throw new Sabel_Exception_Runtime("setObject value must be an object type");
  185. }
  186. if ($default !== null) {
  187. $this->setObject($key, $default);
  188. return $default;
  189. }
  190. if (!$this->backend->has($key) && $default === null) {
  191. throw new Sabel_Exception_Runtime("preference ${key} not found");
  192. }
  193. return unserialize(base64_decode($this->backend->get($key)));
  194. }
  195. /**
  196. * delete preference
  197. *
  198. * @param string $key
  199. * @return mixed
  200. */
  201. public function delete($key)
  202. {
  203. if ($this->backend->has($key)) {
  204. $removedValue = $this->backend->get($key);
  205. $this->backend->delete($key);
  206. return $removedValue;
  207. }
  208. }
  209. private function get($key, $default, $type)
  210. {
  211. if ($default !== null) {
  212. $this->backend->set($key, $default, $type);
  213. return $default;
  214. }
  215. if (!$this->backend->has($key) && $default === null) {
  216. throw new Sabel_Exception_Runtime("preference ${key} not found");
  217. }
  218. return $this->backend->get($key);
  219. }
  220. }