123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- <?php
- /**
- * log4php is a PHP port of the log4j java logging package.
- *
- * <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
- * <p>Design, strategies and part of the methods documentation are developed by log4j team
- * (Ceki Gülcü as log4j project founder and
- * {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
- *
- * <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
- * For more information, please see {@link http://www.vxr.it/log4php/}.</p>
- *
- * <p>This software is published under the terms of the LGPL License
- * a copy of which has been included with this distribution in the LICENSE file.</p>
- *
- * @package log4php
- * @subpackage helpers
- */
- /**
- * @ignore
- */
- if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
- require_once(LOG4PHP_DIR . '/LoggerLevel.php');
- define('LOG4PHP_OPTION_CONVERTER_DELIM_START', '${');
- define('LOG4PHP_OPTION_CONVERTER_DELIM_STOP', '}');
- define('LOG4PHP_OPTION_CONVERTER_DELIM_START_LEN', 2);
- define('LOG4PHP_OPTION_CONVERTER_DELIM_STOP_LEN', 1);
- /**
- * A convenience class to convert property values to specific types.
- *
- * @author VxR <vxr@vxr.it>
- * @version $Revision: 1.1 $
- * @package log4php
- * @subpackage helpers
- * @static
- * @since 0.5
- */
- class LoggerOptionConverter {
- /**
- * OptionConverter is a static class.
- */
- function OptionConverter()
- {
- return;
- }
- /**
- * @param array $l
- * @param array $r
- * @return array
- *
- * @static
- */
- function concatanateArrays($l, $r)
- {
- return array_merge($l, $r);
- }
- /**
- * Read a predefined var.
- *
- * It returns a value referenced by <var>$key</var> using this search criteria:
- * - if <var>$key</var> is a constant then return it. Else
- * - if <var>$key</var> is set in <var>$_ENV</var> then return it. Else
- * - return <var>$def</var>.
- *
- * @param string $key The key to search for.
- * @param string $def The default value to return.
- * @return string the string value of the system property, or the default
- * value if there is no property with that key.
- *
- * @static
- */
- function getSystemProperty($key, $def)
- {
- LoggerLog::debug("LoggerOptionConverter::getSystemProperty():key=[{$key}]:def=[{$def}].");
- if (defined($key)) {
- return (string)constant($key);
- } elseif (isset($_ENV[$key])) {
- return (string)$_ENV[$key];
- } else {
- return $def;
- }
- }
- /**
- * If <var>$value</var> is <i>true</i>, then <i>true</i> is
- * returned. If <var>$value</var> is <i>false</i>, then
- * <i>true</i> is returned. Otherwise, <var>$default</var> is
- * returned.
- *
- * <p>Case of value is unimportant.</p>
- *
- * @param string $value
- * @param boolean $default
- * @return boolean
- *
- * @static
- */
- function toBoolean($value, $default)
- {
- if($value === null)
- return $default;
- if ($value == 1)
- return true;
- $trimmedVal = strtolower(trim($value));
- if ("true" == $trimmedVal or "yes" == $trimmedVal)
- return true;
- if ("false" == $trimmedVal)
- return false;
- return $default;
- }
- /**
- * @param string $value
- * @param integer $default
- * @return integer
- * @static
- */
- function toInt($value, $default)
- {
- $value = trim($value);
- if (is_numeric($value)) {
- return (int)$value;
- } else {
- return $default;
- }
- }
- /**
- * Converts a standard or custom priority level to a Level
- * object.
- *
- * <p> If <var>$value</var> is of form "<b>level#full_file_classname</b>",
- * where <i>full_file_classname</i> means the class filename with path
- * but without php extension, then the specified class' <i>toLevel()</i> method
- * is called to process the specified level string; if no '#'
- * character is present, then the default {@link LoggerLevel}
- * class is used to process the level value.</p>
- *
- * <p>As a special case, if the <var>$value</var> parameter is
- * equal to the string "NULL", then the value <i>null</i> will
- * be returned.</p>
- *
- * <p>If any error occurs while converting the value to a level,
- * the <var>$defaultValue</var> parameter, which may be
- * <i>null</i>, is returned.</p>
- *
- * <p>Case of <var>$value</var> is insignificant for the level level, but is
- * significant for the class name part, if present.</p>
- *
- * @param string $value
- * @param LoggerLevel $defaultValue
- * @return LoggerLevel a {@link LoggerLevel} or null
- * @static
- */
- function toLevel($value, $defaultValue)
- {
- if($value === null)
- return $defaultValue;
- $hashIndex = strpos($value, '#');
- if ($hashIndex === false) {
- if("NULL" == strtoupper($value)) {
- return null;
- } else {
- // no class name specified : use standard Level class
- return LoggerLevel::toLevel($value, $defaultValue);
- }
- }
- $result = $defaultValue;
- $clazz = substr($value, ($hashIndex + 1));
- $levelName = substr($value, 0, $hashIndex);
- // This is degenerate case but you never know.
- if("NULL" == strtoupper($levelName)) {
- return null;
- }
- LoggerLog::debug("LoggerOptionConverter::toLevel():class=[{$clazz}]:pri=[{$levelName}]");
- if (!class_exists($clazz))
- @include_once("{$clazz}.php");
- $clazz = basename($clazz);
- if (class_exists($clazz)) {
- $result = @call_user_func(array($clazz, 'toLevel'), $value, $defaultValue);
- if (!is_a($result, 'loggerlevel')) {
- LoggerLog::debug("LoggerOptionConverter::toLevel():class=[{$clazz}] cannot call toLevel(). Returning default.");
- $result = $defaultValue;
- }
- } else {
- LoggerLog::warn("LoggerOptionConverter::toLevel() class '{$clazz}' doesnt exists.");
- }
- return $result;
- }
- /**
- * @param string $value
- * @param float $default
- * @return float
- *
- * @static
- */
- function toFileSize($value, $default)
- {
- if ($value === null)
- return $default;
- $s = strtoupper(trim($value));
- $multiplier = (float)1;
- if(($index = strpos($s, 'KB')) !== false) {
- $multiplier = 1024;
- $s = substr($s, 0, $index);
- } elseif(($index = strpos($s, 'MB')) !== false) {
- $multiplier = 1024 * 1024;
- $s = substr($s, 0, $index);
- } elseif(($index = strpos($s, 'GB')) !== false) {
- $multiplier = 1024 * 1024 * 1024;
- $s = substr($s, 0, $index);
- }
- if(is_numeric($s)) {
- return (float)$s * $multiplier;
- } else {
- LoggerLog::warn("LoggerOptionConverter::toFileSize() [{$s}] is not in proper form.");
- }
- return $default;
- }
- /**
- * Find the value corresponding to <var>$key</var> in
- * <var>$props</var>. Then perform variable substitution on the
- * found value.
- *
- * @param string $key
- * @param array $props
- * @return string
- *
- * @static
- */
- function findAndSubst($key, $props)
- {
- $value = @$props[$key];
- if(empty($value)) {
- return null;
- }
- return LoggerOptionConverter::substVars($value, $props);
- }
- /**
- * Perform variable substitution in string <var>$val</var> from the
- * values of keys found with the {@link getSystemProperty()} method.
- *
- * <p>The variable substitution delimeters are <b>${</b> and <b>}</b>.
- *
- * <p>For example, if the "MY_CONSTANT" contains "value", then
- * the call
- * <code>
- * $s = LoggerOptionConverter::substituteVars("Value of key is ${MY_CONSTANT}.");
- * </code>
- * will set the variable <i>$s</i> to "Value of key is value.".</p>
- *
- * <p>If no value could be found for the specified key, then the
- * <var>$props</var> parameter is searched, if the value could not
- * be found there, then substitution defaults to the empty string.</p>
- *
- * <p>For example, if {@link getSystemProperty()} cannot find any value for the key
- * "inexistentKey", then the call
- * <code>
- * $s = LoggerOptionConverter::substVars("Value of inexistentKey is [${inexistentKey}]");
- * </code>
- * will set <var>$s</var> to "Value of inexistentKey is []".</p>
- *
- * <p>A warn is thrown if <var>$val</var> contains a start delimeter "${"
- * which is not balanced by a stop delimeter "}" and an empty string is returned.</p>
- *
- * @log4j-author Avy Sharell
- *
- * @param string $val The string on which variable substitution is performed.
- * @param array $props
- * @return string
- *
- * @static
- */
- function substVars($val, $props = null)
- {
- LoggerLog::debug("LoggerOptionConverter::substVars():val=[{$val}]");
-
- $sbuf = '';
- $i = 0;
- while(true) {
- $j = strpos($val, LOG4PHP_OPTION_CONVERTER_DELIM_START, $i);
- if ($j === false) {
- LoggerLog::debug("LoggerOptionConverter::substVars() no more variables");
- // no more variables
- if ($i == 0) { // this is a simple string
- LoggerLog::debug("LoggerOptionConverter::substVars() simple string");
- return $val;
- } else { // add the tail string which contails no variables and return the result.
- $sbuf .= substr($val, $i);
- LoggerLog::debug("LoggerOptionConverter::substVars():sbuf=[{$sbuf}]. Returning sbuf");
- return $sbuf;
- }
- } else {
-
- $sbuf .= substr($val, $i, $j-$i);
- LoggerLog::debug("LoggerOptionConverter::substVars():sbuf=[{$sbuf}]:i={$i}:j={$j}.");
- $k = strpos($val, LOG4PHP_OPTION_CONVERTER_DELIM_STOP, $j);
- if ($k === false) {
- LoggerLog::warn(
- "LoggerOptionConverter::substVars() " .
- "'{$val}' has no closing brace. Opening brace at position {$j}."
- );
- return '';
- } else {
- $j += LOG4PHP_OPTION_CONVERTER_DELIM_START_LEN;
- $key = substr($val, $j, $k - $j);
- // first try in System properties
- $replacement = LoggerOptionConverter::getSystemProperty($key, null);
- // then try props parameter
- if($replacement == null and $props !== null) {
- $replacement = @$props[$key];
- }
- if(!empty($replacement)) {
- // Do variable substitution on the replacement string
- // such that we can solve "Hello ${x2}" as "Hello p1"
- // the where the properties are
- // x1=p1
- // x2=${x1}
- $recursiveReplacement = LoggerOptionConverter::substVars($replacement, $props);
- $sbuf .= $recursiveReplacement;
- }
- $i = $k + LOG4PHP_OPTION_CONVERTER_DELIM_STOP_LEN;
- }
- }
- }
- }
- }
- ?>
|