Skip to content

Commit

Permalink
Normalize claim serialization on Items and use LegacyStatementDeseria…
Browse files Browse the repository at this point in the history
…lizer

Problem is that Items might have Claims (e.g. missing 'rank' and 'refs' keys).
Deserializing these now fails on Items. The serialization needs to be 'normalized'
as a Statement to deal with this potential inconsitency in old data.

@todo more tests and clean up of LegacyClaimDeserializer

Bug: 70613
  • Loading branch information
filbertkm committed Sep 10, 2014
1 parent 090c4cc commit fa15e5a
Showing 1 changed file with 48 additions and 9 deletions.
57 changes: 48 additions & 9 deletions src/Deserializers/LegacyItemDeserializer.php
Expand Up @@ -5,7 +5,9 @@
use Deserializers\Deserializer;
use Deserializers\Exceptions\DeserializationException;
use Deserializers\Exceptions\InvalidAttributeException;
use Wikibase\DataModel\Claim\Claim;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\DataModel\Term\Fingerprint;

/**
Expand All @@ -16,7 +18,7 @@ class LegacyItemDeserializer implements Deserializer {

private $idDeserializer;
private $siteLinkListDeserializer;
private $claimDeserializer;
private $statementDeserializer;
private $fingerprintDeserializer;

/**
Expand All @@ -26,11 +28,11 @@ class LegacyItemDeserializer implements Deserializer {
private $serialization;

public function __construct( Deserializer $idDeserializer, Deserializer $siteLinkListDeserializer,
Deserializer $claimDeserializer, Deserializer $fingerprintDeserializer ) {
Deserializer $statementDeserializer, Deserializer $fingerprintDeserializer ) {

$this->idDeserializer = $idDeserializer;
$this->siteLinkListDeserializer = $siteLinkListDeserializer;
$this->claimDeserializer = $claimDeserializer;
$this->statementDeserializer = $statementDeserializer;
$this->fingerprintDeserializer = $fingerprintDeserializer;
}

Expand All @@ -50,7 +52,7 @@ public function deserialize( $serialization ) {

$this->setId();
$this->addSiteLinks();
$this->addClaims();
$this->addStatements();
$this->addFingerprint();

return $this->item;
Expand All @@ -76,15 +78,29 @@ private function getSiteLinks() {
return array();
}

private function addClaims() {
$this->normalizeLegacyClaimKey();
private function addStatements() {
$this->normalizeLegacyClaimKeys();

$statementList = new StatementList();

foreach ( $this->getArrayFromKey( 'claims' ) as $claimSerialization ) {
$this->item->addClaim( $this->claimDeserializer->deserialize( $claimSerialization ) );
$this->assertClaimValueIsArray( $claimSerialization );

$statementSerialization = $this->normalizeStatementSerialization( $claimSerialization );
$statement = $this->statementDeserializer->deserialize( $statementSerialization );
$statementList->addStatement( $statement );
}

$this->item->setStatements( $statementList );
}

private function normalizeLegacyClaimKey() {
private function assertClaimValueIsArray( $value ) {
if ( !is_array( $value ) ) {
throw new DeserializationException( 'Claim serialization must be an array.' );
}
}

private function normalizeLegacyClaimKeys() {
// Compatibility with DataModel 0.2 and 0.3 ItemObjects.
// (statements key got renamed to claims)
if ( array_key_exists( 'statements', $this->serialization ) ) {
Expand All @@ -93,6 +109,29 @@ private function normalizeLegacyClaimKey() {
}
}

private function normalizeStatementSerialization( $claimSerialization ) {
$statementSerialization = $this->normalizeStatementRankKey( $claimSerialization );
$statementSerialization = $this->normalizeReferencesKey( $claimSerialization );

return $statementSerialization;
}

private function normalizeStatementRankKey( array $claimSerialization ) {
if ( !isset( $claimSerialization['rank'] ) ) {
$claimSerialization['rank'] = Claim::RANK_NORMAL;
}

return $claimSerialization;
}

private function normalizeReferencesKey( array $claimSerialization ) {
if ( !isset( $claimSerialization['refs'] ) ) {
$claimSerialization['refs'] = array();
}

return $claimSerialization;
}

private function getArrayFromKey( $key ) {
if ( !array_key_exists( $key, $this->serialization ) ) {
return array();
Expand Down Expand Up @@ -124,4 +163,4 @@ private function getFingerprint() {
return $this->fingerprintDeserializer->deserialize( $this->serialization );
}

}
}

0 comments on commit fa15e5a

Please sign in to comment.