Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/includes/ParserOutput/EntityParserOutputDataUpdater.php
<?php

namespace Wikibase\Repo\ParserOutput;

use InvalidArgumentException;
use ParserOutput;
use Wikibase\DataModel\Entity\EntityDocument;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\SiteLinkList;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\DataModel\Statement\StatementListProvider;

/**
 * @todo have ItemParserOutputDataUpdater, etc. instead.
 *
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Katie Filbert < aude.wiki@gmail.com >
 * @author Thiemo Mättig
 */
class EntityParserOutputDataUpdater {

	/**
	 * @var ParserOutput
	 */
	private $parserOutput;

	/**
	 * @var ParserOutputDataUpdater[]
	 */
	private $dataUpdaters;

	/**
	 * @var StatementDataUpdater[]
	 */
	private $statementDataUpdaters = array();

	/**
	 * @var SiteLinkDataUpdater[]
	 */
	private $siteLinkDataUpdaters = array();

	/**
	 * @param ParserOutput $parserOutput
	 * @param ParserOutputDataUpdater[] $dataUpdaters
	 *
	 * @throws InvalidArgumentException
	 */
	public function __construct( ParserOutput $parserOutput, array $dataUpdaters ) {
		foreach ( $dataUpdaters as $updater ) {
			$this->registerDataUpdater( $updater );
		}

		$this->parserOutput = $parserOutput;
		$this->dataUpdaters = $dataUpdaters;
	}

	private function registerDataUpdater( $updater ) {
		if ( !( $updater instanceof StatementDataUpdater ) &&
		     !( $updater instanceof SiteLinkDataUpdater )
		) {
			throw new InvalidArgumentException(
				'Each $dataUpdaters element must be a StatementDataUpdater, SiteLinkDataUpdater or both'
			);
		}

		if ( $updater instanceof StatementDataUpdater ) {
			$this->statementDataUpdaters[] = $updater;
		}

		if ( $updater instanceof SiteLinkDataUpdater ) {
			$this->siteLinkDataUpdaters[] = $updater;
		}
	}

	/**
	 * @param EntityDocument $entity
	 */
	public function processEntity( EntityDocument $entity ) {
		if ( $entity instanceof StatementListProvider && $this->statementDataUpdaters ) {
			$this->processStatements( $entity->getStatements() );
		}

		if ( $entity instanceof Item && $this->siteLinkDataUpdaters ) {
			$this->processSiteLinks( $entity->getSiteLinkList() );
		}
	}

	/**
	 * @param StatementList $statements
	 */
	private function processStatements( StatementList $statements ) {
		foreach ( $statements as $statement ) {
			foreach ( $this->statementDataUpdaters as $updater ) {
				$updater->processStatement( $statement );
			}
		}
	}

	/**
	 * @param SiteLinkList $siteLinks
	 */
	private function processSiteLinks( SiteLinkList $siteLinks ) {
		foreach ( $siteLinks as $siteLink ) {
			foreach ( $this->siteLinkDataUpdaters as $updater ) {
				$updater->processSiteLink( $siteLink );
			}
		}
	}

	public function finish() {
		foreach ( $this->dataUpdaters as $updater ) {
			$updater->updateParserOutput( $this->parserOutput );
		}
	}

}