Completed
Branch master (f93894)
by
unknown
27:35
created

FileBasedSiteLookup::newSiteFromArray()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 3
eloc 13
nc 4
nop 1
dl 0
loc 18
rs 9.4285
c 2
b 0
f 0
1
<?php
2
/**
3
 * This program is free software; you can redistribute it and/or modify
4
 * it under the terms of the GNU General Public License as published by
5
 * the Free Software Foundation; either version 2 of the License, or
6
 * (at your option) any later version.
7
 *
8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
 * GNU General Public License for more details.
12
 *
13
 * You should have received a copy of the GNU General Public License along
14
 * with this program; if not, write to the Free Software Foundation, Inc.,
15
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
 * http://www.gnu.org/copyleft/gpl.html
17
 *
18
 * @file
19
 *
20
 * @license GNU GPL v2+
21
 */
22
23
/**
24
 * Provides a file-based cache of a SiteStore. The sites are stored in
25
 * a json file. (see docs/sitescache.txt regarding format)
26
 *
27
 * The cache can be built with the rebuildSitesCache.php maintenance script,
28
 * and a MediaWiki instance can be setup to use this by setting the
29
 * 'wgSitesCacheFile' configuration to the cache file location.
30
 *
31
 * @since 1.25
32
 */
33
class FileBasedSiteLookup implements SiteLookup {
34
35
	/**
36
	 * @var SiteList
37
	 */
38
	private $sites = null;
39
40
	/**
41
	 * @var string
42
	 */
43
	private $cacheFile;
44
45
	/**
46
	 * @param string $cacheFile
47
	 */
48
	public function __construct( $cacheFile ) {
49
		$this->cacheFile = $cacheFile;
50
	}
51
52
	/**
53
	 * @since 1.25
54
	 *
55
	 * @return SiteList
56
	 */
57
	public function getSites() {
58
		if ( $this->sites === null ) {
59
			$this->sites = $this->loadSitesFromCache();
60
		}
61
62
		return $this->sites;
63
	}
64
65
	/**
66
	 * @param string $globalId
67
	 *
68
	 * @since 1.25
69
	 *
70
	 * @return Site|null
71
	 */
72
	public function getSite( $globalId ) {
73
		$sites = $this->getSites();
74
75
		return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
76
	}
77
78
	/**
79
	 * @return SiteList
80
	 */
81
	private function loadSitesFromCache() {
82
		$data = $this->loadJsonFile();
83
84
		$sites = new SiteList();
85
86
		// @todo lazy initialize the site objects in the site list (e.g. only when needed to access)
87
		foreach ( $data['sites'] as $siteArray ) {
88
			$sites[] = $this->newSiteFromArray( $siteArray );
89
		}
90
91
		return $sites;
92
	}
93
94
	/**
95
	 * @throws MWException
96
	 * @return array see docs/sitescache.txt for format of the array.
97
	 */
98
	private function loadJsonFile() {
99
		if ( !is_readable( $this->cacheFile ) ) {
100
			throw new MWException( 'SiteList cache file not found.' );
101
		}
102
103
		$contents = file_get_contents( $this->cacheFile );
104
		$data = json_decode( $contents, true );
105
106
		if ( !is_array( $data ) || !is_array( $data['sites'] )
107
			|| !array_key_exists( 'sites', $data )
108
		) {
109
			throw new MWException( 'SiteStore json cache data is invalid.' );
110
		}
111
112
		return $data;
113
	}
114
115
	/**
116
	 * @param array $data
117
	 *
118
	 * @return Site
119
	 */
120
	private function newSiteFromArray( array $data ) {
121
		$siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
122
		$site = Site::newForType( $siteType );
123
124
		$site->setGlobalId( $data['globalid'] );
125
		$site->setForward( $data['forward'] );
126
		$site->setGroup( $data['group'] );
127
		$site->setLanguageCode( $data['language'] );
128
		$site->setSource( $data['source'] );
129
		$site->setExtraData( $data['data'] );
130
		$site->setExtraConfig( $data['config'] );
131
132
		foreach ( $data['identifiers'] as $identifier ) {
133
			$site->addLocalId( $identifier['type'], $identifier['key'] );
134
		}
135
136
		return $site;
137
	}
138
139
}
140