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