Passed
Push — new-entity-serializers ( 00afbd )
by Bene
02:09
created

SerializerFactory::newPropertySerializer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 7
rs 9.4285
cc 1
eloc 5
nc 1
nop 0
1
<?php
2
3
namespace Wikibase\DataModel;
4
5
use InvalidArgumentException;
6
use Serializers\DispatchableSerializer;
7
use Serializers\DispatchingSerializer;
8
use Serializers\Serializer;
9
use Wikibase\DataModel\Serializers\AliasGroupListSerializer;
10
use Wikibase\DataModel\Serializers\AliasGroupSerializer;
11
use Wikibase\DataModel\Serializers\ItemSerializer;
12
use Wikibase\DataModel\Serializers\PropertySerializer;
13
use Wikibase\DataModel\Serializers\ReferenceListSerializer;
14
use Wikibase\DataModel\Serializers\ReferenceSerializer;
15
use Wikibase\DataModel\Serializers\SiteLinkSerializer;
16
use Wikibase\DataModel\Serializers\SnakListSerializer;
17
use Wikibase\DataModel\Serializers\SnakSerializer;
18
use Wikibase\DataModel\Serializers\StatementListSerializer;
19
use Wikibase\DataModel\Serializers\StatementSerializer;
20
use Wikibase\DataModel\Serializers\TermListSerializer;
21
use Wikibase\DataModel\Serializers\TermSerializer;
22
use Wikibase\DataModel\Serializers\TypedSnakSerializer;
23
24
/**
25
 * Factory for constructing Serializer objects that can serialize WikibaseDataModel objects.
26
 *
27
 * @since 0.1
28
 *
29
 * @licence GNU GPL v2+
30
 * @author Thomas Pellissier Tanon
31
 * @author Bene* < [email protected] >
32
 * @author Addshore
33
 */
34
class SerializerFactory {
35
36
	const OPTION_DEFAULT = 0;
37
	/** @since 1.2.0 */
38
	const OPTION_OBJECTS_FOR_MAPS = 1;
39
	/** @since 1.7.0 */
40
	const OPTION_SERIALIZE_MAIN_SNAKS_WITHOUT_HASH = 2;
41
	const OPTION_SERIALIZE_QUALIFIER_SNAKS_WITHOUT_HASH = 4;
42
	const OPTION_SERIALIZE_REFERENCE_SNAKS_WITHOUT_HASH = 8;
43
44
	/**
45
	 * @var int
46
	 */
47
	private $options;
48
49
	/**
50
	 * @var Serializer
51
	 */
52
	private $dataValueSerializer;
53
54
	/**
55
	 * @var DispatchableSerializer[]
56
	 */
57
	private $additionalEntitySerializers;
58
59
	/**
60
	 * @param Serializer $dataValueSerializer serializer for DataValue objects
61
	 * @param int $options set multiple with bitwise or
62
	 * @param DispatchableSerializer[] $additionalEntitySerializers
63
	 *
64
	 * @throws InvalidArgumentException
65
	 */
66
	public function __construct(
67
		Serializer $dataValueSerializer,
68
		$options = 0,
69
		array $additionalEntitySerializers = array()
70
	) {
71
		if ( !is_int( $options ) ) {
72
			throw new InvalidArgumentException( '$options must be an integer' );
73
		}
74
75
		$this->dataValueSerializer = $dataValueSerializer;
76
		$this->options = $options;
77
		$this->additionalEntitySerializers = $additionalEntitySerializers;
78
	}
79
80
	/**
81
	 * @return bool
82
	 */
83
	private function shouldUseObjectsForMaps() {
84
		return (bool)( $this->options & self::OPTION_OBJECTS_FOR_MAPS );
85
	}
86
87
	/**
88
	 * @return bool
89
	 */
90
	private function shouldSerializeMainSnaksWithHash() {
91
		return !(bool)( $this->options & self::OPTION_SERIALIZE_MAIN_SNAKS_WITHOUT_HASH );
92
	}
93
94
	/**
95
	 * @return bool
96
	 */
97
	private function shouldSerializeQualifierSnaksWithHash() {
98
		return !(bool)( $this->options & self::OPTION_SERIALIZE_QUALIFIER_SNAKS_WITHOUT_HASH );
99
	}
100
101
	/**
102
	 * @return bool
103
	 */
104
	private function shouldSerializeReferenceSnaksWithHash() {
105
		return !(bool)( $this->options & self::OPTION_SERIALIZE_REFERENCE_SNAKS_WITHOUT_HASH );
106
	}
107
108
	/**
109
	 * Returns a Serializer that can serialize Entity objects.
110
	 *
111
	 * @return Serializer
112
	 */
113
	public function newEntitySerializer() {
114
		return new DispatchingSerializer(
115
			array_merge(
116
				$this->additionalEntitySerializers,
117
				array(
118
					$this->newItemSerializer(),
119
					$this->newPropertySerializer()
120
				)
121
			)
122
		);
123
	}
124
125
	/**
126
	 * @return DispatchableSerializer
127
	 */
128
	private function newItemSerializer() {
129
		return new ItemSerializer(
130
			$this->newTermListSerializer(),
131
			$this->newAliasGroupListSerializer(),
132
			$this->newStatementListSerializer(),
133
			$this->newSiteLinkSerializer(),
134
			$this->shouldUseObjectsForMaps()
135
		);
136
	}
137
138
	/**
139
	 * @return DispatchableSerializer
140
	 */
141
	private function newPropertySerializer() {
142
		return new PropertySerializer(
143
			$this->newTermListSerializer(),
144
			$this->newAliasGroupListSerializer(),
145
			$this->newStatementListSerializer()
146
		);
147
	}
148
149
	/**
150
	 * Returns a Serializer that can serialize SiteLink objects.
151
	 *
152
	 * @return Serializer
153
	 */
154
	public function newSiteLinkSerializer() {
155
		return new SiteLinkSerializer();
156
	}
157
158
	/**
159
	 * Returns a Serializer that can serialize StatementList objects.
160
	 *
161
	 * @since 1.4
162
	 *
163
	 * @return Serializer
164
	 */
165
	public function newStatementListSerializer() {
166
		return new StatementListSerializer(
167
			$this->newStatementSerializer(),
168
			$this->shouldUseObjectsForMaps()
169
		);
170
	}
171
172
	/**
173
	 * Returns a Serializer that can serialize Statement objects.
174
	 *
175
	 * @since 1.4
176
	 *
177
	 * @return Serializer
178
	 */
179
	public function newStatementSerializer() {
180
		return new StatementSerializer(
181
			$this->newSnakSerializer( $this->shouldSerializeMainSnaksWithHash() ),
182
			$this->newSnakListSerializer( $this->shouldSerializeQualifierSnaksWithHash() ),
183
			$this->newReferencesSerializer()
184
		);
185
	}
186
187
	/**
188
	 * Returns a Serializer that can serialize ReferenceList objects.
189
	 *
190
	 * @return Serializer
191
	 */
192
	public function newReferencesSerializer() {
193
		return new ReferenceListSerializer( $this->newReferenceSerializer() );
194
	}
195
196
	/**
197
	 * Returns a Serializer that can serialize Reference objects.
198
	 *
199
	 * @return Serializer
200
	 */
201
	public function newReferenceSerializer() {
202
		return new ReferenceSerializer(
203
			$this->newSnakListSerializer(
204
				$this->shouldSerializeReferenceSnaksWithHash()
205
			)
206
		);
207
	}
208
209
	/**
210
	 * Returns a Serializer that can serialize SnakList objects.
211
	 *
212
	 * @param bool $serializeSnaksWithHash
213
	 *
214
	 * @since 1.4
215
	 *
216
	 * @return Serializer
217
	 */
218
	public function newSnakListSerializer( $serializeSnaksWithHash = true ) {
219
		return new SnakListSerializer(
220
			$this->newSnakSerializer( $serializeSnaksWithHash ),
221
			$this->shouldUseObjectsForMaps()
222
		);
223
	}
224
225
	/**
226
	 * Returns a Serializer that can serialize Snak objects.
227
	 *
228
	 * @param bool $serializeWithHash
229
	 *
230
	 * @return Serializer
231
	 */
232
	public function newSnakSerializer( $serializeWithHash = true ) {
233
		return new SnakSerializer(
234
			$this->dataValueSerializer,
235
			$serializeWithHash
236
		);
237
	}
238
239
	/**
240
	 * Returns a Serializer that can serialize TypedSnak objects.
241
	 *
242
	 * @param bool $serializeWithHash
243
	 *
244
	 * @since 1.3
245
	 *
246
	 * @return Serializer
247
	 */
248
	public function newTypedSnakSerializer( $serializeWithHash = true ) {
249
		return new TypedSnakSerializer( $this->newSnakSerializer( $serializeWithHash ) );
250
	}
251
252
	/**
253
	 * Returns a Serializer that can serialize Term objects.
254
	 *
255
	 * @since 1.5
256
	 *
257
	 * @return Serializer
258
	 */
259
	public function newTermSerializer() {
260
		return new TermSerializer();
261
	}
262
263
	/**
264
	 * Returns a Serializer that can serialize TermList objects.
265
	 *
266
	 * @since 1.5
267
	 *
268
	 * @return Serializer
269
	 */
270
	public function newTermListSerializer() {
271
		return new TermListSerializer( $this->newTermSerializer(), $this->shouldUseObjectsForMaps() );
272
	}
273
274
	/**
275
	 * Returns a Serializer that can serialize AliasGroup objects.
276
	 *
277
	 * @since 1.6
278
	 *
279
	 * @return Serializer
280
	 */
281
	public function newAliasGroupSerializer() {
282
		return new AliasGroupSerializer();
283
	}
284
285
	/**
286
	 * Returns a Serializer that can serialize AliasGroupList objects.
287
	 *
288
	 * @since 1.5
289
	 *
290
	 * @return Serializer
291
	 */
292
	public function newAliasGroupListSerializer() {
293
		return new AliasGroupListSerializer( $this->newAliasGroupSerializer(), $this->shouldUseObjectsForMaps() );
294
	}
295
296
}
297