1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Wikibase\Api\Service; |
4
|
|
|
|
5
|
|
|
use Deserializers\Deserializer; |
6
|
|
|
use Mediawiki\Api\MediawikiApi; |
7
|
|
|
use Mediawiki\Api\SimpleRequest; |
8
|
|
|
use Mediawiki\DataModel\PageIdentifier; |
9
|
|
|
use Mediawiki\DataModel\Revision; |
10
|
|
|
use RuntimeException; |
11
|
|
|
use Wikibase\DataModel\ItemContent; |
12
|
|
|
use Wikibase\DataModel\PropertyContent; |
13
|
|
|
use Wikibase\DataModel\Entity\EntityId; |
14
|
|
|
use Wikibase\DataModel\Entity\Item; |
15
|
|
|
use Wikibase\DataModel\Entity\Property; |
16
|
|
|
use Wikibase\DataModel\SiteLink; |
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* @access private |
20
|
|
|
* |
21
|
|
|
* @author Adam Shorland |
22
|
|
|
*/ |
23
|
|
|
class RevisionGetter { |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* @var MediawikiApi |
27
|
|
|
*/ |
28
|
|
|
protected $api; |
29
|
|
|
|
30
|
|
|
/** |
31
|
|
|
* @var Deserializer |
32
|
|
|
*/ |
33
|
|
|
protected $entityDeserializer; |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* @param MediawikiApi $api |
37
|
|
|
* @param Deserializer $entityDeserializer |
38
|
|
|
*/ |
39
|
3 |
|
public function __construct( MediawikiApi $api, Deserializer $entityDeserializer ) { |
40
|
3 |
|
$this->api = $api; |
41
|
3 |
|
$this->entityDeserializer = $entityDeserializer; |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
/** |
45
|
|
|
* @since 0.1 |
46
|
|
|
* @param string|EntityId $id |
47
|
|
|
* @returns Revision |
48
|
|
|
*/ |
49
|
2 |
|
public function getFromId( $id ) { |
50
|
2 |
|
if( $id instanceof EntityId ) { |
51
|
|
|
$id = $id->getSerialization(); |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
$result = $this->api->getRequest( new SimpleRequest( 'wbgetentities', array( 'ids' => $id ) ) ); |
55
|
|
|
return $this->newRevisionFromResult( array_shift( $result['entities'] ) ); |
56
|
|
|
} |
57
|
|
|
|
58
|
|
|
/** |
59
|
|
|
* @since 0.1 |
60
|
|
|
* @param SiteLink $siteLink |
61
|
|
|
* @returns Revision |
62
|
|
|
*/ |
63
|
|
|
public function getFromSiteLink( SiteLink $siteLink ) { |
64
|
|
|
$result = $this->api->getRequest( new SimpleRequest( |
65
|
|
|
'wbgetentities', |
66
|
|
|
array( 'sites' => $siteLink->getSiteId(), 'titles' => $siteLink->getPageName() ) |
67
|
|
|
) ); |
68
|
|
|
return $this->newRevisionFromResult( array_shift( $result['entities'] ) ); |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* @since 0.1 |
73
|
|
|
* @param string $siteId |
74
|
|
|
* @param string $title |
75
|
|
|
* @returns Revision |
76
|
|
|
*/ |
77
|
|
|
public function getFromSiteAndTitle( $siteId, $title ) { |
78
|
|
|
$result = $this->api->getRequest( new SimpleRequest( |
79
|
|
|
'wbgetentities', |
80
|
|
|
array( 'sites' => $siteId, 'titles' => $title ) |
81
|
|
|
) ); |
82
|
|
|
return $this->newRevisionFromResult( array_shift( $result['entities'] ) ); |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/** |
86
|
|
|
* @param array $entityResult |
87
|
|
|
* @returns Revision |
88
|
|
|
* @todo this could be factored into a different class? |
89
|
|
|
*/ |
90
|
2 |
|
private function newRevisionFromResult( array $entityResult ) { |
91
|
|
|
if( array_key_exists( 'missing', $entityResult ) ) { |
92
|
|
|
return false; //Throw an exception? |
93
|
|
|
} |
94
|
|
|
return new Revision( |
95
|
|
|
$this->getContentFromEntity( $this->entityDeserializer->deserialize( $entityResult ) ), |
96
|
|
|
new PageIdentifier( null, intval( $entityResult['pageid'] ) ), |
97
|
2 |
|
$entityResult['lastrevid'], |
98
|
2 |
|
null, |
99
|
2 |
|
null, |
100
|
2 |
|
$entityResult['modified'] |
101
|
|
|
); |
102
|
2 |
|
} |
103
|
|
|
|
104
|
|
|
/** |
105
|
|
|
* @param Item|Property $entity |
106
|
|
|
* |
107
|
|
|
* @throws RuntimeException |
108
|
|
|
* @return ItemContent|PropertyContent |
109
|
|
|
* @todo this could be factored into a different class? |
110
|
|
|
*/ |
111
|
2 |
|
private function getContentFromEntity( $entity ) { |
112
|
2 |
|
switch ( $entity->getType() ) { |
113
|
2 |
|
case Item::ENTITY_TYPE: |
114
|
|
|
return new ItemContent( $entity ); |
|
|
|
|
115
|
|
|
case Property::ENTITY_TYPE: |
116
|
|
|
return new PropertyContent( $entity ); |
|
|
|
|
117
|
|
|
default: |
118
|
|
|
throw new RuntimeException( 'I cant get a content for this type of entity' ); |
119
|
|
|
} |
120
|
|
|
} |
121
|
|
|
|
122
|
|
|
} |
123
|
|
|
|
This check looks at variables that have been passed in as parameters and are passed out again to other methods.
If the outgoing method call has stricter type requirements than the method itself, an issue is raised.
An additional type check may prevent trouble.