Completed
Push — master ( 7d7b0c...47c96c )
by Leszek
39s
created

ReferenceDeserializer::assertCanDeserialize()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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