Completed
Pull Request — master (#98)
by no
04:47 queued 02:22
created

LegacyItemDeserializer::isDeserializerFor()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 3
eloc 4
nc 3
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\InvalidAttributeException;
9
use Wikibase\DataModel\Entity\Item;
10
use Wikibase\DataModel\Entity\ItemId;
11
use Wikibase\DataModel\SiteLinkList;
12
use Wikibase\DataModel\Statement\Statement;
13
use Wikibase\DataModel\Statement\StatementList;
14
15
/**
16
 * @licence GNU GPL v2+
17
 * @author Jeroen De Dauw < [email protected] >
18
 * @author Katie Filbert < [email protected] >
19
 * @author Bene* < [email protected] >
20
 */
21
class LegacyItemDeserializer implements DispatchableDeserializer {
22
23
	/**
24
	 * @var Deserializer
25
	 */
26
	private $idDeserializer;
27
28
	/**
29
	 * @var Deserializer
30
	 */
31
	private $siteLinkListDeserializer;
32
33
	/**
34
	 * @var Deserializer
35
	 */
36
	private $statementDeserializer;
37
38
	/**
39
	 * @var Deserializer
40
	 */
41
	private $fingerprintDeserializer;
42
43
	public function __construct(
44
		Deserializer $idDeserializer,
45
		Deserializer $siteLinkListDeserializer,
46
		Deserializer $statementDeserializer,
47
		Deserializer $fingerprintDeserializer
48
	) {
49
		$this->idDeserializer = $idDeserializer;
50
		$this->siteLinkListDeserializer = $siteLinkListDeserializer;
51
		$this->statementDeserializer = $statementDeserializer;
52
		$this->fingerprintDeserializer = $fingerprintDeserializer;
53
	}
54
55
	/**
56
	 * @param array $serialization
57
	 *
58
	 * @return Item
59
	 * @throws DeserializationException
60
	 */
61
	public function deserialize( $serialization ) {
62
		if ( !is_array( $serialization ) ) {
63
			throw new DeserializationException( 'Item serialization should be an array' );
64
		}
65
66
		return new Item(
67
			$this->getItemId( $serialization ),
68
			$this->fingerprintDeserializer->deserialize( $serialization ),
69
			$this->getSiteLinkList( $serialization ),
70
			$this->getStatementList( $serialization )
71
		);
72
	}
73
74
	/**
75
	 * @param array $serialization
76
	 *
77
	 * @return ItemId|null
78
	 */
79
	private function getItemId( array $serialization ) {
80
		if ( array_key_exists( 'entity', $serialization ) ) {
81
			return $this->idDeserializer->deserialize( $serialization['entity'] );
82
		}
83
84
		return null;
85
	}
86
87
	/**
88
	 * @param array $serialization
89
	 *
90
	 * @return SiteLinkList|null
91
	 */
92
	private function getSiteLinkList( array $serialization ) {
93
		if ( array_key_exists( 'links', $serialization ) ) {
94
			return $this->siteLinkListDeserializer->deserialize( $serialization['links'] );
95
		}
96
97
		return null;
98
	}
99
100
	/**
101
	 * @param array $serialization
102
	 *
103
	 * @return StatementList
104
	 */
105
	private function getStatementList( array $serialization ) {
106
		$serialization = $this->normalizeLegacyClaimKeys( $serialization );
107
108
		$statementList = new StatementList();
109
110
		foreach ( $this->getArrayFromKey( 'claims', $serialization ) as $claimSerialization ) {
111
			$this->assertClaimValueIsArray( $claimSerialization );
112
			$statementList->addStatement( $this->getStatement( $claimSerialization ) );
113
		}
114
115
		return $statementList;
116
	}
117
118
	/**
119
	 * @param array $claimSerialization
120
	 *
121
	 * @return Statement
122
	 */
123
	private function getStatement( array $claimSerialization ) {
124
		$statementSerialization = $this->normalizeStatementSerialization( $claimSerialization );
125
126
		return $this->statementDeserializer->deserialize( $statementSerialization );
127
	}
128
129
	private function assertClaimValueIsArray( $value ) {
130
		if ( !is_array( $value ) ) {
131
			throw new DeserializationException( 'Claim serialization must be an array.' );
132
		}
133
	}
134
135
	private function normalizeLegacyClaimKeys( array $serialization ) {
136
		// Compatibility with DataModel 0.2 and 0.3 ItemObjects.
137
		// (statements key got renamed to claims)
138
		if ( array_key_exists( 'statements', $serialization ) ) {
139
			$serialization['claims'] = $serialization['statements'];
140
			unset( $serialization['statements'] );
141
		}
142
143
		return $serialization;
144
	}
145
146
	private function normalizeStatementSerialization( array $seralization ) {
147
		if ( !isset( $seralization['rank'] ) ) {
148
			$seralization['rank'] = Statement::RANK_NORMAL;
149
		}
150
151
		if ( !isset( $seralization['refs'] ) ) {
152
			$seralization['refs'] = array();
153
		}
154
155
		return $seralization;
156
	}
157
158
	private function getArrayFromKey( $key, array $serialization ) {
159
		if ( !array_key_exists( $key, $serialization ) ) {
160
			return array();
161
		}
162
163
		if ( !is_array( $serialization[$key] ) ) {
164
			throw new InvalidAttributeException(
165
				$key,
166
				$serialization[$key],
167
				'The ' . $key . ' key should point to an array'
168
			);
169
		}
170
171
		return $serialization[$key];
172
	}
173
174
	/**
175
	 * @see DispatchableDeserializer::isDeserializerFor
176
	 *
177
	 * @since 2.2
178
	 *
179
	 * @param mixed $serialization
180
	 *
181
	 * @return bool
182
	 */
183
	public function isDeserializerFor( $serialization ) {
184
		return is_array( $serialization )
185
			// This element is called 'id' in the current serialization.
186
			&& array_key_exists( 'entity', $serialization )
187
			&& !array_key_exists( 'datatype', $serialization );
188
	}
189
190
}
191