[BUGFIX] Autoloader fails for several classes
authorNicole Cordes <n.cordes@biz-design.biz>
Tue, 28 Aug 2012 11:24:26 +0000 (13:24 +0200)
committerThomas Maroschik <tmaroschik@dfau.de>
Tue, 28 Aug 2012 17:39:50 +0000 (19:39 +0200)
Due to false path the autoloader doesn't work in several cases. This patch
attaches the last class name parameter to file path.

Change-Id: Id3a7ee7204944267824f70457d4786c38cd278ec
Fixes: #40339
Related: #40095
Releases: 6.0
Reviewed-on: http://review.typo3.org/14153
Reviewed-by: Jigal van Hemert
Tested-by: Jigal van Hemert
Reviewed-by: Thomas Maroschik
Tested-by: Thomas Maroschik
typo3/sysext/core/Classes/Autoloader.php
typo3/sysext/core/Tests/Unit/AutoloaderTest.php

index cfce9d5..70f1980 100644 (file)
@@ -283,12 +283,16 @@ class Autoloader {
                        $delimiter = '\\';
                }
                $classNameParts = explode($delimiter, $tempClassName, 4);
-               if (((isset($classNameParts[0]) && $classNameParts[0] === 'TYPO3') && isset($classNameParts[1])) && $classNameParts[1] === 'CMS') {
+               if ((isset($classNameParts[0]) && $classNameParts[0] === 'TYPO3') && (isset($classNameParts[1]) && $classNameParts[1] === 'CMS')) {
                        $extensionKey = \TYPO3\CMS\Core\Utility\GeneralUtility::camelCaseToLowerCaseUnderscored($classNameParts[2]);
                        $classNameWithoutVendorAndProduct = $classNameParts[3];
                } else {
                        $extensionKey = \TYPO3\CMS\Core\Utility\GeneralUtility::camelCaseToLowerCaseUnderscored($classNameParts[1]);
                        $classNameWithoutVendorAndProduct = $classNameParts[2];
+
+                       if (isset($classNameParts[3])) {
+                               $classNameWithoutVendorAndProduct .= $delimiter . $classNameParts[3];
+                       }
                }
 
                if ($extensionKey) {
@@ -296,7 +300,7 @@ class Autoloader {
                                // This will throw a BadFunctionCallException if the extension is not loaded
                                $extensionPath = \TYPO3\CMS\Core\Extension\ExtensionManager::extPath($extensionKey);
                                $classPath = (substr(strtolower($classNameWithoutVendorAndProduct), 0, 5) === 'tests') ? '' : 'Classes/';
-                               $classFilePathAndName = (($extensionPath . $classPath) . strtr($classNameWithoutVendorAndProduct, $delimiter, '/')) . '.php';
+                               $classFilePathAndName = $extensionPath . $classPath . strtr($classNameWithoutVendorAndProduct, $delimiter, '/') . '.php';
                                self::addClassToCache($classFilePathAndName, $className);
                        } catch (\BadFunctionCallException $exception) {
 
index f89cf8c..397f901 100644 (file)
@@ -131,6 +131,7 @@ class AutoloaderTest extends \Tx_Phpunit_TestCase {
 
        /**
         * @test
+        * @expectedException \RuntimeException
         */
        public function autoloadFindsClassFileDefinedInExtAutoloadFile() {
                $extKey = $this->createFakeExtension();
@@ -157,7 +158,6 @@ return array(\'' . $class) . '\' => \'') . $file) . '\');
                \TYPO3\CMS\Core\Autoloader::unregisterAutoloader();
                \TYPO3\CMS\Core\Autoloader::registerAutoloader();
                // Expect the exception of the file to be thrown
-               $this->setExpectedException('\\RuntimeException', '', 1310203812);
                \TYPO3\CMS\Core\Autoloader::autoload($class);
        }
 
@@ -250,19 +250,19 @@ throw new \RuntimeException(\'\', 1336756850);
 
        /**
         * @test
+        * @expectedException \RuntimeException
         */
        public function autoloadFindsClassFileThatRespectsExtbaseNamingSchemeWithoutExtAutoloadFile() {
-               $this->markTestSkipped('This test was a blocker for other namespaced tests.');
                $extKey = $this->createFakeExtension();
                $extPath = ((PATH_site . 'typo3temp/') . $extKey) . '/';
                // Create a class named Tx_Extension_Foo123_Bar456
                // to find file extension/Classes/Foo123/Bar456.php
                $pathSegment = 'Foo' . uniqid();
                $fileName = 'Bar' . uniqid();
-               $class = (((('Tx_' . $extKey) . '_') . $pathSegment) . '_') . $fileName;
+               $class = 'Tx_' . ucfirst($extKey) . '_' . $pathSegment . '_' . $fileName;
 
-               $file = (((($extPath . 'Classes/') . $pathSegment) . '/') . $fileName) . '.php';
-               \TYPO3\CMS\Core\Utility\GeneralUtility::mkdir_deep(($extPath . 'Classes/') . $pathSegment);
+               $file = $extPath . 'Classes/' . $pathSegment . '/' . $fileName . '.php';
+               \TYPO3\CMS\Core\Utility\GeneralUtility::mkdir_deep($extPath . 'Classes/' . $pathSegment);
                file_put_contents($file, '<?php
 
 throw new \\RuntimeException(\'\', 1310203813);
@@ -274,7 +274,6 @@ throw new \\RuntimeException(\'\', 1310203813);
                $GLOBALS['typo3CacheManager'] = $this->getMock('TYPO3\\CMS\\Core\\Cache\\CacheManager', array('getCache'));
                $GLOBALS['typo3CacheManager']->expects($this->any())->method('getCache')->will($this->returnValue($mockCache));
                // Expect the exception of the file to be thrown
-               $this->setExpectedException('RuntimeException', '', 1310203813);
                \TYPO3\CMS\Core\Autoloader::autoload($class);
        }
 
@@ -415,24 +414,23 @@ die();
 
        /**
         * @test
+        * @expectedException \RuntimeException
         */
        public function autoloadFindsClassFileThatRespectsExtbaseNamingSchemeWithNamespace() {
-               $this->markTestSkipped('This test was a blocker for other namespaced tests.');
                $extKey = $this->createFakeExtension();
                $extPath = ((PATH_site . 'typo3temp/') . $extKey) . '/';
                // Create a class named \Tx\Extension\Foo123\Bar456
                // to find file extension/Classes/Foo123/Bar456.php
                $pathSegment = 'Foo' . uniqid();
                $fileName = 'Bar' . uniqid();
-               $namespacedClass = (((('\\Vendor\\' . $extKey) . '\\') . $pathSegment) . '\\') . $fileName;
-               $file = (((($extPath . 'Classes/') . $pathSegment) . '/') . $fileName) . '.php';
+               $namespacedClass = '\\Vendor\\' . ucfirst($extKey) . '\\' . $pathSegment . '\\' . $fileName;
+               $file = $extPath . 'Classes/' . $pathSegment . '/' . $fileName . '.php';
                \TYPO3\CMS\Core\Utility\GeneralUtility::mkdir_deep(($extPath . 'Classes/') . $pathSegment);
-               file_put_contents($file, ((('<?php' . LF) . 'throw new RuntimeException(\'\', 1342800577);') . LF) . '?>');
+               file_put_contents($file, '<?php' . LF . 'throw new \\RuntimeException(\'\', 1342800577);' . LF . '?>');
                // Re-initialize autoloader registry to force it to recognize the new extension
                \TYPO3\CMS\Core\Autoloader::unregisterAutoloader();
                \TYPO3\CMS\Core\Autoloader::registerAutoloader();
                // Expect the exception of the file to be thrown
-               $this->setExpectedException('\\RuntimeException', '', 1342800577);
                \TYPO3\CMS\Core\Autoloader::autoload($namespacedClass);
        }