LOG4PHP-200: Improved superglobal access in converters

Removed the current, slightly hackish access to superglobal variables,
i.e. ${$this->name}. Instead added a function in each sub-class which
returns the contents of the required superglobal. This fixes the issue and
replaces hacky accessing with more vanilla code.

Signed-off-by: Ivan Habunek <ihabunek@apache.org>
diff --git a/src/main/php/pattern/LoggerPatternConverterCookie.php b/src/main/php/pattern/LoggerPatternConverterCookie.php
index 6b0e221..2118193 100644
--- a/src/main/php/pattern/LoggerPatternConverterCookie.php
+++ b/src/main/php/pattern/LoggerPatternConverterCookie.php
@@ -30,5 +30,7 @@
  * @since 2.3

  */

 class LoggerPatternConverterCookie extends LoggerPatternConverterSuperglobal {

-	protected $name = '_COOKIE';

-}
\ No newline at end of file
+	protected function getSource() {

+		return $_COOKIE;

+	}

+}

diff --git a/src/main/php/pattern/LoggerPatternConverterEnvironment.php b/src/main/php/pattern/LoggerPatternConverterEnvironment.php
index 3096b20..0b3aabe 100644
--- a/src/main/php/pattern/LoggerPatternConverterEnvironment.php
+++ b/src/main/php/pattern/LoggerPatternConverterEnvironment.php
@@ -30,5 +30,7 @@
  * @since 2.3

  */

 class LoggerPatternConverterEnvironment extends LoggerPatternConverterSuperglobal {

-	protected $name = '_ENV';

+	protected function getSource() {

+		return $_ENV;

+	}

 }

diff --git a/src/main/php/pattern/LoggerPatternConverterRequest.php b/src/main/php/pattern/LoggerPatternConverterRequest.php
index ac45e6b..939805a 100644
--- a/src/main/php/pattern/LoggerPatternConverterRequest.php
+++ b/src/main/php/pattern/LoggerPatternConverterRequest.php
@@ -30,5 +30,7 @@
  * @since 2.3

  */

 class LoggerPatternConverterRequest extends LoggerPatternConverterSuperglobal {

-	protected $name = '_REQUEST';

-}
\ No newline at end of file
+	protected function getSource() {

+		return $_REQUEST;

+	}

+}

diff --git a/src/main/php/pattern/LoggerPatternConverterServer.php b/src/main/php/pattern/LoggerPatternConverterServer.php
index 27a983d..636f848 100644
--- a/src/main/php/pattern/LoggerPatternConverterServer.php
+++ b/src/main/php/pattern/LoggerPatternConverterServer.php
@@ -30,5 +30,7 @@
  * @since 2.3

  */

 class LoggerPatternConverterServer extends LoggerPatternConverterSuperglobal {

-	protected $name = '_SERVER';

+	protected function getSource() {

+		return $_SERVER;

+	}

 }

diff --git a/src/main/php/pattern/LoggerPatternConverterSession.php b/src/main/php/pattern/LoggerPatternConverterSession.php
index a73e27a..8f572c7 100644
--- a/src/main/php/pattern/LoggerPatternConverterSession.php
+++ b/src/main/php/pattern/LoggerPatternConverterSession.php
@@ -30,5 +30,7 @@
  * @since 2.3

  */

 class LoggerPatternConverterSession extends LoggerPatternConverterSuperglobal {

-	protected $name = '_SESSION';

+	protected function getSource() {

+		return $_SESSION;

+	}

 }

diff --git a/src/main/php/pattern/LoggerPatternConverterSuperglobal.php b/src/main/php/pattern/LoggerPatternConverterSuperglobal.php
index f1164d3..dbabeca 100644
--- a/src/main/php/pattern/LoggerPatternConverterSuperglobal.php
+++ b/src/main/php/pattern/LoggerPatternConverterSuperglobal.php
@@ -36,12 +36,6 @@
  * @since 2.3

  */

 abstract class LoggerPatternConverterSuperglobal extends LoggerPatternConverter {

-

-	/** 

-	 * Name of the superglobal variable, to be defined by subclasses. 

-	 * For example: "_SERVER" or "_ENV". 

-	 */

-	protected $name;

 	

 	protected $value = '';

 	

@@ -50,33 +44,8 @@
 		if (isset($this->option) && $this->option !== '') {

 			$key = $this->option;

 		}

-	

-		/*

-		 * There is a bug in PHP which doesn't allow superglobals to be 

-		 * accessed when their name is stored in a variable, e.g.:

-		 * 

-		 * $name = '_SERVER';

-		 * $array = $$name;

-		 * 

-		 * This code does not work when run from within a method (only when run

-		 * in global scope). But the following code does work: 

-		 * 

-		 * $name = '_SERVER';

-		 * global $$name;

-		 * $array = $$name;

-		 * 

-		 * That's why global is used here.

-		 */

-		global ${$this->name};

-			

-		// Check the given superglobal exists. It is possible that it is not initialized.

-		if (!isset(${$this->name})) {

-			$class = get_class($this);

-			trigger_error("log4php: $class: Cannot find superglobal variable \${$this->name}.", E_USER_WARNING);

-			return;

-		}

-		

-		$source = ${$this->name};

+

+		$source = $this->getSource();

 		

 		// When the key is set, display the matching value

 		if (isset($key)) {

diff --git a/src/test/php/pattern/LoggerPatternConverterTest.php b/src/test/php/pattern/LoggerPatternConverterTest.php
index 704930e..ec09edd 100644
--- a/src/test/php/pattern/LoggerPatternConverterTest.php
+++ b/src/test/php/pattern/LoggerPatternConverterTest.php
@@ -22,11 +22,6 @@
  * @link       http://logging.apache.org/log4php

  */

 

-/** Converter referencing non-existant superglobal variable. */

-class LoggerInvalidSuperglobalConverter extends LoggerPatternConverterSuperglobal {

-	protected $name = '_FOO';

-}

-

 /**

  * @group pattern

  */

@@ -305,15 +300,6 @@
 		self::assertSame($expected, $actual);

 	}

 

-	/**

-	 * @expectedException PHPUnit_Framework_Error

-	 * @expectedExceptionMessage log4php: LoggerInvalidSuperglobalConverter: Cannot find superglobal variable $_FOO

-	 */

-	public function testNonexistantSuperglobal() {

-		$converter = new LoggerInvalidSuperglobalConverter($this->info);

-		$actual = $converter->convert($this->event);

-	}

-

 	public function testFormattingTrimRight() {

 		$event = LoggerTestHelper::getInfoEvent('0123456789');