View source
<?php
namespace Drupal\xautoload\ClassFinder;
use Drupal\xautoload\ClassLoader\AbstractClassLoader;
use Drupal\xautoload\DirectoryBehavior\DefaultDirectoryBehavior;
use Drupal\xautoload\DirectoryBehavior\Psr0DirectoryBehavior;
use Drupal\xautoload\Util;
class ClassFinder extends AbstractClassLoader implements ExtendedClassFinderInterface {
protected $classes = array();
protected $prefixMap;
protected $namespaceMap;
protected $defaultBehavior;
protected $psr0Behavior;
function __construct() {
$this->prefixMap = new GenericPrefixMap('_');
$this->namespaceMap = new GenericPrefixMap('\\');
$this->defaultBehavior = new DefaultDirectoryBehavior();
$this->psr0Behavior = new Psr0DirectoryBehavior();
}
function getPrefixMap() {
return $this->prefixMap;
}
function getNamespaceMap() {
return $this->namespaceMap;
}
function addClassMap(array $classMap) {
$this
->registerClasses($classMap);
}
function add($prefix, $paths) {
if (FALSE === strpos($prefix, '\\')) {
$logical_base_path = Util::prefixLogicalPath($prefix);
foreach ((array) $paths as $root_path) {
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->prefixMap
->registerDeepPath($logical_base_path, $deep_path, $this->defaultBehavior);
}
}
$logical_base_path = Util::namespaceLogicalPath($prefix);
foreach ((array) $paths as $root_path) {
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->namespaceMap
->registerDeepPath($logical_base_path, $deep_path, $this->psr0Behavior);
}
}
function addPsr0($prefix, $paths) {
$this
->add($prefix, $paths);
}
function addPsr4($prefix, $paths) {
$logical_base_path = Util::namespaceLogicalPath($prefix);
foreach ((array) $paths as $deep_path) {
$deep_path = strlen($deep_path) ? rtrim($deep_path, '/') . '/' : '';
$this->namespaceMap
->registerDeepPath($logical_base_path, $deep_path, $this->defaultBehavior);
}
}
function addNamespacePsr0($prefix, $paths) {
$logical_base_path = Util::namespaceLogicalPath($prefix);
foreach ((array) $paths as $root_path) {
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->namespaceMap
->registerDeepPath($logical_base_path, $deep_path, $this->psr0Behavior);
}
}
function addPear($prefix, $paths) {
$logical_base_path = Util::prefixLogicalPath($prefix);
foreach ((array) $paths as $root_path) {
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->prefixMap
->registerDeepPath($logical_base_path, $deep_path, $this->defaultBehavior);
}
}
function addPearFlat($prefix, $paths) {
$logical_base_path = Util::prefixLogicalPath($prefix);
foreach ((array) $paths as $deep_path) {
$deep_path = strlen($deep_path) ? rtrim($deep_path, '/') . '/' : '';
$this->prefixMap
->registerDeepPath($logical_base_path, $deep_path, $this->defaultBehavior);
}
}
function registerClass($class, $file_path) {
$this->classes[$class][$file_path] = TRUE;
}
function registerClasses($classes) {
foreach ($classes as $class => $file_path) {
$this->classes[$class][$file_path] = TRUE;
}
}
function registerPrefixRoot($prefix, $root_path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$logical_base_path = Util::prefixLogicalPath($prefix);
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->prefixMap
->registerDeepPath($logical_base_path, $deep_path, $behavior);
if (strlen($prefix)) {
$filepath = substr($deep_path, 0, -1) . '.php';
$this
->registerClass($prefix, $filepath);
}
}
function registerPrefixesRoot($map, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$deep_map = array();
foreach ($map as $prefix => $root_path) {
$logical_base_path = Util::prefixLogicalPath($prefix);
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$deep_map[$logical_base_path][$deep_path] = $behavior;
if (strlen($prefix)) {
$filepath = substr($deep_path, 0, -1) . '.php';
$this->classes[$prefix][$filepath] = TRUE;
}
}
$this->prefixMap
->registerDeepPaths($deep_map);
}
function registerPrefixDeep($prefix, $deep_path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$this
->registerPrefixDeepLocation($prefix, $deep_path, $behavior);
}
function registerPrefixesDeep($map, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$deep_map = array();
foreach ($map as $prefix => $deep_path) {
$logical_base_path = Util::prefixLogicalPath($prefix);
$deep_path = strlen($deep_path) ? rtrim($deep_path, '/') . '/' : '';
$deep_map[$logical_base_path][$deep_path] = $behavior;
}
$this->prefixMap
->registerDeepPaths($deep_map);
}
function registerPrefixDeepLocation($prefix, $deep_path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$logical_base_path = Util::prefixLogicalPath($prefix);
$deep_path = strlen($deep_path) ? rtrim($deep_path, '/') . '/' : '';
$this->prefixMap
->registerDeepPath($logical_base_path, $deep_path, $behavior);
}
function registerNamespaceRoot($namespace, $root_path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$logical_base_path = Util::namespaceLogicalPath($namespace);
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$this->namespaceMap
->registerDeepPath($logical_base_path, $deep_path, $behavior);
}
function registerNamespacesRoot($map, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$deep_map = array();
foreach ($map as $namespace => $root_path) {
$logical_base_path = Util::namespaceLogicalPath($namespace);
$deep_path = strlen($root_path) ? rtrim($root_path, '/') . '/' . $logical_base_path : $logical_base_path;
$deep_map[$logical_base_path][$deep_path] = $behavior;
}
$this->namespaceMap
->registerDeepPaths($deep_map);
}
function registerNamespaceDeep($namespace, $path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$logical_base_path = Util::namespaceLogicalPath($namespace);
$deep_path = strlen($path) ? $path . '/' : '';
$this->namespaceMap
->registerDeepPath($logical_base_path, $deep_path, $behavior);
}
function registerNamespacesDeep($map, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$deep_map = array();
foreach ($map as $namespace => $deep_path) {
$logical_base_path = Util::namespaceLogicalPath($namespace);
$deep_path = strlen($deep_path) ? rtrim($deep_path, '/') . '/' : '';
$deep_map[$logical_base_path][$deep_path] = $behavior;
}
$this->namespaceMap
->registerDeepPaths($deep_map);
}
function registerNamespaceDeepLocation($namespace, $path, $behavior = NULL) {
if (!isset($behavior)) {
$behavior = $this->defaultBehavior;
}
$namespace_path_fragment = Util::namespaceLogicalPath($namespace);
$deep_path = strlen($path) ? $path . '/' : '';
$this->namespaceMap
->registerDeepPath($namespace_path_fragment, $deep_path, $behavior);
}
function loadClass($class) {
if ('\\' === $class[0]) {
$class = substr($class, 1);
}
if (!empty($this->classes[$class])) {
foreach ($this->classes[$class] as $filepath => $true) {
if (file_exists($filepath)) {
require $filepath;
return TRUE;
}
}
}
if (FALSE !== ($pos = strrpos($class, '\\'))) {
$logical_path = str_replace('\\', '/', $class) . '.php';
return $this->namespaceMap
->loadClass($class, $logical_path, $pos);
}
$pear_logical_path = str_replace('_', '/', $class) . '.php';
while (FALSE !== ($pos = strrpos('/' . $pear_logical_path, '//'))) {
$pear_logical_path[$pos] = '_';
}
$pos = strrpos($pear_logical_path, '/');
return $this->prefixMap
->loadClass($class, $pear_logical_path, $pos);
}
function apiFindFile($api, $class) {
if ('\\' === $class[0]) {
$class = substr($class, 1);
}
if (!empty($this->classes[$class])) {
foreach ($this->classes[$class] as $filepath => $true) {
if ($api
->suggestFile($filepath)) {
return TRUE;
}
}
}
if (FALSE !== ($pos = strrpos($class, '\\'))) {
$logical_path = str_replace('\\', '/', $class) . '.php';
return $this->namespaceMap
->apiFindFile($api, $logical_path, $pos);
}
$pear_logical_path = str_replace('_', '/', $class) . '.php';
while (FALSE !== ($pos = strrpos('/' . $pear_logical_path, '//'))) {
$pear_logical_path[$pos] = '_';
}
$pos = strrpos($pear_logical_path, '/');
return $this->prefixMap
->apiFindFile($api, $pear_logical_path, $pos);
}
}