ReferenceSerializer::isSerializerFor()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Wikibase\DataModel\Serializers;
4
5
use Serializers\DispatchableSerializer;
6
use Serializers\Exceptions\SerializationException;
7
use Serializers\Exceptions\UnsupportedObjectException;
8
use Serializers\Serializer;
9
use Wikibase\DataModel\Reference;
10
use Wikibase\DataModel\Snak\Snak;
11
use Wikibase\DataModel\Snak\SnakList;
12
13
/**
14
 * Package private
15
 *
16
 * @license GPL-2.0-or-later
17
 * @author Thomas Pellissier Tanon
18
 */
19
class ReferenceSerializer implements DispatchableSerializer {
20
21
	/**
22
	 * @var Serializer
23
	 */
24
	private $snaksSerializer;
25
26 41
	public function __construct( Serializer $snaksSerializer ) {
27 41
		$this->snaksSerializer = $snaksSerializer;
28 41
	}
29
30
	/**
31
	 * @see Serializer::isSerializerFor
32
	 *
33
	 * @param mixed $object
34
	 *
35
	 * @return bool
36
	 */
37 16
	public function isSerializerFor( $object ) {
38 16
		return $object instanceof Reference;
39
	}
40
41
	/**
42
	 * @see Serializer::serialize
43
	 *
44
	 * @param Reference $object
45
	 *
46
	 * @throws SerializationException
47
	 * @return array
48
	 */
49 11
	public function serialize( $object ) {
50 11
		if ( !$this->isSerializerFor( $object ) ) {
51 3
			throw new UnsupportedObjectException(
52 3
				$object,
53 3
				'ReferenceSerializer can only serialize Reference objects'
54
			);
55
		}
56
57 8
		return $this->getSerialized( $object );
58
	}
59
60 8
	private function getSerialized( Reference $reference ) {
61
		return [
62 8
			'hash' => $reference->getHash(),
63 8
			'snaks' => $this->snaksSerializer->serialize( $reference->getSnaks() ),
64 8
			'snaks-order' => $this->buildSnakListOrderList( $reference->getSnaks() )
65
		];
66
	}
67
68 8
	private function buildSnakListOrderList( SnakList $snaks ) {
69 8
		$list = [];
70
71
		/**
72
		 * @var Snak $snak
73
		 */
74 8
		foreach ( $snaks as $snak ) {
75 5
			$id = $snak->getPropertyId()->getSerialization();
76 5
			if ( !in_array( $id, $list ) ) {
77 5
				$list[] = $id;
78
			}
79
		}
80
81 8
		return $list;
82
	}
83
84
}
85