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