Completed
Push — master ( ed9ffe...904824 )
by Amir
12s
created

LegacyItemDeserializer   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 154
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 96.43%

Importance

Changes 0
Metric Value
wmc 20
lcom 1
cbo 5
dl 0
loc 154
ccs 54
cts 56
cp 0.9643
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
A deserialize() 0 12 2
A getItemId() 0 7 2
A getSiteLinkList() 0 7 2
A getStatementList() 0 12 2
A getStatement() 0 5 1
A assertClaimValueIsArray() 0 5 2
A normalizeLegacyClaimKeys() 0 10 2
A normalizeStatementSerialization() 0 11 3
A getArrayFromKey() 0 15 3
1
<?php
2
3
namespace Wikibase\InternalSerialization\Deserializers;
4
5
use Deserializers\Deserializer;
6
use Deserializers\Exceptions\DeserializationException;
7
use Deserializers\Exceptions\InvalidAttributeException;
8
use Wikibase\DataModel\Entity\Item;
9
use Wikibase\DataModel\Entity\ItemId;
10
use Wikibase\DataModel\SiteLinkList;
11
use Wikibase\DataModel\Statement\Statement;
12
use Wikibase\DataModel\Statement\StatementList;
13
14
/**
15
 * @license GPL-2.0+
16
 * @author Jeroen De Dauw < [email protected] >
17
 * @author Katie Filbert < [email protected] >
18
 * @author Bene* < [email protected] >
19
 */
20
class LegacyItemDeserializer implements Deserializer {
21
22
	/**
23
	 * @var Deserializer
24
	 */
25
	private $idDeserializer;
26
27
	/**
28
	 * @var Deserializer
29
	 */
30
	private $siteLinkListDeserializer;
31
32
	/**
33
	 * @var Deserializer
34
	 */
35
	private $statementDeserializer;
36
37
	/**
38
	 * @var Deserializer
39
	 */
40
	private $fingerprintDeserializer;
41
42 17
	public function __construct(
43
		Deserializer $idDeserializer,
44
		Deserializer $siteLinkListDeserializer,
45
		Deserializer $statementDeserializer,
46
		Deserializer $fingerprintDeserializer
47
	) {
48 17
		$this->idDeserializer = $idDeserializer;
49 17
		$this->siteLinkListDeserializer = $siteLinkListDeserializer;
50 17
		$this->statementDeserializer = $statementDeserializer;
51 17
		$this->fingerprintDeserializer = $fingerprintDeserializer;
52 17
	}
53
54
	/**
55
	 * @param array $serialization
56
	 *
57
	 * @return Item
58
	 * @throws DeserializationException
59
	 */
60 17
	public function deserialize( $serialization ) {
61 17
		if ( !is_array( $serialization ) ) {
62 1
			throw new DeserializationException( 'Item serialization should be an array' );
63
		}
64
65 16
		return new Item(
66 16
			$this->getItemId( $serialization ),
67 15
			$this->fingerprintDeserializer->deserialize( $serialization ),
68 13
			$this->getSiteLinkList( $serialization ),
69 12
			$this->getStatementList( $serialization )
70
		);
71
	}
72
73
	/**
74
	 * @param array $serialization
75
	 *
76
	 * @return ItemId|null
77
	 */
78 16
	private function getItemId( array $serialization ) {
79 16
		if ( array_key_exists( 'entity', $serialization ) ) {
80 1
			return $this->idDeserializer->deserialize( $serialization['entity'] );
81
		}
82
83 15
		return null;
84
	}
85
86
	/**
87
	 * @param array $serialization
88
	 *
89
	 * @return SiteLinkList|null
90
	 */
91 13
	private function getSiteLinkList( array $serialization ) {
92 13
		if ( array_key_exists( 'links', $serialization ) ) {
93 2
			return $this->siteLinkListDeserializer->deserialize( $serialization['links'] );
94
		}
95
96 11
		return null;
97
	}
98
99
	/**
100
	 * @param array $serialization
101
	 *
102
	 * @return StatementList
103
	 */
104 12
	private function getStatementList( array $serialization ) {
105 12
		$serialization = $this->normalizeLegacyClaimKeys( $serialization );
106
107 12
		$statementList = new StatementList();
108
109 12
		foreach ( $this->getArrayFromKey( 'claims', $serialization ) as $claimSerialization ) {
110 3
			$this->assertClaimValueIsArray( $claimSerialization );
111 2
			$statementList->addStatement( $this->getStatement( $claimSerialization ) );
112
		}
113
114 10
		return $statementList;
115
	}
116
117
	/**
118
	 * @param array $claimSerialization
119
	 *
120
	 * @return Statement
121
	 */
122 2
	private function getStatement( array $claimSerialization ) {
123 2
		$statementSerialization = $this->normalizeStatementSerialization( $claimSerialization );
124
125 2
		return $this->statementDeserializer->deserialize( $statementSerialization );
126
	}
127
128 3
	private function assertClaimValueIsArray( $value ) {
129 3
		if ( !is_array( $value ) ) {
130 1
			throw new DeserializationException( 'Claim serialization must be an array.' );
131
		}
132 2
	}
133
134 12
	private function normalizeLegacyClaimKeys( array $serialization ) {
135
		// Compatibility with DataModel 0.2 and 0.3 ItemObjects.
136
		// (statements key got renamed to claims)
137 12
		if ( array_key_exists( 'statements', $serialization ) ) {
138 1
			$serialization['claims'] = $serialization['statements'];
139 1
			unset( $serialization['statements'] );
140
		}
141
142 12
		return $serialization;
143
	}
144
145 2
	private function normalizeStatementSerialization( array $seralization ) {
146 2
		if ( !isset( $seralization['rank'] ) ) {
147
			$seralization['rank'] = Statement::RANK_NORMAL;
148
		}
149
150 2
		if ( !isset( $seralization['refs'] ) ) {
151
			$seralization['refs'] = array();
152
		}
153
154 2
		return $seralization;
155
	}
156
157 12
	private function getArrayFromKey( $key, array $serialization ) {
158 12
		if ( !array_key_exists( $key, $serialization ) ) {
159 8
			return array();
160
		}
161
162 4
		if ( !is_array( $serialization[$key] ) ) {
163 1
			throw new InvalidAttributeException(
164 1
				$key,
165 1
				$serialization[$key],
166 1
				'The ' . $key . ' key should point to an array'
167
			);
168
		}
169
170 3
		return $serialization[$key];
171
	}
172
173
}
174