ReferenceDeserializer::deserialize()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 4
cts 4
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 Wikibase\DataModel\Reference;
10
use Wikibase\DataModel\Snak\SnakList;
11
12
/**
13
 * Package private
14
 *
15
 * @license GPL-2.0-or-later
16
 * @author Thomas Pellissier Tanon
17
 */
18
class ReferenceDeserializer implements DispatchableDeserializer {
19
20
	/**
21
	 * @var Deserializer
22
	 */
23
	private $snaksDeserializer;
24
25 48
	public function __construct( Deserializer $snaksDeserializer ) {
26 48
		$this->snaksDeserializer = $snaksDeserializer;
27 48
	}
28
29
	/**
30
	 * @see Deserializer::isDeserializerFor
31
	 *
32
	 * @param mixed $serialization
33
	 *
34
	 * @return bool
35
	 */
36 3
	public function isDeserializerFor( $serialization ) {
37 3
		return $this->isValidSerialization( $serialization );
38
	}
39
40 20
	private function isValidSerialization( $serialization ) {
41 20
		return is_array( $serialization ) && array_key_exists( 'snaks', $serialization );
42
	}
43
44
	/**
45
	 * @see Deserializer::deserialize
46
	 *
47
	 * @param array $serialization
48
	 *
49
	 * @throws DeserializationException
50
	 * @return Reference
51
	 */
52 17
	public function deserialize( $serialization ) {
53 17
		if ( !$this->isValidSerialization( $serialization ) ) {
54 3
			throw new DeserializationException( 'The serialization is invalid' );
55
		}
56
57 14
		return $this->getDeserialized( $serialization );
58
	}
59
60
	/**
61
	 * @param array $serialization
62
	 *
63
	 * @return Reference
64
	 */
65 14
	private function getDeserialized( array $serialization ) {
66 14
		return new Reference(
67 14
			$this->deserializeSnaks( $serialization )
68
		);
69
	}
70
71
	/**
72
	 * @param array $serialization
73
	 *
74
	 * @return SnakList
75
	 */
76 14
	private function deserializeSnaks( array $serialization ) {
77 14
		$snaks = $this->snaksDeserializer->deserialize( $serialization['snaks'] );
78
79 14
		if ( array_key_exists( 'snaks-order', $serialization ) ) {
80 10
			$this->assertSnaksOrderIsArray( $serialization );
81
82 9
			$snaks->orderByProperty( $serialization['snaks-order'] );
83
		}
84
85 13
		return $snaks;
86
	}
87
88 10
	private function assertSnaksOrderIsArray( array $serialization ) {
89 10
		if ( !is_array( $serialization['snaks-order'] ) ) {
90 1
			throw new InvalidAttributeException(
91 1
				'snaks-order',
92 1
				$serialization['snaks-order'],
93 1
				"snaks-order attribute is not a valid array"
94
			);
95
		}
96 9
	}
97
98
}
99