StatementDeserializer   A
last analyzed

Complexity

Total Complexity 25

Size/Duplication

Total Lines 157
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 25
lcom 1
cbo 8
dl 0
loc 157
ccs 61
cts 61
cp 1
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A isDeserializerFor() 0 5 3
A isValidStatementType() 0 3 2
A deserialize() 0 16 5
A getDeserialized() 0 21 5
A setGuidFromSerialization() 0 9 2
A setQualifiersFromSerialization() 0 12 2
A setRankFromSerialization() 0 9 2
A setReferencesFromSerialization() 0 5 1
A assertQualifiersOrderIsArray() 0 9 2
1
<?php
2
3
namespace Wikibase\DataModel\Deserializers;
4
5
use Deserializers\Deserializer;
6
use Deserializers\DispatchableDeserializer;
7
use Deserializers\Exceptions\DeserializationException;
8
use Deserializers\Exceptions\InvalidAttributeException;
9
use Deserializers\Exceptions\MissingAttributeException;
10
use Deserializers\Exceptions\MissingTypeException;
11
use Deserializers\Exceptions\UnsupportedTypeException;
12
use Wikibase\DataModel\ReferenceList;
13
use Wikibase\DataModel\Snak\Snak;
14
use Wikibase\DataModel\Snak\SnakList;
15
use Wikibase\DataModel\Statement\Statement;
16
17
/**
18
 * Package private
19
 *
20
 * @license GPL-2.0-or-later
21
 * @author Thomas Pellissier Tanon
22
 */
23
class StatementDeserializer implements DispatchableDeserializer {
24
25
	private static $rankIds = [
26
		'deprecated' => Statement::RANK_DEPRECATED,
27
		'normal' => Statement::RANK_NORMAL,
28
		'preferred' => Statement::RANK_PREFERRED
29
	];
30
31
	/**
32
	 * @var Deserializer
33
	 */
34
	private $snakDeserializer;
35
36
	/**
37
	 * @var Deserializer
38
	 */
39
	private $snaksDeserializer;
40
41
	/**
42
	 * @var Deserializer
43
	 */
44
	private $referencesDeserializer;
45
46 52
	public function __construct(
47
		Deserializer $snakDeserializer,
48
		Deserializer $snaksDeserializer,
49
		Deserializer $referencesDeserializer
50
	) {
51 52
		$this->snakDeserializer = $snakDeserializer;
52 52
		$this->snaksDeserializer = $snaksDeserializer;
53 52
		$this->referencesDeserializer = $referencesDeserializer;
54 52
	}
55
56
	/**
57
	 * @see DispatchableDeserializer::isDeserializerFor
58
	 *
59
	 * @param mixed $serialization
60
	 *
61
	 * @return bool
62
	 */
63 6
	public function isDeserializerFor( $serialization ) {
64 6
		return is_array( $serialization )
65 6
			&& array_key_exists( 'type', $serialization )
66 6
			&& $this->isValidStatementType( $serialization['type'] );
67
	}
68
69
	/**
70
	 * @param string $statementType
71
	 *
72
	 * @return bool
73
	 */
74 32
	private function isValidStatementType( $statementType ) {
75 32
		return $statementType === 'statement' || $statementType === 'claim';
76
	}
77
78
	/**
79
	 * @see Deserializer::deserialize
80
	 *
81
	 * @param array $serialization
82
	 *
83
	 * @throws DeserializationException
84
	 * @return Statement
85
	 */
86 30
	public function deserialize( $serialization ) {
87
		// Note: The following functions have been inlined on purpose, see T157013.
88 30
		if ( !is_array( $serialization ) || !array_key_exists( 'type', $serialization ) ) {
89 2
			throw new MissingTypeException();
90
		}
91
92 28
		if ( !$this->isValidStatementType( $serialization['type'] ) ) {
93 1
			throw new UnsupportedTypeException( $serialization['type'] );
94
		}
95
96 27
		if ( !array_key_exists( 'mainsnak', $serialization ) ) {
97 1
			throw new MissingAttributeException( 'mainsnak' );
98
		}
99
100 26
		return $this->getDeserialized( $serialization );
101
	}
102
103
	/**
104
	 * @param array $serialization
105
	 *
106
	 * @return Statement
107
	 */
108 26
	private function getDeserialized( array $serialization ) {
109
		/** @var Snak $mainSnak */
110 26
		$mainSnak = $this->snakDeserializer->deserialize( $serialization['mainsnak'] );
111 26
		$statement = new Statement( $mainSnak );
112
113
		// Note: The following ifs are inlined on purpose, see T157013.
114 26
		if ( array_key_exists( 'id', $serialization ) ) {
115 9
			$this->setGuidFromSerialization( $serialization, $statement );
116
		}
117 25
		if ( array_key_exists( 'qualifiers', $serialization ) ) {
118 6
			$this->setQualifiersFromSerialization( $serialization, $statement );
119
		}
120 24
		if ( array_key_exists( 'rank', $serialization ) ) {
121 20
			$this->setRankFromSerialization( $serialization, $statement );
122
		}
123 23
		if ( array_key_exists( 'references', $serialization ) ) {
124 5
			$this->setReferencesFromSerialization( $serialization, $statement );
125
		}
126
127 23
		return $statement;
128
	}
129
130 9
	private function setGuidFromSerialization( array $serialization, Statement $statement ) {
131 9
		if ( !is_string( $serialization['id'] ) ) {
132 1
			throw new DeserializationException(
133 1
				'The id ' . $serialization['id'] . ' is not a valid GUID.'
134
			);
135
		}
136
137 8
		$statement->setGuid( $serialization['id'] );
138 8
	}
139
140 6
	private function setQualifiersFromSerialization( array $serialization, Statement $statement ) {
141
		/** @var SnakList $qualifiers */
142 6
		$qualifiers = $this->snaksDeserializer->deserialize( $serialization['qualifiers'] );
143
144 6
		if ( array_key_exists( 'qualifiers-order', $serialization ) ) {
145 5
			$this->assertQualifiersOrderIsArray( $serialization );
146
147 4
			$qualifiers->orderByProperty( $serialization['qualifiers-order'] );
148
		}
149
150 5
		$statement->setQualifiers( $qualifiers );
151 5
	}
152
153 20
	private function setRankFromSerialization( array $serialization, Statement $statement ) {
154 20
		if ( !array_key_exists( $serialization['rank'], self::$rankIds ) ) {
155 1
			throw new DeserializationException(
156 1
				'The rank ' . $serialization['rank'] . ' is not a valid rank.'
157
			);
158
		}
159
160 19
		$statement->setRank( self::$rankIds[$serialization['rank']] );
161 19
	}
162
163 5
	private function setReferencesFromSerialization( array $serialization, Statement $statement ) {
164
		/** @var ReferenceList $references */
165 5
		$references = $this->referencesDeserializer->deserialize( $serialization['references'] );
166 5
		$statement->setReferences( $references );
167 5
	}
168
169 5
	private function assertQualifiersOrderIsArray( array $serialization ) {
170 5
		if ( !is_array( $serialization['qualifiers-order'] ) ) {
171 1
			throw new InvalidAttributeException(
172 1
				'qualifiers-order',
173 1
				$serialization['qualifiers-order'],
174 1
				'qualifiers-order attribute is not a valid array'
175
			);
176
		}
177 4
	}
178
179
}
180