Added the zend framework 2 library, the path is specified in line no.26 in zend_modul...
[openemr.git] / interface / modules / zend_modules / library / Zend / File / ClassFileLocator.php
blobb4d93fe139671732e7467b25f79d66ea98e41267
1 <?php
2 /**
3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
8 */
10 namespace Zend\File;
12 use DirectoryIterator;
13 use FilterIterator;
14 use RecursiveDirectoryIterator;
15 use RecursiveIterator;
16 use RecursiveIteratorIterator;
17 use SplFileInfo;
19 /**
20 * Locate files containing PHP classes, interfaces, abstracts or traits
22 class ClassFileLocator extends FilterIterator
24 /**
25 * Create an instance of the locator iterator
27 * Expects either a directory, or a DirectoryIterator (or its recursive variant)
28 * instance.
30 * @param string|DirectoryIterator $dirOrIterator
31 * @throws Exception\InvalidArgumentException
33 public function __construct($dirOrIterator = '.')
35 if (is_string($dirOrIterator)) {
36 if (!is_dir($dirOrIterator)) {
37 throw new Exception\InvalidArgumentException('Expected a valid directory name');
40 $dirOrIterator = new RecursiveDirectoryIterator($dirOrIterator, RecursiveDirectoryIterator::FOLLOW_SYMLINKS);
41 } elseif (!$dirOrIterator instanceof DirectoryIterator) {
42 throw new Exception\InvalidArgumentException('Expected a DirectoryIterator');
45 if ($dirOrIterator instanceof RecursiveIterator) {
46 $dirOrIterator = new RecursiveIteratorIterator($dirOrIterator);
49 parent::__construct($dirOrIterator);
50 $this->setInfoClass('Zend\File\PhpClassFile');
53 /**
54 * Filter for files containing PHP classes, interfaces, or abstracts
56 * @return bool
58 public function accept()
60 $file = $this->getInnerIterator()->current();
61 // If we somehow have something other than an SplFileInfo object, just
62 // return false
63 if (!$file instanceof SplFileInfo) {
64 return false;
67 // If we have a directory, it's not a file, so return false
68 if (!$file->isFile()) {
69 return false;
72 // If not a PHP file, skip
73 if ($file->getBasename('.php') == $file->getBasename()) {
74 return false;
77 $contents = file_get_contents($file->getRealPath());
78 $tokens = token_get_all($contents);
79 $count = count($tokens);
80 $t_trait = defined('T_TRAIT') ? T_TRAIT : -1; // For preserve PHP 5.3 compatibility
81 for ($i = 0; $i < $count; $i++) {
82 $token = $tokens[$i];
83 if (!is_array($token)) {
84 // single character token found; skip
85 $i++;
86 continue;
88 switch ($token[0]) {
89 case T_NAMESPACE:
90 // Namespace found; grab it for later
91 $namespace = '';
92 for ($i++; $i < $count; $i++) {
93 $token = $tokens[$i];
94 if (is_string($token)) {
95 if (';' === $token) {
96 $saveNamespace = false;
97 break;
99 if ('{' === $token) {
100 $saveNamespace = true;
101 break;
103 continue;
105 list($type, $content, $line) = $token;
106 switch ($type) {
107 case T_STRING:
108 case T_NS_SEPARATOR:
109 $namespace .= $content;
110 break;
113 if ($saveNamespace) {
114 $savedNamespace = $namespace;
116 break;
117 case $t_trait:
118 case T_CLASS:
119 case T_INTERFACE:
120 // Abstract class, class, interface or trait found
122 // Get the classname
123 for ($i++; $i < $count; $i++) {
124 $token = $tokens[$i];
125 if (is_string($token)) {
126 continue;
128 list($type, $content, $line) = $token;
129 if (T_STRING == $type) {
130 // If a classname was found, set it in the object, and
131 // return boolean true (found)
132 if (!isset($namespace) || null === $namespace) {
133 if (isset($saveNamespace) && $saveNamespace) {
134 $namespace = $savedNamespace;
135 } else {
136 $namespace = null;
140 $class = (null === $namespace) ? $content : $namespace . '\\' . $content;
141 $file->addClass($class);
142 if ($namespace) {
143 $file->addNamespace($namespace);
145 $namespace = null;
146 break;
149 break;
150 default:
151 break;
154 $classes = $file->getClasses();
155 if (!empty($classes)) {
156 return true;
158 // No class-type tokens found; return false
159 return false;