<?php
/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @package log4php
 */

if (function_exists('__autoload')) {
	trigger_error("log4php: It looks like your code is using an __autoload() function. log4php uses spl_autoload_register() which will bypass your __autoload() function and may break autoloading.", E_USER_WARNING);
}

spl_autoload_register(array('LoggerAutoloader', 'autoload'));

/**
 * Class autoloader.
 *
 * @package log4php
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */
class LoggerAutoloader {

	/** Maps classnames to files containing the class. */
	private static $classes = array(

		// Base
		'LoggerAppender' => '/LoggerAppender.php',
		'LoggerAppenderPool' => '/LoggerAppenderPool.php',
		'LoggerConfigurable' => '/LoggerConfigurable.php',
		'LoggerConfigurator' => '/LoggerConfigurator.php',
		'LoggerException' => '/LoggerException.php',
		'LoggerFilter' => '/LoggerFilter.php',
		'LoggerHierarchy' => '/LoggerHierarchy.php',
		'LoggerLevel' => '/LoggerLevel.php',
		'LoggerLocationInfo' => '/LoggerLocationInfo.php',
		'LoggerLoggingEvent' => '/LoggerLoggingEvent.php',
		'LoggerMDC' => '/LoggerMDC.php',
		'LoggerNDC' => '/LoggerNDC.php',
		'LoggerLayout' => '/LoggerLayout.php',
		'LoggerReflectionUtils' => '/LoggerReflectionUtils.php',
		'LoggerRoot' => '/LoggerRoot.php',
		'LoggerThrowableInformation' => '/LoggerThrowableInformation.php',

		// Appenders
		'LoggerAppenderAMQP' => '/appenders/LoggerAppenderAMQP.php',
		'LoggerAppenderConsole' => '/appenders/LoggerAppenderConsole.php',
		'LoggerAppenderDailyFile' => '/appenders/LoggerAppenderDailyFile.php',
		'LoggerAppenderEcho' => '/appenders/LoggerAppenderEcho.php',
		'LoggerAppenderFile' => '/appenders/LoggerAppenderFile.php',
		'LoggerAppenderGraylog2' => '/appenders/LoggerAppenderGraylog2.php',
		'LoggerAppenderMail' => '/appenders/LoggerAppenderMail.php',
		'LoggerAppenderMailEvent' => '/appenders/LoggerAppenderMailEvent.php',
		'LoggerAppenderMongoDB' => '/appenders/LoggerAppenderMongoDB.php',
		'LoggerAppenderNull' => '/appenders/LoggerAppenderNull.php',
		'LoggerAppenderFirePHP' => '/appenders/LoggerAppenderFirePHP.php',
		'LoggerAppenderPDO' => '/appenders/LoggerAppenderPDO.php',
		'LoggerAppenderPhp' => '/appenders/LoggerAppenderPhp.php',
		'LoggerAppenderRollingFile' => '/appenders/LoggerAppenderRollingFile.php',
		'LoggerAppenderSocket' => '/appenders/LoggerAppenderSocket.php',
		'LoggerAppenderSyslog' => '/appenders/LoggerAppenderSyslog.php',

		// Configurators
		'LoggerConfigurationAdapter' => '/configurators/LoggerConfigurationAdapter.php',
		'LoggerConfigurationAdapterINI' => '/configurators/LoggerConfigurationAdapterINI.php',
		'LoggerConfigurationAdapterPHP' => '/configurators/LoggerConfigurationAdapterPHP.php',
		'LoggerConfigurationAdapterXML' => '/configurators/LoggerConfigurationAdapterXML.php',
		'LoggerConfiguratorDefault' => '/configurators/LoggerConfiguratorDefault.php',

		// Filters
		'LoggerFilterDenyAll' => '/filters/LoggerFilterDenyAll.php',
		'LoggerFilterLevelMatch' => '/filters/LoggerFilterLevelMatch.php',
		'LoggerFilterLevelRange' => '/filters/LoggerFilterLevelRange.php',
		'LoggerFilterStringMatch' => '/filters/LoggerFilterStringMatch.php',

		// Helpers
		'LoggerFormattingInfo' => '/helpers/LoggerFormattingInfo.php',
		'LoggerMailerInterface' => '/helpers/LoggerMailerInterface.php',
		'LoggerMailerPHP' => '/helpers/LoggerMailerPHP.php',
		'LoggerOptionConverter' => '/helpers/LoggerOptionConverter.php',
		'LoggerPatternParser' => '/helpers/LoggerPatternParser.php',
		'LoggerUtils' => '/helpers/LoggerUtils.php',

		// Pattern converters
		'LoggerPatternConverter' => '/pattern/LoggerPatternConverter.php',
		'LoggerPatternConverterClass' => '/pattern/LoggerPatternConverterClass.php',
		'LoggerPatternConverterCookie' => '/pattern/LoggerPatternConverterCookie.php',
		'LoggerPatternConverterDate' => '/pattern/LoggerPatternConverterDate.php',
		'LoggerPatternConverterEnvironment' => '/pattern/LoggerPatternConverterEnvironment.php',
		'LoggerPatternConverterFile' => '/pattern/LoggerPatternConverterFile.php',
		'LoggerPatternConverterLevel' => '/pattern/LoggerPatternConverterLevel.php',
		'LoggerPatternConverterLine' => '/pattern/LoggerPatternConverterLine.php',
		'LoggerPatternConverterLiteral' => '/pattern/LoggerPatternConverterLiteral.php',
		'LoggerPatternConverterLocation' => '/pattern/LoggerPatternConverterLocation.php',
		'LoggerPatternConverterLogger' => '/pattern/LoggerPatternConverterLogger.php',
		'LoggerPatternConverterMDC' => '/pattern/LoggerPatternConverterMDC.php',
		'LoggerPatternConverterMessage' => '/pattern/LoggerPatternConverterMessage.php',
		'LoggerPatternConverterMethod' => '/pattern/LoggerPatternConverterMethod.php',
		'LoggerPatternConverterNDC' => '/pattern/LoggerPatternConverterNDC.php',
		'LoggerPatternConverterNewLine' => '/pattern/LoggerPatternConverterNewLine.php',
		'LoggerPatternConverterProcess' => '/pattern/LoggerPatternConverterProcess.php',
		'LoggerPatternConverterRelative' => '/pattern/LoggerPatternConverterRelative.php',
		'LoggerPatternConverterRequest' => '/pattern/LoggerPatternConverterRequest.php',
		'LoggerPatternConverterServer' => '/pattern/LoggerPatternConverterServer.php',
		'LoggerPatternConverterSession' => '/pattern/LoggerPatternConverterSession.php',
		'LoggerPatternConverterSessionID' => '/pattern/LoggerPatternConverterSessionID.php',
		'LoggerPatternConverterSuperglobal' => '/pattern/LoggerPatternConverterSuperglobal.php',
		'LoggerPatternConverterThrowable' => '/pattern/LoggerPatternConverterThrowable.php',

		// Layouts
		'LoggerLayoutGelf' => '/layouts/LoggerLayoutGelf.php',
		'LoggerLayoutHtml' => '/layouts/LoggerLayoutHtml.php',
		'LoggerLayoutPattern' => '/layouts/LoggerLayoutPattern.php',
		'LoggerLayoutSerialized' => '/layouts/LoggerLayoutSerialized.php',
		'LoggerLayoutSimple' => '/layouts/LoggerLayoutSimple.php',
		'LoggerLayoutTTCC' => '/layouts/LoggerLayoutTTCC.php',
		'LoggerLayoutXml' => '/layouts/LoggerLayoutXml.php',

		// Renderers
		'LoggerRendererDefault' => '/renderers/LoggerRendererDefault.php',
		'LoggerRendererException' => '/renderers/LoggerRendererException.php',
		'LoggerRendererMap' => '/renderers/LoggerRendererMap.php',
		'LoggerRenderer' => '/renderers/LoggerRenderer.php',
	);

	/**
	 * Loads a class.
	 * @param string $className The name of the class to load.
	 */
	public static function autoload($className) {
		if(isset(self::$classes[$className])) {
			include dirname(__FILE__) . self::$classes[$className];
		}
	}
}
