Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/client/includes/Store/AddUsagesForPageJob.php
<?php

namespace Wikibase\Client\Store;

use Job;
use JobSpecification;
use Title;
use Wikibase\Client\Usage\EntityUsage;
use Wikibase\Client\WikibaseClient;
use Wikibase\DataModel\Entity\EntityIdParser;
use Wikimedia\Assert\Assert;

/**
 * Job for scheduled invocation of UsageUpdater::addUsagesForPage
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class AddUsagesForPageJob extends Job {

	/**
	 * @var integer
	 */
	private $pageId;

	/**
	 * @var EntityUsage[]
	 */
	private $usages;

	/**
	 * @var UsageUpdater
	 */
	private $usageUpdater;

	/**
	 * @var EntityIdParser
	 */
	private $idParser;

	/**
	 * Spec constructor, for creating JobSpecifications to be pushed to the job queue.
	 *
	 * @param Title $title
	 * @param EntityUsage[] $usages
	 *
	 * @return JobSpecification
	 */
	public static function newSpec( Title $title, array $usages ) {
		// NOTE: Map EntityUsage objects to scalar arrays, for JSON serialization in the job queue.
		$usages = array_map( function ( EntityUsage $usage ) {
			return $usage->asArray();
		}, $usages );

		$jobParams = array(
			'pageId' => $title->getArticleId(),
			'usages' => $usages
		);

		return new JobSpecification(
			'wikibase-addUsagesForPage',
			$jobParams,
			array( 'removeDuplicates' => true ),
			$title
		);
	}

	/**
	 * @param Title $title
	 * @param array $params
	 */
	public function __construct( Title $title, array $params ) {
		parent::__construct( 'wikibase-addUsagesForPage', $title, $params );

		Assert::parameter(
			isset( $params['pageId'] ) && is_int( $params['pageId'] ) && $params['pageId'] > 0,
			'$params["pageId"]',
			'must be a positive integer' );

		Assert::parameter(
			isset( $params['usages'] ) && is_array( $params['usages'] ) && !empty( $params['usages'] ),
			'$params["usages"]',
			'must be a non-empty array' );

		Assert::parameterElementType(
			'array',
			$params['usages'],
			'$params["usages"]' );

		$this->pageId = $params['pageId'];
		$this->usages = $params['usages'];

		$wikibaseClient = WikibaseClient::getDefaultInstance();
		$usageUpdater = $wikibaseClient->getStore()->getUsageUpdater();
		$idParser = $wikibaseClient->getEntityIdParser();
		$this->overrideServices( $usageUpdater, $idParser );
	}

	/**
	 * Service override for testing
	 *
	 * @param UsageUpdater $usageUpdater
	 * @param EntityIdParser $idParser
	 */
	public function overrideServices( UsageUpdater $usageUpdater, EntityIdParser $idParser ) {
		$this->usageUpdater = $usageUpdater;
		$this->idParser = $idParser;
	}

	/**
	 * @return EntityUsage[]
	 */
	private function getUsages() {
		// Turn serialized usage info into EntityUsage objects
		$idParser = $this->idParser;
		$usages = array_map( function ( array $usageArray ) use ( $idParser ) {
			// This is the inverse of EntityUsage::asArray()
			return new EntityUsage(
				$idParser->parse( $usageArray['entityId'] ),
				$usageArray['aspect'],
				$usageArray['modifier']
			);
		}, $this->usages );

		return $usages;
	}

	/**
	 * Call UsageUpdater::addUsagesForPage
	 *
	 * @return bool Success
	 */
	public function run() {
		$this->usageUpdater->addUsagesForPage(
			$this->pageId,
			$this->getUsages()
		);
	}

}