summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Deserializers/DVDescriptionDeserializerRegistry.php
blob: 8927334bded64b67f61d46c7c8e31b65cb0269de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php

namespace SMW\Deserializers;

use SMW\Deserializers\DVDescriptionDeserializer\DescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\DispatchingDescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\MonolingualTextValueDescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\NumberValueDescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\RecordValueDescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\SomeValueDescriptionDeserializer;
use SMW\Deserializers\DVDescriptionDeserializer\TimeValueDescriptionDeserializer;
use SMWDataValue as DataValue;

/**
 * @license GNU GPL v2+
 * @since 2.3
 *
 * @author mwjames
 */
class DVDescriptionDeserializerRegistry {

	/**
	 * @var DVDescriptionDeserializerRegistry
	 */
	private static $instance = null;

	/**
	 * @var DispatchingDescriptionDeserializer
	 */
	private $dispatchingDescriptionDeserializer = null;

	/**
	 * @since 2.3
	 *
	 * @param DispatchingDescriptionDeserializer|null $dispatchingDescriptionDeserializer
	 */
	public function __construct( DispatchingDescriptionDeserializer $dispatchingDescriptionDeserializer = null ) {
		$this->dispatchingDescriptionDeserializer = $dispatchingDescriptionDeserializer;
	}

	/**
	 * @since 2.3
	 *
	 * @return self
	 */
	public static function getInstance() {

		if ( self::$instance === null ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * @since 2.3
	 */
	public static function clear() {
		self::$instance = null;
	}

	/**
	 * @note This allows extensions to inject their own DescriptionDeserializer
	 * without further violating SRP of the DataType or DataValue.
	 *
	 * @since 2.3
	 *
	 * @param DescriptionDeserializer $descriptionDeserializer
	 */
	public function registerDescriptionDeserializer( DescriptionDeserializer $descriptionDeserializer ) {

		if ( $this->dispatchingDescriptionDeserializer === null ) {
			$this->dispatchingDescriptionDeserializer = $this->newDispatchingDescriptionDeserializer();
		}

		$this->dispatchingDescriptionDeserializer->addDescriptionDeserializer( $descriptionDeserializer );
	}

	/**
	 * @since 2.3
	 *
	 * @param DataValue $dataValue
	 *
	 * @return DescriptionDeserializer
	 */
	public function getDescriptionDeserializerBy( DataValue $dataValue ) {

		if ( $this->dispatchingDescriptionDeserializer === null ) {
			$this->dispatchingDescriptionDeserializer = $this->newDispatchingDescriptionDeserializer();
		}

		return $this->dispatchingDescriptionDeserializer->getDescriptionDeserializerBy( $dataValue );
	}

	private function newDispatchingDescriptionDeserializer() {

		$dispatchingDescriptionDeserializer = new DispatchingDescriptionDeserializer();
		$dispatchingDescriptionDeserializer->addDescriptionDeserializer( new TimeValueDescriptionDeserializer() );
		$dispatchingDescriptionDeserializer->addDescriptionDeserializer( new NumberValueDescriptionDeserializer() );
		$dispatchingDescriptionDeserializer->addDescriptionDeserializer( new RecordValueDescriptionDeserializer() );
		$dispatchingDescriptionDeserializer->addDescriptionDeserializer( new MonolingualTextValueDescriptionDeserializer() );

		$dispatchingDescriptionDeserializer->addDefaultDescriptionDeserializer( new SomeValueDescriptionDeserializer() );

		return $dispatchingDescriptionDeserializer;
	}

}