Completed
Push — meaningfulInterfaces ( 00ef73 )
by no
02:51
created

AliasGroupListDeserializer::assertNotAttribute()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 9
rs 9.6666
cc 2
eloc 6
nc 2
nop 2
1
<?php
2
3
namespace Wikibase\DataModel\Deserializers\Internal;
4
5
use Deserializers\Exceptions\DeserializationException;
6
use Deserializers\Exceptions\InvalidAttributeException;
7
use Deserializers\Exceptions\MissingAttributeException;
8
use Wikibase\DataModel\Deserializers\AliasGroupListDeserializer as AliasGroupListDeserializerInterface;
9
use Wikibase\DataModel\Term\AliasGroup;
10
use Wikibase\DataModel\Term\AliasGroupList;
11
12
/**
13
 * Package private
14
 *
15
 * @licence GNU GPL v2+
16
 * @author Addshore
17
 * @author Bene* < [email protected] >
18
 */
19
class AliasGroupListDeserializer implements AliasGroupListDeserializerInterface {
20
21
	/**
22
	 * @see \Wikibase\DataModel\Deserializers\AliasGroupListDeserializer::deserialize
23
	 *
24
	 * @param array[] $serialization
25
	 *
26
	 * @throws DeserializationException
27
	 * @return AliasGroupList
28
	 */
29
	public function deserialize( array $serialization ) {
30
		$this->assertCanDeserialize( $serialization );
31
		return $this->getDeserialized( $serialization );
32
	}
33
34
	/**
35
	 * @param array[] $serialization
36
	 *
37
	 * @return AliasGroupList
38
	 */
39
	private function getDeserialized( array $serialization ) {
40
		$aliasGroupList = new AliasGroupList();
41
42
		foreach ( $serialization as $languageCode => $aliasGroupSerialization ) {
43
			$aliasGroupList->setGroup( $this->deserializeAliasGroup( $aliasGroupSerialization, $languageCode ) );
44
		}
45
46
		return $aliasGroupList;
47
	}
48
49
	/**
50
	 * @param array $serialization
51
	 * @param string $languageCode
52
	 *
53
	 * @return AliasGroup
54
	 */
55
	private function deserializeAliasGroup( array $serialization, $languageCode ) {
56
		$aliases = array();
57
58
		foreach ( $serialization as $aliasSerialization ) {
59
			$aliases[] = $aliasSerialization['value'];
60
		}
61
62
		return new AliasGroup(
63
			$languageCode,
64
			$aliases
65
		);
66
	}
67
68
	/**
69
	 * @param array[] $serialization
70
	 *
71
	 * @throws DeserializationException
72
	 */
73
	private function assertCanDeserialize( array $serialization ) {
74
		foreach ( $serialization as $requestedLanguage => $valueSerialization ) {
75
			$this->assertAttributeIsArray( $serialization, $requestedLanguage );
76
77
			foreach ( $valueSerialization as $aliasSerialization ) {
78
				$this->assertIsValidAliasSerialization( $aliasSerialization, $requestedLanguage );
79
			}
80
		}
81
	}
82
83
	private function assertIsValidAliasSerialization( $serialization, $requestedLanguage ) {
84
		if ( !is_array( $serialization ) ) {
85
			throw new DeserializationException( 'Term serializations must be arrays' );
86
		}
87
88
		$this->requireAttribute( $serialization, 'language' );
89
		$this->requireAttribute( $serialization, 'value' );
90
		// Do not deserialize alias group fallbacks
91
		$this->assertNotAttribute( $serialization, 'source' );
92
93
		$this->assertAttributeInternalType( $serialization, 'language', 'string' );
94
		$this->assertAttributeInternalType( $serialization, 'value', 'string' );
95
		$this->assertRequestedAndActualLanguageMatch( $serialization, $requestedLanguage );
96
	}
97
98
	private function requireAttribute( array $array, $attributeName ) {
99
		if ( !array_key_exists( $attributeName, $array ) ) {
100
			throw new MissingAttributeException(
101
				$attributeName
102
			);
103
		}
104
	}
105
106
	private function assertNotAttribute( array $array, $key ) {
107
		if ( array_key_exists( $key, $array ) ) {
108
			throw new InvalidAttributeException(
109
				$key,
110
				$array[$key],
111
				'Deserialization of attribute ' . $key . ' not supported.'
112
			);
113
		}
114
	}
115
116
	private function assertRequestedAndActualLanguageMatch(
117
		array $serialization,
118
		$requestedLanguage
119
	) {
120
		if ( $serialization['language'] !== $requestedLanguage ) {
121
			throw new DeserializationException(
122
				'Deserialization of a value of the attribute language (actual)'
123
					. ' that is not matching the language key (requested) is not supported: '
124
					. $serialization['language'] . ' !== ' . $requestedLanguage
125
			);
126
		}
127
	}
128
129
	private function assertAttributeIsArray( array $array, $attributeName ) {
130
		$this->assertAttributeInternalType( $array, $attributeName, 'array' );
131
	}
132
133
	private function assertAttributeInternalType( array $array, $attributeName, $internalType ) {
134
		if ( gettype( $array[$attributeName] ) !== $internalType ) {
135
			throw new InvalidAttributeException(
136
				$attributeName,
137
				$array[$attributeName],
138
				"The internal type of attribute '$attributeName' needs to be '$internalType'"
139
			);
140
		}
141
	}
142
143
}
144