Skip to content
Merged
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ and by [Jeroen De Dauw](https://www.mediawiki.org/wiki/User:Jeroen_De_Dauw) as [

## Release notes

### 1.4.0 (dev)

* Added support for showing the component version when loaded via MediaWiki

### 1.3.0 (2015-01-28)

* `FingerprintSerializer` now supports serializing `AliasGroupFallback`s and `TermFallback`s
Expand Down
14 changes: 12 additions & 2 deletions src/DeserializerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Wikibase\DataModel\Deserializers\SiteLinkDeserializer;
use Wikibase\DataModel\Deserializers\SnakDeserializer;
use Wikibase\DataModel\Deserializers\SnakListDeserializer;
use Wikibase\DataModel\Deserializers\StatementListDeserializer;
use Wikibase\DataModel\Entity\EntityIdParser;

/**
Expand Down Expand Up @@ -54,8 +55,8 @@ public function __construct( Deserializer $dataValueDeserializer, EntityIdParser
*/
public function newEntityDeserializer() {
return new DispatchingDeserializer( array(
new ItemDeserializer( $this->newEntityIdDeserializer(), $this->newFingerprintDeserializer(), $this->newClaimsDeserializer(), $this->newSiteLinkDeserializer() ),
new PropertyDeserializer( $this->newEntityIdDeserializer(), $this->newFingerprintDeserializer(), $this->newClaimsDeserializer() )
new ItemDeserializer( $this->newEntityIdDeserializer(), $this->newFingerprintDeserializer(), $this->newStatementListDeserializer(), $this->newSiteLinkDeserializer() ),
new PropertyDeserializer( $this->newEntityIdDeserializer(), $this->newFingerprintDeserializer(), $this->newStatementListDeserializer() )
) );
}

Expand All @@ -77,6 +78,15 @@ public function newClaimsDeserializer() {
return new ClaimsDeserializer( $this->newClaimDeserializer() );
}

/**
* Returns a Deserializer that can deserialize StatementList objects.
*
* @return Deserializer
*/
public function newStatementListDeserializer() {
return new StatementListDeserializer( $this->newClaimDeserializer() );
}

/**
* Returns a Deserializer that can deserialize Claim objects.
*
Expand Down
17 changes: 8 additions & 9 deletions src/Deserializers/EntityDeserializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use Deserializers\Exceptions\DeserializationException;
use Deserializers\TypedObjectDeserializer;
use Wikibase\DataModel\Entity\Entity;
use Wikibase\DataModel\Statement\StatementList;

/**
* Package private
Expand All @@ -29,24 +28,25 @@ abstract class EntityDeserializer extends TypedObjectDeserializer {
/**
* @var Deserializer
*/
private $claimsDeserializer;
private $statementListDeserializer;

/**
* @param string $entityType
* @param Deserializer $entityIdDeserializer
* @param Deserializer $claimsDeserializer
* @param Deserializer $fingerprintDeserializer
* @param Deserializer $statementListDeserializer
*/
public function __construct(
$entityType,
Deserializer $entityIdDeserializer,
Deserializer $fingerprintDeserializer,
Deserializer $claimsDeserializer
Deserializer $statementListDeserializer
) {
parent::__construct( $entityType, 'type' );

$this->entityIdDeserializer = $entityIdDeserializer;
$this->fingerprintDeserializer = $fingerprintDeserializer;
$this->claimsDeserializer = $claimsDeserializer;
$this->statementListDeserializer = $statementListDeserializer;
}

/**
Expand Down Expand Up @@ -75,7 +75,7 @@ private function getDeserialized( array $serialization ) {
$entity->setFingerprint( $this->fingerprintDeserializer->deserialize( $serialization ) );

$this->setIdFromSerialization( $serialization, $entity );
$this->setClaimsFromSerialization( $serialization, $entity );
$this->setStatementListFromSerialization( $serialization, $entity );

return $entity;
}
Expand All @@ -88,13 +88,12 @@ private function setIdFromSerialization( array $serialization, Entity $entity )
$entity->setId( $this->entityIdDeserializer->deserialize( $serialization['id'] ) );
}

private function setClaimsFromSerialization( array $serialization, Entity $entity ) {
private function setStatementListFromSerialization( array $serialization, Entity $entity ) {
if ( !array_key_exists( 'claims', $serialization ) || !method_exists( $entity, 'setStatements' ) ) {
return;
}

$claims = $this->claimsDeserializer->deserialize( $serialization['claims'] );
$statements = new StatementList( iterator_to_array( $claims ) );
$statements = $this->statementListDeserializer->deserialize( $serialization['claims'] );
$entity->setStatements( $statements );
}

Expand Down
67 changes: 67 additions & 0 deletions src/Deserializers/StatementListDeserializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace Wikibase\DataModel\Deserializers;

use Deserializers\Deserializer;
use Deserializers\Exceptions\DeserializationException;
use Wikibase\DataModel\Statement\StatementList;

/**
* Package private
*
* @licence GNU GPL v2+
* @author Bene* < benestar.wikimedia@gmail.com >
*/
class StatementListDeserializer implements Deserializer {

/**
* @var Deserializer
*/
private $statementDeserializer;

/**
* @param Deserializer $statementDeserializer
*/
public function __construct( Deserializer $statementDeserializer ) {
$this->statementDeserializer = $statementDeserializer;
}

/**
* @see Deserializer::deserialize
*
* @param mixed $serialization
*
* @return object
* @throws DeserializationException
*/
public function deserialize( $serialization ) {
$this->assertHasGoodFormat( $serialization );

return $this->getDeserialized( $serialization );
}

private function getDeserialized( array $serialization ) {
$statementList = new StatementList();

foreach( $serialization as $statementArray ) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I spend some time wondering why we have a list of lists here. Having some kind of hint that these are grouped by property id would be nice. Which also makes me wonder if we should just accept statements with a property id different than that of the list they are in. Though that is not something to change here if this just re-implements the current code.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It indeed just reflects the current serialization format. I'm not sure if we should enforce statements grouped by property id in the serializatoin though if it is not done in the DataModel. This is a more general question but we should stay consistent and either do this grouping in Items/Properties as well or don't force it in the serialization.

foreach( $statementArray as $statementSerialization ) {
$statementList->addStatement( $this->statementDeserializer->deserialize( $statementSerialization ) );
}
}

return $statementList;
}

private function assertHasGoodFormat( $serialization ) {
if( !is_array( $serialization ) ) {
throw new DeserializationException( 'The StatementList serialization should be an array' );
}

foreach( $serialization as $statementArray ) {
if( !is_array( $statementArray ) ) {
throw new DeserializationException( 'The statements per property should be an array' );
}
}
}

}
14 changes: 12 additions & 2 deletions src/SerializerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Wikibase\DataModel\Serializers\SiteLinkSerializer;
use Wikibase\DataModel\Serializers\SnakSerializer;
use Wikibase\DataModel\Serializers\SnaksSerializer;
use Wikibase\DataModel\Serializers\StatementListSerializer;
use Wikibase\DataModel\Serializers\TypedSnakSerializer;

/**
Expand Down Expand Up @@ -70,8 +71,8 @@ private function shouldUseObjectsForMaps() {
public function newEntitySerializer() {
$fingerprintSerializer = new FingerprintSerializer( $this->shouldUseObjectsForMaps() );
return new DispatchingSerializer( array(
new ItemSerializer( $fingerprintSerializer, $this->newClaimsSerializer(), $this->newSiteLinkSerializer(), $this->shouldUseObjectsForMaps() ),
new PropertySerializer( $fingerprintSerializer, $this->newClaimsSerializer() ),
new ItemSerializer( $fingerprintSerializer, $this->newStatementListSerializer(), $this->newSiteLinkSerializer(), $this->shouldUseObjectsForMaps() ),
new PropertySerializer( $fingerprintSerializer, $this->newStatementListSerializer() ),
) );
}

Expand All @@ -93,6 +94,15 @@ public function newClaimsSerializer() {
return new ClaimsSerializer( $this->newClaimSerializer(), $this->shouldUseObjectsForMaps() );
}

/**
* Returns a Serializer that can serialize StatementList objects.
*
* @return Serializer
*/
public function newStatementListSerializer() {
return new StatementListSerializer( $this->newClaimSerializer(), $this->shouldUseObjectsForMaps() );
}

/**
* Returns a Serializer that can serialize Claim objects.
*
Expand Down
22 changes: 12 additions & 10 deletions src/Serializers/ItemSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use Serializers\Exceptions\SerializationException;
use Serializers\Exceptions\UnsupportedObjectException;
use Serializers\Serializer;
use Wikibase\DataModel\Claim\Claims;
use Wikibase\DataModel\Entity\Item;

/**
Expand All @@ -26,7 +25,7 @@ class ItemSerializer implements DispatchableSerializer {
/**
* @var Serializer
*/
private $claimsSerializer;
private $statementListSerializer;

/**
* @var Serializer
Expand All @@ -40,13 +39,18 @@ class ItemSerializer implements DispatchableSerializer {

/**
* @param FingerprintSerializer $fingerprintSerializer
* @param Serializer $claimsSerializer
* @param Serializer $statementListSerializer
* @param Serializer $siteLinkSerializer
* @param bool $useObjectsForMaps
*/
public function __construct( FingerprintSerializer $fingerprintSerializer, Serializer $claimsSerializer, Serializer $siteLinkSerializer, $useObjectsForMaps ) {
public function __construct(
FingerprintSerializer $fingerprintSerializer,
Serializer $statementListSerializer,
Serializer $siteLinkSerializer,
$useObjectsForMaps
) {
$this->fingerprintSerializer = $fingerprintSerializer;
$this->claimsSerializer = $claimsSerializer;
$this->statementListSerializer = $statementListSerializer;
$this->siteLinkSerializer = $siteLinkSerializer;
$this->useObjectsForMaps = $useObjectsForMaps;
}
Expand Down Expand Up @@ -87,16 +91,14 @@ private function getSerialized( Item $item ) {
);

$this->fingerprintSerializer->addBasicsToSerialization( $item, $serialization );
$this->addClaimsToSerialization( $item, $serialization );
$this->addStatementListToSerialization( $item, $serialization );
$this->addSiteLinksToSerialization( $item, $serialization );

return $serialization;
}

private function addClaimsToSerialization( Item $item, array &$serialization ) {
$claims = new Claims( $item->getClaims() );

$serialization['claims'] = $this->claimsSerializer->serialize( $claims );
private function addStatementListToSerialization( Item $item, array &$serialization ) {
$serialization['claims'] = $this->statementListSerializer->serialize( $item->getStatements() );
}

private function addSiteLinksToSerialization( Item $item, array &$serialization ) {
Expand Down
17 changes: 7 additions & 10 deletions src/Serializers/PropertySerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use Serializers\Exceptions\SerializationException;
use Serializers\Exceptions\UnsupportedObjectException;
use Serializers\Serializer;
use Wikibase\DataModel\Claim\Claims;
use Wikibase\DataModel\Entity\Property;

/**
Expand All @@ -26,15 +25,15 @@ class PropertySerializer implements DispatchableSerializer {
/**
* @var Serializer
*/
private $claimsSerializer;
private $statementListSerializer;

/**
* @param FingerprintSerializer $fingerprintSerializer
* @param Serializer $claimsSerializer
* @param Serializer $statementListSerializer
*/
public function __construct( FingerprintSerializer $fingerprintSerializer, Serializer $claimsSerializer ) {
public function __construct( FingerprintSerializer $fingerprintSerializer, Serializer $statementListSerializer ) {
$this->fingerprintSerializer = $fingerprintSerializer;
$this->claimsSerializer = $claimsSerializer;
$this->statementListSerializer = $statementListSerializer;
}

/**
Expand Down Expand Up @@ -74,15 +73,13 @@ private function getSerialized( Property $entity ) {
);

$this->fingerprintSerializer->addBasicsToSerialization( $entity, $serialization );
$this->addClaimsToSerialization( $entity, $serialization );
$this->addStatementListToSerialization( $entity, $serialization );

return $serialization;
}

private function addClaimsToSerialization( Property $entity, array &$serialization ) {
$claims = new Claims( $entity->getStatements() );

$serialization['claims'] = $this->claimsSerializer->serialize( $claims );
private function addStatementListToSerialization( Property $entity, array &$serialization ) {
$serialization['claims'] = $this->statementListSerializer->serialize( $entity->getStatements() );
}

}
Loading