/** * Check if resource is available. * * @param ContainerInterface $container Current container. * @param LibraryDefinitionInterface $definition Current definition. * @param ResourceInterface $resource Current resource. * @throws UnavailableResourceException * @throws RuntimeException */ public function checkResourceAvailability(ContainerInterface $container, LibraryDefinitionInterface $definition, ResourceInterface $resource) { if ($this->options['check_availability']) { if ($resource instanceof FileResource && $this->options['check_availability']['file_resource']) { if (!@file_exists($resource->getSource())) { throw new UnavailableResourceException(sprintf('File resource "%s" does not exists.', $resource->getSource())); } if (!@is_file($resource->getSource())) { throw new UnavailableResourceException(sprintf('File resource "%s" is not file.', $resource->getSource())); } if (!@is_readable($resource->getSource())) { throw new UnavailableResourceException(sprintf('File resource "%s" is not readable.', $resource->getSource())); } } elseif ($resource instanceof GlobResource && $this->options['check_availability']['glob_resource']) { $files = $resource->getFiles(); if (count($files) == 0) { throw new InvalidArgumentException(sprintf('Glob resource "%s" yields no results.', $resource->getSource())); } foreach ($files as $file) { if (!@file_exists($file)) { throw new UnavailableResourceException(sprintf('Glob "%s" resulting file "%s" does not exists.', $resource->getSource(), $file)); } if (!@is_file($file)) { throw new UnavailableResourceException(sprintf('Glob "%s" result "%s" is not file.', $resource->getSource(), $file)); } if (!@is_readable($file)) { throw new UnavailableResourceException(sprintf('Glob "%s" resulting file "%s" is not readable.', $resource->getSource(), $file)); } } } elseif ($resource instanceof HttpResource && $this->options['check_availability']['http_resource']) { if (strpos($url = $resource->getSource(), '//') === 0) { $url = 'http:' . $url; } elseif (strpos($url, '://') === false) { throw new InvalidArgumentException(sprintf('Http resource "%s" is not valid.', $resource->getSource())); } if (@file_get_contents($url, false, stream_context_create(array('http' => array('method' => 'HEAD')))) === false) { throw new UnavailableResourceException(sprintf('Http resource "%s" is not available.', $resource->getSource())); } } elseif ($resource instanceof ReferenceResource && $this->options['check_availability']['reference_resource']) { if (!$container->getLibraries()->hasDefinition($resource->getSource())) { throw new UnavailableResourceException(sprintf('Reference resource "%s" references to non-existing library.', $resource->getSource())); } } elseif ($resource instanceof StringResource) { // Always available } else { throw new RuntimeException(sprintf('Unable to determine resource availability of instance of "%s".', get_class($resource))); } } }