Completed
Push — master ( 1143d9...c006ff )
by
unknown
04:01 queued 10s
created

ConstraintReportFactory::getConstraintParameterMap()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 26
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 26
rs 8.8571
cc 2
eloc 22
nc 2
nop 0
1
<?php
2
3
namespace WikibaseQuality\ConstraintReport;
4
5
use Config;
6
use IBufferingStatsdDataFactory;
7
use MediaWiki\Logger\LoggerFactory;
8
use MediaWiki\MediaWikiServices;
9
use TitleParser;
10
use Wikibase\DataModel\Entity\EntityIdParser;
11
use Wikibase\DataModel\Services\Lookup\EntityLookup;
12
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
13
use Wikibase\Lib\Units\UnitConverter;
14
use Wikibase\Rdf\RdfVocabulary;
15
use Wikibase\Repo\WikibaseRepo;
16
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\EntityTypeChecker;
17
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\IntegerChecker;
18
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\NoBoundsChecker;
19
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\AllowedUnitsChecker;
20
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\NoneOfChecker;
21
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ReferenceChecker;
22
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SingleBestValueChecker;
23
use WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
24
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConstraintParameterParser;
25
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\CommonsLinkChecker;
26
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\FormatChecker;
27
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\OneOfChecker;
28
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifierChecker;
29
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\RangeChecker;
30
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TypeChecker;
31
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ConflictsWithChecker;
32
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifiersChecker;
33
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TargetRequiredClaimChecker;
34
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ItemChecker;
35
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MandatoryQualifiersChecker;
36
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueTypeChecker;
37
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SymmetricChecker;
38
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\InverseChecker;
39
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\DiffWithinRangeChecker;
40
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SingleValueChecker;
41
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MultiValueChecker;
42
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\UniqueValueChecker;
43
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueOnlyChecker;
44
use WikibaseQuality\ConstraintReport\ConstraintCheck\ConstraintChecker;
45
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
46
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\LoggingHelper;
47
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
48
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\SparqlHelper;
49
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
50
use Wikibase\DataModel\Services\Statement\StatementGuidParser;
51
use WikibaseQuality\ConstraintReport\ConstraintCheck\Message\ViolationMessageDeserializer;
52
use WikibaseQuality\ConstraintReport\ConstraintCheck\Message\ViolationMessageSerializer;
53
54
/**
55
 * Factory for {@link DelegatingConstraintChecker}
56
 * and {@link ConstraintRepository}.
57
 *
58
 * @license GPL-2.0-or-later
59
 */
60
class ConstraintReportFactory {
61
62
	/**
63
	 * @var ConstraintRepository|null
64
	 */
65
	private $constraintRepository;
66
67
	/**
68
	 * @var ConstraintChecker[]|null
69
	 */
70
	private $constraintCheckerMap;
71
72
	/**
73
	 * @var DelegatingConstraintChecker|null
74
	 */
75
	private $delegatingConstraintChecker;
76
77
	/**
78
	 * @var EntityLookup
79
	 */
80
	private $lookup;
81
82
	/**
83
	 * @var PropertyDataTypeLookup
84
	 */
85
	private $propertyDataTypeLookup;
86
87
	/**
88
	 * @var StatementGuidParser
89
	 */
90
	private $statementGuidParser;
91
92
	/**
93
	 * @var Config
94
	 */
95
	private $config;
96
97
	/**
98
	 * @var ConstraintParameterParser
99
	 */
100
	private $constraintParameterParser;
101
102
	/**
103
	 * @var ViolationMessageSerializer
104
	 */
105
	private $violationMessageSerializer;
106
107
	/**
108
	 * @var ViolationMessageDeserializer
109
	 */
110
	private $violationMessageDeserializer;
111
112
	/**
113
	 * @var RdfVocabulary
114
	 */
115
	private $rdfVocabulary;
116
117
	/**
118
	 * @var EntityIdParser
119
	 */
120
	private $entityIdParser;
121
122
	/**
123
	 * @var TitleParser
124
	 */
125
	private $titleParser;
126
127
	/**
128
	 * @var UnitConverter|null
129
	 */
130
	private $unitConverter;
131
132
	/**
133
	 * @var IBufferingStatsdDataFactory
134
	 */
135
	private $dataFactory;
136
137
	/**
138
	 * Returns the default instance.
139
	 * IMPORTANT: Use only when it is not feasible to inject an instance properly.
140
	 *
141
	 * @return self
142
	 */
143
	public static function getDefaultInstance() {
144
		static $instance = null;
145
146
		if ( $instance === null ) {
147
			$wikibaseRepo = WikibaseRepo::getDefaultInstance();
148
			$config = MediaWikiServices::getInstance()->getMainConfig();
149
			$titleParser = MediaWikiServices::getInstance()->getTitleParser();
150
			$violationMessageDeserializer = new ViolationMessageDeserializer(
151
				$wikibaseRepo->getEntityIdParser(),
152
				$wikibaseRepo->getDataValueFactory()
153
			);
154
			$instance = new self(
155
				$wikibaseRepo->getEntityLookup(),
156
				$wikibaseRepo->getPropertyDataTypeLookup(),
157
				$wikibaseRepo->getStatementGuidParser(),
158
				$config,
159
				new ConstraintParameterParser(
160
					$config,
161
					$wikibaseRepo->getBaseDataModelDeserializerFactory(),
162
					$wikibaseRepo->getConceptBaseUris()
163
				),
164
				new ViolationMessageSerializer(),
165
				$violationMessageDeserializer,
166
				$wikibaseRepo->getRdfVocabulary(),
167
				$wikibaseRepo->getEntityIdParser(),
168
				$titleParser,
169
				$wikibaseRepo->getUnitConverter(),
170
				MediaWikiServices::getInstance()->getStatsdDataFactory()
171
			);
172
		}
173
174
		return $instance;
175
	}
176
177
	public function __construct(
178
		EntityLookup $lookup,
179
		PropertyDataTypeLookup $propertyDataTypeLookup,
180
		StatementGuidParser $statementGuidParser,
181
		Config $config,
182
		ConstraintParameterParser $constraintParameterParser,
183
		ViolationMessageSerializer $violationMessageSerializer,
184
		ViolationMessageDeserializer $violationMessageDeserializer,
185
		RdfVocabulary $rdfVocabulary,
186
		EntityIdParser $entityIdParser,
187
		TitleParser $titleParser,
188
		UnitConverter $unitConverter = null,
189
		IBufferingStatsdDataFactory $dataFactory
190
	) {
191
		$this->lookup = $lookup;
192
		$this->propertyDataTypeLookup = $propertyDataTypeLookup;
193
		$this->statementGuidParser = $statementGuidParser;
194
		$this->config = $config;
195
		$this->constraintParameterParser = $constraintParameterParser;
196
		$this->violationMessageSerializer = $violationMessageSerializer;
197
		$this->violationMessageDeserializer = $violationMessageDeserializer;
198
		$this->rdfVocabulary = $rdfVocabulary;
199
		$this->entityIdParser = $entityIdParser;
200
		$this->titleParser = $titleParser;
201
		$this->unitConverter = $unitConverter;
202
		$this->dataFactory = $dataFactory;
203
	}
204
205
	/**
206
	 * @return DelegatingConstraintChecker
207
	 */
208
	public function getConstraintChecker() {
209
		if ( $this->delegatingConstraintChecker === null ) {
210
			$this->delegatingConstraintChecker = new DelegatingConstraintChecker(
211
				$this->lookup,
212
				$this->getConstraintCheckerMap(),
213
				new CachingConstraintLookup( $this->getConstraintRepository() ),
214
				$this->constraintParameterParser,
215
				$this->statementGuidParser,
216
				new LoggingHelper(
217
					$this->dataFactory,
218
					LoggerFactory::getInstance( 'WikibaseQualityConstraints' ),
219
					$this->config
220
				),
221
				$this->config->get( 'WBQualityConstraintsCheckQualifiers' ),
222
				$this->config->get( 'WBQualityConstraintsCheckReferences' ),
223
				$this->config->get( 'WBQualityConstraintsPropertiesWithViolatingQualifiers' )
224
			);
225
		}
226
227
		return $this->delegatingConstraintChecker;
228
	}
229
230
	/**
231
	 * @return ConstraintChecker[]
232
	 */
233
	private function getConstraintCheckerMap() {
234
		if ( $this->constraintCheckerMap === null ) {
235
			$connectionCheckerHelper = new ConnectionCheckerHelper();
236
			$rangeCheckerHelper = new RangeCheckerHelper( $this->config, $this->unitConverter );
237
			if ( $this->config->get( 'WBQualityConstraintsSparqlEndpoint' ) !== '' ) {
238
				$sparqlHelper = new SparqlHelper(
239
					$this->config,
240
					$this->rdfVocabulary,
241
					$this->entityIdParser,
242
					$this->propertyDataTypeLookup,
243
					MediaWikiServices::getInstance()->getMainWANObjectCache(),
244
					$this->violationMessageSerializer,
245
					$this->violationMessageDeserializer,
246
					$this->dataFactory
247
				);
248
			} else {
249
				$sparqlHelper = null;
250
			}
251
			$typeCheckerHelper = new TypeCheckerHelper(
252
				$this->lookup,
253
				$this->config,
254
				$sparqlHelper,
255
				$this->dataFactory
256
			);
257
258
			$this->constraintCheckerMap = [
259
				$this->config->get( 'WBQualityConstraintsConflictsWithConstraintId' )
260
					=> new ConflictsWithChecker(
261
						$this->lookup,
262
						$this->constraintParameterParser,
263
						$connectionCheckerHelper
264
					),
265
				$this->config->get( 'WBQualityConstraintsItemRequiresClaimConstraintId' )
266
					=> new ItemChecker(
267
						$this->lookup,
268
						$this->constraintParameterParser,
269
						$connectionCheckerHelper
270
					),
271
				$this->config->get( 'WBQualityConstraintsValueRequiresClaimConstraintId' )
272
					=> new TargetRequiredClaimChecker(
273
						$this->lookup,
274
						$this->constraintParameterParser,
275
						$connectionCheckerHelper
276
					),
277
				$this->config->get( 'WBQualityConstraintsSymmetricConstraintId' )
278
					=> new SymmetricChecker(
279
						$this->lookup,
280
						$connectionCheckerHelper
281
					),
282
				$this->config->get( 'WBQualityConstraintsInverseConstraintId' )
283
					=> new InverseChecker(
284
						$this->lookup,
285
						$this->constraintParameterParser,
286
						$connectionCheckerHelper
287
					),
288
				$this->config->get( 'WBQualityConstraintsUsedAsQualifierConstraintId' )
289
					=> new QualifierChecker(),
290
				$this->config->get( 'WBQualityConstraintsAllowedQualifiersConstraintId' )
291
					=> new QualifiersChecker(
292
						$this->constraintParameterParser
293
					),
294
				$this->config->get( 'WBQualityConstraintsMandatoryQualifierConstraintId' )
295
					=> new MandatoryQualifiersChecker(
296
						$this->constraintParameterParser
297
					),
298
				$this->config->get( 'WBQualityConstraintsRangeConstraintId' )
299
					=> new RangeChecker(
300
						$this->propertyDataTypeLookup,
301
						$this->constraintParameterParser,
302
						$rangeCheckerHelper
303
					),
304
				$this->config->get( 'WBQualityConstraintsDifferenceWithinRangeConstraintId' )
305
					=> new DiffWithinRangeChecker(
306
						$this->constraintParameterParser,
307
						$rangeCheckerHelper,
308
						$this->config
309
					),
310
				$this->config->get( 'WBQualityConstraintsTypeConstraintId' )
311
					=> new TypeChecker(
312
						$this->lookup,
313
						$this->constraintParameterParser,
314
						$typeCheckerHelper,
315
						$this->config
316
					),
317
				$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' )
318
					=> new ValueTypeChecker(
319
						$this->lookup,
320
						$this->constraintParameterParser,
321
						$typeCheckerHelper,
322
						$this->config
323
					),
324
				$this->config->get( 'WBQualityConstraintsSingleValueConstraintId' )
325
					=> new SingleValueChecker( $this->constraintParameterParser ),
326
				$this->config->get( 'WBQualityConstraintsMultiValueConstraintId' )
327
					=> new MultiValueChecker( $this->constraintParameterParser ),
328
				$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' )
329
					=> new UniqueValueChecker(
330
						$sparqlHelper
331
					),
332
				$this->config->get( 'WBQualityConstraintsFormatConstraintId' )
333
					=> new FormatChecker(
334
						$this->constraintParameterParser,
335
						$this->config,
336
						$sparqlHelper
337
					),
338
				$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' )
339
					=> new CommonsLinkChecker(
340
						$this->constraintParameterParser,
341
						$this->titleParser
342
					),
343
				$this->config->get( 'WBQualityConstraintsOneOfConstraintId' )
344
					=> new OneOfChecker(
345
						$this->constraintParameterParser
346
					),
347
				$this->config->get( 'WBQualityConstraintsUsedForValuesOnlyConstraintId' )
348
					=> new ValueOnlyChecker(),
349
				$this->config->get( 'WBQualityConstraintsUsedAsReferenceConstraintId' )
350
					=> new ReferenceChecker(),
351
				$this->config->get( 'WBQualityConstraintsNoBoundsConstraintId' )
352
					=> new NoBoundsChecker(),
353
				$this->config->get( 'WBQualityConstraintsAllowedUnitsConstraintId' )
354
					=> new AllowedUnitsChecker(
355
						$this->constraintParameterParser,
356
						$this->unitConverter
357
					),
358
				$this->config->get( 'WBQualityConstraintsSingleBestValueConstraintId' )
359
					=> new SingleBestValueChecker( $this->constraintParameterParser ),
360
				$this->config->get( 'WBQualityConstraintsAllowedEntityTypesConstraintId' )
361
					=> new EntityTypeChecker(
362
						$this->constraintParameterParser
363
					),
364
				$this->config->get( 'WBQualityConstraintsNoneOfConstraintId' )
365
					=> new NoneOfChecker(
366
						$this->constraintParameterParser
367
					),
368
				$this->config->get( 'WBQualityConstraintsIntegerConstraintId' )
369
					=> new IntegerChecker(),
370
			];
371
		}
372
373
		return $this->constraintCheckerMap;
374
	}
375
376
	/**
377
	 * @return ConstraintRepository
378
	 */
379
	public function getConstraintRepository() {
380
		if ( $this->constraintRepository === null ) {
381
			$this->constraintRepository = new ConstraintRepository();
382
		}
383
384
		return $this->constraintRepository;
385
	}
386
387
}
388