Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      0.00%  | 
      0 / 5  | 
      CRAP |         | 
      0.00%  | 
      0 / 32  | 
     
| AnnotatedClassDiscovery |         | 
      0.00%  | 
      0 / 1  | 
              | 
      0.00%  | 
      0 / 5  | 
      182 |         | 
      0.00%  | 
      0 / 32  | 
     
| __construct |         | 
      0.00%  | 
      0 / 1  | 
      2 |         | 
      0.00%  | 
      0 / 3  | 
     |||
| getAnnotationReader |         | 
      0.00%  | 
      0 / 1  | 
      6 |         | 
      0.00%  | 
      0 / 5  | 
     |||
| getDefinitions |         | 
      0.00%  | 
      0 / 1  | 
      72 |         | 
      0.00%  | 
      0 / 21  | 
     |||
| prepareAnnotationDefinition |         | 
      0.00%  | 
      0 / 1  | 
      2 |         | 
      0.00%  | 
      0 / 2  | 
     |||
| getPluginNamespaces |         | 
      0.00%  | 
      0 / 1  | 
      2 |         | 
      0.00%  | 
      0 / 1  | 
     |||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery. | |
| */ | |
| namespace Drupal\Component\Annotation\Plugin\Discovery; | |
| use Drupal\Component\Annotation\AnnotationInterface; | |
| use Drupal\Component\Plugin\Discovery\DiscoveryInterface; | |
| use Drupal\Component\Annotation\Reflection\MockFileFinder; | |
| use Doctrine\Common\Annotations\SimpleAnnotationReader; | |
| use Doctrine\Common\Annotations\AnnotationRegistry; | |
| use Doctrine\Common\Reflection\StaticReflectionParser; | |
| use Drupal\Component\Plugin\Discovery\DiscoveryTrait; | |
| /** | |
| * Defines a discovery mechanism to find annotated plugins in PSR-0 namespaces. | |
| */ | |
| class AnnotatedClassDiscovery implements DiscoveryInterface { | |
| use DiscoveryTrait; | |
| /** | |
| * The namespaces within which to find plugin classes. | |
| * | |
| * @var string[] | |
| */ | |
| protected $pluginNamespaces; | |
| /** | |
| * The name of the annotation that contains the plugin definition. | |
| * | |
| * The class corresponding to this name must implement | |
| * \Drupal\Component\Annotation\AnnotationInterface. | |
| * | |
| * @var string | |
| */ | |
| protected $pluginDefinitionAnnotationName; | |
| /** | |
| * The doctrine annotation reader. | |
| * | |
| * @var \Doctrine\Common\Annotations\Reader | |
| */ | |
| protected $annotationReader; | |
| /** | |
| * Constructs a new instance. | |
| * | |
| * @param string[] $plugin_namespaces | |
| * (optional) An array of namespace that may contain plugin implementations. | |
| * Defaults to an empty array. | |
| * @param string $plugin_definition_annotation_name | |
| * (optional) The name of the annotation that contains the plugin definition. | |
| * Defaults to 'Drupal\Component\Annotation\Plugin'. | |
| */ | |
| function __construct($plugin_namespaces = array(), $plugin_definition_annotation_name = 'Drupal\Component\Annotation\Plugin') { | |
| $this->pluginNamespaces = $plugin_namespaces; | |
| $this->pluginDefinitionAnnotationName = $plugin_definition_annotation_name; | |
| } | |
| /** | |
| * Gets the used doctrine annotation reader. | |
| * | |
| * @return \Doctrine\Common\Annotations\Reader | |
| * The annotation reader. | |
| */ | |
| protected function getAnnotationReader() { | |
| if (!isset($this->annotationReader)) { | |
| $this->annotationReader = new SimpleAnnotationReader(); | |
| // Add the namespaces from the main plugin annotation, like @EntityType. | |
| $namespace = substr($this->pluginDefinitionAnnotationName, 0, strrpos($this->pluginDefinitionAnnotationName, '\\')); | |
| $this->annotationReader->addNamespace($namespace); | |
| } | |
| return $this->annotationReader; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getDefinitions() { | |
| $definitions = array(); | |
| $reader = $this->getAnnotationReader(); | |
| // Clear the annotation loaders of any previous annotation classes. | |
| AnnotationRegistry::reset(); | |
| // Register the namespaces of classes that can be used for annotations. | |
| AnnotationRegistry::registerLoader('class_exists'); | |
| // Search for classes within all PSR-0 namespace locations. | |
| foreach ($this->getPluginNamespaces() as $namespace => $dirs) { | |
| foreach ($dirs as $dir) { | |
| if (file_exists($dir)) { | |
| $iterator = new \RecursiveIteratorIterator( | |
| new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS) | |
| ); | |
| foreach ($iterator as $fileinfo) { | |
| if ($fileinfo->getExtension() == 'php') { | |
| $sub_path = $iterator->getSubIterator()->getSubPath(); | |
| $sub_path = $sub_path ? str_replace(DIRECTORY_SEPARATOR, '\\', $sub_path) . '\\' : ''; | |
| $class = $namespace . '\\' . $sub_path . $fileinfo->getBasename('.php'); | |
| // The filename is already known, so there is no need to find the | |
| // file. However, StaticReflectionParser needs a finder, so use a | |
| // mock version. | |
| $finder = MockFileFinder::create($fileinfo->getPathName()); | |
| $parser = new StaticReflectionParser($class, $finder, TRUE); | |
| /** @var $annotation \Drupal\Component\Annotation\AnnotationInterface */ | |
| if ($annotation = $reader->getClassAnnotation($parser->getReflectionClass(), $this->pluginDefinitionAnnotationName)) { | |
| $this->prepareAnnotationDefinition($annotation, $class); | |
| $definitions[$annotation->getId()] = $annotation->get(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| // Don't let annotation loaders pile up. | |
| AnnotationRegistry::reset(); | |
| return $definitions; | |
| } | |
| /** | |
| * Prepares the annotation definition. | |
| * | |
| * @param \Drupal\Component\Annotation\AnnotationInterface $annotation | |
| * The annotation derived from the plugin. | |
| * @param string $class | |
| * The class used for the plugin. | |
| */ | |
| protected function prepareAnnotationDefinition(AnnotationInterface $annotation, $class) { | |
| $annotation->setClass($class); | |
| } | |
| /** | |
| * Gets an array of PSR-0 namespaces to search for plugin classes. | |
| * | |
| * @return string[] | |
| */ | |
| protected function getPluginNamespaces() { | |
| return $this->pluginNamespaces; | |
| } | |
| } |