Completed
Push — thereIsNoEntity ( ef775f )
by no
07:23
created

SerializerFactory::newEntitySerializer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

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