Jeroen De Dauw has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/138821

Change subject: Use new serializers for entity serialization
......................................................................

Use new serializers for entity serialization

Change-Id: I2c6f873dd85480aece28c2bd38d33d21ed51e589
---
M composer.json
M repo/Wikibase.hooks.php
M repo/includes/WikibaseRepo.php
M repo/includes/content/EntityHandler.php
M repo/includes/content/ItemHandler.php
M repo/includes/content/PropertyHandler.php
6 files changed, 103 insertions(+), 25 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/21/138821/1

diff --git a/composer.json b/composer.json
index 09cc2d8..aaee71a 100644
--- a/composer.json
+++ b/composer.json
@@ -36,6 +36,8 @@
                "data-values/value-view": "~0.6.1",
 
                "wikibase/data-model": "~0.8.1",
+               "wikibase/internal-serialization": "~1.0",
+
                "diff/diff": "~1.0",
                "wikibase/easyrdf_lite": "~0.8.1"
        },
diff --git a/repo/Wikibase.hooks.php b/repo/Wikibase.hooks.php
index 4c5274e..5621807 100644
--- a/repo/Wikibase.hooks.php
+++ b/repo/Wikibase.hooks.php
@@ -1225,6 +1225,8 @@
         * @return bool
         */
        public static function onContentHandlerForModelID( $modelId, &$handler 
) {
+               // FIXME: this code needs to be moved out. Construction should 
happen elsewhere and
+               // a mechanism for registering additional entity types needs to 
be put in place.
                switch ( $modelId ) {
                        case CONTENT_MODEL_WIKIBASE_ITEM:
                                $handler = self::newItemHandler();
@@ -1246,8 +1248,18 @@
                $entityPerPage = $repo->getStore()->newEntityPerPage();
                $termIndex = $repo->getStore()->getTermIndex();
                $siteLinkStore = $repo->getStore()->newSiteLinkCache();
+               $entitySerializer = 
$repo->newInternalSerializerFactory()->newEntitySerializer();
+               $entityDeserializer = 
$repo->newInternalDeserializerFactory()->newEntityDeserializer();
 
-               return new ItemHandler( $entityPerPage, $termIndex, $codec, 
array( $validator ), $siteLinkStore );
+               return new ItemHandler(
+                       $entityPerPage,
+                       $termIndex,
+                       $codec,
+                       array( $validator ),
+                       $siteLinkStore,
+                       $entitySerializer,
+                       $entityDeserializer
+               );
        }
 
        private static function newPropertyHandler() {
@@ -1257,8 +1269,18 @@
                $entityPerPage = $repo->getStore()->newEntityPerPage();
                $termIndex = $repo->getStore()->getTermIndex();
                $propertyInfoStore = $repo->getStore()->getPropertyInfoStore();
+               $entitySerializer = 
$repo->newInternalSerializerFactory()->newEntitySerializer();
+               $entityDeserializer = 
$repo->newInternalDeserializerFactory()->newEntityDeserializer();
 
-               return new PropertyHandler( $entityPerPage, $termIndex, $codec, 
array( $validator ), $propertyInfoStore );
+               return new PropertyHandler(
+                       $entityPerPage,
+                       $termIndex,
+                       $codec,
+                       array( $validator ),
+                       $propertyInfoStore,
+                       $entitySerializer,
+                       $entityDeserializer
+               );
        }
 
        /**
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index dc670fd..fbcea4b 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -4,6 +4,8 @@
 
 use DataTypes\DataTypeFactory;
 use DataValues\DataValueFactory;
+use DataValues\Deserializers\DataValueDeserializer;
+use DataValues\Serializers\DataValueSerializer;
 use SiteSQLStore;
 use SiteStore;
 use ValueFormatters\FormatterOptions;
@@ -17,6 +19,8 @@
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\Property;
 use Wikibase\EntityContentFactory;
+use Wikibase\InternalSerialization\DeserializerFactory;
+use Wikibase\InternalSerialization\SerializerFactory;
 use Wikibase\Lib\Store\EntityLookup;
 use Wikibase\EntityFactory;
 use Wikibase\LabelDescriptionDuplicateDetector;
@@ -731,4 +735,16 @@
        public function getEntityContentDataCodec() {
                return new EntityContentDataCodec();
        }
+
+       public function newInternalDeserializerFactory() {
+               return new DeserializerFactory(
+                       new DataValueDeserializer( $GLOBALS['evilDataValueMap'] 
),
+                       $this->getEntityIdParser()
+               );
+       }
+
+       public function newInternalSerializerFactory() {
+               return new SerializerFactory( new DataValueSerializer() );
+       }
+
 }
diff --git a/repo/includes/content/EntityHandler.php 
b/repo/includes/content/EntityHandler.php
index 532751d..7ad310f 100644
--- a/repo/includes/content/EntityHandler.php
+++ b/repo/includes/content/EntityHandler.php
@@ -5,6 +5,8 @@
 use Content;
 use ContentHandler;
 use DataUpdate;
+use Deserializers\Deserializer;
+use Deserializers\Exceptions\DeserializationException;
 use IContextSource;
 use InvalidArgumentException;
 use Language;
@@ -12,6 +14,8 @@
 use ParserOptions;
 use RequestContext;
 use Revision;
+use Serializers\Exceptions\SerializationException;
+use Serializers\Serializer;
 use Title;
 use User;
 use Wikibase\DataModel\Entity\BasicEntityIdParser;
@@ -51,18 +55,32 @@
        private $termIndex;
 
        /**
+        * @var Serializer
+        */
+       private $entitySerializer;
+
+       /**
+        * @var Deserializer
+        */
+       private $entityDeserializer;
+
+       /**
         * @param string $modelId
         * @param EntityPerPage $entityPerPage
         * @param TermIndex $termIndex
         * @param EntityContentDataCodec $contentCodec
         * @param EntityValidator[] $preSaveValidators
+        * @param Serializer $entitySerializer
+        * @param Deserializer $entityDeserializer
         */
        public function __construct(
                $modelId,
                EntityPerPage $entityPerPage,
                TermIndex $termIndex,
                EntityContentDataCodec $contentCodec,
-               array $preSaveValidators
+               array $preSaveValidators,
+               Serializer $entitySerializer,
+               Deserializer $entityDeserializer
        ) {
                $formats = $contentCodec->getSupportedFormats();
 
@@ -72,6 +90,8 @@
                $this->preSaveValidators = $preSaveValidators;
                $this->entityPerPage = $entityPerPage;
                $this->termIndex = $termIndex;
+               $this->entitySerializer = $entitySerializer;
+               $this->entityDeserializer = $entityDeserializer;
        }
 
        /**
@@ -195,14 +215,21 @@
         * @param string|null $format
         *
         * @throws InvalidArgumentException
+        * @throws MWContentSerializationException
         * @return string
         */
        public function serializeContent( Content $content, $format = null ) {
                if ( ! $content instanceof EntityContent ) {
-                       throw new \InvalidArgumentException( '$content mist be 
an instance of EntityContent' );
+                       throw new \InvalidArgumentException( '$content must be 
an instance of EntityContent' );
                }
 
-               $data = $content->getEntity()->toArray();
+               try {
+                       $data = $this->entitySerializer->serialize( 
$content->getEntity() );
+               }
+               catch ( SerializationException $ex ) {
+                       throw new MWContentSerializationException( 
$ex->getMessage(), 0, $ex );
+               }
+
                return $this->contentCodec->encodeEntityContentData( $data, 
$format );
        }
 
@@ -214,14 +241,22 @@
         * @param string $blob
         * @param null|string $format
         *
-        * @throws \MWContentSerializationException
+        * @throws MWContentSerializationException
         * @return EntityContent
         */
        public function unserializeContent( $blob, $format = null ) {
                $data = $this->contentCodec->decodeEntityContentData( $blob, 
$format );
 
-               $entityContent = $this->newContentFromArray( $data );
-               return $entityContent;
+               try {
+                       $entity = $this->entityDeserializer->deserialize( $data 
);
+               }
+               catch ( DeserializationException $ex ) {
+                       throw new MWContentSerializationException( 
$ex->getMessage(), 0, $ex );
+               }
+
+               // TODO: use an EntityContent Deserializer
+               $contentClass = $this->getContentClass();
+               return new $contentClass( $entity );
        }
 
        /**
@@ -260,19 +295,6 @@
                //FIXME: inject an EntityTitleLookup!
                $title = Title::makeTitle( $this->getEntityNamespace(), 
$id->getSerialization() );
                return $title;
-       }
-
-       /**
-        * Calls the static function newFromArray() on the content class,
-        * to create a new EntityContent object based on the array data.
-        *
-        * @param array $data
-        *
-        * @return EntityContent
-        */
-       protected function newContentFromArray( array $data ) {
-               $contentClass = $this->getContentClass();
-               return $contentClass::newFromArray( $data );
        }
 
        /**
diff --git a/repo/includes/content/ItemHandler.php 
b/repo/includes/content/ItemHandler.php
index 149179d..8993820 100644
--- a/repo/includes/content/ItemHandler.php
+++ b/repo/includes/content/ItemHandler.php
@@ -3,6 +3,8 @@
 namespace Wikibase;
 
 use DataUpdate;
+use Deserializers\Deserializer;
+use Serializers\Serializer;
 use Title;
 use Wikibase\Lib\Store\EntityContentDataCodec;
 use Wikibase\Lib\Store\SiteLinkCache;
@@ -41,20 +43,26 @@
         * @param EntityContentDataCodec $contentCodec
         * @param EntityValidator[] $preSaveValidators
         * @param SiteLinkCache $siteLinkStore
+        * @param Serializer $entitySerializer
+        * @param Deserializer $entityDeserializer
         */
        public function __construct(
                EntityPerPage $entityPerPage,
                TermIndex $termIndex,
                EntityContentDataCodec $contentCodec,
                array $preSaveValidators,
-               SiteLinkCache $siteLinkStore
+               SiteLinkCache $siteLinkStore,
+               Serializer $entitySerializer,
+               Deserializer $entityDeserializer
        ) {
                parent::__construct(
                        CONTENT_MODEL_WIKIBASE_ITEM,
                        $entityPerPage,
                        $termIndex,
                        $contentCodec,
-                       $preSaveValidators
+                       $preSaveValidators,
+                       $entitySerializer,
+                       $entityDeserializer
                );
 
                $this->siteLinkStore = $siteLinkStore;
diff --git a/repo/includes/content/PropertyHandler.php 
b/repo/includes/content/PropertyHandler.php
index e697721..7c9d44d 100644
--- a/repo/includes/content/PropertyHandler.php
+++ b/repo/includes/content/PropertyHandler.php
@@ -3,6 +3,8 @@
 namespace Wikibase;
 
 use DataUpdate;
+use Deserializers\Deserializer;
+use Serializers\Serializer;
 use Title;
 use Wikibase\Lib\Store\EntityContentDataCodec;
 use Wikibase\Updates\DataUpdateClosure;
@@ -41,20 +43,26 @@
         * @param EntityContentDataCodec $contentCodec
         * @param EntityValidator[] $preSaveValidators
         * @param PropertyInfoStore $infoStore
+        * @param Serializer $entitySerializer
+        * @param Deserializer $entityDeserializer
         */
        public function __construct(
                EntityPerPage $entityPerPage,
                TermIndex $termIndex,
                EntityContentDataCodec $contentCodec,
                $preSaveValidators,
-               PropertyInfoStore $infoStore
+               PropertyInfoStore $infoStore,
+               Serializer $entitySerializer,
+               Deserializer $entityDeserializer
        ) {
                parent::__construct(
                        CONTENT_MODEL_WIKIBASE_PROPERTY,
                        $entityPerPage,
                        $termIndex,
                        $contentCodec,
-                       $preSaveValidators
+                       $preSaveValidators,
+                       $entitySerializer,
+                       $entityDeserializer
                );
 
                $this->infoStore = $infoStore;

-- 
To view, visit https://gerrit.wikimedia.org/r/138821
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2c6f873dd85480aece28c2bd38d33d21ed51e589
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Jeroen De Dauw <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to