jenkins-bot has submitted this change and it was merged.

Change subject: Configure JS deserializers via entitytypes
......................................................................


Configure JS deserializers via entitytypes

Bug: T132558
Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
---
M docs/entitytypes.wiki
M lib/includes/EntityTypeDefinitions.php
A repo/includes/Modules/EntityTypesModuleWorker.php
A repo/includes/Modules/MwConfigModule.php
A repo/includes/Modules/MwConfigModuleWorker.php
M repo/includes/WikibaseRepo.php
M repo/resources/Resources.php
M repo/resources/wikibase.EntityInitializer.js
8 files changed, 183 insertions(+), 6 deletions(-)

Approvals:
  Adrian Heine: Looks good to me, approved
  Thiemo Mättig (WMDE): Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/docs/entitytypes.wiki b/docs/entitytypes.wiki
index 91016d3..7e99793 100644
--- a/docs/entitytypes.wiki
+++ b/docs/entitytypes.wiki
@@ -52,6 +52,9 @@
 : a string representing the id of the content model
 ; content-handler-factory-callback (repo only)
 : a callable that returns an EntityHandler instance supporting this entity type
+; js-deserializer-factory-function (repo only)
+: a string representing a resource loader module that, when `require`d, 
returns a function returning
+  a `wikibase.serialization.Deserializer` instance supporting this entity type
 
 Extensions that wish to register an entity type should use the 
WikibaseRepoEntityTypes respectively
 WikibaseClientEntityTypes hooks to provide additional entity type definitions.
diff --git a/lib/includes/EntityTypeDefinitions.php 
b/lib/includes/EntityTypeDefinitions.php
index c2c44cf..d674200 100644
--- a/lib/includes/EntityTypeDefinitions.php
+++ b/lib/includes/EntityTypeDefinitions.php
@@ -109,4 +109,11 @@
                return $this->getMapForDefinitionField( 
'content-handler-factory-callback' );
        }
 
+       /**
+        * @return string[]
+        */
+       public function getJsDeserializerFactoryFunctions() {
+               return $this->getMapForDefinitionField( 
'js-deserializer-factory-function' );
+       }
+
 }
diff --git a/repo/includes/Modules/EntityTypesModuleWorker.php 
b/repo/includes/Modules/EntityTypesModuleWorker.php
new file mode 100644
index 0000000..a8a3bf1
--- /dev/null
+++ b/repo/includes/Modules/EntityTypesModuleWorker.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+use Wikibase\Lib\EntityTypeDefinitions;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class EntityTypesModuleWorker implements MwConfigModuleWorker {
+
+       /**
+        * @var EntityTypeDefinitions
+        */
+       private $entityTypeDefinitions;
+
+       public function __construct( EntityTypeDefinitions 
$entityTypeDefinitions ) {
+               $this->entityTypeDefinitions = $entityTypeDefinitions;
+       }
+
+       /**
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return mixed
+        */
+       public function getValue( ResourceLoaderContext $context ) {
+               return [
+                       "types" => 
$this->entityTypeDefinitions->getEntityTypes(),
+                       "deserializer-factory-functions" => 
$this->entityTypeDefinitions->getJsDeserializerFactoryFunctions()
+               ];
+       }
+
+}
diff --git a/repo/includes/Modules/MwConfigModule.php 
b/repo/includes/Modules/MwConfigModule.php
new file mode 100644
index 0000000..c5a1898
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModule.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoader;
+use ResourceLoaderContext;
+use ResourceLoaderModule;
+use Xml;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class MwConfigModule extends ResourceLoaderModule {
+
+       /**
+        * @var string
+        */
+       private $configName;
+
+       /**
+        * @var callable
+        */
+       private $getWorker;
+
+       public function __construct( $info ) {
+               $this->getWorker = $info['getworker'];
+               $this->configName = $info['name'];
+       }
+
+       /**
+        * @see ResourceLoaderModule::getScript
+        *
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return string
+        */
+       public function getScript( ResourceLoaderContext $context ) {
+               return Xml::encodeJsCall(
+                       'mediaWiki.config.set',
+                       [
+                               $this->configName,
+                               call_user_func( $this->getWorker )->getValue( 
$context )
+                       ],
+                       ResourceLoader::inDebugMode()
+               );
+       }
+
+       /**
+        * @return bool
+        */
+       public function enableModuleContentVersion() {
+               return true;
+       }
+
+}
diff --git a/repo/includes/Modules/MwConfigModuleWorker.php 
b/repo/includes/Modules/MwConfigModuleWorker.php
new file mode 100644
index 0000000..0ec31f3
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModuleWorker.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+interface MwConfigModuleWorker {
+
+       /**
+        * @since 0.5
+        *
+        * @param ResourceLoaderContext $context
+        *
+        * @return mixed
+        */
+       public function getValue( ResourceLoaderContext $context );
+
+}
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 7b0fe68..677ab8b 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -105,6 +105,7 @@
 use Wikibase\Repo\Localizer\MessageExceptionLocalizer;
 use Wikibase\Repo\Localizer\MessageParameterFormatter;
 use Wikibase\Repo\Localizer\ParseExceptionLocalizer;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
 use Wikibase\Repo\Notifications\ChangeNotifier;
 use Wikibase\Repo\Notifications\ChangeTransmitter;
 use Wikibase\Repo\Notifications\DatabaseChangeTransmitter;
@@ -1660,4 +1661,8 @@
                return new WikibaseHtmlSnakFormatterFactory( 
$this->getSnakFormatterFactory() );
        }
 
+       public function getEntityTypesModuleWorker() {
+               return new EntityTypesModuleWorker( 
$this->entityTypeDefinitions );
+       }
+
 }
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index e935bbb..53c2ada 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -1,6 +1,8 @@
 <?php
 
 use DataTypes\Modules\DataTypesModule;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
+use Wikibase\Repo\Modules\MwConfigModule;
 use Wikibase\Repo\WikibaseRepo;
 
 /**
@@ -48,6 +50,14 @@
                        'datatypesconfigvarname' => 'wbDataTypes',
                ),
 
+               'mw.config.values.wbEntityTypes' => $moduleTemplate + [
+                       'class' => MwConfigModule::class,
+                       'name' => 'wbEntityTypes',
+                       'getworker' => function() {
+                               return 
WikibaseRepo::getDefaultInstance()->getEntityTypesModuleWorker();
+                       }
+               ],
+
                'wikibase.dataTypeStore' => $moduleTemplate + array(
                        'scripts' => array(
                                'dataTypes/wikibase.dataTypeStore.js',
@@ -68,6 +78,7 @@
                        'dependencies' => array(
                                'mediawiki.page.watch.ajax',
                                'mediawiki.user',
+                               'mw.config.values.wbEntityTypes',
                                'mw.config.values.wbRepo',
                                'jquery.wikibase.toolbarcontroller',
                                
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
@@ -99,7 +110,6 @@
                                'wikibase.parsers.getStore',
                                'wikibase.api.RepoApi',
                                'wikibase.RevisionStore',
-                               'wikibase.serialization.EntityDeserializer',
                                'wikibase.serialization.EntityDeserializer',
                                'wikibase.sites',
                                'wikibase.store.ApiEntityStore',
diff --git a/repo/resources/wikibase.EntityInitializer.js 
b/repo/resources/wikibase.EntityInitializer.js
index eba10bd..5b60782 100644
--- a/repo/resources/wikibase.EntityInitializer.js
+++ b/repo/resources/wikibase.EntityInitializer.js
@@ -81,14 +81,43 @@
                                        return;
                                }
 
-                               var entityJSON = JSON.parse( serializedEntity ),
-                                       entityDeserializer = new 
wb.serialization.EntityDeserializer();
-
-                               deferred.resolve( 
entityDeserializer.deserialize( entityJSON ) );
-                               entityJSON = null;
+                               self._getDeserializer().done( function( 
entityDeserializer ) {
+                                       var entity = 
entityDeserializer.deserialize( JSON.parse( serializedEntity ) );
+                                       deferred.resolve( entity );
+                               } );
                        } );
 
                        return deferred.promise();
+               },
+
+               /**
+                * @return {Object} jQuery promise
+                *         Resolved parameters:
+                *         - {wikibase.serialization.EntityDeserializer}
+                *         No rejected parameters.
+                */
+               _getDeserializer: function() {
+                       var entityDeserializer = new 
wb.serialization.EntityDeserializer(),
+                               deferred = $.Deferred();
+
+                       var entityTypes = mw.config.get( 'wbEntityTypes' );
+                       var modules = [];
+                       var typeNames = [];
+                       entityTypes.types.forEach( function( type ) {
+                               var deserializerFactoryFunction = entityTypes[ 
'deserializer-factory-functions' ][ type ];
+                               if ( deserializerFactoryFunction ) {
+                                       modules.push( 
deserializerFactoryFunction );
+                                       typeNames.push( type );
+                               }
+                       } );
+                       mw.loader.using( modules, function() {
+                               modules.forEach( function( module, index ) {
+                                       entityDeserializer.registerStrategy( 
mw.loader.require( module )(), typeNames[ index ] );
+                               } );
+
+                               deferred.resolve( entityDeserializer );
+                       } );
+                       return deferred.promise();
                }
        } );
 

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
Gerrit-PatchSet: 10
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Heine <[email protected]>
Gerrit-Reviewer: Adrian Heine <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to