[MediaWiki-commits] [Gerrit] Use DataModel Deserializer in SetReferences - change (mediawiki...Wikibase)
jenkins-bot has submitted this change and it was merged. Change subject: Use DataModel Deserializer in SetReferences .. Use DataModel Deserializer in SetReferences This removes a large method which no longer needs to be here, and has had a TODO on it for a long time to remove this code! This also removed some other dead code which would die if $claim was not an instance of Statement, which it will always be now. I deliberatly didn't rename $claim in this patch to avoid touching more lines... Change-Id: I281c043512bd6f3eccc7fa7e5922cdd654cfdad1 --- M repo/includes/api/SetReference.php 1 file changed, 29 insertions(+), 67 deletions(-) Approvals: Jonas Kress (WMDE): Looks good to me, but someone else must approve Thiemo Mättig (WMDE): Looks good to me, but someone else must approve Jeroen De Dauw: Looks good to me, approved jenkins-bot: Verified diff --git a/repo/includes/api/SetReference.php b/repo/includes/api/SetReference.php index 14adb47..51dd856 100644 --- a/repo/includes/api/SetReference.php +++ b/repo/includes/api/SetReference.php @@ -3,14 +3,14 @@ namespace Wikibase\Repo\Api; use ApiMain; -use InvalidArgumentException; -use OutOfBoundsException; +use DataValues\Deserializers\DataValueDeserializer; +use Deserializers\Exceptions\DeserializationException; use Wikibase\ChangeOp\ChangeOpReference; use Wikibase\ChangeOp\StatementChangeOpFactory; +use Wikibase\DataModel\DeserializerFactory; use Wikibase\DataModel\Reference; use Wikibase\DataModel\Snak\SnakList; use Wikibase\DataModel\Statement\Statement; -use Wikibase\Lib\Serializers\LibSerializerFactory; use Wikibase\Repo\WikibaseRepo; /** @@ -35,6 +35,11 @@ private $errorReporter; /** +* @var DeserializerFactory +*/ + private $deserializerFactory; + + /** * @param ApiMain $mainModule * @param string $moduleName * @param string $modulePrefix @@ -48,6 +53,10 @@ $this-statementChangeOpFactory = $changeOpFactoryProvider-getStatementChangeOpFactory(); $this-errorReporter = $apiHelperFactory-getErrorReporter( $this ); + $this-deserializerFactory = new DeserializerFactory( + $wikibaseRepo-getDataValueDeserializer(), + $wikibaseRepo-getEntityIdParser() + ); } /** @@ -71,13 +80,6 @@ $claim = $this-modificationHelper-getStatementFromEntity( $params['statement'], $entity ); - if ( ! ( $claim instanceof Statement ) ) { - $this-errorReporter-dieError( - 'The referenced claim is not a statement and thus cannot have references', - 'not-statement' - ); - } - if ( isset( $params['reference'] ) ) { $this-validateReferenceHash( $claim, $params['reference'] ); } @@ -88,20 +90,28 @@ $snaksOrder = array(); } - $newReference = new Reference( - $this-getSnaks( - $this-getArrayFromParam( $params['snaks'] ), - $snaksOrder - ) - ); + $deserializer = $this-deserializerFactory-newSnakListDeserializer(); + /** @var SnakList $snakList */ + try{ + $snakList = $deserializer-deserialize( $this-getArrayFromParam( $params['snaks'] ) ); + } catch ( DeserializationException $e ) { + $this-errorReporter-dieError( + 'Failed to get reference from reference Serialization ' . $e-getMessage(), + 'snak-instantiation-failure' + ); + } + $snakList-orderByProperty( $snaksOrder ); + + $newReference = new Reference( $snakList ); $changeOp = $this-getChangeOp( $newReference ); $this-modificationHelper-applyChangeOp( $changeOp, $entity, $summary ); $status = $this-saveChanges( $entity, $summary ); - $this-getResultBuilder()-addRevisionIdFromStatusToResult( $status, 'pageinfo' ); - $this-getResultBuilder()-markSuccess(); - $this-getResultBuilder()-addReference( $newReference ); + $resultBuilder = $this-getResultBuilder(); + $resultBuilder-addRevisionIdFromStatusToResult( $status, 'pageinfo' ); + $resultBuilder-markSuccess(); + $resultBuilder-addReference( $newReference ); } /** @@ -139,54 +149,6 @@ } return $rawArray; - } - - /** -* @param array $rawSnaks array of snaks -* @param
[MediaWiki-commits] [Gerrit] Use DataModel Deserializer in SetReferences - change (mediawiki...Wikibase)
Addshore has uploaded a new change for review. https://gerrit.wikimedia.org/r/223010 Change subject: Use DataModel Deserializer in SetReferences .. Use DataModel Deserializer in SetReferences This removes a large method which no longer needs to be here, and has had a TODO on it for a long time to remove this code! Change-Id: I281c043512bd6f3eccc7fa7e5922cdd654cfdad1 --- M repo/includes/api/SetReference.php 1 file changed, 21 insertions(+), 67 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/10/223010/1 diff --git a/repo/includes/api/SetReference.php b/repo/includes/api/SetReference.php index c9feaad..82041e4 100644 --- a/repo/includes/api/SetReference.php +++ b/repo/includes/api/SetReference.php @@ -4,14 +4,13 @@ use ApiBase; use ApiMain; -use InvalidArgumentException; -use OutOfBoundsException; +use DataValues\Deserializers\DataValueDeserializer; use Wikibase\ChangeOp\ChangeOpReference; use Wikibase\ChangeOp\StatementChangeOpFactory; +use Wikibase\DataModel\DeserializerFactory; use Wikibase\DataModel\Reference; use Wikibase\DataModel\Snak\SnakList; use Wikibase\DataModel\Statement\Statement; -use Wikibase\Lib\Serializers\LibSerializerFactory; use Wikibase\Repo\WikibaseRepo; /** @@ -36,6 +35,11 @@ private $errorReporter; /** +* @var DeserializerFactory +*/ + private $deserializerFactory; + + /** * @param ApiMain $mainModule * @param string $moduleName * @param string $modulePrefix @@ -49,6 +53,10 @@ $this-statementChangeOpFactory = $changeOpFactoryProvider-getStatementChangeOpFactory(); $this-errorReporter = $apiHelperFactory-getErrorReporter( $this ); + $this-deserializerFactory = new DeserializerFactory( + new DataValueDeserializer(), + $wikibaseRepo-getEntityIdParser() + ); } /** @@ -72,13 +80,6 @@ $claim = $this-modificationHelper-getStatementFromEntity( $params['statement'], $entity ); - if ( ! ( $claim instanceof Statement ) ) { - $this-errorReporter-dieError( - 'The referenced claim is not a statement and thus cannot have references', - 'not-statement' - ); - } - if ( isset( $params['reference'] ) ) { $this-validateReferenceHash( $claim, $params['reference'] ); } @@ -89,20 +90,21 @@ $snaksOrder = array(); } - $newReference = new Reference( - $this-getSnaks( - $this-getArrayFromParam( $params['snaks'] ), - $snaksOrder - ) - ); + $deserializer = $this-deserializerFactory-newSnakListDeserializer(); + /** @var SnakList $snakList */ + $snakList = $deserializer-deserialize( $this-getArrayFromParam( $params['snaks'] ) ); + $snakList-orderByProperty( $snaksOrder ); + + $newReference = new Reference( $snakList ); $changeOp = $this-getChangeOp( $newReference ); $this-modificationHelper-applyChangeOp( $changeOp, $entity, $summary ); $status = $this-saveChanges( $entity, $summary ); - $this-getResultBuilder()-addRevisionIdFromStatusToResult( $status, 'pageinfo' ); - $this-getResultBuilder()-markSuccess(); - $this-getResultBuilder()-addReference( $newReference ); + $resultBuilder = $this-getResultBuilder(); + $resultBuilder-addRevisionIdFromStatusToResult( $status, 'pageinfo' ); + $resultBuilder-markSuccess(); + $resultBuilder-addReference( $newReference ); } /** @@ -140,54 +142,6 @@ } return $rawArray; - } - - /** -* @param array $rawSnaks array of snaks -* @param array $snakOrder array of property ids the snaks are supposed to be ordered by. -* -* @todo: Factor deserialization out of the API class. -* -* @return SnakList -*/ - private function getSnaks( array $rawSnaks, array $snakOrder = array() ) { - $snaks = new SnakList(); - - $serializerFactory = new LibSerializerFactory(); - $snakUnserializer = $serializerFactory-newUnserializerForClass( 'Wikibase\DataModel\Snak\Snak' ); - - $snakOrder = ( count( $snakOrder ) 0 ) ? $snakOrder : array_keys( $rawSnaks ); - - try { - foreach ( $snakOrder as $propertyId ) { - if ( !is_array(