Your IP : 3.148.210.23


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/classes/general/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/classes/general/taskassert.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage tasks
 * @copyright 2001-2013 Bitrix
 */

class CTaskAssertException extends \Bitrix\Main\ArgumentException
{
}


class CTaskAssert
{
	// Error log levels:
	const ELL_TRACE   = 0x001;	// track control flow
	const ELL_DEBUG   = 0x002;	// track conditions
	const ELL_INFO    = 0x004;	// key points of normal control flow
	const ELL_WARN    = 0x008;	// synonym for ELL_WARNING
	const ELL_WARNING = 0x010;	// non-critical erros, but expected correct result
	const ELL_ERROR   = 0x020;	// errors, incorrect results expected
	const ELL_FATAL   = 0x040;

	private static $bLogEnabled = false;
	private static $pathToLogFile = false;
	private static $fp = null;	// file pointer

	// List of error log levels, that will be logged
	private static $bmEnabledLogLevels = array();

	private static $sessId = false;


	/**
	 * @throws CTaskAssertException when assertion failed
	 */
	public static function assert($assertion)
	{
		if ($assertion === true)
			return;

		if (self::$bLogEnabled !== false)
			static::log("Assertion failed!", self::ELL_ERROR, true);

		throw new CTaskAssertException();
	}


	public static function logWarning($logMessage)
	{
		trigger_error('CTaskAssert::ELL_WARNING (no data loss expected): ' . $logMessage, E_USER_WARNING);
		self::log($logMessage, self::ELL_WARNING);
		return (false);
	}


	public static function logError($logMessage)
	{
		trigger_error('CTaskAssert::ELL_ERROR (data loss or corruption expected): ' . $logMessage, E_USER_WARNING);
		self::log($logMessage, self::ELL_ERROR);
		return (false);
	}


	public static function logFatal($logMessage)
	{
		trigger_error('CTaskAssert::ELL_FATAL: ' . $logMessage, E_USER_WARNING);
		self::log($logMessage, self::ELL_FATAL);
		return (false);
	}


	public static function log($logMessage, $errLogLevel = self::ELL_TRACE, $showBacktrace = false)
	{
		if (self::$bLogEnabled === false)
			return;

		// Log only selected errorlevels
		if ( ! ($errLogLevel & self::$bmEnabledLogLevels) )
			return;

		/** @noinspection PhpUnusedLocalVariableInspection */
		$prefix = '';

		switch ($errLogLevel)
		{
			case self::ELL_TRACE:
				$prefix = '[TRACE] ';
			break;

			case self::ELL_DEBUG:
				$prefix = '[DEBUG] ';
			break;

			case self::ELL_INFO:
				$prefix = '[INFO] ';
			break;

			case self::ELL_WARNING:
				$prefix = '[WARN] ';
			break;

			case self::ELL_ERROR:
				$prefix = '[ERROR] ';
			break;

			case self::ELL_FATAL:
				$prefix = '[FATAL] ';
			break;

			default:
				$prefix = '[UNKNOWN ERROR LOG LEVEL #' . $errLogLevel . '] ';
			break;
		}

		list($usec, $sec) = explode(" ", microtime());
		$strMessage = date('Y-m-d H:i:s', $sec).'.'.mb_substr($usec, 2, 4)
			. ' ' . self::$sessId . ' ' . $prefix . $logMessage . "\n";

		if ($showBacktrace && function_exists('debug_backtrace'))
		{
			$strMessage .= "\nStack trace:, referer: " 
				. $_SERVER['REQUEST_METHOD'] . ' '
				. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n";
			$arBacktraces = debug_backtrace();

			$iMx = count($arBacktraces);

			$ii = 0;
			for ($i = $iMx - 1; $i >= 0; $i--)
			{
				$arBacktrace = $arBacktraces[$i];

				$strMessage .= str_pad(++$ii, 2, ' ', STR_PAD_LEFT) . '. ';

				if ($arBacktrace['type'] != '')
					$strMessage .= $arBacktrace['class'] . $arBacktrace['type'];

				$strMessage .= $arBacktrace['function'] . '(';

				if (
					($arBacktrace['function'] !== 'IncludeComponent')
					&& ($arBacktrace['function'] !== 'includeComponent')
					&& ($arBacktrace['function'] !== 'run')
					&& ($arBacktrace['function'] !== 'runTest')
					&& ($arBacktrace['function'] !== 'invokeArgs')
				)
				{
					$arArgsFormatted = array();

					foreach ($arBacktrace['args'] as $arg)
						$arArgsFormatted[] = var_export($arg, true);

					$strMessage .=  implode(', ', $arArgsFormatted);
				}

				$strMessage .= ') ' . $arBacktrace['file'] 
					. ':' . $arBacktrace['line'] . "\n";
			}
		}

		// do log
		if (self::$fp !== null)
		{
			@fwrite(
				self::$fp,
				$strMessage
			);
		}
	}


	public static function setLogFileName($fullPathToLogFile)
	{
		// Open and closes files here, if need
		if ($fullPathToLogFile !== self::$pathToLogFile)
		{
			self::$pathToLogFile = $fullPathToLogFile;

			if (is_resource(self::$fp))
			{
				@fclose(self::$fp);
				self::$fp = null;	// file closed
			}

			$fp = @fopen($fullPathToLogFile, 'ab+');

			if ( ! is_resource($fp) )
			{
				AddMessage2Log('[ERROR] CTaskAssert: cannot open/create log file with name: ' . $fullPathToLogFile, 'tasks');
				return (false);
			}

			self::$fp = $fp;
		}

		return (true);
	}


	public static function disableLogging()
	{
		if (self::$bLogEnabled !== true)
			return;		// nothing to do

		static::log('CTaskAssert: stop logging.', self::ELL_INFO);
		self::$bLogEnabled = false;
		self::$bmEnabledLogLevels = 0;
	}


	/**
	 * @param integer $enableLogLevels bitmask of enabled log levels. By default all error levels will be enabled.
	 *
	 * @return bool
	 * @example CTaskAssert::enableLogging(CTaskAssert::ELL_TRACE | CTaskAssert::ELL_DEBUG);
	 */
	public static function enableLogging($enableLogLevels = null)
	{
		if (self::$sessId === false)
		{
			$tmp = '';

			for ($i=0; $i < 4; $i++)
			{
				if (mt_rand(1, 36) <= 10)
					$tmp .= chr(mt_rand(48,57));
				else
					$tmp .= chr(mt_rand(65,90));
			}

			self::$sessId = $tmp;
			unset ($tmp);
		}

		if ((self::$fp === null) && (self::$pathToLogFile === false))
			self::setLogFileName($_SERVER['DOCUMENT_ROOT'] . BX_ROOT . '/modules/tasks.log');

		if (self::$fp === null)
		{
			AddMessage2Log('[ERROR] CTaskAssert::enableLogging(): Log file cannot be used or not set. Logging not enabled.', 'tasks');
			return (false);
		}

		// if wrong error levels given, log this and switch to default value
		if (($enableLogLevels !== null) && ( ! is_int($enableLogLevels) ))
		{
			$enableLogLevels = null;
			AddMessage2Log('[ERROR] CTaskAssert::enableLogging(): Invalid log errors level set, using defaults', 'tasks');
		}

		// If null given, than use default value (all levels enabled)
		if ($enableLogLevels === null)
		{
			$enableLogLevels = self::ELL_TRACE | self::ELL_DEBUG 
				| self::ELL_INFO | self::ELL_WARNING | self::ELL_ERROR
				| self::ELL_FATAL;
		}

		self::$bmEnabledLogLevels = $enableLogLevels;

		if ($enableLogLevels !== 0)
			self::$bLogEnabled = true;
		else
			self::$bLogEnabled = false;

		return (true);
	}


	public static function isLaxIntegers()
	{
		return (static::_isLaxIntegers(func_get_args()));
	}


	public static function assertLaxIntegers()
	{
		static::assert(static::_isLaxIntegers(func_get_args()));
	}


	private static function _isLaxIntegers($args)
	{
		if (count($args) == 0)
			return (false);

		foreach ($args as $value)
		{
			if ( ! (
				is_int($value)
				|| (
					is_string($value)
					&& ($value !== '')
					&& (
						preg_match('/^[0-9]{1,}$/', $value)		// positive integer
						|| (		// or negative integer
							(mb_substr($value, 0, 1) === '-')
							&& preg_match('/^[0-9]{1,}$/', mb_substr($value, 1))
						)
					)
				)
			))
			{
				return (false);
			}
		}

		return (true);
	}
}