[!!!][BUGFIX] Fix wrong usage of Enum in InformationStatus Enum itself 04/42804/8
authorSascha Egerer <sascha@sascha-egerer.de>
Fri, 21 Aug 2015 09:04:36 +0000 (11:04 +0200)
committerSascha Egerer <sascha@sascha-egerer.de>
Fri, 25 Sep 2015 05:54:10 +0000 (07:54 +0200)
The Enumeration implementation of InformationStatus provides
a mapStatusToInt() method that must expect a InformationStatus instance
as parameter instead of a string.

The method mapStatusToInt() has also been replaced by "isGreaterThan" as
a comparison method fits better into the enumeration usage.

This change is breaking but should not really break anything as it
was introduced in 7.4 and only used at one place in the core.

Change-Id: I84548ba291360d1b20a607fa1e5149b95ca93bda
Resolves: #69224
Releases: master
Reviewed-on: http://review.typo3.org/42804
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Tested-by: Daniel Goerz <ervaude@gmail.com>
Reviewed-by: Sascha Egerer <sascha@sascha-egerer.de>
Tested-by: Sascha Egerer <sascha@sascha-egerer.de>
typo3/sysext/backend/Classes/Backend/ToolbarItems/SystemInformationToolbarItem.php
typo3/sysext/backend/Classes/Toolbar/Enumeration/InformationStatus.php
typo3/sysext/core/Documentation/Changelog/7.5/Breaking-69224-FixWrongUsageOfEnumerationsInInformationStatusmapStatusToInt.rst [new file with mode: 0644]

index a9179f9..c6c5d08 100644 (file)
@@ -52,9 +52,9 @@ class SystemInformationToolbarItem implements ToolbarItemInterface {
        /**
         * Holds the highest severity
         *
-        * @var string
+        * @var InformationStatus
         */
-       protected $highestSeverity = '';
+       protected $highestSeverity;
 
        /**
         * The CSS class for the badge
@@ -98,6 +98,8 @@ class SystemInformationToolbarItem implements ToolbarItemInterface {
                $this->standaloneView->setTemplatePathAndFilename($extPath . 'Resources/Private/Templates/ToolbarMenu/' . static::TOOLBAR_MENU_TEMPLATE);
 
                $this->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/Toolbar/SystemInformationMenu');
+
+               $this->highestSeverity = InformationStatus::cast(InformationStatus::STATUS_INFO);
        }
 
        /**
@@ -114,7 +116,7 @@ class SystemInformationToolbarItem implements ToolbarItemInterface {
                $this->emitGetSystemInformation();
                $this->emitLoadMessages();
 
-               $this->severityBadgeClass = $this->highestSeverity !== InformationStatus::STATUS_NOTICE ? 'badge-' . $this->highestSeverity : '';
+               $this->severityBadgeClass = !$this->highestSeverity->equals(InformationStatus::STATUS_NOTICE) ? 'badge-' . (string)$this->highestSeverity : '';
        }
 
        /**
@@ -259,9 +261,11 @@ class SystemInformationToolbarItem implements ToolbarItemInterface {
                        $this->totalCount += (int)$message['count'];
                }
 
+               /** @var InformationStatus $messageSeverity */
+               $messageSeverity = InformationStatus::cast($message['status']);
                // define the severity for the badge
-               if (InformationStatus::mapStatusToInt($message['status']) > InformationStatus::mapStatusToInt($this->highestSeverity)) {
-                       $this->highestSeverity = $message['status'];
+               if ($messageSeverity->isGreaterThan($this->highestSeverity)) {
+                       $this->highestSeverity = $messageSeverity;
                }
 
                $this->systemMessages[] = $message;
index 1e5f1f7..a19ac6b 100644 (file)
@@ -19,6 +19,8 @@ namespace TYPO3\CMS\Backend\Toolbar\Enumeration;
  */
 class InformationStatus extends \TYPO3\CMS\Core\Type\Enumeration {
 
+       const __default = self::STATUS_INFO;
+
        /**
         * @var string
         */
@@ -56,15 +58,12 @@ class InformationStatus extends \TYPO3\CMS\Core\Type\Enumeration {
        );
 
        /**
-        * Map the status string to an integer
+        * Check if the given status is greater than this status instance
         *
-        * @param string $status
-        * @return int
+        * @param InformationStatus $status
+        * @return boolean
         */
-       static public function mapStatusToInt($status) {
-               if (isset(static::$statusIntegerMap[$status])) {
-                       return static::$statusIntegerMap[$status];
-               }
-               return -1;
+       public function isGreaterThan(InformationStatus $status) {
+               return static::$statusIntegerMap[(string)$this] > static::$statusIntegerMap[(string)$status];
        }
-}
\ No newline at end of file
+}
diff --git a/typo3/sysext/core/Documentation/Changelog/7.5/Breaking-69224-FixWrongUsageOfEnumerationsInInformationStatusmapStatusToInt.rst b/typo3/sysext/core/Documentation/Changelog/7.5/Breaking-69224-FixWrongUsageOfEnumerationsInInformationStatusmapStatusToInt.rst
new file mode 100644 (file)
index 0000000..011b857
--- /dev/null
@@ -0,0 +1,21 @@
+=========================================================================================
+Breaking: #69224 - Fix wrong usage of enumerations in InformationStatus::mapStatusToInt()
+=========================================================================================
+
+Description
+===========
+
+The ``InformationStatus`` enumeration provides a ``mapStatusToInt()`` method.
+* The method expects a string but should expect an enum of itself.
+* The method logic is not what is expected from an enumeration method as it does not do any logic comparison.
+Therefore it has been replaced by ``isGreaterThan()`` as this was the logic that has been checked
+everywhere ``mapStatusToInt()`` has been used.
+
+
+Impact
+======
+
+The method ``InformationStatus::mapStatusToInt()`` has been replaced by ``InformationStatus::isGreaterThan()`` and all
+usages have been replaced by the new method / logic.
+As the ``InformationStatus`` Enum has been introduced in 7.4 it should not be used by any public API and
+therefore the change should not have much impact.
\ No newline at end of file