/**
  * @param string $namespace_prefix
  * @param string $namespace_url
  * @param string $component_name
  * @param ComponentsProviderInterface $components
  * @param int $code
  * @param Exception $previous
  */
 public function __construct($namespace_prefix, $namespace_url, $component_name, ComponentsProviderInterface $components, $code = 0, Exception $previous = null)
 {
     $known_components = $components->getNamespace($namespace_url)->getComponents();
     $known_components = implode(', ', array_map(function (ComponentDefinition $d) use($namespace_prefix) {
         return "<{$namespace_prefix}:{$d->getName()}>";
     }, $known_components));
     parent::__construct("Component not found in a registered namespace: <{$namespace_prefix}:{$component_name}>.\n" . "Known components in '{$namespace_url}' namespace: " . $known_components, $code, $previous);
 }
 /**
  * @param ComponentsProviderInterface $components
  * @return array [ $path => $contents ]
  */
 public function buildSchemas(ComponentsProviderInterface $components)
 {
     $schemas = [];
     foreach ($components->getNamespaces() as $namespace) {
         $url = parse_url($namespace->getUri());
         $path = $url['host'] . $url['path'];
         if (substr($path, -1) == '/') {
             $path .= 'schema.xsd';
         } else {
             $path .= '.xsd';
         }
         $schemas[$path] = $this->buildNamespaceSchema($namespace);
     }
     return $schemas;
 }
 /**
  * Checks if tag token is component and returns it's spec
  *
  * @param $token
  * @return array|bool [ $namespace_prefix, $namespace_url, $tag_name ] for valid components and false for non-component tokens
  *
  * @throws ParseException
  */
 protected function getComponentTagSpec($token)
 {
     if ($this->isNamespacedTag($token)) {
         list($prefix, $tag_name) = $this->parseNamespacedTagName($token);
         $stack_namespaces = $this->getStackNamespaceDeclarations();
         $tag_namespaces = $this->getNamespaceDeclarations($token);
         if (isset($tag_namespaces[$prefix]) || isset($stack_namespaces[$prefix])) {
             $namespace_url = isset($tag_namespaces[$prefix]) ? $tag_namespaces[$prefix] : $stack_namespaces[$prefix];
             if ($this->components->hasComponent($namespace_url, $tag_name)) {
                 return [$prefix, $namespace_url, $tag_name];
             } else {
                 throw new UnknownComponentException($prefix, $namespace_url, $tag_name, $this->components);
             }
         } else {
             trigger_error("No namespace declaration found for prefix: {$prefix}.", E_USER_NOTICE);
         }
     }
     return false;
 }