Revert "[BUGFIX] Replace the table definition manipulation by signals" 88/26488/3
authorHelmut Hummel <helmut.hummel@typo3.org>
Thu, 19 Dec 2013 13:43:33 +0000 (14:43 +0100)
committerHelmut Hummel <helmut.hummel@typo3.org>
Thu, 19 Dec 2013 13:45:31 +0000 (14:45 +0100)
This reverts commit 2d6e8deae30794afb1967c38857f49b10060f38d
This merge broke travis unit and functional tests.
Needs some work on these components to get in again.

[ci skip]

Change-Id: Ifa96df8c60472def99707431793de291043d23e4
Reviewed-on: https://review.typo3.org/26488
Reviewed-by: Helmut Hummel
Tested-by: Helmut Hummel
typo3/sysext/core/Classes/Cache/Cache.php
typo3/sysext/core/Classes/Category/CategoryRegistry.php
typo3/sysext/core/Tests/Unit/Category/CategoryRegistryTest.php
typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php
typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php
typo3/sysext/extensionmanager/ext_localconf.php
typo3/sysext/install/Classes/Controller/Action/Tool/UpdateWizard.php
typo3/sysext/install/Classes/Service/CachingFrameworkDatabaseSchemaService.php [deleted file]
typo3/sysext/install/Classes/Service/Exception/UnexpectedSignalReturnValueTypeException.php [deleted file]
typo3/sysext/install/Classes/Service/SqlExpectedSchemaService.php
typo3/sysext/install/ext_localconf.php

index 8198f21..c8f314e 100644 (file)
@@ -98,18 +98,4 @@ class Cache {
                return $tableDefinitions;
        }
 
-       /**
-        * A slot method to inject the required caching framework database tables to the
-        * tables defintions string
-        *
-        * @param array $sqlString
-        * @param string $extensionKey
-        * @return array
-        */
-       public function addCachingFrameworkRequiredDatabaseSchemaToTablesDefintion(array $sqlString, $extensionKey) {
-               $GLOBALS['typo3CacheManager']->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
-               $sqlString[] = static::getDatabaseTableDefinitions();
-               return array('sqlString' => $sqlString, 'extensionKey' => $extensionKey);
-       }
-
 }
index a77e25c..1cd1407 100644 (file)
@@ -88,8 +88,8 @@ class CategoryRegistry implements \TYPO3\CMS\Core\SingletonInterface {
                        throw new \InvalidArgumentException('TYPO3\\CMS\\Core\\Category\\CategoryRegistry No tableName given.', 1369122038);
                }
 
-               // Makes sure nothing was registered yet.
-               if (!$this->isRegistered($tableName, $fieldName)) {
+               // Makes sure there is an existing table configuration and nothing registered yet:
+               if (isset($GLOBALS['TCA'][$tableName]) && !$this->isRegistered($tableName, $fieldName)) {
                        $this->registry[$extensionKey][$tableName][$fieldName] = $options;
                        $result = TRUE;
                }
@@ -372,29 +372,4 @@ class CategoryRegistry implements \TYPO3\CMS\Core\SingletonInterface {
                        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns($tableName, $columns);
                }
        }
-
-       /**
-        * A slot method to inject the required category database fields to the
-        * tables defintion string
-        *
-        * @param array $sqlString
-        * @return array
-        */
-       public function addCategoryDatabaseSchemaToTablesDefintion(array $sqlString) {
-               $sqlString[] = $this->getDatabaseTableDefinitions();
-               return array('sqlString' => $sqlString);
-       }
-
-       /**
-        * A slot method to inject the required category database fields of an
-        * extension to the tables defintion string
-        *
-        * @param array $sqlString
-        * @param string $extensionKey
-        * @return array
-        */
-       public function addExtensionCategoryDatabaseSchemaToTablesDefintion(array $sqlString, $extensionKey) {
-               $sqlString[] = $this->getDatabaseTableDefinition($extensionKey);
-               return array('sqlString' => $sqlString, 'extensionKey' => $extensionKey);
-       }
 }
index 371af39..e4017d7 100644 (file)
@@ -79,6 +79,13 @@ class CategoryRegistryTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
 
        /**
         * @test
+        */
+       public function doesAddReturnFalseOnUndefinedTable() {
+               $this->assertFalse($this->fixture->add('test_extension_a', 'undefined_table', 'categories'));
+       }
+
+       /**
+        * @test
         * @expectedException \InvalidArgumentException
         * @expectedExceptionCode 1369122038
         */
index 432ddad..bbe5a7a 100644 (file)
@@ -123,7 +123,7 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface {
                        $this->loadExtension($extensionKey);
                }
                $this->reloadCaches();
-               $this->processRuntimeDatabaseUpdates($extensionKey);
+               $this->processCachingFrameworkUpdates();
                $this->saveDefaultConfiguration($extension['key']);
        }
 
@@ -240,40 +240,20 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface {
        }
 
        /**
-        * Gets all database updates due to runtime configuration, like caching framework or
-        * category api for example
+        * Gets all registered caches and creates required caching framework tables.
         *
-        * @param string $extensionKey
+        * @return void
         */
-       protected function processRuntimeDatabaseUpdates($extensionKey) {
-               $sqlString = $this->emitTablesDefinitionIsBeingBuiltSignal($extensionKey);
-               if (!empty($sqlString)) {
-                       $this->updateDbWithExtTablesSql(implode(LF . LF . LF . LF, $sqlString));
-               }
-       }
+       protected function processCachingFrameworkUpdates() {
+               $extTablesSqlContent = '';
 
-       /**
-        * Emits a signal to manipulate the tables definitions
-        *
-        * @param string $extensionKey
-        * @return mixed
-        * @throws \TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
-        */
-       protected function emitTablesDefinitionIsBeingBuiltSignal($extensionKey) {
-               $signalReturn = $this->signalSlotDispatcher->dispatch(__CLASS__, 'tablesDefinitionIsBeingBuilt', array('sqlString' => array(), 'extensionKey' => $extensionKey));
-               $sqlString = $signalReturn['sqlString'];
-               if (!is_array($sqlString)) {
-                       throw new \TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException(
-                               sprintf(
-                                       'The signal %s of class %s returned a value of type %s, but array was expected.',
-                                       'tablesDefinitionIsBeingBuilt',
-                                       __CLASS__,
-                                       gettype($sqlString)
-                               ),
-                               1382360258
-                       );
+               // @TODO: This should probably moved to TYPO3\CMS\Core\Cache\Cache->getDatabaseTableDefinitions ?!
+               $GLOBALS['typo3CacheManager']->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
+               $extTablesSqlContent .= \TYPO3\CMS\Core\Cache\Cache::getDatabaseTableDefinitions();
+
+               if ($extTablesSqlContent !== '') {
+                       $this->updateDbWithExtTablesSql($extTablesSqlContent);
                }
-               return $sqlString;
        }
 
        /**
@@ -283,7 +263,7 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface {
         */
        public function reloadCaches() {
                \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::removeCacheFiles();
-               \TYPO3\CMS\Core\Core\Bootstrap::getInstance()->reloadTypo3LoadedExtAndClassLoaderAndExtLocalconf()->loadExtensionTables();
+               \TYPO3\CMS\Core\Core\Bootstrap::getInstance()->reloadTypo3LoadedExtAndClassLoaderAndExtLocalconf();
        }
 
        /**
index 3724bf2..d362123 100644 (file)
@@ -64,7 +64,6 @@ class InstallUtilityTest extends \TYPO3\CMS\Extbase\Tests\Unit\BaseTestCase {
                                'loadExtension',
                                'unloadExtension',
                                'processDatabaseUpdates',
-                               'processRuntimeDatabaseUpdates',
                                'reloadCaches',
                                'processCachingFrameworkUpdates',
                                'saveDefaultConfiguration',
@@ -120,10 +119,20 @@ class InstallUtilityTest extends \TYPO3\CMS\Extbase\Tests\Unit\BaseTestCase {
        /**
         * @test
         */
-       public function installCallsProcessRuntimeDatabaseUpdates() {
+       public function installCallsProcessDatabaseUpdates() {
                $this->installMock->expects($this->once())
-                       ->method('processRuntimeDatabaseUpdates')
-                       ->with($this->extensionKey);
+                       ->method('processDatabaseUpdates')
+                       ->with($this->extensionData);
+
+               $this->installMock->install($this->extensionKey);
+       }
+
+       /**
+        * @test
+        */
+       public function installCallsProcessCachingFrameworkUpdates() {
+               $this->installMock->expects($this->once())
+                       ->method('processCachingFrameworkUpdates');
 
                $this->installMock->install($this->extensionKey);
        }
index ff21ce1..f339e04 100644 (file)
@@ -21,17 +21,5 @@ if (TYPO3_MODE === 'BE') {
                        'TYPO3\\CMS\\Core\\Package\\PackageManager',
                        'scanAvailablePackages'
                );
-               $signalSlotDispatcher->connect(
-                       'TYPO3\\CMS\\Extensionmanager\\Utility\\InstallUtility',
-                       'tablesDefinitionIsBeingBuilt',
-                       'TYPO3\\CMS\\Core\\Cache\\Cache',
-                       'addCachingFrameworkRequiredDatabaseSchemaToTablesDefintion'
-               );
-               $signalSlotDispatcher->connect(
-                       'TYPO3\\CMS\\Extensionmanager\\Utility\\InstallUtility',
-                       'tablesDefinitionIsBeingBuilt',
-                       'TYPO3\\CMS\\Core\\Category\\CategoryRegistry',
-                       'addExtensionCategoryDatabaseSchemaToTablesDefintion'
-               );
        }
 }
index 94a9743..c5287a2 100644 (file)
@@ -258,9 +258,9 @@ class UpdateWizard extends Action\AbstractAction implements Action\ActionInterfa
                /** @var $sqlHandler \TYPO3\CMS\Install\Service\SqlSchemaMigrationService */
                $sqlHandler = $this->objectManager->get('TYPO3\\CMS\\Install\\Service\\SqlSchemaMigrationService');
 
-               /** @var \TYPO3\CMS\Install\Service\CachingFrameworkDatabaseSchemaService $cachingFrameworkDatabaseSchemaService */
-               $cachingFrameworkDatabaseSchemaService = $this->objectManager->get('TYPO3\\CMS\\Install\\Service\\CachingFrameworkDatabaseSchemaService');
-               $expectedSchemaString = $cachingFrameworkDatabaseSchemaService->getCachingFrameworkRequiredDatabaseSchema();
+               /** @var \TYPO3\CMS\Install\Service\SqlExpectedSchemaService $expectedSchemaService */
+               $expectedSchemaService = $this->objectManager->get('TYPO3\\CMS\\Install\\Service\\SqlExpectedSchemaService');
+               $expectedSchemaString = $expectedSchemaService->getCachingFrameworkRequiredDatabaseSchema();
                $cleanedExpectedSchemaString = implode(LF, $sqlHandler->getStatementArray($expectedSchemaString, TRUE, '^CREATE TABLE '));
                $neededTableDefinition = $sqlHandler->getFieldDefinitions_fileContent($cleanedExpectedSchemaString);
                $currentTableDefinition = $sqlHandler->getFieldDefinitions_database();
diff --git a/typo3/sysext/install/Classes/Service/CachingFrameworkDatabaseSchemaService.php b/typo3/sysext/install/Classes/Service/CachingFrameworkDatabaseSchemaService.php
deleted file mode 100644 (file)
index 84d5e32..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Service;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2013 Thomas Maroschik
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-
-/**
- * This service provides the sql schema for the caching framework
- */
-class CachingFrameworkDatabaseSchemaService {
-
-       /**
-        * Get schema SQL of required cache framework tables.
-        *
-        * This method needs ext_localconf and ext_tables loaded!
-        *
-        * This is a hack, but there was no smarter solution with current cache configuration setup:
-        * ToolController sets the extbase caches to NullBackend to ensure the install tool does not
-        * cache anything. The CacheManager gets the required SQL from database backends only, so we need to
-        * temporarily 'fake' the standard db backends for extbase caches so they are respected.
-        *
-        * Additionally, the extbase_object cache is already in use and instantiated, and the CacheManager singleton
-        * does not allow overriding this definition. The only option at the moment is to 'fake' another cache with
-        * a different name, and then substitute this name in the sql content with the real one.
-        *
-        * @TODO: http://forge.typo3.org/issues/54498
-        * @TODO: It might be possible to reduce this ugly construct by circumventing the 'singleton' of CacheManager by using 'new'
-        *
-        * @return string Cache framework SQL
-        */
-       public function getCachingFrameworkRequiredDatabaseSchema() {
-               $cacheConfigurationBackup = $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'];
-               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap'] = array();
-               $extbaseObjectFakeName = uniqid('extbase_object');
-               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$extbaseObjectFakeName] = array();
-               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_reflection'] = array();
-               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_typo3dbbackend_tablecolumns'] = array();
-               /** @var \TYPO3\CMS\Core\Cache\CacheManager $cacheManager */
-               $cacheManager = $GLOBALS['typo3CacheManager'];
-               $cacheManager->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
-               $cacheSqlString = \TYPO3\CMS\Core\Cache\Cache::getDatabaseTableDefinitions();
-               $sqlString = str_replace($extbaseObjectFakeName, 'extbase_object', $cacheSqlString);
-               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] = $cacheConfigurationBackup;
-               $cacheManager->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
-
-               return $sqlString;
-       }
-
-       /**
-        * A slot method to inject the required caching framework database tables to the
-        * tables defintions string
-        *
-        * @param array $sqlString
-        * @return array
-        */
-       public function addCachingFrameworkRequiredDatabaseSchemaToTablesDefintion(array $sqlString) {
-               $sqlString[] = $this->getCachingFrameworkRequiredDatabaseSchema();
-               return array('sqlString' => $sqlString);
-       }
-
-}
diff --git a/typo3/sysext/install/Classes/Service/Exception/UnexpectedSignalReturnValueTypeException.php b/typo3/sysext/install/Classes/Service/Exception/UnexpectedSignalReturnValueTypeException.php
deleted file mode 100644 (file)
index b6ea001..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Service\Exception;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2013 Christian Kuhn <lolli@schwarzbu.ch>
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-
-/**
- * An exception thrown if the return value type of a signal is not the expected one.
- */
-class UnexpectedSignalReturnValueTypeException extends CoreVersionServiceException {
-
-}
\ No newline at end of file
index 5cdee62..253e83f 100644 (file)
@@ -43,12 +43,6 @@ class SqlExpectedSchemaService {
        protected $objectManager = NULL;
 
        /**
-        * @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher
-        * @inject
-        */
-       protected $signalSlotDispatcher;
-
-       /**
         * Get expected schema array
         *
         * @return array Expected schema
@@ -87,31 +81,50 @@ class SqlExpectedSchemaService {
                        }
                }
 
-               $sqlString = $this->emitTablesDefinitionIsBeingBuiltSignal($sqlString);
+               // Add caching framework sql definition
+               $sqlString[] = $this->getCachingFrameworkRequiredDatabaseSchema();
+
+               // Add category registry sql definition
+               $sqlString[] = \TYPO3\CMS\Core\Category\CategoryRegistry::getInstance()->getDatabaseTableDefinitions();
 
                return implode(LF . LF . LF . LF, $sqlString);
        }
 
        /**
-        * Emits a signal to manipulate the tables definitions
+        * Get schema SQL of required cache framework tables.
+        *
+        * This method needs ext_localconf and ext_tables loaded!
         *
-        * @param array $sqlString
-        * @return mixed
+        * This is a hack, but there was no smarter solution with current cache configuration setup:
+        * ToolController sets the extbase caches to NullBackend to ensure the install tool does not
+        * cache anything. The CacheManager gets the required SQL from database backends only, so we need to
+        * temporarily 'fake' the standard db backends for extbase caches so they are respected.
+        *
+        * Additionally, the extbase_object cache is already in use and instantiated, and the CacheManager singleton
+        * does not allow overriding this definition. The only option at the moment is to 'fake' another cache with
+        * a different name, and then substitute this name in the sql content with the real one.
+        *
+        * @TODO: This construct needs to be improved. It does not recognise if some custom ext overwrote the extbase cache config
+        * @TODO: Solve this as soon as cache configuration is separated from ext_localconf / ext_tables
+        * @TODO: It might be possible to reduce this ugly construct by circumventing the 'singleton' of CacheManager by using 'new'
+        *
+        * @return string Cache framework SQL
         */
-       protected function emitTablesDefinitionIsBeingBuiltSignal(array $sqlString) {
-               $signalReturn = $this->signalSlotDispatcher->dispatch(__CLASS__, 'tablesDefinitionIsBeingBuilt', array('sqlString' => $sqlString));
-               $sqlString = $signalReturn['sqlString'];
-               if (!is_array($sqlString)) {
-                       throw new Exception\UnexpectedSignalReturnValueTypeException(
-                               sprintf(
-                                       'The signal %s of class %s returned a value of type %s, but array was expected.',
-                                       'tablesDefinitionIsBeingBuilt',
-                                       __CLASS__,
-                                       gettype($sqlString)
-                               ),
-                               1382351456
-                       );
-               }
+       public function getCachingFrameworkRequiredDatabaseSchema() {
+               $cacheConfigurationBackup = $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'];
+               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_datamapfactory_datamap'] = array();
+               $extbaseObjectFakeName = uniqid('extbase_object');
+               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$extbaseObjectFakeName] = array();
+               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_reflection'] = array();
+               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_typo3dbbackend_tablecolumns'] = array();
+               /** @var \TYPO3\CMS\Core\Cache\CacheManager $cacheManager */
+               $cacheManager = $GLOBALS['typo3CacheManager'];
+               $cacheManager->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
+               $cacheSqlString = \TYPO3\CMS\Core\Cache\Cache::getDatabaseTableDefinitions();
+               $sqlString = str_replace($extbaseObjectFakeName, 'extbase_object', $cacheSqlString);
+               $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] = $cacheConfigurationBackup;
+               $cacheManager->setCacheConfigurations($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']);
+
                return $sqlString;
        }
 }
index 52a8f5f..06007b4 100644 (file)
@@ -52,17 +52,3 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['sysext_file_
 
 // Version 4.7: Migrate the flexforms of MediaElement
 $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['mediaElementFlexform'] = 'TYPO3\\CMS\\Install\\Updates\\MediaFlexformUpdate';
-
-$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher');
-$signalSlotDispatcher->connect(
-       'TYPO3\\CMS\\Install\\Service\\SqlExpectedSchemaService',
-       'tablesDefinitionIsBeingBuilt',
-       'TYPO3\\CMS\\Install\\Service\\CachingFrameworkDatabaseSchemaService',
-       'addCachingFrameworkRequiredDatabaseSchemaToTablesDefintion'
-);
-$signalSlotDispatcher->connect(
-       'TYPO3\\CMS\\Install\\Service\\SqlExpectedSchemaService',
-       'tablesDefinitionIsBeingBuilt',
-       'TYPO3\\CMS\\Core\\Category\\CategoryRegistry',
-       'addCategoryDatabaseSchemaToTablesDefintion'
-);