[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * File backend 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 FileBackend 22 * @author Aaron Schulz 23 */ 24 25 /** 26 * Class to handle file backend registration 27 * 28 * @ingroup FileBackend 29 * @since 1.19 30 */ 31 class FileBackendGroup { 32 /** @var FileBackendGroup */ 33 protected static $instance = null; 34 35 /** @var array (name => ('class' => string, 'config' => array, 'instance' => object)) */ 36 protected $backends = array(); 37 38 protected function __construct() { 39 } 40 41 /** 42 * @return FileBackendGroup 43 */ 44 public static function singleton() { 45 if ( self::$instance == null ) { 46 self::$instance = new self(); 47 self::$instance->initFromGlobals(); 48 } 49 50 return self::$instance; 51 } 52 53 /** 54 * Destroy the singleton instance 55 */ 56 public static function destroySingleton() { 57 self::$instance = null; 58 } 59 60 /** 61 * Register file backends from the global variables 62 */ 63 protected function initFromGlobals() { 64 global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends; 65 66 // Register explicitly defined backends 67 $this->register( $wgFileBackends ); 68 69 $autoBackends = array(); 70 // Automatically create b/c backends for file repos... 71 $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) ); 72 foreach ( $repos as $info ) { 73 $backendName = $info['backend']; 74 if ( is_object( $backendName ) || isset( $this->backends[$backendName] ) ) { 75 continue; // already defined (or set to the object for some reason) 76 } 77 $repoName = $info['name']; 78 // Local vars that used to be FSRepo members... 79 $directory = $info['directory']; 80 $deletedDir = isset( $info['deletedDir'] ) 81 ? $info['deletedDir'] 82 : false; // deletion disabled 83 $thumbDir = isset( $info['thumbDir'] ) 84 ? $info['thumbDir'] 85 : "{$directory}/thumb"; 86 $transcodedDir = isset( $info['transcodedDir'] ) 87 ? $info['transcodedDir'] 88 : "{$directory}/transcoded"; 89 $fileMode = isset( $info['fileMode'] ) 90 ? $info['fileMode'] 91 : 0644; 92 // Get the FS backend configuration 93 $autoBackends[] = array( 94 'name' => $backendName, 95 'class' => 'FSFileBackend', 96 'lockManager' => 'fsLockManager', 97 'containerPaths' => array( 98 "{$repoName}-public" => "{$directory}", 99 "{$repoName}-thumb" => $thumbDir, 100 "{$repoName}-transcoded" => $transcodedDir, 101 "{$repoName}-deleted" => $deletedDir, 102 "{$repoName}-temp" => "{$directory}/temp" 103 ), 104 'fileMode' => $fileMode, 105 ); 106 } 107 108 // Register implicitly defined backends 109 $this->register( $autoBackends ); 110 } 111 112 /** 113 * Register an array of file backend configurations 114 * 115 * @param array $configs 116 * @throws FileBackendException 117 */ 118 protected function register( array $configs ) { 119 foreach ( $configs as $config ) { 120 if ( !isset( $config['name'] ) ) { 121 throw new FileBackendException( "Cannot register a backend with no name." ); 122 } 123 $name = $config['name']; 124 if ( isset( $this->backends[$name] ) ) { 125 throw new FileBackendException( "Backend with name `{$name}` already registered." ); 126 } elseif ( !isset( $config['class'] ) ) { 127 throw new FileBackendException( "Backend with name `{$name}` has no class." ); 128 } 129 $class = $config['class']; 130 131 unset( $config['class'] ); // backend won't need this 132 $this->backends[$name] = array( 133 'class' => $class, 134 'config' => $config, 135 'instance' => null 136 ); 137 } 138 } 139 140 /** 141 * Get the backend object with a given name 142 * 143 * @param string $name 144 * @return FileBackend 145 * @throws FileBackendException 146 */ 147 public function get( $name ) { 148 if ( !isset( $this->backends[$name] ) ) { 149 throw new FileBackendException( "No backend defined with the name `$name`." ); 150 } 151 // Lazy-load the actual backend instance 152 if ( !isset( $this->backends[$name]['instance'] ) ) { 153 $class = $this->backends[$name]['class']; 154 $config = $this->backends[$name]['config']; 155 $config['wikiId'] = isset( $config['wikiId'] ) 156 ? $config['wikiId'] 157 : wfWikiID(); // e.g. "my_wiki-en_" 158 $config['lockManager'] = 159 LockManagerGroup::singleton( $config['wikiId'] )->get( $config['lockManager'] ); 160 $config['fileJournal'] = isset( $config['fileJournal'] ) 161 ? FileJournal::factory( $config['fileJournal'], $name ) 162 : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $name ); 163 $this->backends[$name]['instance'] = new $class( $config ); 164 } 165 166 return $this->backends[$name]['instance']; 167 } 168 169 /** 170 * Get the config array for a backend object with a given name 171 * 172 * @param string $name 173 * @return array 174 * @throws FileBackendException 175 */ 176 public function config( $name ) { 177 if ( !isset( $this->backends[$name] ) ) { 178 throw new FileBackendException( "No backend defined with the name `$name`." ); 179 } 180 $class = $this->backends[$name]['class']; 181 182 return array( 'class' => $class ) + $this->backends[$name]['config']; 183 } 184 185 /** 186 * Get an appropriate backend object from a storage path 187 * 188 * @param string $storagePath 189 * @return FileBackend|null Backend or null on failure 190 */ 191 public function backendFromPath( $storagePath ) { 192 list( $backend, , ) = FileBackend::splitStoragePath( $storagePath ); 193 if ( $backend !== null && isset( $this->backends[$backend] ) ) { 194 return $this->get( $backend ); 195 } 196 197 return null; 198 } 199 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |