summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Serializers/SemanticDataSerializer.php
blob: 63085584105a3f3a4dd1a52826cfe273233ad3a7 (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\Serializers;

use OutOfBoundsException;
use Serializers\Serializer;
use SMW\SemanticData;

/**
 * @license GNU GPL v2+
 * @since 1.9
 *
 * @author mwjames
 */
class SemanticDataSerializer implements Serializer {

	/**
	 * @see Serializer::serialize
	 *
	 * @since  1.9
	 */
	public function serialize( $semanticData ) {

		if ( !$semanticData instanceof SemanticData ) {
			throw new OutOfBoundsException( 'Object is not supported' );
		}

		return $this->doSerialize( $semanticData ) + [ 'serializer' => __CLASS__, 'version' => 2 ];
	}

	private function doSerialize( SemanticData $semanticData ) {

		$data = [
			'subject' => $semanticData->getSubject()->getSerialization(),
			'data'    => $this->doSerializeProperty( $semanticData )
		];

		$subobjects = $this->doSerializeSubSemanticData(
			$semanticData->getSubSemanticData()
		);

		if ( $subobjects !== [] ) {
			$data['sobj'] = $subobjects;
		}

		return $data;
	}

	/**
	 * Build property and dataItem serialization record
	 *
	 * @return array
	 */
	private function doSerializeProperty( $semanticData ) {

		$properties = [];

		foreach ( $semanticData->getProperties() as $property ) {
			$properties[] = [
				'property' => $property->getSerialization(),
				'dataitem' => $this->doSerializeDataItem( $semanticData, $property )
			];
		}

		return $properties;
	}

	/**
	 * Returns DataItem serialization
	 *
	 * @note 'type' is added to ensure that during unserialization the type
	 * definition of the requested data is in alignment with the definition found
	 * in the system (type changes that can occur during the time between
	 * serialization and unserialization)
	 *
	 * @return array
	 */
	private function doSerializeDataItem( $semanticData, $property ) {

		$dataItems = [];

		foreach ( $semanticData->getPropertyValues( $property ) as $dataItem ) {
			$dataItems[] = [
				'type' => $dataItem->getDIType(),
				'item' => $dataItem->getSerialization()
			];
		}

		return $dataItems;
	}

	/**
	 * Returns all subobjects of a SemanticData instance
	 *
	 * @return array
	 */
	protected function doSerializeSubSemanticData( $subSemanticData ) {

		$subobjects = [];

		foreach ( $subSemanticData as $semanticData ) {
			$subobjects[] = $this->doSerialize( $semanticData );
		}

		return $subobjects;
	}

}