Passed
Push — master ( 35b0b4...a423cc )
by Marius
01:13
created

LegacyItemDeserializer::isDeserializerFor()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 12
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
 * @license GPL-2.0-or-later
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 17
	public function __construct(
44
		Deserializer $idDeserializer,
45
		Deserializer $siteLinkListDeserializer,
46
		Deserializer $statementDeserializer,
47
		Deserializer $fingerprintDeserializer
48
	) {
49 17
		$this->idDeserializer = $idDeserializer;
50 17
		$this->siteLinkListDeserializer = $siteLinkListDeserializer;
51 17
		$this->statementDeserializer = $statementDeserializer;
52 17
		$this->fingerprintDeserializer = $fingerprintDeserializer;
53 17
	}
54
55
	/**
56
	 * @param array $serialization
57
	 *
58
	 * @return Item
59
	 * @throws DeserializationException
60
	 */
61 17
	public function deserialize( $serialization ) {
62 17
		if ( !is_array( $serialization ) ) {
63 1
			throw new DeserializationException( 'Item serialization should be an array' );
64
		}
65
66 16
		return new Item(
67 16
			$this->getItemId( $serialization ),
68 15
			$this->fingerprintDeserializer->deserialize( $serialization ),
69 13
			$this->getSiteLinkList( $serialization ),
70 12
			$this->getStatementList( $serialization )
71
		);
72
	}
73
74
	/**
75
	 * @param array $serialization
76
	 *
77
	 * @return ItemId|null
78
	 */
79 16
	private function getItemId( array $serialization ) {
80 16
		if ( array_key_exists( 'entity', $serialization ) ) {
81 1
			return $this->idDeserializer->deserialize( $serialization['entity'] );
82
		}
83
84 15
		return null;
85
	}
86
87
	/**
88
	 * @param array $serialization
89
	 *
90
	 * @return SiteLinkList|null
91
	 */
92 13
	private function getSiteLinkList( array $serialization ) {
93 13
		if ( array_key_exists( 'links', $serialization ) ) {
94 2
			return $this->siteLinkListDeserializer->deserialize( $serialization['links'] );
95
		}
96
97 11
		return null;
98
	}
99
100
	/**
101
	 * @param array $serialization
102
	 *
103
	 * @return StatementList
104
	 */
105 12
	private function getStatementList( array $serialization ) {
106 12
		$serialization = $this->normalizeLegacyClaimKeys( $serialization );
107
108 12
		$statementList = new StatementList();
109
110 12
		foreach ( $this->getArrayFromKey( 'claims', $serialization ) as $claimSerialization ) {
111 3
			$this->assertClaimValueIsArray( $claimSerialization );
112 2
			$statementList->addStatement( $this->getStatement( $claimSerialization ) );
113
		}
114
115 10
		return $statementList;
116
	}
117
118
	/**
119
	 * @param array $claimSerialization
120
	 *
121
	 * @return Statement
122
	 */
123 2
	private function getStatement( array $claimSerialization ) {
124 2
		$statementSerialization = $this->normalizeStatementSerialization( $claimSerialization );
125
126 2
		return $this->statementDeserializer->deserialize( $statementSerialization );
127
	}
128
129 3
	private function assertClaimValueIsArray( $value ) {
130 3
		if ( !is_array( $value ) ) {
131 1
			throw new DeserializationException( 'Claim serialization must be an array.' );
132
		}
133 2
	}
134
135 12
	private function normalizeLegacyClaimKeys( array $serialization ) {
136
		// Compatibility with DataModel 0.2 and 0.3 ItemObjects.
137
		// (statements key got renamed to claims)
138 12
		if ( array_key_exists( 'statements', $serialization ) ) {
139 1
			$serialization['claims'] = $serialization['statements'];
140 1
			unset( $serialization['statements'] );
141
		}
142
143 12
		return $serialization;
144
	}
145
146 2
	private function normalizeStatementSerialization( array $seralization ) {
147 2
		if ( !isset( $seralization['rank'] ) ) {
148
			$seralization['rank'] = Statement::RANK_NORMAL;
149
		}
150
151 2
		if ( !isset( $seralization['refs'] ) ) {
152
			$seralization['refs'] = array();
153
		}
154
155 2
		return $seralization;
156
	}
157
158 12
	private function getArrayFromKey( $key, array $serialization ) {
159 12
		if ( !array_key_exists( $key, $serialization ) ) {
160 8
			return array();
161
		}
162
163 4
		if ( !is_array( $serialization[$key] ) ) {
164 1
			throw new InvalidAttributeException(
165 1
				$key,
166 1
				$serialization[$key],
167 1
				'The ' . $key . ' key should point to an array'
168
			);
169
		}
170
171 3
		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