[!!!][TASK] Remove old XCLASS compatibility layer
authorChristian Kuhn <lolli@schwarzbu.ch>
Fri, 20 Jul 2012 13:18:09 +0000 (15:18 +0200)
committerHelmut Hummel <helmut.hummel@typo3.org>
Fri, 20 Jul 2012 14:35:36 +0000 (16:35 +0200)
The XCLASS handling that was changed with #31893 allows to register
XCLASS'es with an entry in ext_autoload. The patch introduced a
compatibility layer to support the old registration by guessing the
needed array key in TYPO3_CONF_VARS. This turns out to not work very
reliable and could only be fixed with a massive organizational and
performance overhead.

Therefore, this patch now drops the complete compatibility layer, so an
extension must be adapted to support the new scheme. This is ok, since
extension authors maintaining extensions with XCLASS'es are aware that
those classes already break frequently in the past, and were already
advised to request hooks in the long run.

Change-Id: I95a8bf986c94c784c69d4c4cc4a9c4645cd3fcc9
Resolves: #39128
Releases: 6.0
Reviewed-on: http://review.typo3.org/12926
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
Reviewed-by: Helmut Hummel
Tested-by: Helmut Hummel
NEWS.txt
t3lib/class.t3lib_autoloader.php
tests/Unit/t3lib/class.t3lib_autoloaderTest.php
typo3/classes/Bootstrap.php
typo3/cli_dispatch.phpsh
typo3/init.php
typo3/install/index.php
typo3/sysext/cms/tslib/index_ts.php

index 5411b7f..62d97ac 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -79,13 +79,12 @@ removed instead of deprecating it.
 * New XCLASS handling
 
 The old way of registering XCLASSes in $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS'] is
-deprecated. XCLASSES can now be registered by adding a 'ux_' prefixed entry of
-the base class to the ext_autoload.php file providing the XCLASS path. The
-deprecation layer for old class registration can potentially calculate a wrong
-path so the XCLASS registration can fail now. This can be fixed by addiononally
-using the new registration scheme through ext_autoload.
-Extension authors are advised to remove the three line XCLASS statement at the
-bottom of class files now for any extension with a compatibility for 6.0 and above.
+removed. XCLASSES must now be registered by adding a 'ux_' prefixed entry of
+the base class to the ext_autoload.php file providing the XCLASS path. To keep
+compatibility for 6.0 and 4.x, extension authors should add the ext_autoload
+entry and additionally keep the TYPO3_CONF_VARS registration.
+Extension authors should remove the three line XCLASS statement at the bottom
+of class files now for any extension with a compatibility for 6.0 and above.
 More information can be found at http://wiki.typo3.org/Autoload
 
 Removed Functionality
index 2e1d258..e79e66b 100644 (file)
@@ -183,9 +183,6 @@ class t3lib_autoloader {
                        // Look up class name in cache file
                if (array_key_exists($classNameLower, self::$classNameToFileMapping)) {
                        $classPath = self::$classNameToFileMapping[$classNameLower];
-               } else {
-                               // Handle deprecated XCLASS lookups
-                       $classPath = self::classPathForDeprecatedXclassHandling($classPath, $classNameLower);
                }
 
                if (
@@ -201,93 +198,6 @@ class t3lib_autoloader {
        }
 
        /**
-        * Resolve 'old' XCLASS registrations from TYPO3_CONF_VARS
-        *
-        * @param string $classPath The current class path from previous lookup
-        * @param string $classNameLower Lower cased class name to be looked up
-        * @return string Class path
-        * @deprecated since 6.0, deprecation log is handled in bootstrap deprecationLogForOldXclassRegistration().
-        *              This method and the call can be safely removed in two versions.
-        */
-       protected static function classPathForDeprecatedXclassHandling($classPath, $classNameLower) {
-                       // Start XCLASS handling if the requested class starts with 'ux_'
-                       // If so, we need to resolve the base class first
-                       // e.g. ux_t3lib_beuserauth => t3lib_beuserauth
-               $baseClassOfXClass = NULL;
-               $xClassRequested = FALSE;
-               if ($classPath === NULL && substr($classNameLower, 0, 3) === 'ux_') {
-                       $baseClassOfXClass = substr($classNameLower, 3);
-                       $xClassRequested = TRUE;
-               }
-
-                       // If a XCLASS was requested for autoloading, the autoloader has to know which class will be extended.
-                       // only with this information it is possible to get the "relative path" of the extended class.
-                       // The "relative path" is needed to simulate the correct path for $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS'][$relativePath]
-                       // "relative path" is in quotes, because this is not every time the case.
-                       // The old way to include an XCLASS is defined by such a piece of code at the end of a class:
-                       //
-                       // if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php'])) {
-                       //              include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php']);
-                       // }
-               if ($classPath === NULL && array_key_exists($baseClassOfXClass, self::$classNameToFileMapping)) {
-                       $classPath = self::$classNameToFileMapping[$baseClassOfXClass];
-               }
-
-                       // Try to determine the relative class for the old XCLASS, if:
-                       // - We got a physical path for the base class
-                       // - An xclass was requested
-                       // - The old way of xclassing is still used
-                       // $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_beuserauth.php']
-               if ($classPath !== NULL && $xClassRequested === TRUE && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS'])) {
-
-                               // Check if the XCLASS for the requested path is set  a transformation for some paths needs to be done
-                       $relativeClassPath = substr($classPath, strlen(PATH_site));
-
-                               // Replacements for some special cases
-                               // @TODO: This layer should be adapted / finished for further special core cases
-                       $relativeClassPath = str_replace(
-                               array(
-                                       'typo3/sysext/cms/tslib',
-                                       'typo3conf/ext',
-                                       'typo3/sysext',
-                               ),
-                               array(
-                                       'tslib',
-                                       'ext',
-                                       'ext',
-                               ),
-                               $relativeClassPath
-                       );
-
-                       if (isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS'][$relativeClassPath])) {
-                                       // If a class path was found: Set it and add to cache file
-                               $classPath = $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS'][$relativeClassPath];
-                               self::addClassToCache(PATH_site . $classPath, $classNameLower);
-                       } else {
-                                       // If an XCLASS was requested AND no XLASS was found,
-                                       // $classPath is filled with the path of the class which will be extended.
-                                       //
-                                       // If no XCLASS is defined, we set $classPath to NULL, because otherwise the autoloader will
-                                       // load the same class twice
-                                       //
-                                       // Example:
-                                       // Autoload ux_t3lib_l10n_locales. This class will be not find in the autoloader cache.
-                                       // After this, we try to determine the path of base class, in our case t3lib_l10n_locales
-                                       // (to determine the relative class for old XCLASS inclusion).
-                                       // So we determine the relative path ob the base class ('t3lib/l10n/class.t3lib_l10n_locales.php')
-                                       // and have a look up for defined XCLASSes of t3lib_l10n_locales
-                                       // ($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/l10n/class.t3lib_l10n_locales.php'])
-                                       // If we found one XCLASS, we will return the physical path of this class
-                                       // If no XCLASS was found, we MUST set $classPath to NULL
-                                       // Without this step the physical path of t3lib_l10n_locales will be returned and a
-                                       // "Cannot re-declare class t3lib_l10n_locales"-Error will occur
-                               $classPath = NULL;
-                       }
-               }
-               return $classPath;
-       }
-
-       /**
         * Find all ext_autoload files and merge with core_autoload.
         *
         * @return array
index 8514cd9..aeec1bb 100644 (file)
@@ -357,37 +357,6 @@ class t3lib_autoloaderTest extends Tx_Phpunit_TestCase {
        /**
         * @test
         */
-       public function getClassPathByRegistryLookupFindsDeprecatedXclassFilePathRegisteredInTypo3ConfVars() {
-                       // Create a fake extension
-               $extKey = $this->createFakeExtension();
-               $extPath = PATH_site . 'typo3temp/' . $extKey . '/';
-               $autoloaderFile = $extPath . "ext_autoload.php";
-
-                       // Feed ext_autoload with a base file
-               $class = strtolower("tx_${extKey}_" . uniqid(''));
-               $fileName = uniqid('') . '.php';
-               $file = $extPath . $fileName;
-               file_put_contents($autoloaderFile, "<?php\n\nreturn array('" . $class . "' => '" . $file . "');\n\n?>");
-
-                       // Register a xclass for the base file
-               $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3temp/' . $extKey . '/' . $fileName] = 'typo3temp/' . $extKey . '/xclassFile';
-
-                       // Inject a dummy for the core_phpcode cache to force the autoloader
-                       // to re calculate the registry
-               $mockCache = $this->getMock('t3lib_cache_frontend_AbstractFrontend', array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove', 'flush', 'flushByTag', 'requireOnce'), array(), '', FALSE);
-               $GLOBALS['typo3CacheManager'] = $this->getMock('t3lib_cache_Manager', array('getCache'));
-               $GLOBALS['typo3CacheManager']->expects($this->any())->method('getCache')->will($this->returnValue($mockCache));
-
-               t3lib_autoloader::unregisterAutoloader();
-               t3lib_autoloader::registerAutoloader();
-
-                       // See if the xclass lookup is successful
-               $this->assertSame('typo3temp/' . $extKey . '/xclassFile', t3lib_autoloader::getClassPathByRegistryLookup('ux_' . $class));
-       }
-
-       /**
-        * @test
-        */
        public function unregisterAutoloaderWritesNotExistingUxCLassLookupFromGetClassPathByRegistryLookupToCache() {
                $uxClassName = 'ux_Tx_Foo' . uniqid();
 
index 0ebd3d2..b798a5e 100644 (file)
@@ -643,24 +643,6 @@ class Typo3_Bootstrap {
        }
 
        /**
-        * Write deprecation log if the TYPO3 instance uses deprecated XCLASS
-        * registrations via $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']
-        *
-        * @return Typo3_Bootstrap
-        */
-       public function deprecationLogForOldXclassRegistration() {
-               if (count($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']) > 0) {
-                       t3lib_div::deprecationLog(
-                               'This installation runs with extensions that use XCLASSing by setting the XCLASS path in ext_localconf.php. ' .
-                               'This is deprecated and will be removed in TYPO3 6.2 and later. It is preferred to define XCLASSes in ' .
-                               'ext_autoload.php instead. See http://wiki.typo3.org/Autoload for more information.'
-                       );
-               }
-
-               return $this;
-       }
-
-       /**
         * Write deprecation log if deprecated extCache setting was set in the instance.
         *
         * @return Typo3_Bootstrap
index da8f415..53d6d87 100755 (executable)
@@ -67,7 +67,6 @@ Typo3_Bootstrap::getInstance()
        ->defineTypo3RequestTypes()
        ->populateTypo3LoadedExtGlobal(TRUE)
        ->loadAdditionalConfigurationFromExtensions(TRUE)
-       ->deprecationLogForOldXclassRegistration()
        ->deprecationLogForOldExtCacheSetting()
        ->initializeExceptionHandling()
        ->requireAdditionalExtensionFiles()
index 86b9dd3..b154322 100644 (file)
@@ -82,7 +82,6 @@ Typo3_Bootstrap::getInstance()
        ->defineTypo3RequestTypes()
        ->populateTypo3LoadedExtGlobal(TRUE)
        ->loadAdditionalConfigurationFromExtensions(TRUE)
-       ->deprecationLogForOldXclassRegistration()
        ->deprecationLogForOldExtCacheSetting()
        ->initializeExceptionHandling()
        ->requireAdditionalExtensionFiles()
index b500e85..c9343b8 100755 (executable)
@@ -65,7 +65,6 @@ Typo3_Bootstrap::getInstance()
        ->defineTypo3RequestTypes()
        ->populateTypo3LoadedExtGlobal(FALSE)
        ->loadAdditionalConfigurationFromExtensions(FALSE)
-       ->deprecationLogForOldXclassRegistration()
        ->deprecationLogForOldExtCacheSetting()
        ->initializeExceptionHandling()
        ->requireAdditionalExtensionFiles()
index 6da8f4b..94d9180 100644 (file)
@@ -65,7 +65,6 @@ Typo3_Bootstrap::getInstance()
        ->defineTypo3RequestTypes()
        ->populateTypo3LoadedExtGlobal(TRUE)
        ->loadAdditionalConfigurationFromExtensions(TRUE)
-       ->deprecationLogForOldXclassRegistration()
        ->deprecationLogForOldExtCacheSetting()
        ->initializeExceptionHandling()
        ->requireAdditionalExtensionFiles()