StatementDeserializer::isValidStatementType()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 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