wiki.techinc.nl/includes/filebackend/lockmanager/LockManagerGroup.php
Timo Tijhof bfd419fb9e filebackend: Remove LBFactory dep from LockManager service
This was added during the conversation to a service class in
commit 5a6c18a086 (Iaa7354f31), but the code it was for is unused
and was shortly after removed in commit 37022e2e (Ifa00c59ab), thus
leaving this unused dependency behind.

The motiviation for this change is that Parser is used during
the installer (maintenance/install.php) with DB services naturally
disabled, and Parser has the dependency chain Parser -> BadFileLookup
-> RepoGroup (hidden) -> FileBackendGroup -> LockManagerGroup.

Solving the hidden part is proposed in I9de42a26cd, but fails as
LockManagerGroup currently depends on LBFactory which makes
it crash in db-less environments.

Change-Id: Icaad0acbed2957c1f86e4089dd221a8cdcb1a1ae
2022-08-02 22:22:48 -07:00

139 lines
4.1 KiB
PHP

<?php
/**
* Lock manager registration handling.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup LockManager
*/
use MediaWiki\Logger\LoggerFactory;
/**
* Class to handle file lock manager registration
*
* @ingroup LockManager
* @since 1.19
*/
class LockManagerGroup {
/** @var string domain (usually wiki ID) */
protected $domain;
/** @var array Array of (name => ('class' => ..., 'config' => ..., 'instance' => ...)) */
protected $managers = [];
/**
* Do not call this directly. Use LockManagerGroupFactory.
*
* @param string $domain Domain (usually wiki ID)
* @param array[] $lockManagerConfigs In format of $wgLockManagers
*/
public function __construct( $domain, array $lockManagerConfigs ) {
$this->domain = $domain;
foreach ( $lockManagerConfigs as $config ) {
$config['domain'] = $this->domain;
if ( !isset( $config['name'] ) ) {
throw new Exception( "Cannot register a lock manager with no name." );
}
$name = $config['name'];
if ( !isset( $config['class'] ) ) {
throw new Exception( "Cannot register lock manager `{$name}` with no class." );
}
$class = $config['class'];
unset( $config['class'] ); // lock manager won't need this
$this->managers[$name] = [
'class' => $class,
'config' => $config,
'instance' => null
];
}
}
/**
* Get the lock manager object with a given name
*
* @param string $name
* @return LockManager
* @throws Exception
*/
public function get( $name ) {
if ( !isset( $this->managers[$name] ) ) {
throw new Exception( "No lock manager defined with the name `$name`." );
}
// Lazy-load the actual lock manager instance
if ( !isset( $this->managers[$name]['instance'] ) ) {
$class = $this->managers[$name]['class'];
'@phan-var string $class';
$config = $this->managers[$name]['config'];
$config['logger'] = LoggerFactory::getInstance( 'LockManager' );
$this->managers[$name]['instance'] = new $class( $config );
}
return $this->managers[$name]['instance'];
}
/**
* Get the config array for a lock manager object with a given name
*
* @param string $name
* @return array
* @throws Exception
*/
public function config( $name ) {
if ( !isset( $this->managers[$name] ) ) {
throw new Exception( "No lock manager defined with the name `$name`." );
}
$class = $this->managers[$name]['class'];
return [ 'class' => $class ] + $this->managers[$name]['config'];
}
/**
* Get the default lock manager configured for the site.
* Returns NullLockManager if no lock manager could be found.
*
* @codeCoverageIgnore
* @deprecated since 1.35, seemingly unused, just call get() and catch any exception instead
* @return LockManager
*/
public function getDefault() {
wfDeprecated( __METHOD__, '1.35' );
return isset( $this->managers['default'] )
? $this->get( 'default' )
: new NullLockManager( [] );
}
/**
* Get the default lock manager configured for the site
* or at least some other effective configured lock manager.
* Throws an exception if no lock manager could be found.
*
* @codeCoverageIgnore
* @deprecated since 1.35, seemingly unused, just call get() and catch any exception instead
* @return LockManager
* @throws Exception
*/
public function getAny() {
wfDeprecated( __METHOD__, '1.35' );
return isset( $this->managers['default'] )
? $this->get( 'default' )
: $this->get( 'fsLockManager' );
}
}