View source
<?php
namespace Drupal\xautoload\Phases;
use Drupal\xautoload\ClassFinder\ExtendedClassFinderInterface;
use Drupal\xautoload\ClassFinder\Plugin\DrupalExtensionNamespaceFinderPlugin;
use Drupal\xautoload\ClassFinder\Plugin\DrupalExtensionUnderscoreFinderPlugin;
use Drupal\xautoload\DrupalSystem\DrupalSystemInterface;
class ExtensionNamespaces implements PhaseObserverInterface {
private $finder;
private $queue = array();
private $registered = array();
private $system;
public function __construct(DrupalSystemInterface $system) {
$this->system = $system;
}
public function registerExtension($__FILE__) {
if (NULL === $this->finder) {
$this->queue[$__FILE__] = FALSE;
return;
}
$info = pathinfo($__FILE__);
$name = $info['filename'];
if (isset($this->registered[$name])) {
return;
}
$this
->_registerExtension($name, $info['dirname']);
}
public function registerExtensionPsr4($__FILE__, $subdir) {
if (NULL === $this->finder) {
$this->queue[$__FILE__] = $subdir;
return;
}
$info = pathinfo($__FILE__);
$name = $info['filename'];
if (isset($this->registered[$name])) {
if ('psr-4' === $this->registered[$name]) {
return;
}
$this->finder
->getNamespaceMap()
->unregisterDeepPath('Drupal/' . $name . '/', $name);
$this->finder
->getPrefixMap()
->unregisterDeepPath(str_replace('_', '/', $name) . '/', $name);
}
$this
->_registerExtensionPsr4($name, $info['dirname'], $subdir);
}
public function wakeUp(ExtendedClassFinderInterface $finder, array $extensions) {
$this->finder = $finder;
foreach ($this->queue as $__FILE__ => $subdir) {
$info = pathinfo($__FILE__);
$name = $info['filename'];
$dir = $info['dirname'];
if (FALSE === $subdir) {
$this
->_registerExtension($name, $dir);
}
else {
$this
->_registerExtensionPsr4($name, $dir, $subdir);
}
}
$extensions = array_diff_key($extensions, $this->registered);
$this
->_registerLazyExtensionPlugins($extensions);
}
public function enterBootPhase() {
}
public function enterMainPhase() {
}
public function welcomeNewExtension($name, $type) {
if (isset($this->registered[$name])) {
return;
}
$dir = $this->system
->drupalGetPath($type, $name);
$this
->_registerExtension($name, $dir);
}
public function modulesEnabled($modules) {
}
private function _registerExtension($name, $dir) {
if (is_dir($lib = $dir . '/lib')) {
$this->finder
->addPsr0('Drupal\\' . $name . '\\', $lib);
$this->finder
->addPearFlat($name . '_', $lib);
}
if (is_dir($src = $dir . '/src')) {
$this->finder
->addPsr4('Drupal\\' . $name . '\\', $src);
}
$this->registered[$name] = TRUE;
}
private function _registerExtensionPsr4($name, $dir, $subdir) {
$this->finder
->addPsr4('Drupal\\' . $name . '\\', $dir . '/' . $subdir);
if (is_dir($lib_tests = $dir . '/lib/Drupal/' . $name . '/Tests')) {
$this->finder
->addPsr0('Drupal\\' . $name . '\\Tests\\', $lib_tests);
}
$this->registered[$name] = 'psr-4';
}
private function _registerLazyExtensionPlugins(array $extensions) {
$namespaceBehaviors = array();
$prefixBehaviors = array();
foreach (array(
'module',
'theme',
) as $extension_type) {
$namespaceBehaviors[$extension_type] = new DrupalExtensionNamespaceFinderPlugin($extension_type, $this->finder
->getNamespaceMap(), $this->finder
->getPrefixMap(), $this->system);
$prefixBehaviors[$extension_type] = new DrupalExtensionUnderscoreFinderPlugin($extension_type, $this->finder
->getNamespaceMap(), $this->finder
->getPrefixMap(), $this->system);
}
$prefix_map = array();
$namespace_map = array();
foreach ($extensions as $name => $type) {
if (empty($namespaceBehaviors[$type])) {
continue;
}
if (!empty($this->registered[$name])) {
continue;
}
$namespace_map['Drupal/' . $name . '/'][$name] = $namespaceBehaviors[$type];
$prefix_map[str_replace('_', '/', $name) . '/'][$name] = $prefixBehaviors[$type];
$this->registered[$name] = TRUE;
}
$this->finder
->getNamespaceMap()
->registerDeepPaths($namespace_map);
$this->finder
->getPrefixMap()
->registerDeepPaths($prefix_map);
}
}