Aude has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/131023

Change subject: Improve badge handling in SpecialSetSiteLink and fix uncaught 
exception
......................................................................

Improve badge handling in SpecialSetSiteLink and fix uncaught exception

Bug: 63391
Change-Id: I9f5a58622f2cf242a2d53d639265c03707a8f85f
---
M repo/includes/specials/SpecialSetSiteLink.php
1 file changed, 59 insertions(+), 30 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/23/131023/1

diff --git a/repo/includes/specials/SpecialSetSiteLink.php 
b/repo/includes/specials/SpecialSetSiteLink.php
index cc92aa5..0f23643 100644
--- a/repo/includes/specials/SpecialSetSiteLink.php
+++ b/repo/includes/specials/SpecialSetSiteLink.php
@@ -11,6 +11,7 @@
 use Wikibase\ChangeOp\ChangeOpSiteLink;
 use Wikibase\CopyrightMessageBuilder;
 use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\Summary;
@@ -18,6 +19,9 @@
 
 /**
  * Special page for setting the sitepage of a Wikibase entity.
+ *
+ * @todo put more handling into ChangeOpSiteLink
+ * @todo use WikibaseExceptionLocalizer for error handling
  *
  * @since 0.4
  * @licence GNU GPL v2+
@@ -63,6 +67,16 @@
        protected $rightsText;
 
        /**
+        * @var EntityIdParser
+        */
+       private $entityIdParser;
+
+       /**
+        * @var array
+        */
+       private $badgeItems;
+
+       /**
         * @since 0.4
         */
        public function __construct() {
@@ -72,6 +86,10 @@
 
                $this->rightsUrl = $settings->getSetting( 'dataRightsUrl' );
                $this->rightsText = $settings->getSetting( 'dataRightsText' );
+
+               // @todo inject the dependencies
+               $this->entityIdParser = 
WikibaseRepo::getDefaultInstance()->getEntityIdParser();
+               $this->badgeItems = $settings->getSetting( 'badgeItems' );
        }
 
        /**
@@ -367,47 +385,58 @@
         * @return ItemId[]|boolean
         */
        protected function parseBadges( array $badges, Status $status ) {
-               $repo = WikibaseRepo::getDefaultInstance();
-
-               $entityIdParser = $repo->getEntityIdParser();
-
                $badgesObjects = array();
 
                foreach ( $badges as $badge ) {
-                       try {
-                               $badgeId = $entityIdParser->parse( $badge );
-                       } catch( ParseException $e ) {
-                               $status->fatal( 'wikibase-setentity-invalid-id' 
);
+                       $badgeId = $this->extractBadgeId( $badge, $status );
+
+                       if ( $badgeId ) {
+                               $badgesObjects[] = $badgeId;
+                       } else {
                                return false;
                        }
-
-                       if ( !( $badgeId instanceof ItemId ) ) {
-                               $status->fatal( 
'wikibase-setsitelink-not-item', $badgeId->getPrefixedId() );
-                               return false;
-                       }
-
-                       $badgeItems = 
WikibaseRepo::getDefaultInstance()->getSettings()
-                                       ->getSetting( 'badgeItems' );
-
-                       if ( !array_key_exists( $badgeId->getPrefixedId(), 
$badgeItems ) ) {
-                               $status->fatal( 
'wikibase-setsitelink-not-badge', $badgeId->getPrefixedId() );
-                               return false;
-                       }
-
-                       $itemTitle = $this->getEntityTitle( $badgeId );
-
-                       if ( is_null( $itemTitle ) || !$itemTitle->exists() ) {
-                               $status->fatal( 'wikibase-setentity-invalid-id' 
);
-                               return false;
-                       }
-
-                       $badgesObjects[] = $badgeId;
                }
 
                return $badgesObjects;
        }
 
        /**
+        * @param string $badge
+        * @param Status $status
+        *
+        * @return ItemId|boolean
+        */
+       private function extractBadgeId( $badge, Status $status ) {
+               try {
+                       $badgeId = $this->entityIdParser->parse( $badge );
+               } catch( EntityIdParsingException $e ) {
+                       $status->fatal( 'wikibase-wikibaserepopage-invalid-id', 
$badge );
+                       return false;
+               }
+
+               if ( !( $badgeId instanceof ItemId ) ) {
+                       $status->fatal( 'wikibase-setsitelink-not-item', 
$badgeId->getSerialization() );
+                       return false;
+               }
+
+               $prefixedId = $badgeId->getSerialization();
+
+               if ( !array_key_exists( $prefixedId, $this->badgeItems ) ) {
+                       $status->fatal( 'wikibase-setsitelink-not-badge', 
$prefixedId );
+                       return false;
+               }
+
+               $itemTitle = $this->getEntityTitle( $badgeId );
+
+               if ( is_null( $itemTitle ) || !$itemTitle->exists() ) {
+                       $status->fatal( 'wikibase-wikibaserepopage-invalid-id', 
$prefixedId );
+                       return false;
+               }
+
+               return $badgeId;
+       }
+
+       /**
         * Setting the sitepage of the entity.
         *
         * @since 0.4

-- 
To view, visit https://gerrit.wikimedia.org/r/131023
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9f5a58622f2cf242a2d53d639265c03707a8f85f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to