summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php78
1 files changed, 78 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php b/www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php
new file mode 100644
index 00000000..bb5906db
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/Deserializers/ExpDataDeserializer.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace SMW\Deserializers;
+
+use Deserializers\Deserializer;
+use OutOfBoundsException;
+use SMW\Exporter\Element\ExpElement;
+use SMWExpData as ExpData;
+
+/**
+ * @license GNU GPL v2+
+ * @since 2.2
+ *
+ * @author mwjames
+ */
+class ExpDataDeserializer implements Deserializer {
+
+ /**
+ * @see Deserializers::deserialize
+ *
+ * @since 2.2
+ *
+ * @return ExpData
+ * @throws OutOfBoundsException
+ */
+ public function deserialize( $serialization ) {
+
+ $expData = null;
+
+ if ( isset( $serialization['version'] ) && $serialization['version'] !== 0.1 ) {
+ throw new OutOfBoundsException( 'Serializer/Deserializer version does not match, please update your data' );
+ }
+
+ if ( isset( $serialization['subject'] ) ) {
+ $expData = $this->newExpData( $serialization['subject'] );
+ }
+
+ if ( !$expData instanceof ExpData ) {
+ throw new OutOfBoundsException( 'ExpData could not be created probably due to an invalid subject' );
+ }
+
+ $this->doDeserialize( $serialization, $expData );
+
+ return $expData;
+ }
+
+ private function newExpData( $subject ) {
+ return new ExpData( ExpElement::newFromSerialization( $subject ) );
+ }
+
+ private function doDeserialize( $serialization, $expData ) {
+
+ foreach ( $serialization['data'] as $data ) {
+
+ $property = ExpElement::newFromSerialization( $data['property'] );
+
+ foreach ( $data['children'] as $child ) {
+ $expData->addPropertyObjectValue(
+ $property,
+ $this->doDeserializeChild( $child )
+ );
+ }
+ }
+ }
+
+ private function doDeserializeChild( $serialization ) {
+
+ if ( !isset( $serialization['subject'] ) ) {
+ return ExpElement::newFromSerialization( $serialization );
+ }
+
+ $element = $this->newExpData( $serialization['subject'] );
+ $this->doDeserialize( $serialization, $element );
+
+ return $element;
+ }
+
+}