Passed
Push — dispatchEntityId ( b07053...245111 )
by no
07:01 queued 04:24
created

LegacyStatementDeserializer::isDeserializerFor()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 2
eloc 3
nc 2
nop 1
1
<?php
2
3
namespace Wikibase\InternalSerialization\Deserializers;
4
5
use Deserializers\Deserializer;
6
use Deserializers\Exceptions\DeserializationException;
7
use Deserializers\Exceptions\MissingAttributeException;
8
use InvalidArgumentException;
9
use Wikibase\DataModel\Reference;
10
use Wikibase\DataModel\ReferenceList;
11
use Wikibase\DataModel\Statement\Statement;
12
13
/**
14
 * @licence GNU GPL v2+
15
 * @author Katie Filbert < [email protected] >
16
 * @author Jeroen De Dauw < [email protected] >
17
 * @author Bene* < [email protected] >
18
 */
19
class LegacyStatementDeserializer implements Deserializer {
20
21
	/**
22
	 * @var Deserializer
23
	 */
24
	private $snakDeserializer;
25
26
	/**
27
	 * @var Deserializer
28
	 */
29
	private $snakListDeserializer;
30
31
	public function __construct( Deserializer $snakDeserializer, Deserializer $snakListDeserializer ) {
32
		$this->snakDeserializer = $snakDeserializer;
33
		$this->snakListDeserializer = $snakListDeserializer;
34
	}
35
36
	/**
37
	 * @param array $serialization
38
	 *
39
	 * @return Statement
40
	 * @throws DeserializationException
41
	 */
42
	public function deserialize( $serialization ) {
43
		if ( !is_array( $serialization ) ) {
44
			throw new DeserializationException( 'Statement serialization must be an array' );
45
		}
46
47
		$this->assertHasKey( $serialization, 'm', 'Mainsnak serialization is missing' );
48
		$this->assertHasKey( $serialization, 'q', 'Qualifiers serialization is missing' );
49
		$this->assertHasKey( $serialization, 'g', 'Guid is missing in serialization' );
50
		$this->assertHasKey( $serialization, 'rank', 'Rank is missing in serialization' );
51
		$this->assertHasKey( $serialization, 'refs', 'Refs are missing in serialization' );
52
53
		return $this->newStatement( $serialization );
54
	}
55
56
	private function assertHasKey( array $serialization, $key, $message ) {
57
		if ( !array_key_exists( $key, $serialization ) ) {
58
			throw new MissingAttributeException( $key, $message );
59
		}
60
	}
61
62
	private function newStatement( array $serialization ) {
63
		$statement = new Statement(
64
			$this->snakDeserializer->deserialize( $serialization['m'] ),
65
			$this->snakListDeserializer->deserialize( $serialization['q'] ),
66
			$this->getReferences( $serialization['refs'] )
67
		);
68
69
		try {
70
			$statement->setRank( $serialization['rank'] );
71
			$statement->setGuid( $serialization['g'] );
72
		} catch ( InvalidArgumentException $ex ) {
73
			throw new DeserializationException( $ex->getMessage(), $ex );
74
		}
75
76
		return $statement;
77
	}
78
79
	private function getReferences( array $refs ) {
80
		$references = array();
81
82
		foreach ( $refs as $serialization ) {
83
			$references[] = new Reference( $this->snakListDeserializer->deserialize( $serialization ) );
84
		}
85
86
		return new ReferenceList( $references );
87
	}
88
89
}
90