Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
27 / 27 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
1 / 1 |
LockManagerGroup | |
100.00% |
27 / 27 |
|
100.00% |
3 / 3 |
9 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
15 / 15 |
|
100.00% |
1 / 1 |
4 | |||
get | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
3 | |||
config | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 |
1 | <?php |
2 | /** |
3 | * Lock manager registration handling. |
4 | * |
5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. |
9 | * |
10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. |
14 | * |
15 | * You should have received a copy of the GNU General Public License along |
16 | * with this program; if not, write to the Free Software Foundation, Inc., |
17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
18 | * http://www.gnu.org/copyleft/gpl.html |
19 | * |
20 | * @file |
21 | * @ingroup LockManager |
22 | */ |
23 | use MediaWiki\Logger\LoggerFactory; |
24 | |
25 | /** |
26 | * Class to handle file lock manager registration |
27 | * |
28 | * @ingroup LockManager |
29 | * @since 1.19 |
30 | */ |
31 | class LockManagerGroup { |
32 | /** @var string domain (usually wiki ID) */ |
33 | protected $domain; |
34 | |
35 | /** @var array Array of (name => ('class' => ..., 'config' => ..., 'instance' => ...)) */ |
36 | protected $managers = []; |
37 | |
38 | /** |
39 | * Do not call this directly. Use LockManagerGroupFactory. |
40 | * |
41 | * @param string $domain Domain (usually wiki ID) |
42 | * @param array[] $lockManagerConfigs In format of $wgLockManagers |
43 | */ |
44 | public function __construct( $domain, array $lockManagerConfigs ) { |
45 | $this->domain = $domain; |
46 | |
47 | foreach ( $lockManagerConfigs as $config ) { |
48 | $config['domain'] = $this->domain; |
49 | if ( !isset( $config['name'] ) ) { |
50 | throw new InvalidArgumentException( "Cannot register a lock manager with no name." ); |
51 | } |
52 | $name = $config['name']; |
53 | if ( !isset( $config['class'] ) ) { |
54 | throw new InvalidArgumentException( "Cannot register lock manager `{$name}` with no class." ); |
55 | } |
56 | $class = $config['class']; |
57 | unset( $config['class'] ); // lock manager won't need this |
58 | $this->managers[$name] = [ |
59 | 'class' => $class, |
60 | 'config' => $config, |
61 | 'instance' => null |
62 | ]; |
63 | } |
64 | } |
65 | |
66 | /** |
67 | * Get the lock manager object with a given name |
68 | * |
69 | * @param string $name |
70 | * @return LockManager |
71 | * @throws Exception |
72 | */ |
73 | public function get( $name ) { |
74 | if ( !isset( $this->managers[$name] ) ) { |
75 | throw new InvalidArgumentException( "No lock manager defined with the name `$name`." ); |
76 | } |
77 | // Lazy-load the actual lock manager instance |
78 | if ( !isset( $this->managers[$name]['instance'] ) ) { |
79 | $class = $this->managers[$name]['class']; |
80 | '@phan-var string $class'; |
81 | $config = $this->managers[$name]['config']; |
82 | $config['logger'] = LoggerFactory::getInstance( 'LockManager' ); |
83 | |
84 | $this->managers[$name]['instance'] = new $class( $config ); |
85 | } |
86 | |
87 | return $this->managers[$name]['instance']; |
88 | } |
89 | |
90 | /** |
91 | * Get the config array for a lock manager object with a given name |
92 | * |
93 | * @param string $name |
94 | * @return array |
95 | * @throws Exception |
96 | */ |
97 | public function config( $name ) { |
98 | if ( !isset( $this->managers[$name] ) ) { |
99 | throw new InvalidArgumentException( "No lock manager defined with the name `$name`." ); |
100 | } |
101 | $class = $this->managers[$name]['class']; |
102 | |
103 | return [ 'class' => $class ] + $this->managers[$name]['config']; |
104 | } |
105 | } |