web/lib/Zend/File/ClassFileLocator.php
changeset 808 6b6c2214f778
child 1230 68c69c656a2c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/File/ClassFileLocator.php	Thu Mar 21 19:52:38 2013 +0100
@@ -0,0 +1,173 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_File
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+
+/**
+ * Locate files containing PHP classes, interfaces, or abstracts
+ * 
+ * @package    Zend_File
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    New BSD {@link http://framework.zend.com/license/new-bsd}
+ */
+class Zend_File_ClassFileLocator extends FilterIterator
+{
+    /**
+     * Create an instance of the locator iterator
+     * 
+     * Expects either a directory, or a DirectoryIterator (or its recursive variant) 
+     * instance.
+     * 
+     * @param  string|DirectoryIterator $dirOrIterator 
+     * @return void
+     */
+    public function __construct($dirOrIterator = '.')
+    {
+        if (is_string($dirOrIterator)) {
+            if (!is_dir($dirOrIterator)) {
+                throw new InvalidArgumentException('Expected a valid directory name');
+            }
+
+            $dirOrIterator = new RecursiveDirectoryIterator($dirOrIterator);
+        }
+        if (!$dirOrIterator instanceof DirectoryIterator) {
+            throw new InvalidArgumentException('Expected a DirectoryIterator');
+        }
+
+        if ($dirOrIterator instanceof RecursiveIterator) {
+            $iterator = new RecursiveIteratorIterator($dirOrIterator);
+        } else {
+            $iterator = $dirOrIterator;
+        }
+
+        parent::__construct($iterator);
+
+        // Forward-compat with PHP 5.3
+        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+            if (!defined('T_NAMESPACE')) {
+                define('T_NAMESPACE', 'namespace');
+            }
+            if (!defined('T_NS_SEPARATOR')) {
+                define('T_NS_SEPARATOR', '\\');
+            }
+        }
+    }
+
+    /**
+     * Filter for files containing PHP classes, interfaces, or abstracts
+     * 
+     * @return bool
+     */
+    public function accept()
+    {
+        $file = $this->getInnerIterator()->current();
+
+        // If we somehow have something other than an SplFileInfo object, just 
+        // return false
+        if (!$file instanceof SplFileInfo) {
+            return false;
+        }
+
+        // If we have a directory, it's not a file, so return false
+        if (!$file->isFile()) {
+            return false;
+        }
+
+        // If not a PHP file, skip
+        if ($file->getBasename('.php') == $file->getBasename()) {
+            return false;
+        }
+
+        $contents = file_get_contents($file->getRealPath());
+        $tokens   = token_get_all($contents);
+        $count    = count($tokens);
+        $i        = 0;
+        while ($i < $count) {
+            $token = $tokens[$i];
+
+            if (!is_array($token)) {
+                // single character token found; skip
+                $i++;
+                continue;
+            }
+
+            list($id, $content, $line) = $token;
+
+            switch ($id) {
+                case T_NAMESPACE:
+                    // Namespace found; grab it for later
+                    $namespace = '';
+                    $done      = false;
+                    do {
+                        ++$i;
+                        $token = $tokens[$i];
+                        if (is_string($token)) {
+                            if (';' === $token) {
+                                $done = true;
+                            }
+                            continue;
+                        }
+                        list($type, $content, $line) = $token;
+                        switch ($type) {
+                            case T_STRING:
+                            case T_NS_SEPARATOR:
+                                $namespace .= $content;
+                                break;
+                        }
+                    } while (!$done && $i < $count);
+
+                    // Set the namespace of this file in the object
+                    $file->namespace = $namespace;
+                    break;
+                case T_CLASS:
+                case T_INTERFACE:
+                    // Abstract class, class, or interface found
+
+                    // Get the classname
+                    $class = '';
+                    do {
+                        ++$i;
+                        $token = $tokens[$i];
+                        if (is_string($token)) {
+                            continue;
+                        }
+                        list($type, $content, $line) = $token;
+                        switch ($type) {
+                            case T_STRING:
+                                $class = $content;
+                                break;
+                        }
+                    } while (empty($class) && $i < $count);
+
+                    // If a classname was found, set it in the object, and 
+                    // return boolean true (found)
+                    if (!empty($class)) {
+                        $file->classname = $class;
+                        return true;
+                    }
+                    break;
+                default:
+                    break;
+            }
+            ++$i;
+        }
+
+        // No class-type tokens found; return false
+        return false;
+    }
+}