Completed
Push — master ( 039a57...d01339 )
by Jeroen De
02:42
created

PageImporter::a()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 4
rs 10
cc 1
eloc 3
nc 1
nop 2
1
<?php
2
3
namespace Queryr\Replicator\Importer;
4
5
use Deserializers\Deserializer;
6
use Deserializers\Exceptions\DeserializationException;
7
use Queryr\Replicator\Model\EntityPage;
8
use Wikibase\DataModel\Entity\EntityDocument;
9
use Wikibase\DataModel\Entity\Item;
10
11
class PageImporter {
12
13
	private $entityDeserializer;
14
	private $reporter;
15
16
	private $entityHandlers;
17
	private $entityPageHandlers;
18
19
	/**
20
	 * @param Deserializer $entityDeserializer
21
	 * @param EntityHandler[] $entityHandlers
22
	 * @param EntityPageHandler[] $entityPageHandlers
23
	 * @param PageImportReporter $reporter
24
	 */
25
	public function __construct( Deserializer $entityDeserializer, array $entityHandlers,
26
		array $entityPageHandlers, PageImportReporter $reporter ) {
27
28
		$this->entityDeserializer = $entityDeserializer;
29
		$this->reporter = $reporter;
30
31
		$this->entityHandlers = $entityHandlers;
32
		$this->entityPageHandlers = $entityPageHandlers;
33
	}
34
35
	public function import( EntityPage $entityPage ) {
36
		$this->reporter->started( $entityPage );
37
38
		try {
39
			$this->doImport( $entityPage );
40
41
			$this->reporter->endedSuccessfully();
42
		}
43
		catch ( \Exception $ex ) {
44
			$this->reporter->endedWithError( $ex );
45
		}
46
	}
47
48
	private function doImport( EntityPage $entityPage ) {
49
		if ( $this->thereAreHandlers() ) {
50
			$entity = $this->doDeserializeStep( $entityPage );
51
52
			$this->invokeEntityPageHandlers( $entity, $entityPage );
53
			$this->invokeEntityHandlers( $entity );
54
		}
55
	}
56
57
	private function thereAreHandlers(): bool {
58
		return !empty( $this->entityHandlers ) || !empty( $this->entityPageHandlers );
59
	}
60
61
	private function doDeserializeStep( EntityPage $entityPage ) {
62
		$this->reporter->stepStarted( 'Deserializing' );
63
		$entity = $this->entityFromEntityPage( $entityPage );
64
		$this->reporter->stepCompleted();
65
66
		return $entity;
67
	}
68
69
	private function invokeEntityPageHandlers( EntityDocument $entity, EntityPage $entityPage ) {
70
		foreach ( $this->entityPageHandlers as $pageHandler ) {
71
			$this->reporter->stepStarted( $pageHandler->getHandlingMessage( $entity ) );
72
			$pageHandler->handleEntityPage( $entity, $entityPage );
73
			$this->reporter->stepCompleted();
74
		}
75
	}
76
77
	private function invokeEntityHandlers( EntityDocument $entity ) {
78
		foreach ( $this->entityHandlers as $entityHandler ) {
79
			$this->reporter->stepStarted( $entityHandler->getHandlingMessage( $entity ) );
80
			$entityHandler->handleEntity( $entity );
81
			$this->reporter->stepCompleted();
82
		}
83
	}
84
85
	/**
86
	 * @param EntityPage $entityPage
87
	 * @return Item
88
	 * @throws DeserializationException
89
	 */
90
	private function entityFromEntityPage( EntityPage $entityPage ) {
91
		return $this->entityDeserializer->deserialize(
92
			json_decode( $entityPage->getEntityJson(), true )
93
		);
94
	}
95
96
	public function setReporter( PageImportReporter $reporter ) {
97
		$this->reporter = $reporter;
98
	}
99
100
	public function getReporter() {
101
		return $this->reporter;
102
	}
103
104
}
105