You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ih...@apache.org on 2011/09/19 08:47:54 UTC

svn commit: r1172485 - in /logging/log4php/branches/experimental/config-adapters/src: main/php/ main/php/configurators/ test/php/ test/php/configurators/ test/php/renderers/

Author: ihabunek
Date: Mon Sep 19 06:47:53 2011
New Revision: 1172485

URL: http://svn.apache.org/viewvc?rev=1172485&view=rev
Log:
More work including tests and bugfixes found by tests. Also documentation.

Added:
    logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerConfiguratorTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterINITest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterPHPTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterXMLTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.ini
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.xml
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.ini
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.xml
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.ini
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.xml
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.ini
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.xml
Removed:
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfiguratorBasicTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfiguratorIniTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfiguratorPhpTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfiguratorXmlTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test1.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test1.properties
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test1.xml
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test2.properties
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test3.properties
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test4.properties
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test5.properties
    logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/test6.properties
Modified:
    logging/log4php/branches/experimental/config-adapters/src/main/php/Logger.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerAppenderPool.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerConfigurator.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapter.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterINI.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterPHP.php
    logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterXML.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/bootstrap.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/LoggerRendererMapTest.php
    logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/test4.properties

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/Logger.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/Logger.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/Logger.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/Logger.php Mon Sep 19 06:47:53 2011
@@ -57,6 +57,7 @@ class Logger {
 		'LoggerConfigurationAdapter' => '/configurators/LoggerConfigurationAdapter.php',
 		'LoggerConfigurationAdapterINI' => '/configurators/LoggerConfigurationAdapterINI.php',
 		'LoggerConfigurationAdapterXML' => '/configurators/LoggerConfigurationAdapterXML.php',
+		'LoggerConfigurationAdapterPHP' => '/configurators/LoggerConfigurationAdapterPHP.php',
 		'LoggerRoot' => '/LoggerRoot.php',
 		'LoggerAppender' => '/LoggerAppender.php',
 		'LoggerAppenderPool' => '/LoggerAppenderPool.php',
@@ -355,7 +356,7 @@ class Logger {
 	 */	   
 	public static function getRootLogger() {
 		if(!self::isInitialized()) {
-			self::initialize();
+			self::configure();
 		}
 		return self::getHierarchy()->getRootLogger();	  
 	}
@@ -481,14 +482,11 @@ class Logger {
 	
 	/**
 	 * Destroy configurations for logger definitions
-	 * 
-	 * @static
-	 * @return boolean 
 	 */
 	public static function resetConfiguration() {
-		$result = self::getHierarchy()->resetConfiguration();
+		self::getHierarchy()->resetConfiguration();
+		self::getHierarchy()->clear(); // TODO: clear or not?
 		self::$initialized = false;
-		return $result;	 
 	}
 
 	/**
@@ -566,12 +564,9 @@ class Logger {
 	 * that it can be included by PHP when necessary.
 	 */
 	public static function configure($configuration = null) {
-		if (!isset(self::$configurator)) {
-			self::$configurator = new LoggerConfigurator();	
-		}
-		
 		self::resetConfiguration();
-		self::$configurator->configure(self::getHierarchy(), $configuration);
+		$configurator = new LoggerConfigurator();
+		$configurator->configure(self::getHierarchy(), $configuration);
 		self::$initialized = true;
 	}
 	

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerAppenderPool.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerAppenderPool.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerAppenderPool.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerAppenderPool.php Mon Sep 19 06:47:53 2011
@@ -19,7 +19,12 @@
  */
 
 /**
- * Pool implmentation for LoggerAppender instances
+ * Pool implmentation for LoggerAppender instances.
+ * 
+ * The pool is used when configuring log4php. First all appender instances 
+ * are created in the pool. Afterward, they are linked to loggers, each 
+ * appender can be linked to multiple loggers. This makes sure duplicate 
+ * appenders are not created.
  *
  * @version $Revision: 795727 $
  * @package log4php
@@ -39,10 +44,14 @@ class LoggerAppenderPool {
 		$name = $appender->getName();
 		
 		if(empty($name)) {
-			trigger_error('Cannot add unnamed appender to pool.', E_USER_WARNING);
+			trigger_error('log4php: Cannot add unnamed appender to pool.', E_USER_WARNING);
 			return;
 		}
 		
+		if (isset(self::$appenders[$name])) {
+			trigger_error("log4php: Appender [$name] already exists in pool. Overwriting existing appender.", E_USER_WARNING);
+		}
+		
 		self::$appenders[$name] = $appender;
 	}
 	
@@ -57,6 +66,22 @@ class LoggerAppenderPool {
 	}
 	
 	/**
+	* Removes an appender from the pool by name.
+	* @param string $name Name of the appender to remove.
+	*/
+	public static function delete($name) {
+		unset(self::$appenders[$name]);
+	}
+	
+	/**
+	 * Returns all appenders from the pool.
+	 * @return array Array of LoggerAppender objects.
+	 */
+	public static function getAppenders() {
+		return self::$appenders;
+	}
+	
+	/**
 	 * Checks whether an appender exists in the pool.
 	 * @param string $name Name of the appender to look for.
 	 * @return boolean TRUE if the appender with the given name exists.

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerConfigurator.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerConfigurator.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerConfigurator.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/LoggerConfigurator.php Mon Sep 19 06:47:53 2011
@@ -19,7 +19,12 @@
  */
 
 /**
- * Configures log4php based on a provided configuration file or array.  
+ * Configures log4php based on a provided configuration file or array.
+ * 
+ * @package log4php
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version $Revision$
+ * @since 2.2
  */
 class LoggerConfigurator
 {
@@ -56,11 +61,18 @@ class LoggerConfigurator
         ),
 	);
 	
+	/** Holds the appenders before they are linked to loggers. */
+	private $appenders = array();
+	
 	/**
-	 * Starts logger configuration procedure.
+	 * Configures log4php based on the given configuration. The input can 
+	 * either be a path to the config file, or a PHP array holding the 
+	 * configuration. 
 	 * 
-	 * If the config file cannot be loaded or parsed, reverts to the default 
-	 * configuration contained in {@link $defaultConfiguration}.
+	 * If no configuration is given, or if the given configuration cannot be
+	 * parsed for whatever reason, a warning will be issued, and log4php
+	 * will use the default configuration contained in 
+	 * {@link $defaultConfiguration}.
 	 * 
 	 * @param LoggerHierarchy $hierarchy The hierarchy on which to perform 
 	 * 		the configuration. 
@@ -70,6 +82,25 @@ class LoggerConfigurator
 	 */
 	public function configure(LoggerHierarchy $hierarchy, $input = null)
 	{
+		$config = $this->parse($input);
+		$this->doConfigure($hierarchy, $config);
+	}
+	
+	/**
+	 * Parses the given configuration and returns the parsed configuration
+	 * as a PHP array. Does not perform any configuration. 
+	 * 
+	 * If no configuration is given, or if the given configuration cannot be
+	 * parsed for whatever reason, a warning will be issued, and the default 
+	 * configuration will be returned ({@link $defaultConfiguration}).
+	 * 
+	 * @param string|array $input Either path to the config file or the 
+	 * 		configuration as an array. If not set, default configuration 
+	 * 		will be used.
+	 * @return array The parsed configuration.
+	 */
+	public function parse($input)
+	{
 		// No input - use default configuration
 		if (!isset($input)) {
 			$config =  $this->defaultConfiguration;
@@ -80,12 +111,12 @@ class LoggerConfigurator
 			$config = $input;
 		}
 		
-		// String input - contains path to configuration file 
+		// String input - contains path to configuration file
 		else if (is_string($input)) {
 			try {
-				$config = $this->parseConfigFile($input);
-			} catch (Exception $e) {
-				$this->warn("Failed parsing configuration file: " . $e->getMessage());
+				$config = $this->parseFile($input);
+			} catch (LoggerException $e) {
+				$this->warn("Configuration failed. " . $e->getMessage() . " Using default configuration.");
 				$config = $this->defaultConfiguration;
 			}
 		}
@@ -95,22 +126,34 @@ class LoggerConfigurator
 			$this->warn("Invalid configuration param given. Reverting to default configuration.");
 			$config = $this->defaultConfiguration;
 		}
-
-		$this->doConfigure($hierarchy, $config);
+		
+		return $config;
 	}
+
+	/** 
+	 * Returns the default log4php configuration.
+	 * @return array
+	 */
+	public function getDefaultConfiguration() {
+		return $this->defaultConfiguration;
+	} 
 	
 	/**
-	 * Loads the configuration file from the given URL, determines which 
+	 * Loads the configuration file from the given URL, determines which
 	 * adapter to use, converts the configuration to a PHP array and
 	 * returns it.
-	 * 
+	 *
 	 * @param string $url Path to the config file.
 	 * @return The configuration from the config file, as a PHP array.
 	 * @throws LoggerException If the configuration file cannot be loaded, or
 	 * 		if the parsing fails.
 	 */
-	public function parseConfigFile($url)
-	{
+	private function parseFile($url) {
+		
+		if (!file_exists($url)) {
+			throw new LoggerException("File not found at [$url].");
+		}
+		
 		$type = $this->getConfigType($url);
 		$adapterClass = $this->adapters[$type];
 
@@ -158,7 +201,7 @@ class LoggerConfigurator
 		// Configure appenders and add them to the appender pool
 		if (isset($config['appenders']) && is_array($config['appenders'])) {
 			foreach($config['appenders'] as $name => $appenderConfig) {
-				$this->configureAppender($hierarchy, $name, $appenderConfig);
+				$this->configureAppender($name, $appenderConfig);
 			}
 		}
 		
@@ -182,21 +225,28 @@ class LoggerConfigurator
 		}
 	}
 	
-	private function configureAppender(LoggerHierarchy $hierarchy, $name, $config) {
+	/** 
+	 * Configures an appender based on given config and saves it to 
+	 * {@link $appenders} array so it can be later linked to loggers. 
+	 * @param string $name Appender name. 
+	 * @param array $config Appender configuration options.
+	 */
+	private function configureAppender($name, $config) {
+		// Parse appender class
 		$class = $config['class'];
-		
 		if (!class_exists($class)) {
 			$this->warn("Class [$class] does not exist. Skipping appender [$name].");
 			return;
 		}
 		
+		// Instantiate the appender
 		$appender = new $class($name);
 		if (!($appender instanceof LoggerAppender)) {
 			$this->warn("[$class] is not a valid appender class. Skipping appender [$name].");
 			return;
 		}
 		
-		// Parse the threshold
+		// Parse the appender threshold
 		if (isset($config['threshold'])) {
 			$threshold = LoggerLevel::toLevel($config['threshold']);
 			if ($threshold instanceof LoggerLevel) {
@@ -211,11 +261,10 @@ class LoggerConfigurator
 		if ($appender->requiresLayout() && isset($config['layout'])) {
 			$this->createAppenderLayout($appender, $config['layout']);
 		}
-		
+
+		// Activate and save for later linking to loggers
 		$appender->activateOptions();
-		
-		// Save appender in pool 
-		LoggerAppenderPool::add($appender);
+		$this->appenders[$name] = $appender;
 	}
 	
 	/**
@@ -244,19 +293,33 @@ class LoggerConfigurator
 		$appender->setLayout($layout);
 	}
 	
+	/** 
+	 * Configures the root logger
+	 * @see configureLogger() 
+	 */
 	private function configureRootLogger(LoggerHierarchy $hierarchy, $config) {
 		$logger = $hierarchy->getRootLogger();
 		$this->configureLogger($logger, $config);
 	}
-	
+
+	/**
+	 * Configures a logger which is not root.
+	 * @see configureLogger()
+	 */
 	private function configureOtherLogger(LoggerHierarchy $hierarchy, $name, $config) {
 		// Get logger from hierarchy (this creates it if it doesn't already exist)
 		$logger = $hierarchy->getLogger($name);
 		$this->configureLogger($logger, $config);
 	}
 	
+	/**
+	 * Configures a logger. 
+	 * 
+	 * @param Logger $logger The logger to configure
+	 * @param array $config Logger configuration options.
+	 */
 	private function configureLogger(Logger $logger, $config) {
-		$name = $logger->getName();
+		$loggerName = $logger->getName();
 		
 		// Set logger level
 		if (isset($config['level'])) {
@@ -264,18 +327,18 @@ class LoggerConfigurator
 			if (isset($level)) {
 				$logger->setLevel($level);
 			} else {
-				$this->warn("Invalid logger level [{$config['level']}] specified for logger [$name].");
+				$default = $logger->getLevel();
+				$this->warn("Invalid logger level [{$config['level']}] specified for logger [$loggerName].");
 			}
 		}
 		
 		// Link appenders to logger
 		if (isset($config['appenders'])) {
 			foreach($config['appenders'] as $appenderName) {
-				$appender = LoggerAppenderPool::get($appenderName);
-				if (isset($appender)) {
-					$logger->addAppender($appender);
+				if (isset($this->appenders[$appenderName])) {
+					$logger->addAppender($this->appenders[$appenderName]);
 				} else {
-					$this->warn("Nonexistnant appender [$appenderName] linked to logger [$name].");
+					$this->warn("Nonexistnant appender [$appenderName] linked to logger [$loggerName].");
 				}
 			}
 		}
@@ -286,11 +349,34 @@ class LoggerConfigurator
 			if (is_bool($additivity)) {
 				$logger->setAdditivity($additivity);
 			} else {
-				$this->warn("Invalid additivity value [{$config['additivity']}] specified for logger [$name].");
+				$this->warn("Invalid additivity value [{$config['additivity']}] specified for logger [$loggerName].");
 			}
 		}
 	}
 
+	/**
+	 * Helper method which applies given options to an object which has setters
+	 * for these options (such as appenders, layouts, etc.).
+	 * 
+	 * For example, if options are:
+	 * <code>
+	 * array(
+	 * 	'file' => '/tmp/myfile.log',
+	 * 	'append' => true
+	 * )
+	 * </code>
+	 * 
+	 * This method will call:
+	 * <code>
+	 * $object->setFile('/tmp/myfile.log')
+	 * $object->setAppend(true)
+	 * </code>
+	 * 
+	 * If required setters do not exist, it will produce a warning. 
+	 * 
+	 * @param mixed $object The object to configure.
+	 * @param unknown_type $options
+	 */
 	private function setOptions($object, $options) {
 		foreach($options as $name => $value) {
 			$setter = "set$name";

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapter.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapter.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapter.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapter.php Mon Sep 19 06:47:53 2011
@@ -1,5 +1,35 @@
 <?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
+ */
 
+/**
+ * The interface for configurator adapters.
+ * 
+ * Adapters convert configuration in several formats such as XML, ini and PHP 
+ * file to a PHP array. 
+ * 
+ * @package log4php
+ * @subpackage configurators
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version $Revision$
+ * @since 2.2
+ */
 interface LoggerConfigurationAdapter
 {
 	/** Converts the configuration file to PHP format usable by the configurator. */

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterINI.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterINI.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterINI.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterINI.php Mon Sep 19 06:47:53 2011
@@ -1,20 +1,61 @@
 <?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
+ */
 
+/**
+ * Converts ini configuration files to a PHP array.
+ * 
+ * These used to be called "properties" files (inherited from log4j), and that 
+ * file extension is still supported. 
+ *
+ * @package log4php
+ * @subpackage configurators
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version $Revision$
+ * @since 2.2
+ */
 class LoggerConfigurationAdapterINI implements LoggerConfigurationAdapter {
 	
+	/** Name to assign to the root logger. */
 	const ROOT_LOGGER_NAME = "root";
-	
+
+	/** Prefix used for defining logger additivity. */
 	const ADDITIVITY_PREFIX = "log4php.additivity.";
+	
+	/** Prefix used for defining logger threshold. */
 	const THRESHOLD_PREFIX = "log4php.threshold";
+	
+	/** Prefix used for defining the root logger. */
 	const ROOT_LOGGER_PREFIX = "log4php.rootLogger";
+	
+	/** Prefix used for defining a logger. */
 	const LOGGER_PREFIX = "log4php.logger.";
+	
+	/** Prefix used for defining an appender. */
 	const APPENDER_PREFIX = "log4php.appender.";
+	
+	/** Prefix used for defining a renderer. */
 	const RENDERER_PREFIX = "log4php.renderer.";
 	
+	/** Holds the configuration. */
 	private $config = array();
 	
-	private $properties;
-	
 	/**
 	 * Loads and parses the INI configuration file.
 	 * 
@@ -24,21 +65,21 @@ class LoggerConfigurationAdapterINI impl
 	 * 
 	 * @see http://php.net/manual/en/function.parse-ini-file.php
 	 * 
-	 * @param string $path Path to the config file.
+	 * @param string $url Path to the config file.
 	 * @throws LoggerException
 	 */
-	private function load($path) {
-		if(!file_exists($path)) {
-			throw new LoggerException("Config file not found on given path: [$path].");	
+	private function load($url) {
+		if (!file_exists($url)) {
+			throw new LoggerException("File [$url] does not exist.");
 		}
 		
-		$properties = @parse_ini_file($path, true, INI_SCANNER_RAW);
+		$properties = @parse_ini_file($url, true, INI_SCANNER_RAW);
 		if ($properties === false) {
 			$error = error_get_last();
 			throw new LoggerException("Error parsing configuration file: {$error['message']}");
 		}
 		
-		$this->properties = $properties;
+		return $properties;
 	}
 	
 	/**
@@ -49,21 +90,21 @@ class LoggerConfigurationAdapterINI impl
 	*/
 	public function convert($path) {
 		// Load the configuration
-		$this->load($path);
+		$properties = $this->load($path);
 		
 		// Parse threshold
-		if (isset($this->properties[self::THRESHOLD_PREFIX])) {
-			$this->config['threshold'] = $this->properties[self::THRESHOLD_PREFIX]; 
+		if (isset($properties[self::THRESHOLD_PREFIX])) {
+			$this->config['threshold'] = $properties[self::THRESHOLD_PREFIX]; 
 		}
 		
 		// Parse root logger
-		if (isset($this->properties[self::ROOT_LOGGER_PREFIX])) {
-			$this->parseLogger($this->properties[self::ROOT_LOGGER_PREFIX], self::ROOT_LOGGER_NAME);
+		if (isset($properties[self::ROOT_LOGGER_PREFIX])) {
+			$this->parseLogger($properties[self::ROOT_LOGGER_PREFIX], self::ROOT_LOGGER_NAME);
 		}
 		
 		$appenders = array();
 		
-		foreach($this->properties as $key => $value) {
+		foreach($properties as $key => $value) {
 			// Parse loggers
 			if ($this->beginsWith($key, self::LOGGER_PREFIX)) {
 				$name = substr($key, strlen(self::LOGGER_PREFIX));
@@ -73,7 +114,7 @@ class LoggerConfigurationAdapterINI impl
 			// Parse additivity
 			if ($this->beginsWith($key, self::ADDITIVITY_PREFIX)) {
 				$name = substr($key, strlen(self::ADDITIVITY_PREFIX));
-				$this->parseAdditivity($value, $name);
+				$this->config['loggers'][$name]['additivity'] = $value;
 			}
 			
 			// Parse appenders
@@ -92,65 +133,42 @@ class LoggerConfigurationAdapterINI impl
 	
 	
 	/**
-	 * Parses a logger property.
+	 * Parses a logger definition.
 	 * 
 	 * Loggers are defined in the following manner:
 	 * <pre>
 	 * log4php.logger.<name> = [<level>], [<appender-ref>, <appender-ref>, ...] 
 	 * </pre>
 	 * 
-	 * Where:
-	 * 	- level        - level to assign to the logger (optional)
-	 * 	- appender-ref - name of the appenders to attach to the logger (optional)
-	 * 
-	 * @param string $property
-	 * @param string $loggerName
+	 * @param string $value The configuration value (level and appender-refs).
+	 * @param string $name Logger name. 
 	 */
-	private function parseLogger($property, $loggerName) {
-		// Values are divided by commas
-		$values = explode(',', $property);
-		
-		if (empty($property) || empty($values)) {
+	private function parseLogger($value, $name) {
+		// Value is divided by commas
+		$parts = explode(',', $value);
+		if (empty($value) || empty($parts)) {
 			return;
 		}
 
 		// The first value is the logger level 
-		$level = array_shift($values);
+		$level = array_shift($parts);
 		
 		// The remaining values are appender references 
 		$appenders = array();
-		while($appender = array_shift($values)) {
+		while($appender = array_shift($parts)) {
 			$appender = trim($appender);
 			if (!empty($appender)) {
 				$appenders[] = trim($appender);
 			}
 		}
 
-		$config = array(
-			'level' => trim($level),
-			'appenders' => $appenders
-		);
-		
-		if ($loggerName == self::ROOT_LOGGER_NAME) {
-			$target = &$this->config['rootLogger']; 
-		} else {
-			$target = &$this->config['loggers'][$loggerName];
-		}
-		
-		// It is possible that the logger config array already exists  
-		//  (set when parsing additivity) so make sure not to overwrite it.
-		if (is_array($target)) {
-			$target = array_merge($target, $config);
-		} else {
-			$target = $config;
-		}
-	}
-	
-	private function parseAdditivity($value, $loggerName) {
-		if ($loggerName == self::ROOT_LOGGER_NAME) {
-			$this->config['rootLogger']['additivity'] = $value;
+		// Find the target configuration 
+		if ($name == self::ROOT_LOGGER_NAME) {
+			$this->config['rootLogger']['level'] = trim($level);
+			$this->config['rootLogger']['appenders'] = $appenders;
 		} else {
-			$this->config['loggers'][$loggerName]['additivity'] = $value;
+			$this->config['loggers'][$name]['level'] = trim($level);
+			$this->config['loggers'][$name]['appenders'] = $appenders;
 		}
 	}
 	
@@ -169,6 +187,11 @@ class LoggerConfigurationAdapterINI impl
 	 * log4php.appender.<name>.<param> = <value>
 	 * </pre>
 	 * 
+ 	 * Appender threshold:
+	 * <pre>
+	 * log4php.appender.<name>.threshold = <level>
+	 * </pre>
+	 * 
  	 * Appender layout:
 	 * <pre>
 	 * log4php.appender.<name>.layout = <layoutClass>
@@ -182,13 +205,32 @@ class LoggerConfigurationAdapterINI impl
 	 * For example, a full appender config might look like:
 	 * <pre>
 	 * log4php.appender.myAppender = LoggerAppenderConsole
-	 * log4php.appender.myAppender.target = STDOUT
-	 * log4php.appender.default.layout = LoggerLayoutPattern
-	 * log4php.appender.default.layout.conversionPattern = "%d %c: %m%n"
+	 * log4php.appender.myAppender.threshold = info
+	 * log4php.appender.myAppender.target = stdout
+	 * log4php.appender.myAppender.layout = LoggerLayoutPattern
+	 * log4php.appender.myAppender.layout.conversionPattern = "%d %c: %m%n"
 	 * </pre>
 	 * 
-	 * @param unknown_type $key
-	 * @param unknown_type $value
+	 * After parsing all these options, the following configuration can be 
+	 * found under $this->config['appenders']['myAppender']:
+	 * <pre>
+	 * array(
+	 * 	'class' => LoggerAppenderConsole,
+	 * 	'threshold' => info,
+	 * 	'params' => array(
+	 * 		'target' => 'stdout'
+	 * 	),
+	 * 	'layout' => array(
+	 * 		'class' => 'LoggerAppenderConsole',
+	 * 		'params' => array(
+	 * 			'conversionPattern' => '%d %c: %m%n'
+	 * 		)
+	 * 	)
+	 * )
+	 * </pre>
+	 * 
+	 * @param string $key
+	 * @param string $value
 	 */
 	private function parseAppender($key, $value) {
 
@@ -208,30 +250,43 @@ class LoggerConfigurationAdapterINI impl
 			return;
 		}
 		
-		// Two parts - either an appender property or layout class
+		// Two parts - either a parameter, a threshold or layout class
 		else if ($count == 2) {
 			
 			if ($parts[1] == 'layout') {
 				$this->config['appenders'][$name]['layout']['class'] = $value;
 				return;
+			} else if ($parts[1] == 'threshold') {
+				$this->config['appenders'][$name]['threshold'] = $value;
+				return;
 			} else {
-				$this->config['appenders'][$name][$parts[1]] = $value;
+				$this->config['appenders'][$name]['params'][$parts[1]] = $value;
 				return;
 			}
 		}
 		
-		// Three parts - this can only be a layout property
+		// Three parts - this can only be a layout parameter
 		else if ($count == 3) {
 			if ($parts[1] == 'layout') {
-				$this->config['appenders'][$name]['layout'][$parts[2]] = $value;
+				$this->config['appenders'][$name]['layout']['params'][$parts[2]] = $value;
 				return;
 			}
 		}
 		
-		trigger_error("log4php: Error in config file \"$key = $value\". Skipped this line.");
+		trigger_error("log4php: Don't know how to parse the following line: \"$key = $value\". Skipping.");
 	}
-	
-	
+
+	/**
+	 * Parses a renderer definition.
+	 * 
+	 * Renderers are defined as:
+	 * <pre>
+	 * log4php.renderer.<renderedClass> = <renderingClass> 
+	 * </pre>
+	 * 
+	 * @param string $key log4php.renderer.<renderedClass>
+	 * @param string $value <renderingClass>
+	 */
 	private function parseRenderer($key, $value) {
 		// Remove the appender prefix from key
 		$renderedClass = substr($key, strlen(self::APPENDER_PREFIX));
@@ -240,6 +295,7 @@ class LoggerConfigurationAdapterINI impl
 		$this->config['renderers'][] = compact('renderedClass', 'renderingClass');
 	}
 	
+	/** Helper method. Returns true if $str begins with $sub. */
 	private function beginsWith($str, $sub) {
 		return (strncmp($str, $sub, strlen($sub)) == 0);
 	}

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterPHP.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterPHP.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterPHP.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterPHP.php Mon Sep 19 06:47:53 2011
@@ -1,29 +1,81 @@
 <?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
+ */
 
 /**
- * Loads configuration from an PHP file and parses it to a PHP array.
+ * Converts PHP configuration files to a PHP array.
+ * 
+ * The file should only hold the PHP config array preceded by "return".
+ * 
+ * Example PHP config file:
+ * <code>
+ * <?php
+ * return array(
+ *   'rootLogger' => array(
+ *     'level' => 'info',
+ *     'appenders' => array('default')
+ *   ),
+ *   'appenders' => array(
+ *     'default' => array(
+ *       'class' => 'LoggerAppenderEcho',
+ *       'layout' => array(
+ *       	'class' => 'LoggerLayoutSimple'
+ *        )
+ *     )
+ *   )
+ * )
+ * ?>
+ * </code>
+ * 
+ * @package log4php
+ * @subpackage configurators
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version $Revision$
+ * @since 2.2
  */
 class LoggerConfigurationAdapterPHP implements LoggerConfigurationAdapter
 {
-	public function convert($url)
-	{
+	public function convert($url) {
 		if (!file_exists($url)) {
-			throw new LoggerException("Invalid configuration file: does not exist.");
+			throw new LoggerException("File [$url] does not exist.");
+		}
+		
+		// Load the config file
+		$data = @file_get_contents($url);
+		if ($data === false) {
+			$error = error_get_last();
+			throw new LoggerException("Error loading config file: {$error['message']}");
 		}
 		
-		$data = @include($url);
+		$config = @eval('?>' . $data);
 		
 		if ($config === false) {
 			$error = error_get_last();
-			throw new LoggerException("Error loading PHP configuration file: " . $error['message']);
+			throw new LoggerException("Error parsing configuration: " . $error['message']);
 		}
 		
 		if (empty($config)) {
-			throw new LoggerException("Invalid PHP configuration file: does not return any data.");
+			throw new LoggerException("Invalid configuration: empty configuration array.");
 		}
 		
 		if (!is_array($config)) {
-			throw new LoggerException("Invalid PHP configuration file: does not return an array.");
+			throw new LoggerException("Invalid configuration: not an array.");
 		}
 		
 		return $config;

Modified: logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterXML.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterXML.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterXML.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/main/php/configurators/LoggerConfigurationAdapterXML.php Mon Sep 19 06:47:53 2011
@@ -1,7 +1,31 @@
 <?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
+ */
 
 /**
- * Loads configuration from an XML file and converts it to a PHP array.
+ * Converts XML configuration files to a PHP array.
+ * 
+ * @package log4php
+ * @subpackage configurators
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version $Revision$
+ * @since 2.2
  */
 class LoggerConfigurationAdapterXML implements LoggerConfigurationAdapter
 {
@@ -48,57 +72,18 @@ class LoggerConfigurationAdapterXML impl
 	 */
 	private function loadXML($url) {
 		if (!file_exists($url)) {
-			$cwd = getcwd();
-			throw new LoggerException("Config file not found at [$url]. Current working dir is [$cwd].");
+			throw new LoggerException("File [$url] does not exist.");
 		}
 		
-		// Load the config file
-		$config = @file_get_contents($url);
-		if ($config === false) {
-			$error = error_get_last();
-			throw new LoggerException("Cannot load config file.");
-		}
-		
-		// Validate XML against schema
-// 		$internal = libxml_use_internal_errors(true);
-// 		$this->validateXML($config);
-// 		libxml_clear_errors();
-// 		libxml_use_internal_errors($internal);
-		
 		// Load XML
-		$xml = simplexml_load_string($config);
+		$xml = simplexml_load_file($url);
 		if ($xml === false) {
-			throw new LoggerException("XML file contains errors.");
+			throw new LoggerException("Error loading confuguration file.");
 		}
 		return $xml;
 	}
 	
 	/**
-	 * DOMDocument is used here for validation because SimpleXML doesn't 
-	 * implement this feature.
-	 * @param string $input The configuration XML.
-	 */
-	private function validateXML($url) {
-		$schema = dirname(__FILE__) . self::SCHEMA_PATH;
-		try {
-			$dom = new DOMDocument();
-			$dom->loadXML($url);
-		} catch(Exception $e) {
-			throw new LoggerException("Failed parsing XML configuration file.");
-		}
-		
-		$success = $dom->schemaValidate($schema);
-		if ($success === false) {
-			$errors = libxml_get_errors();
-			foreach($errors as $error) {
-				$message = trim($error->message) . " On line {$error->line} of the configuration file.";
-				$this->warn($message);
-			}
-			throw new LoggerException("The XML configuration file failed validation.");
-		}
-	}
-	
-	/**
 	 * Parses the <configuration> node.
 	 */
 	private function parseConfiguration(SimpleXMLElement $xml) {
@@ -115,9 +100,8 @@ class LoggerConfigurationAdapterXML impl
 		$appender = array();
 		$appender['class'] = $this->getAttributeValue($node, 'class');
 		
-		$attrs = $node->attributes();
-		if (isset($attrs['threshold'])) {
-			$appender['threshold'] = (string) $attrs['threshold'];
+		if (isset($node['threshold'])) {
+			$appender['threshold'] = $this->getAttributeValue($node, 'threshold');
 		}
 		
 		if (isset($node->layout)) {
@@ -147,13 +131,17 @@ class LoggerConfigurationAdapterXML impl
 		return $layout;
 	}

 	/** Parses any <param> child nodes returning them in an array. */
-	private function parseParameters($node) {
+	private function parseParameters($paramsNode) {
 		$params = array();
 
-		foreach($node->param as $paramNode) {
-			$attrs = $paramNode->attributes();
-			$name = (string) $attrs['name'];
-			$value = (string) $attrs['value'];
+		foreach($paramsNode->param as $paramNode) {
+			if (empty($paramNode['name'])) {
+				$this->warn("Found parameter node without a name. Skipping parameter.");
+				continue;
+			}
+			
+			$name = $this->getAttributeValue($paramNode, 'name');
+			$value = $this->getAttributeValue($paramNode, 'value');
 			
 			$params[$name] = $value;
 		}
@@ -180,18 +168,28 @@ class LoggerConfigurationAdapterXML impl
 	/** Parses a <logger> node. */
 	private function parseLogger(SimpleXMLElement $node) {
 		$logger = array();
-		$attributes = $node->attributes();
 		
-		$name = (string) $attributes['name'];
+		// Check logger name exists (mandatory because it is used as the array key)
+		if (empty($node['name'])) {
+			$this->warn("Found logger without a 'name' attribute. All loggers must be named. Skipping.");
+			return;
+		}
+		
+		$name = (string) $node['name'];
 		
 		if (isset($node->level)) {
 			$logger['level'] = $this->getAttributeValue($node->level, 'value');
 		}
 		
+		if (isset($node['additivity'])) {
+			$logger['additivity'] = $this->getAttributeValue($node, 'additivity');
+		}
+		
 		$logger['appenders'] = $this->parseAppenderReferences($node, $name);
 
+		// Check for duplicate loggers
 		if (isset($this->config['loggers'][$name])) {
-			$this->warn("Duplicate logger definition for $name. Overwriting.");
+			$this->warn("Duplicate logger definition [$name]. Overwriting.");
 		}
 		
 		$this->config['loggers'][$name] = $logger;

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerConfiguratorTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerConfiguratorTest.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerConfiguratorTest.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerConfiguratorTest.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,96 @@
+<?php
+ 
+
+/**
+ * 
+ * @group configurators
+ *
+ */
+ class LoggerConfiguratorTest extends PHPUnit_Framework_TestCase
+ {
+ 	/** Reset configuration after each test. */
+ 	public function setUp() {
+ 		Logger::resetConfiguration();
+ 	}
+ 	/** Reset configuration after each test. */
+ 	public function tearDown() {
+ 		Logger::resetConfiguration();
+ 	}
+ 	
+ 	/** Check proper default setup. */
+ 	public function testDefaultConfig() {
+ 		// Uses default config file
+ 		Logger::configure();
+ 		
+ 		$actual = Logger::getCurrentLoggers();
+ 		$expected = array();
+		$this->assertSame($expected, $actual);
+
+ 		$appenders = Logger::getRootLogger()->getAllAppenders();
+ 		$this->assertInternalType('array', $appenders);
+ 		$this->assertEquals(count($appenders), 1);
+ 		$this->assertSame('default', $appenders[0]->getName());
+ 		
+ 		$appender = $appenders[0];
+ 		$this->assertInstanceOf('LoggerAppenderEcho', $appender);
+ 		
+ 		$layout = $appender->getLayout();
+ 		$this->assertInstanceOf('LoggerLayoutSimple', $layout);
+ 		
+ 		$root = Logger::getRootLogger();
+ 		$appenders = $root->getAllAppenders();
+ 		$this->assertInternalType('array', $appenders);
+ 		$this->assertEquals(count($appenders), 1);
+		
+ 		$actual = $root->getLevel();
+ 		$expected = LoggerLevel::getLevelInfo();
+ 		$this->assertSame($expected, $actual);
+ 	}
+ 	
+ 	/**
+ 	 * Test that an error is reported when config file is not found. 
+ 	 * @expectedException PHPUnit_Framework_Error
+ 	 * @expectedExceptionMessage log4php: Configuration failed. File not found
+ 	 */
+ 	public function testNonexistantFile() {
+ 		Logger::configure('hopefully/this/path/doesnt/exist/config.xml');
+ 		
+ 	}
+ 	
+ 	/** Test correct fallback to the default configuration. */
+ 	public function testNonexistantFileFallback() {
+ 		@Logger::configure('hopefully/this/path/doesnt/exist/config.xml');
+ 		$this->testDefaultConfig();
+ 	}
+ 	
+ 	public function testAppendersWithLayout() {
+ 		Logger::configure(array(
+ 			'rootLogger' => array(
+ 				'appenders' => array('app1', 'app2')
+ 			),
+ 			'appenders' => array(
+ 				'app1' => array(
+ 					'class' => 'LoggerAppenderEcho',
+ 					'layout' => array(
+ 						'class' => 'LoggerLayoutSimple'
+ 					)
+ 				),
+		 		'app2' => array(
+		 		 	'class' => 'LoggerAppenderEcho',
+		 		 	'layout' => array(
+		 		 		'class' => 'LoggerLayoutPattern',
+		 		 		'conversionPattern' => 'message: %m%n'
+		 			)
+		 		),
+ 			) 
+ 		));
+ 		
+ 		ob_start();
+ 		Logger::getRootLogger()->info('info');
+ 		$actual = ob_get_contents();
+ 		ob_end_clean();
+ 		
+ 		$expected = "INFO - info" . PHP_EOL . "message: info" . PHP_EOL;
+  		$this->assertSame($expected, $actual);
+ 	}
+ }
\ No newline at end of file

Modified: logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerTest.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerTest.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/LoggerTest.php Mon Sep 19 06:47:53 2011
@@ -55,7 +55,7 @@ class LoggerTest extends PHPUnit_Framewo
 	}
 	
 	public function testCanLogToAllLevels() {
-		Logger::configure('LoggerTest.properties');
+		Logger::configure(dirname(__FILE__) . '/LoggerTest.properties');
 		
 		$logger = Logger::getLogger('mylogger');
 		ob_start();
@@ -78,7 +78,7 @@ class LoggerTest extends PHPUnit_Framewo
 	}
 	
 	public function testIsEnabledFor() {
-		Logger::configure('LoggerTest.properties');
+		Logger::configure(dirname(__FILE__) . '/LoggerTest.properties');
 		
 		$logger = Logger::getLogger('mylogger');
 		
@@ -97,34 +97,10 @@ class LoggerTest extends PHPUnit_Framewo
 		
 		self::assertEquals(0, count(Logger::getCurrentLoggers()));
 		
-		Logger::configure('LoggerTest.properties');
-		Logger::initialize();
+		Logger::configure(dirname(__FILE__) . '/LoggerTest.properties');
 		self::assertEquals(1, count(Logger::getCurrentLoggers()));
 		$list = Logger::getCurrentLoggers();
 		self::assertEquals('mylogger', $list[0]->getName());
 	}
-	
-	public function testConfigure() {
-		Logger::resetConfiguration();
-		Logger::configure();
-		self::assertEquals('LoggerConfiguratorBasic', Logger::getConfigurationClass());
-		self::assertEquals(null, Logger::getConfigurationFile());
-		
-		Logger::configure(null, 'MyLoggerClass');
-		self::assertEquals('MyLoggerClass', Logger::getConfigurationClass());
-		self::assertEquals(null, Logger::getConfigurationFile());
-		
-		Logger::configure('log4php.xml');
-		self::assertEquals('LoggerConfiguratorXml', Logger::getConfigurationClass());
-		self::assertEquals('log4php.xml', Logger::getConfigurationFile());
-		
-		Logger::configure('log4php.xml');
-		self::assertEquals('LoggerConfiguratorXml', Logger::getConfigurationClass());
-		self::assertEquals('log4php.xml', Logger::getConfigurationFile());
-		
-		Logger::configure('log4php.properties');
-		self::assertEquals('LoggerConfiguratorIni', Logger::getConfigurationClass());
-		self::assertEquals('log4php.properties', Logger::getConfigurationFile());
-		
-	}
+
 }

Modified: logging/log4php/branches/experimental/config-adapters/src/test/php/bootstrap.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/bootstrap.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/bootstrap.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/bootstrap.php Mon Sep 19 06:47:53 2011
@@ -26,4 +26,12 @@ error_reporting(E_ALL | E_STRICT); 
 
 date_default_timezone_set('Europe/London');
 
+// Define a temp dir where tests may write to
+$tmpDir = dirname(__FILE__) . '/../../../../target/temp/phpunit';
+if (!is_dir($tmpDir)) {
+	mkdir($tmpDir, 0777, true);
+}
+define('PHPUNIT_TEMP_DIR', realpath($tmpDir));
+
 require dirname(__FILE__) . '/../../main/php/Logger.php';
+

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterINITest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterINITest.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterINITest.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterINITest.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @group configurators
+ */
+class LoggerConfigurationAdapterINITest extends PHPUnit_Framework_TestCase {
+	
+	/** Expected output of parsing config1.ini. */
+	private $expected1 = array(
+		'threshold' => 'debug',
+		'rootLogger' => array(
+			'level' => 'DEBUG',
+			'appenders' => array('default'),
+		),
+		'appenders' => array(
+			'default' => array(
+				'class' => 'LoggerAppenderEcho',
+				'layout' => array(
+					'class' => 'LoggerLayoutTTCC',
+				),
+			),
+			'file' => array(
+				'class' => 'LoggerAppenderDailyFile',
+				'layout' => array(
+					'class' => 'LoggerLayoutPattern',
+					'params' => array(
+						'conversionPattern' => '%d{ISO8601} [%p] %c: %m (at %F line %L)%n',
+					),
+				),
+				'params' => array(
+					'datePattern' => 'Ymd',
+					'file' => 'target/examples/daily_%s.log',
+				),
+				'threshold' => 'warn'
+			),
+		),
+		'loggers' => array(
+			'foo' => array(
+				'level' => 'warn',
+				'appenders' => array('default'),
+			),
+			'foo.bar' => array(
+				'level' => 'debug',
+				'appenders' => array('file'),
+				'additivity' => 'true',
+			),
+			'foo.bar.baz' => array(
+				'level' => 'trace',
+				'appenders' => array('default', 'file'),
+				'additivity' => 'false',
+			),
+		),
+		'renderers' => array(
+			array(
+				'renderedClass' => 'Fruit',
+				'renderingClass' => 'FruitRenderer',
+			),
+			array(
+				'renderedClass' => 'Beer',
+				'renderingClass' => 'BeerRenderer',
+			),
+		),
+	);	
+	
+	public function testConfig() {
+		$url = dirname(__FILE__) . '/config1.ini';
+		$adapter = new LoggerConfigurationAdapterINI();
+		$actual = $adapter->convert($url);
+	
+		$this->assertSame($this->expected1, $actual);
+	}
+	
+	/**
+	 * Test exception is thrown when file cannot be found.
+ 	 * @expectedException LoggerException
+ 	 * @expectedExceptionMessage File [you/will/never/find/me.ini] does not exist.
+	 */
+	public function testNonExistantFileException() {
+		$adapter = new LoggerConfigurationAdapterINI();
+		$adapter->convert('you/will/never/find/me.ini');
+	}
+	
+	/**
+	 * Test exception is thrown when file is not a valid ini file.
+	 * @expectedException LoggerException
+	 * @expectedExceptionMessage Error parsing configuration file: syntax error, unexpected $end
+	 */
+	public function testInvalidFileException() {
+		$url =  dirname(__FILE__) . '/config2.ini';
+		$adapter = new LoggerConfigurationAdapterINI();
+		$adapter->convert($url);
+	}
+
+	/**
+	* Test a warning is triggered when configurator doesn't understand a line.
+	* @expectedException PHPUnit_Framework_Error
+	* @expectedExceptionMessage log4php: Don't know how to parse the following line: "log4php.appender.default.layout.param.bla = LoggerLayoutTTCC". Skipping.
+	*/
+	public function testInvalidLineWarning1() {
+		$url =  dirname(__FILE__) . '/config3.ini';
+		$adapter = new LoggerConfigurationAdapterINI();
+		$adapter->convert($url);
+	}
+	
+	/**
+	* Test a warning is triggered when configurator doesn't understand a line.
+	* @ expectedException PHPUnit_Framework_Error
+	* @ expectedExceptionMessage log4php: Don't know how to parse the following line: "log4php.appender.default.layout.param.bla = LoggerLayoutTTCC". Skipping.
+	*/
+	public function testInvalidLineWarning2() {
+		$url =  dirname(__FILE__) . '/config4.ini';
+		$adapter = new LoggerConfigurationAdapterINI();
+		$adapter->convert($url);
+	}
+}
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterPHPTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterPHPTest.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterPHPTest.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterPHPTest.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @group configurators
+ */
+class LoggerConfigurationAdapterPHPTest extends PHPUnit_Framework_TestCase {
+	
+	private $expected1 = array(
+		'rootLogger' => array(
+			'level' => 'info',
+			'appenders' => array('default')
+		),
+		'appenders' => array(
+			'default' => array(
+				'class' => 'LoggerAppenderEcho',
+				'layout' => array(
+					'class' => 'LoggerLayoutSimple'
+				 )
+			)
+		)
+	);
+	
+	public function testConfig() {
+		$url = dirname(__FILE__) . '/config1.php';
+		$adapter = new LoggerConfigurationAdapterPHP();
+		$actual = $adapter->convert($url);
+		
+		$this->assertSame($this->expected1, $actual);
+	}
+	
+	/**
+	 * Test exception is thrown when file cannot be found.
+ 	 * @expectedException LoggerException
+ 	 * @expectedExceptionMessage File [you/will/never/find/me.conf] does not exist.
+	 */
+	public function testNonExistantFileWarning() {
+		$adapter = new LoggerConfigurationAdapterPHP();
+		$adapter->convert('you/will/never/find/me.conf');
+	}
+	
+	/**
+	 * Test exception is thrown when file is not valid.
+	 * @expectedException LoggerException
+	 * @expectedExceptionMessage Error parsing configuration: syntax error
+	 */
+	public function testInvalidFileWarning() {
+		$url = dirname(__FILE__) . '/config2.php';
+		$adapter = new LoggerConfigurationAdapterPHP();
+		$adapter->convert($url);
+	}
+	
+	/**
+	 * Test exception is thrown when the configuration is empty.
+	 * @expectedException LoggerException
+	 * @expectedExceptionMessage Invalid configuration: empty configuration array.
+	 */
+	public function testEmptyConfigWarning() {
+		$url = dirname(__FILE__) . '/config3.php';
+		$adapter = new LoggerConfigurationAdapterPHP();
+		$adapter->convert($url);
+	}
+	
+	/**
+	 * Test exception is thrown when the configuration does not contain an array.
+	 * @expectedException LoggerException
+	 * @expectedExceptionMessage Invalid configuration: not an array.
+	 */
+	public function testInvalidConfigWarning() {
+		$url = dirname(__FILE__) . '/config4.php';
+		$adapter = new LoggerConfigurationAdapterPHP();
+		$adapter->convert($url);
+	}
+
+
+}
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterXMLTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterXMLTest.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterXMLTest.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/LoggerConfigurationAdapterXMLTest.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * @group configurators
+ */
+class LoggerConfigurationAdapterXMLTest extends PHPUnit_Framework_TestCase {
+	
+	/** Expected output of parsing config1.xml.*/
+	private $expected1 = array(
+		'appenders' => array(
+			'default' => array(
+				'class' => 'LoggerAppenderEcho',
+				'layout' => array(
+					'class' => 'LoggerLayoutTTCC',
+				),
+				'filters' => array(
+					array(
+						'class' => 'LoggerFilterLevelRange',
+						'params' => array(
+							'levelMin' => 'ERROR',
+							'levelMax' => 'FATAL',
+							'acceptOnMatch' => 'false',
+						),
+					),
+					array(
+						'class' => 'LoggerFilterDenyAll',
+					),
+				),
+			),
+			'file' => array(
+				'class' => 'LoggerAppenderDailyFile',
+				'layout' => array(
+					'class' => 'LoggerLayoutPattern',
+					'params' => array(
+						'conversionPattern' => '%d{ISO8601} [%p] %c: %m (at %F line %L)%n',
+					),
+				),
+				'params' => array(
+					'datePattern' => 'Ymd',
+					'file' => 'target/examples/daily_%s.log',
+				),
+				'threshold' => 'warn'
+			),
+		),
+		'loggers' => array(
+			'foo.bar.baz' => array(
+				'level' => 'trace',
+				'additivity' => 'false',
+				'appenders' => array('default'),
+			),
+			'foo.bar' => array(
+				'level' => 'debug',
+				'additivity' => 'true',
+				'appenders' => array('file'),
+			),
+			'foo' => array(
+				'level' => 'warn',
+				'appenders' => array('default', 'file'),
+			),
+		),
+		'renderers' => array(
+			array(
+				'renderedClass' => 'Fruit',
+				'renderingClass' => 'FruitRenderer',
+			),
+			array(
+				'renderedClass' => 'Beer',
+				'renderingClass' => 'BeerRenderer',
+			),
+		),
+		'threshold' => 'debug',
+		'rootLogger' => array(
+			'level' => 'DEBUG',
+			'appenders' => array('default'),
+		),
+	);
+	
+	public function setUp() {
+		Logger::resetConfiguration();
+	}
+	
+	public function tearDown() {
+		Logger::resetConfiguration();
+	}
+	
+	public function testConversion() {
+		$url =  dirname(__FILE__) . '/config1.xml';
+		$adapter = new LoggerConfigurationAdapterXML();
+		$actual = $adapter->convert($url);
+		$this->assertEquals($this->expected1, $actual);
+	}
+	
+	/**
+	 * Test exception is thrown when file cannot be found.
+ 	 * @expectedException LoggerException
+ 	 * @expectedExceptionMessage File [you/will/never/find/me.conf] does not exist.
+	 */
+	public function testNonExistantFile() {
+		$adapter = new LoggerConfigurationAdapterXML();
+		$adapter->convert('you/will/never/find/me.conf');
+	}
+	
+	/**
+	 * Test exception is thrown when file contains invalid XML.
+	 * @ expectedException LoggerException
+	 * @ expectedExceptionMessage Cannot load config file
+	 */
+	public function testInvalidXMLFile() {
+		// TODO: fix error reporting for XML files
+		//$url =  dirname(__FILE__) . '/config4.xml';
+		//$adapter = new LoggerConfigurationAdapterXML();
+		//$adapter->convert($url);
+	}
+	
+	/**
+	 * Test that a warning is triggered when two loggers with the same name 
+	 * are defined.
+ 	 * @expectedException PHPUnit_Framework_Error
+ 	 * @expectedExceptionMessage log4php: Duplicate logger definition [foo]. Overwriting
+	 */
+	public function testDuplicateLoggerWarning() {
+		$url =  dirname(__FILE__) . '/config3.xml';
+		$adapter = new LoggerConfigurationAdapterXML();
+		$adapter->convert($url);
+	}
+	
+	
+	/**
+	 * Test that when two loggers with the same name are defined, the second 
+	 * one will overwrite the first.
+	 */
+	public function testDuplicateLoggerConfig() {
+		$url =  dirname(__FILE__) . '/config3.xml';
+		$adapter = new LoggerConfigurationAdapterXML();
+		
+		// Supress the warning so that test can continue 
+		$config = @$adapter->convert($url);
+
+		// Second definition of foo has level set to warn (the first to info)
+		$this->assertEquals('warn', $config['loggers']['foo']['level']);		
+	}
+}
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.ini
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.ini?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.ini (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.ini Mon Sep 19 06:47:53 2011
@@ -0,0 +1,24 @@
+log4php.rootLogger = DEBUG, default
+
+log4php.appender.default = LoggerAppenderEcho
+log4php.appender.default.layout = LoggerLayoutTTCC
+
+log4php.appender.file = LoggerAppenderDailyFile
+log4php.appender.file.layout = LoggerLayoutPattern
+log4php.appender.file.layout.conversionPattern =%d{ISO8601} [%p] %c: %m (at %F line %L)%n
+log4php.appender.file.datePattern = Ymd
+log4php.appender.file.file = target/examples/daily_%s.log
+log4php.appender.file.threshold = warn
+
+log4php.logger.foo = warn, default
+
+log4php.logger.foo.bar = debug, file
+log4php.additivity.foo.bar = true
+
+log4php.logger.foo.bar.baz = trace, default, file
+log4php.additivity.foo.bar.baz = false
+
+log4php.renderer.Fruit = FruitRenderer
+log4php.renderer.Beer = BeerRenderer
+
+log4php.threshold = debug

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,19 @@
+<?php
+
+return array(
+	'rootLogger' => array(
+		'level' => 'info',
+		'appenders' => array('default')
+	),
+	'appenders' => array(
+		'default' => array(
+			'class' => 'LoggerAppenderEcho',
+			'layout' => array(
+				'class' => 'LoggerLayoutSimple'
+			 )
+		)
+	)
+)
+;
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.xml
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.xml?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.xml (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config1.xml Mon Sep 19 06:47:53 2011
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://logging.apache.org/log4php" threshold="debug">
+	<renderer renderedClass="Fruit" renderingClass="FruitRenderer" />
+	<renderer renderedClass="Beer" renderingClass="BeerRenderer" />
+    <appender name="default" class="LoggerAppenderEcho">
+        <layout class="LoggerLayoutTTCC"/>
+        <filter class="LoggerFilterLevelRange">
+            <param name="levelMin" value="ERROR" />
+            <param name="levelMax" value="FATAL" />
+            <param name="acceptOnMatch" value="false" />
+        </filter>
+        <filter class="LoggerFilterDenyAll" />
+    </appender>
+	<appender name="file" class="LoggerAppenderDailyFile" threshold="warn">
+		<param name="datePattern" value="Ymd" />
+		<param name="file" value="target/examples/daily_%s.log" />
+        <layout class="LoggerLayoutPattern">
+        	<param name="conversionPattern" value= "%d{ISO8601} [%p] %c: %m (at %F line %L)%n" />
+        </layout>
+    </appender>
+    <logger name="foo.bar.baz" additivity="false">
+        <level value="trace" />
+        <appender_ref ref="default" />
+    </logger>
+    <logger name="foo.bar" additivity="true">
+        <level value="debug" />
+        <appender_ref ref="file" />
+    </logger>
+    <logger name="foo">
+        <level value="warn" />
+        <appender_ref ref="default" />
+        <appender_ref ref="file" />
+    </logger>
+    <root>
+        <level value="DEBUG" />
+        <appender_ref ref="default" />
+    </root>
+</configuration>

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.ini
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.ini?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.ini (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.ini Mon Sep 19 06:47:53 2011
@@ -0,0 +1,5 @@
+#not valid because it doesn't have a line break at the end.
+log4php.rootLogger = DEBUG, default
+
+log4php.appender.default = LoggerAppenderEcho
+log4php.appender.default.layout = LoggerLayoutTTCC 
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,20 @@
+<?php
+
+
+return array(
+	'rootLogger' => array(
+		'level' => 'info',
+		'appenders' => array('default')
+	),
+	'appenders' => array(
+		'default' => array(
+			'class' => 'LoggerAppenderEcho',
+			'layout' => array(
+				'class' => 'LoggerLayoutSimple'
+			 )
+		)
+	)
+
+// Invalid file - no closing brace.
+	
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.xml
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.xml?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.xml (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config2.xml Mon Sep 19 06:47:53 2011
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+	<!-- Duplicate renderer -->
+	<renderer renderedClass="Fruit" renderingClass="FruitRenderer1" />
+	<renderer renderedClass="Fruit" renderingClass="FruitRenderer2" />
+	<renderer renderedClass="Beer" renderingClass="BeerRenderer" />
+    <appender name="default" class="LoggerAppenderEcho">
+        <layout class="LoggerLayoutSimple"/>
+    </appender>
+    <root>
+        <level value="DEBUG" />
+        <appender_ref ref="default" />
+    </root>
+</configuration>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.ini
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.ini?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.ini (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.ini Mon Sep 19 06:47:53 2011
@@ -0,0 +1,7 @@
+log4php.rootLogger = DEBUG, default
+
+log4php.appender.default = LoggerAppenderEcho
+
+# invalid appender line should trigger warning
+log4php.appender.default.layout.param.bla = LoggerLayoutTTCC
+ 
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,5 @@
+<?php
+
+// Empty config
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.xml
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.xml?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.xml (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config3.xml Mon Sep 19 06:47:53 2011
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://logging.apache.org/log4php" threshold="debug">
+
+    <appender name="default" class="LoggerAppenderEcho">
+        <layout class="LoggerLayoutSimple"/>
+    </appender>
+    
+    <!-- Duplicate logger -->
+    <logger name="foo">
+        <level value="info" />
+        <appender_ref ref="default" />
+    </logger>
+    
+    <logger name="foo">
+        <level value="warn" />
+        <appender_ref ref="default" />
+    </logger>
+    
+    <root>
+        <level value="DEBUG" />
+        <appender_ref ref="default" />
+    </root>
+</configuration>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.ini
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.ini?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.ini (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.ini Mon Sep 19 06:47:53 2011
@@ -0,0 +1,7 @@
+log4php.rootLogger = DEBUG, default
+
+log4php.appender.default = LoggerAppenderEcho
+
+# invalid appender line should trigger warning
+log4php.appender.default.not-layout.param = LoggerLayoutTTCC
+ 
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.php?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.php (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.php Mon Sep 19 06:47:53 2011
@@ -0,0 +1,6 @@
+<?php
+
+// Not an array
+return new Exception();
+
+?>
\ No newline at end of file

Added: logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.xml
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.xml?rev=1172485&view=auto
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.xml (added)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/configurators/config4.xml Mon Sep 19 06:47:53 2011
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://logging.apache.org/log4php" threshold="debug">
+
+    <appender name="default" class="LoggerAppenderEcho">
+        <layout class="LoggerLayoutSimple"/>
+    </appender>
+    
+    <!-- Duplicate logger -->
+    <logger name="foo">
+        <level value="info" />
+        <appender_ref ref="default" />
+    </logger>
+    
+    <logger name="foo">
+        <level value="warn" />
+        <appender_ref ref="default" />
+    </logger>
+    
+    <root>
+        <level value="DEBUG" />
+        <appender_ref ref="default" />
+    </root>
+
+    <!-- Invalid XML file -->
\ No newline at end of file

Modified: logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/LoggerRendererMapTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/LoggerRendererMapTest.php?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/LoggerRendererMapTest.php (original)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/LoggerRendererMapTest.php Mon Sep 19 06:47:53 2011
@@ -46,7 +46,6 @@ class LoggerRendererMapTest extends PHPU
 	public function testFindAndRender() {
 		$fruit = new Fruit3();
 		Logger::configure(dirname(__FILE__).'/test4.properties');
-		Logger::initialize();
 		$hierarchy = Logger::getHierarchy();
 		
 		$map = $hierarchy->getRendererMap();
@@ -57,7 +56,6 @@ class LoggerRendererMapTest extends PHPU
 	public function testFindAndRenderDescendants() {
 		$fruit = new Fruit3Descendant();
 		Logger::configure(dirname(__FILE__).'/test4.properties');
-		Logger::initialize();
 		$hierarchy = Logger::getHierarchy();
 
 		$map = $hierarchy->getRendererMap();
@@ -68,7 +66,6 @@ class LoggerRendererMapTest extends PHPU
 	public function testGetByObject() {
 		$fruit = new Fruit3();
 		Logger::configure(dirname(__FILE__).'/test4.properties');
-		Logger::initialize();
 		$hierarchy = Logger::getHierarchy();
 		
 		$map = $hierarchy->getRendererMap();
@@ -78,7 +75,6 @@ class LoggerRendererMapTest extends PHPU
         
 	public function testGetByClassName() {
 		Logger::configure(dirname(__FILE__).'/test4.properties');
-		Logger::initialize();
 		$hierarchy = Logger::getHierarchy();
 		
 		$map = $hierarchy->getRendererMap();
@@ -89,14 +85,14 @@ class LoggerRendererMapTest extends PHPU
 	public function testUsage() {
 	    Logger::resetConfiguration();
         Logger::configure(dirname(__FILE__).'/test4.properties');
-        Logger::initialize();
         $logger = Logger::getRootLogger();
  
         ob_start();
-        $logger->error(new Fruit3());
-        $v = ob_get_contents();
+        $logger->warn(new Fruit3());
+        $actual = ob_get_contents();
         ob_end_clean();
 
-        self::assertEquals("ERROR - test1,test2,test3" . PHP_EOL, $v);
+        $expected = "WARN - test1,test2,test3" . PHP_EOL;
+        self::assertEquals($expected, $actual);
 	}
 }

Modified: logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/test4.properties
URL: http://svn.apache.org/viewvc/logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/test4.properties?rev=1172485&r1=1172484&r2=1172485&view=diff
==============================================================================
--- logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/test4.properties (original)
+++ logging/log4php/branches/experimental/config-adapters/src/test/php/renderers/test4.properties Mon Sep 19 06:47:53 2011
@@ -19,9 +19,9 @@ log4php.appender.default = LoggerAppende
 log4php.appender.default.layout = LoggerLayoutSimple
 log4php.appender.default.threshold = WARN
 
-log4php.appender.blub2 = LoggerAppenderEcho
+log4php.appender.rendr2 = LoggerAppenderEcho
 log4php.appender.rendr2.layout = LoggerLayoutSimple
-log4php.appender.rendr2.threshold = INFO
+log4php.appender.rendr2.threshold = ERROR
 
 log4php.threshold = WARN
 log4php.rootLogger = WARN, default, rendr2