Mwjames has uploaded a new change for review.

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


Change subject: Fix fatal when predefined properties are no longer exists
......................................................................

Fix fatal when predefined properties are no longer exists

Bug: 48711

Change-Id: Ibfb2ceb33d0260c281b4d72a79deacdf14ac60d8
---
M SemanticMediaWiki.hooks.php
M includes/storage/SQLStore/SMW_DIHandler_WikiPage.php
M includes/storage/SQLStore/SMW_SQLStore3_Queries.php
M tests/phpunit/SemanticMediaWikiTestCase.php
A tests/phpunit/includes/storage/sqlstore/DIHandlerWikiPageTest.php
5 files changed, 163 insertions(+), 4 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/SemanticMediaWiki 
refs/changes/38/64938/1

diff --git a/SemanticMediaWiki.hooks.php b/SemanticMediaWiki.hooks.php
index 7be5ac8..77e1108 100644
--- a/SemanticMediaWiki.hooks.php
+++ b/SemanticMediaWiki.hooks.php
@@ -295,6 +295,7 @@
                        'storage/Store',
 
                        'storage/sqlstore/PropertyStatisticsTable',
+                       'storage/sqlstore/DIHandlerWikiPage'
                );
 
                foreach ( $testFiles as $file ) {
diff --git a/includes/storage/SQLStore/SMW_DIHandler_WikiPage.php 
b/includes/storage/SQLStore/SMW_DIHandler_WikiPage.php
index 18faafb..88f37b5 100644
--- a/includes/storage/SQLStore/SMW_DIHandler_WikiPage.php
+++ b/includes/storage/SQLStore/SMW_DIHandler_WikiPage.php
@@ -112,6 +112,14 @@
                        if ( $namespace == SMW_NS_PROPERTY && $dbkeys[0] != '' 
&&
                                $dbkeys[0]{0} == '_' && $dbkeys[2] == '' ) {
                                // Correctly interpret internal property keys
+
+                               // Check id before invocation to avoid 
exception for non-existing
+                               // but yet still residing as special properties 
in non-updated pages
+                               // @see bug 48711
+                               if ( 
SMWDIProperty::getPredefinedPropertyTypeId( $dbkeys[0] ) === '' ) {
+                                       return null;
+                               }
+
                                $property = new SMWDIProperty( $dbkeys[0] );
                                $wikipage = $property->getDiWikiPage( 
$dbkeys[4] );
                                if ( !is_null( $wikipage ) ) {
diff --git a/includes/storage/SQLStore/SMW_SQLStore3_Queries.php 
b/includes/storage/SQLStore/SMW_SQLStore3_Queries.php
index 33f7d7e..1d03ff2 100644
--- a/includes/storage/SQLStore/SMW_SQLStore3_Queries.php
+++ b/includes/storage/SQLStore/SMW_SQLStore3_Queries.php
@@ -440,17 +440,21 @@
                $diHandler = $this->m_store->getDataItemHandlerForDIType( 
SMWDataItem::TYPE_WIKIPAGE );
 
                while ( ( $count < $query->getLimit() ) && ( $row = 
$this->m_dbs->fetchObject( $res ) ) ) {
-                       $count++;
                        if ( $row->iw === '' || $row->iw{0} != ':' )  {
-                               $qr[] = $diHandler->dataItemFromDBKeys( array(
+                               $dataItem = $diHandler->dataItemFromDBKeys( 
array(
                                                $row->t,
                                                intval( $row->ns ),
                                                $row->iw,
                                                '',
                                                $row->so
                                        ) );
-                               // These IDs are usually needed for displaying 
the page (esp. if more property values are displayed):
-                               $this->m_store->smwIds->setCache( $row->t, 
$row->ns, $row->iw, $row->so, $row->id, $row->sortkey );
+
+                               if ( $dataItem instanceof SMWDIWikiPage ) {
+                                       $count++;
+                                       $qr[] = $dataItem;
+                                       // These IDs are usually needed for 
displaying the page (esp. if more property values are displayed):
+                                       $this->m_store->smwIds->setCache( 
$row->t, $row->ns, $row->iw, $row->so, $row->id, $row->sortkey );
+                               }
                        }
                }
 
diff --git a/tests/phpunit/SemanticMediaWikiTestCase.php 
b/tests/phpunit/SemanticMediaWikiTestCase.php
index 76d9351..cdd93b7 100644
--- a/tests/phpunit/SemanticMediaWikiTestCase.php
+++ b/tests/phpunit/SemanticMediaWikiTestCase.php
@@ -109,6 +109,20 @@
        }
 
        /**
+        * Helper method that returns a Store object
+        *
+        * @since 1.9
+        *
+        * @param string $id
+        *
+        * @return Store
+        */
+       protected function getStore( $id = null ) {
+               // FIXME Use StoreFactory here
+               return smwfGetStore();
+       }
+
+       /**
         * Helper method that returns a random string
         *
         * @since 1.9
diff --git a/tests/phpunit/includes/storage/sqlstore/DIHandlerWikiPageTest.php 
b/tests/phpunit/includes/storage/sqlstore/DIHandlerWikiPageTest.php
new file mode 100644
index 0000000..b16b52e
--- /dev/null
+++ b/tests/phpunit/includes/storage/sqlstore/DIHandlerWikiPageTest.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace SMW\Test;
+
+use SMWDIHandlerWikiPage;
+use SMWDIProperty;
+
+/**
+ * Tests for the SMWDIHandlerWikiPage class
+ *
+ * This program 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.
+ *
+ * This program 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.9
+ *
+ * @file
+ * @ingroup Test
+ *
+ * @licence GNU GPL v2+
+ * @author mwjames
+ */
+
+/**
+ * Tests for the SMWDIHandlerWikiPage class
+ *
+ * @ingroup Test
+ *
+ * @group SMW
+ * @group SMWExtension
+ */
+class DIHandlerWikiPageTest extends SemanticMediaWikiTestCase {
+
+       /**
+        * Returns the name of the class to be tested
+        *
+        * @return string
+        */
+       public function getClass() {
+               return 'SMWDIHandlerWikiPage';
+       }
+
+       /**
+        * Helper method that returns a SMWDIHandlerWikiPage object
+        *
+        * @since 1.9
+        *
+        * @return SMWDIHandlerWikiPage
+        */
+       private function getInstance() {
+               return new SMWDIHandlerWikiPage( $this->getStore() );
+       }
+
+       /**
+        * @test SMWDIHandlerWikiPage::__construct
+        *
+        * @since 1.9
+        */
+       public function testConstructor() {
+               $this->assertInstanceOf( $this->getClass(), 
$this->getInstance() );
+       }
+
+       /**
+        * @test SMWDIHandlerWikiPage::dataItemFromDBKeys
+        *
+        * @since 1.9
+        */
+       public function testDataItemFromDBKeysException() {
+               $this->setExpectedException( 'SMWDataItemException' );
+
+               $instance = $this->getInstance();
+               $result = $instance->dataItemFromDBKeys( array() );
+
+               $this->assertInstanceOf( 'SMWDIWikiPage', $result );
+       }
+
+       /**
+        * @test SMWDIHandlerWikiPage::dataItemFromDBKeys
+        * @dataProvider getDBKeys
+        * @see bug 48711
+        *
+        * @since 1.9
+        */
+       public function testDataItemFromDBKeys( $dbKeys, $expected ) {
+               $instance = $this->getInstance();
+               $result = $instance->dataItemFromDBKeys( $dbKeys );
+
+               if ( $expected === null ) {
+                       $this->assertEmpty( $result );
+               } else {
+                       $this->assertInstanceOf( $expected, $result );
+               }
+       }
+
+       /**
+        * Provides dbKeys sample
+        *
+        * @return array
+        */
+       public function getDBKeys() {
+               return array(
+
+                       // #0 SMW_NS_PROPERTY, user defined property
+                       array(
+                               array( 'Foo', SMW_NS_PROPERTY, 'bar', '', '' ), 
'SMWDIWikiPage'
+                       ),
+
+                       // #1 SMW_NS_PROPERTY, pre-defined property
+                       array(
+                               array( '_Foo', SMW_NS_PROPERTY, 'bar', '', '' 
), 'SMWDIWikiPage'
+                       ),
+
+                       // #2 SMW_NS_PROPERTY, pre-defined property
+                       // bug 48711
+                       array(
+                               array( '_Foo', SMW_NS_PROPERTY, '', '', '' ), 
null
+                       ),
+               );
+       }
+
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibfb2ceb33d0260c281b4d72a79deacdf14ac60d8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/SemanticMediaWiki
Gerrit-Branch: master
Gerrit-Owner: Mwjames <jamesin.hongkon...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to