LoggerRendererMap.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. /**
  3. * log4php is a PHP port of the log4j java logging package.
  4. *
  5. * <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
  6. * <p>Design, strategies and part of the methods documentation are developed by log4j team
  7. * (Ceki Gülcü as log4j project founder and
  8. * {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
  9. *
  10. * <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
  11. * For more information, please see {@link http://www.vxr.it/log4php/}.</p>
  12. *
  13. * <p>This software is published under the terms of the LGPL License
  14. * a copy of which has been included with this distribution in the LICENSE file.</p>
  15. *
  16. * @package log4php
  17. * @subpackage or
  18. */
  19. /**
  20. * @ignore
  21. */
  22. if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
  23. /**
  24. */
  25. require_once(LOG4PHP_DIR . '/or/LoggerDefaultRenderer.php');
  26. require_once(LOG4PHP_DIR . '/or/LoggerObjectRenderer.php');
  27. require_once(LOG4PHP_DIR . '/LoggerLog.php');
  28. /**
  29. * Map class objects to an {@link LoggerObjectRenderer}.
  30. *
  31. * @author VxR <vxr@vxr.it>
  32. * @version $Revision: 1.1 $
  33. * @package log4php
  34. * @subpackage or
  35. * @since 0.3
  36. */
  37. class LoggerRendererMap {
  38. /**
  39. * @var array
  40. */
  41. var $map;
  42. /**
  43. * @var LoggerDefaultRenderer
  44. */
  45. var $defaultRenderer;
  46. /**
  47. * Constructor
  48. */
  49. function LoggerRendererMap()
  50. {
  51. $this->map = array();
  52. $this->defaultRenderer = new LoggerDefaultRenderer();
  53. }
  54. /**
  55. * Add a renderer to a hierarchy passed as parameter.
  56. * Note that hierarchy must implement getRendererMap() and setRenderer() methods.
  57. *
  58. * @param LoggerHierarchy &$repository a logger repository.
  59. * @param string &$renderedClassName
  60. * @param string &$renderingClassName
  61. * @static
  62. */
  63. function addRenderer(&$repository, $renderedClassName, $renderingClassName)
  64. {
  65. LoggerLog::debug("LoggerRendererMap::addRenderer() Rendering class: [{$renderingClassName}], Rendered class: [{$renderedClassName}].");
  66. $renderer = LoggerObjectRenderer::factory($renderingClassName);
  67. if($renderer == null) {
  68. LoggerLog::warn("LoggerRendererMap::addRenderer() Could not instantiate renderer [{$renderingClassName}].");
  69. return;
  70. } else {
  71. $repository->setRenderer($renderedClassName, $renderer);
  72. }
  73. }
  74. /**
  75. * Find the appropriate renderer for the class type of the
  76. * <var>o</var> parameter.
  77. *
  78. * This is accomplished by calling the {@link getByObject()}
  79. * method if <var>o</var> is object or using {@link LoggerDefaultRenderer}.
  80. * Once a renderer is found, it is applied on the object <var>o</var> and
  81. * the result is returned as a string.
  82. *
  83. * @param mixed $o
  84. * @return string
  85. */
  86. function findAndRender($o)
  87. {
  88. if($o == null) {
  89. return null;
  90. } else {
  91. if (is_object($o)) {
  92. $renderer = $this->getByObject($o);
  93. if ($renderer !== null) {
  94. return $renderer->doRender($o);
  95. } else {
  96. return null;
  97. }
  98. } else {
  99. $renderer = $this->defaultRenderer;
  100. return $renderer->doRender($o);
  101. }
  102. }
  103. }
  104. /**
  105. * Syntactic sugar method that calls {@link PHP_MANUAL#get_class} with the
  106. * class of the object parameter.
  107. *
  108. * @param mixed $o
  109. * @return string
  110. */
  111. function &getByObject($o)
  112. {
  113. return ($o == null) ? null : $this->getByClassName(get_class($o));
  114. }
  115. /**
  116. * Search the parents of <var>clazz</var> for a renderer.
  117. *
  118. * The renderer closest in the hierarchy will be returned. If no
  119. * renderers could be found, then the default renderer is returned.
  120. *
  121. * @param string $class
  122. * @return LoggerObjectRenderer
  123. */
  124. function &getByClassName($class)
  125. {
  126. $r = null;
  127. for($c = strtolower($class); !empty($c); $c = get_parent_class($c)) {
  128. if (isset($this->map[$c])) {
  129. return $this->map[$c];
  130. }
  131. }
  132. return $this->defaultRenderer;
  133. }
  134. /**
  135. * @return LoggerDefaultRenderer
  136. */
  137. function &getDefaultRenderer()
  138. {
  139. return $this->defaultRenderer;
  140. }
  141. function clear()
  142. {
  143. $this->map = array();
  144. }
  145. /**
  146. * Register a {@link LoggerObjectRenderer} for <var>clazz</var>.
  147. * @param string $class
  148. * @param LoggerObjectRenderer $or
  149. */
  150. function put($class, $or)
  151. {
  152. $this->map[strtolower($class)] = $or;
  153. }
  154. /**
  155. * @param string $class
  156. * @return boolean
  157. */
  158. function rendererExists($class)
  159. {
  160. $class = basename($class);
  161. if (!class_exists($class)) {
  162. @include_once(LOG4PHP_DIR ."/or/{$class}.php");
  163. }
  164. return class_exists($class);
  165. }
  166. }
  167. ?>