Completed
Pull Request — master (#188)
by Bene
03:46 queued 01:21
created

SerializerFactory::newItemSerializer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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