...really get rid of link color query spam
[lhc/web/wiklou.git] / includes / filerepo / RepoGroup.php
index 3055382..d685121 100644 (file)
@@ -1,12 +1,20 @@
 <?php
 
+/**
+ * Prioritized list of file repositories
+ * @addtogroup FileRepo
+ */
 class RepoGroup {
        var $localRepo, $foreignRepos, $reposInitialised = false;
        var $localInfo, $foreignInfo;
 
        protected static $instance;
 
-       function singleton() {
+       /**
+        * Get a RepoGroup instance. At present only one instance of RepoGroup is
+        * needed in a MediaWiki invocation, this may change in the future.
+        */
+       static function singleton() {
                if ( self::$instance ) {
                        return self::$instance;
                }
@@ -15,6 +23,21 @@ class RepoGroup {
                return self::$instance;
        }
 
+       /**
+        * Destroy the singleton instance, so that a new one will be created next
+        * time singleton() is called.
+        */
+       static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Set the singleton instance to a given object
+        */
+       static function setSingleton( $instance ) {
+               self::$instance = $instance;
+       }
+
        /**
         * Construct a group of file repositories. 
         * @param array $data Array of repository info arrays. 
@@ -31,8 +54,8 @@ class RepoGroup {
         * Search repositories for an image.
         * You can also use wfGetFile() to do this.
         * @param mixed $title Title object or string
-        * @param mixed $time The 14-char timestamp before which the file should 
-        *                    have been uploaded, or false for the current version
+        * @param mixed $time The 14-char timestamp the file should have 
+        *                    been uploaded, or false for the current version
         * @return File object or false if it is not found
         */
        function findFile( $title, $time = false ) {
@@ -45,7 +68,7 @@ class RepoGroup {
                        return $image;
                }
                foreach ( $this->foreignRepos as $repo ) {
-                       $image = $repo->findFile( $image, $time );
+                       $image = $repo->findFile( $title, $time );
                        if ( $image ) {
                                return $image;
                        }
@@ -53,6 +76,27 @@ class RepoGroup {
                return false;
        }
 
+       /**
+        * Interface for FileRepo::checkRedirect()
+        */
+       function checkRedirect( $title ) {
+               if ( !$this->reposInitialised ) {
+                       $this->initialiseRepos();
+               }
+
+               $redir = $this->localRepo->checkRedirect( $title );
+               if( $redir ) {
+                       return $redir;
+               }
+               foreach ( $this->foreignRepos as $repo ) {
+                       $redir = $repo->checkRedirect( $title );
+                       if ( $redir ) {
+                               return $redir;
+                       }
+               }
+               return false;
+       }
+
        /**
         * Get the repo instance with a given key.
         */
@@ -60,7 +104,7 @@ class RepoGroup {
                if ( !$this->reposInitialised ) {
                        $this->initialiseRepos();
                }
-               if ( $index == 'local' ) {
+               if ( $index === 'local' ) {
                        return $this->localRepo;
                } elseif ( isset( $this->foreignRepos[$index] ) ) {
                        return $this->foreignRepos[$index];
@@ -68,7 +112,24 @@ class RepoGroup {
                        return false;
                }
        }
+       /**
+        * Get the repo instance by its name
+        */
+       function getRepoByName( $name ) {
+               if ( !$this->reposInitialised ) {
+                       $this->initialiseRepos();
+               }
+               foreach ( $this->foreignRepos as $key => $repo ) {
+                       if ( $repo->name == $name)
+                               return $repo;
+               }
+               return false;
+       }
 
+       /**
+        * Get the local repository, i.e. the one corresponding to the local image
+        * table. Files are typically uploaded to the local repository.
+        */
        function getLocalRepo() {
                return $this->getRepo( 'local' );
        }
@@ -89,10 +150,42 @@ class RepoGroup {
                }
        }
 
-       function newRepo( $info ) {
+       /**
+        * Create a repo class based on an info structure
+        */
+       protected function newRepo( $info ) {
                $class = $info['class'];
                return new $class( $info );
        }
+
+       /**
+        * Split a virtual URL into repo, zone and rel parts
+        * @return an array containing repo, zone and rel
+        */
+       function splitVirtualUrl( $url ) {
+               if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
+                       throw new MWException( __METHOD__.': unknown protoocl' );
+               }
+
+               $bits = explode( '/', substr( $url, 9 ), 3 );
+               if ( count( $bits ) != 3 ) {
+                       throw new MWException( __METHOD__.": invalid mwrepo URL: $url" );
+               }
+               return $bits;
+       }
+
+       function getFileProps( $fileName ) {
+               if ( FileRepo::isVirtualUrl( $fileName ) ) {
+                       list( $repoName, /* $zone */, /* $rel */ ) = $this->splitVirtualUrl( $fileName );
+                       if ( $repoName === '' ) {
+                               $repoName = 'local';
+                       }
+                       $repo = $this->getRepo( $repoName );
+                       return $repo->getFileProps( $fileName );
+               } else {
+                       return File::getPropsFromPath( $fileName );
+               }
+       }
 }
 
-?>
+