Completed
Push — master ( 2b1f4f...6221e9 )
by
unknown
28s
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\DispatchableDeserializer;
7
use Deserializers\Exceptions\DeserializationException;
8
use Deserializers\Exceptions\MissingAttributeException;
9
use InvalidArgumentException;
10
use Wikibase\DataModel\Reference;
11
use Wikibase\DataModel\ReferenceList;
12
use Wikibase\DataModel\Statement\Statement;
13
14
/**
15
 * @licence GNU GPL v2+
16
 * @author Katie Filbert < [email protected] >
17
 * @author Jeroen De Dauw < [email protected] >
18
 * @author Bene* < [email protected] >
19
 */
20
class LegacyStatementDeserializer implements DispatchableDeserializer {
21
22
	/**
23
	 * @var Deserializer
24
	 */
25
	private $snakDeserializer;
26
27
	/**
28
	 * @var Deserializer
29
	 */
30
	private $snakListDeserializer;
31
32
	public function __construct( Deserializer $snakDeserializer, Deserializer $snakListDeserializer ) {
33
		$this->snakDeserializer = $snakDeserializer;
34
		$this->snakListDeserializer = $snakListDeserializer;
35
	}
36
37
	/**
38
	 * @param array $serialization
39
	 *
40
	 * @return Statement
41
	 * @throws DeserializationException
42
	 */
43
	public function deserialize( $serialization ) {
44
		if ( !is_array( $serialization ) ) {
45
			throw new DeserializationException( 'Statement serialization must be an array' );
46
		}
47
48
		$this->assertHasKey( $serialization, 'm', 'Mainsnak serialization is missing' );
49
		$this->assertHasKey( $serialization, 'q', 'Qualifiers serialization is missing' );
50
		$this->assertHasKey( $serialization, 'g', 'Guid is missing in serialization' );
51
		$this->assertHasKey( $serialization, 'rank', 'Rank is missing in serialization' );
52
		$this->assertHasKey( $serialization, 'refs', 'Refs are missing in serialization' );
53
54
		return $this->newStatement( $serialization );
55
	}
56
57
	private function assertHasKey( array $serialization, $key, $message ) {
58
		if ( !array_key_exists( $key, $serialization ) ) {
59
			throw new MissingAttributeException( $key, $message );
60
		}
61
	}
62
63
	private function newStatement( array $serialization ) {
64
		$statement = new Statement(
65
			$this->snakDeserializer->deserialize( $serialization['m'] ),
66
			$this->snakListDeserializer->deserialize( $serialization['q'] ),
67
			$this->getReferences( $serialization['refs'] )
68
		);
69
70
		try {
71
			$statement->setRank( $serialization['rank'] );
72
			$statement->setGuid( $serialization['g'] );
73
		} catch ( InvalidArgumentException $ex ) {
74
			throw new DeserializationException( $ex->getMessage(), $ex );
75
		}
76
77
		return $statement;
78
	}
79
80
	private function getReferences( array $refs ) {
81
		$references = array();
82
83
		foreach ( $refs as $serialization ) {
84
			$references[] = new Reference( $this->snakListDeserializer->deserialize( $serialization ) );
85
		}
86
87
		return new ReferenceList( $references );
88
	}
89
90
	/**
91
	 * @see DispatchableDeserializer::isDeserializerFor
92
	 *
93
	 * @since 2.2
94
	 *
95
	 * @param mixed $serialization
96
	 *
97
	 * @return bool
98
	 */
99
	public function isDeserializerFor( $serialization ) {
100
		return is_array( $serialization )
101
			// This element is called 'mainsnak' in the current serialization.
102
			&& array_key_exists( 'm', $serialization );
103
	}
104
105
}
106