Aude has uploaded a new change for review.

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

Change subject: Put other project links in parser cache
......................................................................

Put other project links in parser cache

Bug: 70393
Change-Id: I25cc3ea4af94c77eb67ddc02a84df0d95e1348cc
---
M client/WikibaseClient.hooks.php
D client/includes/EntityIdPropertyUpdater.php
M client/includes/LangLinkHandler.php
M client/includes/WikibaseClient.php
M client/tests/phpunit/includes/LangLinkHandlerTest.php
5 files changed, 154 insertions(+), 95 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/81/158381/3

diff --git a/client/WikibaseClient.hooks.php b/client/WikibaseClient.hooks.php
index 83ae926..61aa95a 100644
--- a/client/WikibaseClient.hooks.php
+++ b/client/WikibaseClient.hooks.php
@@ -346,7 +346,9 @@
                        return true;
                }
 
-               if ( !self::isWikibaseEnabled( 
$parser->getTitle()->getNamespace() ) ) {
+               $title = $parser->getTitle();
+
+               if ( !self::isWikibaseEnabled( $title->getNamespace() ) ) {
                        // shorten out
                        return true;
                }
@@ -355,8 +357,6 @@
 
                // @todo split up the multiple responsibilities here and in 
lang link handler
 
-               $parserOutput = $parser->getOutput();
-
                // only run this once, for the article content and not 
interface stuff
                //FIXME: this also runs for messages in 
EditPage::showEditTools! Ugh!
                if ( $parser->getOptions()->getInterfaceMessage() ) {
@@ -364,32 +364,26 @@
                        return true;
                }
 
-               $wikibaseClient = WikibaseClient::getDefaultInstance();
-               $settings = $wikibaseClient->getSettings();
+               $langLinkHandler = 
WikibaseClient::getDefaultInstance()->getLangLinkHandler();
 
-               $langLinkHandler = new LangLinkHandler(
-                       $settings->getSetting( 'siteGlobalID' ),
-                       $wikibaseClient->getNamespaceChecker(),
-                       $wikibaseClient->getStore()->getSiteLinkTable(),
-                       $wikibaseClient->getSiteStore(),
-                       $wikibaseClient->getLangLinkSiteGroup()
-               );
-
-               $useRepoLinks = $langLinkHandler->useRepoLinks( 
$parser->getTitle(), $parser->getOutput() );
+               $parserOutput = $parser->getOutput();
+               $useRepoLinks = $langLinkHandler->useRepoLinks( $title, 
$parserOutput );
 
                try {
                        if ( $useRepoLinks ) {
                                // add links
-                               $langLinkHandler->addLinksFromRepository( 
$parser->getTitle(), $parser->getOutput() );
+                               $langLinkHandler->addLinksFromRepository( 
$title, $parserOutput );
                        }
 
-                       $langLinkHandler->updateItemIdProperty( 
$parser->getTitle(), $parser->getOutput() );
+                       $langLinkHandler->updateItemIdProperty( $title, 
$parserOutput );
+                       $langLinkHandler->updateOtherProjectsLinksData( $title, 
$parserOutput );
                } catch ( \Exception $e ) {
                        wfWarn( 'Failed to add repo links: ' . $e->getMessage() 
);
                }
 
                if ( $useRepoLinks || $settings->getSetting( 'alwaysSort' ) ) {
-                       // sort links
+                       $settings = 
WikibaseClient::getDefaultInstance()->getSettings();
+
                        $interwikiSorter = new InterwikiSorter(
                                $settings->getSetting( 'sort' ),
                                $settings->getSetting( 'interwikiSortOrders' ),
@@ -551,6 +545,12 @@
                        $out->setProperty( 'wikibase_item', $itemId );
                }
 
+               $otherProjects = $pout->getExtensionData( 
'wikibase-otherprojects-sidebar' );
+
+               if ( $otherProjects !== null ) {
+                       $out->setProperty( 'wikibase-otherprojects-sidebar', 
$otherProjects );
+               }
+
                return true;
        }
 
@@ -630,9 +630,20 @@
                                BetaFeatures::isFeatureEnabled( 
$skin->getUser(), 'wikibase-otherprojects' );
 
                if ( $settings->getSetting( 'otherProjectsLinksByDefault' ) || 
$betaFeatureEnabled ) {
-                       $otherProjectsSidebarGenerator = 
$wikibaseClient->getOtherProjectsSidebarGenerator();
-                       $title = $skin->getContext()->getTitle();
-                       $otherProjectsSidebar = 
$otherProjectsSidebarGenerator->buildProjectLinkSidebar( $title );
+                       $outputPage = $skin->getContext()->getOutput();
+                       $otherProjectsSidebar = $outputPage->getProperty( 
'wikibase-otherprojects-sidebar' );
+
+
+                       // backwards compatibility for pages that do not have 
this in parser cache yet
+                       if ( !$otherProjectsSidebar ) {
+                               $title = $outputPage->getTitle();
+
+                               wfDebugLog( __CLASS__, 'Adding other projects 
links via SiteLinkLookup for '
+                                       . $title->getFullText() );
+
+                               $otherProjectsSidebarGenerator = 
$wikibaseClient->getOtherProjectsSidebarGenerator();
+                               $otherProjectsSidebar = 
$otherProjectsSidebarGenerator->buildProjectLinkSidebar( $title );
+                       }
 
                        if ( count( $otherProjectsSidebar ) !== 0 ) {
                                $sidebar['wikibase-otherprojects'] = 
$otherProjectsSidebar;
diff --git a/client/includes/EntityIdPropertyUpdater.php 
b/client/includes/EntityIdPropertyUpdater.php
deleted file mode 100644
index 73f32ac..0000000
--- a/client/includes/EntityIdPropertyUpdater.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-namespace Wikibase;
-
-use ParserOutput;
-use Title;
-use Wikibase\DataModel\SiteLink;
-use Wikibase\Lib\Store\SiteLinkLookup;
-
-/**
- * Handles wikibase_item page and parser output property
- *
- * @since 0.4
- *
- * @licence GNU GPL v2+
- * @author Katie Filbert
- */
-class EntityIdPropertyUpdater {
-
-       /* @var SiteLinkLookup */
-       private $siteLinkLookup;
-
-       /* @var string */
-       private $siteId;
-
-       /**
-        * @since 0.4
-        *
-        * @param SiteLinkLookup $siteLinkLookup
-        * @param string $siteId
-        */
-       public function __construct( SiteLinkLookup $siteLinkLookup, $siteId ) {
-               $this->siteLinkLookup = $siteLinkLookup;
-               $this->siteId = $siteId;
-       }
-
-       /**
-        * Set parser output property with item id
-        *
-        * @since 0.4
-        *
-        * @param ParserOutput $out
-        * @param Title $title
-        */
-       public function updateItemIdProperty( ParserOutput $out, Title $title ) 
{
-               $siteLink = new SiteLink(
-                       $this->siteId,
-                       $title->getFullText()
-               );
-
-               // todo: do we really want to fetch item id twice during 
parsing?
-               $itemId = $this->siteLinkLookup->getEntityIdForSiteLink( 
$siteLink );
-
-               if ( $itemId instanceof EntityId ) {
-                       $out->setProperty( 'wikibase_item', 
$itemId->getSerialization() );
-               } else {
-                       $out->unsetProperty( 'wikibase_item' );
-
-                       wfDebugLog( __CLASS__, __FUNCTION__ . ': Trying to set 
wikibase_item property for '
-                               . $siteLink->getSiteId() . ':' . 
$siteLink->getPageName()
-                               . ' but $itemId ' . $itemId . ' is not an 
EntityId object.' );
-               }
-       }
-}
diff --git a/client/includes/LangLinkHandler.php 
b/client/includes/LangLinkHandler.php
index bc9630f..6307322 100644
--- a/client/includes/LangLinkHandler.php
+++ b/client/includes/LangLinkHandler.php
@@ -6,11 +6,13 @@
 use Site;
 use SiteStore;
 use Title;
+use Wikibase\Client\Hooks\OtherProjectsSidebarGenerator;
 use Wikibase\DataModel\SiteLink;
 use Wikibase\Lib\Store\SiteLinkLookup;
 
 /**
- * Handles language links.
+ * @todo split this up and find a better home for stuff that adds
+ * parser output properties and extension data.
  *
  * @since 0.1
  *
@@ -20,6 +22,11 @@
  * @author Katie Filbert
  */
 class LangLinkHandler {
+
+       /**
+        * @var OtherProjectsSidebarGenerator
+        */
+       private $otherProjectsSidebarGenerator;
 
        /**
         * @var string
@@ -47,8 +54,12 @@
        private $siteGroup;
 
        /**
-        * Constructs a new LangLinkHandler using the given service instances.
-        *
+        * @var ItemId
+        */
+       private $itemId;
+
+       /**
+        * @param OtherProjectsSidebarGenerator $otherProjectsSidebarGenerator
         * @param string $siteId The global site ID for the local wiki
         * @param NamespaceChecker $namespaceChecker determines which 
namespaces wikibase is enabled on
         * @param SiteLinkLookup $siteLinkLookup A site link lookup service
@@ -56,12 +67,14 @@
         * @param string $siteGroup The ID of the site group to use for showing 
language links.
         */
        public function __construct(
+               OtherProjectsSidebarGenerator $otherProjectsSidebarGenerator,
                $siteId,
                NamespaceChecker $namespaceChecker,
                SiteLinkLookup $siteLinkLookup,
                SiteStore $sites,
                $siteGroup
        ) {
+               $this->otherProjectsSidebarGenerator = 
$otherProjectsSidebarGenerator;
                $this->siteId = $siteId;
                $this->namespaceChecker = $namespaceChecker;
                $this->siteLinkLookup = $siteLinkLookup;
@@ -85,8 +98,7 @@
 
                $links = array();
 
-               $siteLink = new SiteLink( $this->siteId, $title->getFullText() 
);
-               $itemId = $this->siteLinkLookup->getEntityIdForSiteLink( 
$siteLink );
+               $itemId = $this->getItemIdForTitle( $title );
 
                if ( $itemId !== null ) {
                        wfDebugLog( __CLASS__, __FUNCTION__ . ": Item ID for " 
. $title->getFullText()
@@ -433,13 +445,42 @@
        public function updateItemIdProperty( Title $title, ParserOutput $out ) 
{
                wfProfileIn( __METHOD__ );
 
-               $entityIdPropertyUpdater = new EntityIdPropertyUpdater(
-                       $this->siteLinkLookup,
-                       $this->siteId
-               );
+               $itemId = $this->getItemIdForTitle( $title );
 
-               $entityIdPropertyUpdater->updateItemIdProperty( $out, $title );
+               if ( $itemId ) {
+                       $out->setProperty( 'wikibase_item', 
$itemId->getSerialization() );
+               } else {
+                       $out->unsetProperty( 'wikibase_item' );
+               }
 
                wfProfileOut( __METHOD__ );
        }
+
+       /**
+        * @param Title $title
+        * @param ParserOutput $out
+        */
+       public function updateOtherProjectsLinksData( Title $title, 
ParserOutput $out ) {
+               $itemId = $this->getItemIdForTitle( $title );
+
+               if ( $itemId ) {
+                       $otherProjects = 
$this->otherProjectsSidebarGenerator->buildProjectLinkSidebar( $title );
+                       $out->setExtensionData( 
'wikibase-otherprojects-sidebar', $otherProjects );
+               }
+       }
+
+       /**
+        * @param Title $title
+        *
+        * @return ItemId|null
+        */
+       private function getItemIdForTitle( Title $title ) {
+               if ( !isset( $this->itemId ) ) {
+                       $siteLink = new SiteLink( $this->siteId, 
$title->getFullText() );
+                       $this->itemId = 
$this->siteLinkLookup->getEntityIdForSiteLink( $siteLink );
+               }
+
+               return $this->itemId;
+       }
+
 }
diff --git a/client/includes/WikibaseClient.php 
b/client/includes/WikibaseClient.php
index cbd1cc1..785edf9 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -550,6 +550,7 @@
                        $settings = $this->getSettings();
 
                        $this->langLinkHandler = new LangLinkHandler(
+                               $this->getOtherProjectsSidebarGenerator(),
                                $settings->getSetting( 'siteGlobalID' ),
                                $this->getNamespaceChecker(),
                                $this->getStore()->getSiteLinkTable(),
diff --git a/client/tests/phpunit/includes/LangLinkHandlerTest.php 
b/client/tests/phpunit/includes/LangLinkHandlerTest.php
index 2744b76..c518735 100644
--- a/client/tests/phpunit/includes/LangLinkHandlerTest.php
+++ b/client/tests/phpunit/includes/LangLinkHandlerTest.php
@@ -56,6 +56,10 @@
        public function setUp() {
                parent::setUp();
 
+               $this->langLinkHandler = $this->getLangLinkHandler( array() );
+       }
+
+       private function getLangLinkHandler( array $otherProjects ) {
                $this->mockRepo = new MockRepository();
 
                foreach ( $this->getItems() as $item ) {
@@ -64,13 +68,26 @@
 
                $sites = MockSiteStore::newFromTestSites();
 
-               $this->langLinkHandler = new LangLinkHandler(
+               return new LangLinkHandler(
+                       $this->getOtherProjectsSidebarGenerator( $otherProjects 
),
                        'srwiki',
                        new NamespaceChecker( array( NS_TALK ), array() ),
                        $this->mockRepo,
                        $sites,
                        'wikipedia'
                );
+       }
+
+       private function getOtherProjectsSidebarGenerator( array $otherProjects 
) {
+               $otherProjectsSidebarGenerator = $this->getMockBuilder( 
'Wikibase\Client\Hooks\OtherProjectsSidebarGenerator' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $otherProjectsSidebarGenerator->expects( $this->any() )
+                       ->method( 'buildProjectLinkSidebar' )
+                       ->will( $this->returnValue( $otherProjects ) );
+
+               return $otherProjectsSidebarGenerator;
        }
 
        public static function provideGetEntityLinks() {
@@ -477,4 +494,57 @@
                );
        }
 
+       public function testUpdateItemIdProperty() {
+               $langLinkHandler = $this->getLangLinkHandler( array() );
+
+               $parserOutput = new ParserOutput();
+
+               $titleText = 'Foo sr';
+               $title = Title::newFromText( $titleText );
+
+               $langLinkHandler->updateItemIdProperty( $title, $parserOutput );
+               $property = $parserOutput->getProperty( 'wikibase_item' );
+
+               $itemId = $this->mockRepo->getItemIdForLink( 'srwiki', 
$titleText );
+
+               $this->assertEquals( $itemId->getSerialization(), $property );
+       }
+
+       public function testUpdateItemIdPropertyForUnconnectedPage() {
+               $langLinkHandler = $this->getLangLinkHandler( array() );
+
+               $parserOutput = new ParserOutput();
+
+               $titleText = 'Foo xx';
+               $title = Title::newFromText( $titleText );
+
+               $langLinkHandler->updateItemIdProperty( $title, $parserOutput );
+               $property = $parserOutput->getProperty( 'wikibase_item' );
+
+               $this->assertEquals( false, $property );
+       }
+
+       /**
+        * @dataProvider updateOtherProjectsLinksDataProvider
+        */
+       public function testUpdateOtherProjectsLinksData( $expected, 
$otherProjects, $titleText ) {
+               $langLinkHandler = $this->getLangLinkHandler( $otherProjects );
+
+               $parserOutput = new ParserOutput();
+               $title = Title::newFromText( $titleText );
+
+               $langLinkHandler->updateOtherProjectsLinksData( $title, 
$parserOutput );
+               $extensionData = $parserOutput->getExtensionData( 
'wikibase-otherprojects-sidebar' );
+
+               $this->assertEquals( $expected, $extensionData );
+       }
+
+       public function updateOtherProjectsLinksDataProvider() {
+               return array(
+                       array( array( 'project' => 'catswiki' ), array( 
'project' => 'catswiki' ), 'Foo sr' ),
+                       array( array(), array(), 'Foo sr' ),
+                       array( null, array(), 'Foo xx' )
+               );
+       }
+
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I25cc3ea4af94c77eb67ddc02a84df0d95e1348cc
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <aude.w...@gmail.com>

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

Reply via email to