From: Chuck Hagenbuch Date: Fri, 11 Jun 2010 14:30:41 +0000 (-0400) Subject: Add the Application ClassPathMapper X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=b302a56898185332d95b5c1418936d52d939f176;p=horde.git Add the Application ClassPathMapper --- diff --git a/framework/Autoloader/lib/Horde/Autoloader/ClassPathMapper/Application.php b/framework/Autoloader/lib/Horde/Autoloader/ClassPathMapper/Application.php new file mode 100644 index 000000000..d28bc3acc --- /dev/null +++ b/framework/Autoloader/lib/Horde/Autoloader/ClassPathMapper/Application.php @@ -0,0 +1,49 @@ + + * @author Chuck Hagenbuch + * @category Horde + * @package Horde_Autoloader + */ +class Horde_Autoloader_ClassPathMapper_Application implements Horde_Autoloader_ClassPathMapper +{ + protected $_appDir; + protected $_mappings = array(); + + /** + * The following constants are for naming the positions in the regex for + * easy readability later. + */ + const APPLICATION_POS = 1; + const ACTION_POS = 2; + const SUFFIX_POS = 3; + + const NAME_SEGMENT = '([0-9A-Z][0-9A-Za-z]+)+'; + + public function __construct($appDir) + { + $this->_appDir = rtrim($appDir, '/') . '/'; + } + + public function addMapping($classSuffix, $subDir) + { + $this->_mappings[$classSuffix] = $subDir; + $this->_classMatchRegex = '/^' . self::NAME_SEGMENT . '_' . self::NAME_SEGMENT . '_' . + '(' . implode('|', array_keys($this->_mappings)) . ')$/'; + } + + public function mapToPath($className) + { + if (preg_match($this->_classMatchRegex, $className, $matches)) { + return $this->_appDir . $this->_mappings[$matches[self::SUFFIX_POS]] . '/' . $matches[self::ACTION_POS] . '.php'; + } + } + + public function __toString() + { + return get_class($this) . ' ' . $this->_classMatchRegex . ' [' . $this->_appDir . ']'; + } +} diff --git a/framework/Autoloader/test/Horde/Autoloader/ClassPathMapper/ApplicationTest.php b/framework/Autoloader/test/Horde/Autoloader/ClassPathMapper/ApplicationTest.php new file mode 100644 index 000000000..8bfa1ba51 --- /dev/null +++ b/framework/Autoloader/test/Horde/Autoloader/ClassPathMapper/ApplicationTest.php @@ -0,0 +1,57 @@ +_mapper = new Horde_Autoloader_ClassPathMapper_Application( + 'app' // directory to app dir + ); + $this->_mapper->addMapping('Suffix', 'subdir'); + } + + public function providerValidClassNames() + { + return array( + array('Module_Action_Suffix', 'app/subdir/Action.php'), + array('MyModule_Action_Suffix', 'app/subdir/Action.php'), + array('Module_MyAction_Suffix', 'app/subdir/MyAction.php'), + array('MyModule_MyAction_Suffix', 'app/subdir/MyAction.php'), + ); + } + + /** + * @dataProvider providerValidClassNames + */ + public function testShouldMapValidAppClassToAppPath($validClassName, $classPath) + { + $this->assertEquals( + $classPath, + $this->_mapper->mapToPath($validClassName) + ); + } + + public function providerInvalidClassNames() + { + return array( + array('Module_Action_BadSuffix'), + array('module_Action_Suffix'), + array('Module_action_Suffix'), + array('Module-Action-Suffix'), + array(''), + ); + } + + /** + * @dataProvider providerInvalidClassNames + */ + public function testShouldIgnoreInvalidAppClassNames($invalidClassName) + { + $this->assertNull($this->_mapper->mapToPath($invalidClassName)); + } +}