ApiPageSet: Indicate why a title was invalid
authorBrad Jorsch <bjorsch@wikimedia.org>
Wed, 6 May 2015 19:33:37 +0000 (15:33 -0400)
committerLegoktm <legoktm.wikipedia@gmail.com>
Thu, 14 May 2015 18:34:02 +0000 (18:34 +0000)
May as well.

Bug: T98198
Change-Id: Ib17088a9685c48d7db647896ecd59aced7911374

includes/api/ApiImageRotate.php
includes/api/ApiPageSet.php
includes/api/ApiQuery.php
includes/api/ApiSetNotificationTimestamp.php

index 865d39f..c8390b6 100644 (file)
@@ -60,7 +60,7 @@ class ApiImageRotate extends ApiBase {
 
                $result = array();
 
-               self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
+               self::addValues( $result, $pageSet->getInvalidTitlesAndReasons(), 'invalid' );
                self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
                self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
                self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
index e6f218d..5efe788 100644 (file)
@@ -58,7 +58,7 @@ class ApiPageSet extends ApiBase {
        private $mGoodTitles = array();
        private $mMissingPages = array(); // [ns][dbkey] => fake page_id
        private $mMissingTitles = array();
-       private $mInvalidTitles = array();
+       private $mInvalidTitles = array(); // [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason )
        private $mMissingPageIDs = array();
        private $mRedirectTitles = array();
        private $mSpecialTitles = array();
@@ -396,9 +396,22 @@ class ApiPageSet extends ApiBase {
        /**
         * Titles that were deemed invalid by Title::newFromText()
         * The array's index will be unique and negative for each item
+        * @deprecated since 1.26, use self::getInvalidTitlesAndReasons()
         * @return string[] Array of strings (not Title objects)
         */
        public function getInvalidTitles() {
+               wfDeprecated( __METHOD__, '1.26' );
+               return array_map( function ( $t ) {
+                       return $t['title'];
+               }, $this->mInvalidTitles );
+       }
+
+       /**
+        * Titles that were deemed invalid by Title::newFromText()
+        * The array's index will be unique and negative for each item
+        * @return array[] Array of arrays with 'title' and 'invalidreason' properties
+        */
+       public function getInvalidTitlesAndReasons() {
                return $this->mInvalidTitles;
        }
 
@@ -552,7 +565,7 @@ class ApiPageSet extends ApiBase {
         *
         * @param array $invalidChecks List of types of invalid titles to include.
         *   Recognized values are:
-        *   - invalidTitles: Titles from $this->getInvalidTitles()
+        *   - invalidTitles: Titles and reasons from $this->getInvalidTitlesAndReasons()
         *   - special: Titles from $this->getSpecialTitles()
         *   - missingIds: ids from $this->getMissingPageIDs()
         *   - missingRevIds: ids from $this->getMissingRevisionIDs()
@@ -566,7 +579,7 @@ class ApiPageSet extends ApiBase {
        ) {
                $result = array();
                if ( in_array( "invalidTitles", $invalidChecks ) ) {
-                       self::addValues( $result, $this->getInvalidTitles(), 'invalid', 'title' );
+                       self::addValues( $result, $this->getInvalidTitlesAndReasons(), 'invalid' );
                }
                if ( in_array( "special", $invalidChecks ) ) {
                        self::addValues( $result, $this->getSpecialTitles(), 'special', 'title' );
@@ -1077,17 +1090,21 @@ class ApiPageSet extends ApiBase {
 
                foreach ( $titles as $title ) {
                        if ( is_string( $title ) ) {
-                               $titleObj = Title::newFromText( $title, $this->mDefaultNamespace );
+                               try {
+                                       $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
+                               } catch ( MalformedTitleException $ex ) {
+                                       // Handle invalid titles gracefully
+                                       $this->mAllPages[0][$title] = $this->mFakePageId;
+                                       $this->mInvalidTitles[$this->mFakePageId] = array(
+                                               'title' => $title,
+                                               'invalidreason' => $ex->getMessage(),
+                                       );
+                                       $this->mFakePageId--;
+                                       continue; // There's nothing else we can do
+                               }
                        } else {
                                $titleObj = $title;
                        }
-                       if ( !$titleObj ) {
-                               // Handle invalid titles gracefully
-                               $this->mAllPages[0][$title] = $this->mFakePageId;
-                               $this->mInvalidTitles[$this->mFakePageId] = $title;
-                               $this->mFakePageId--;
-                               continue; // There's nothing else we can do
-                       }
                        $unconvertedTitle = $titleObj->getPrefixedText();
                        $titleWasConverted = false;
                        if ( $titleObj->isExternal() ) {
index bfe3205..304d0f0 100644 (file)
@@ -407,8 +407,8 @@ class ApiQuery extends ApiBase {
                        $pages[$fakeId] = $vals;
                }
                // Report any invalid titles
-               foreach ( $pageSet->getInvalidTitles() as $fakeId => $title ) {
-                       $pages[$fakeId] = array( 'title' => $title, 'invalid' => true );
+               foreach ( $pageSet->getInvalidTitlesAndReasons() as $fakeId => $data ) {
+                       $pages[$fakeId] = $data + array( 'invalid' => true );
                }
                // Report any missing page ids
                foreach ( $pageSet->getMissingPageIDs() as $pageid ) {
index 86a3f6a..fa6fabf 100644 (file)
@@ -112,9 +112,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                : wfTimestamp( TS_ISO_8601, $timestamp );
                } else {
                        // First, log the invalid titles
-                       foreach ( $pageSet->getInvalidTitles() as $title ) {
-                               $r = array();
-                               $r['title'] = $title;
+                       foreach ( $pageSet->getInvalidTitlesAndReasons() as $r ) {
                                $r['invalid'] = true;
                                $result[] = $r;
                        }