/**
  * Process given remote resource, and if it is eligible for dynamic load, it is replaced with javascript
  * function for inclusion on client side.
  *
  * @param ResourceInterface $resource Resource to process.
  * @return ResourceInterface New resource with dynamic js code, or same resource if it is blacklisted.
  */
 private function processResource(ResourceInterface $resource)
 {
     $url = $resource->getSource();
     if (count($this->options['whitelist']) && !in_array($url, $this->options['whitelist']) || count($this->options['blacklist']) && in_array($url, $this->options['blacklist'])) {
         return $resource;
     }
     switch (AssetType::guessAssetType($url)) {
         case AssetType::JAVASCRIPT:
             return new JavascriptStringResource(sprintf(';(function(r){ r.DynamicAssetInclusion.loadJavascript(\'%s\'); })(RunOpenCode);', addslashes($url)));
             break;
         case AssetType::STYLESHEET:
             return new JavascriptStringResource(sprintf(';(function(r){ r.DynamicAssetInclusion.loadStylesheet(\'%s\', %s); })(RunOpenCode);', addslashes($url), isset($resource->getOptions()['media']) ? sprintf('\'%s\'', $resource->getOptions()['media']) : 'null'));
             break;
         default:
             throw new RuntimeException(sprintf('Unknown remote resource type with source "%s".', $resource->getSource()));
             break;
     }
 }
 /**
  * {@inheritdoc}
  */
 public function removeResource(ResourceInterface $resource)
 {
     $removalCount = 0;
     $this->resources = array_values(array_filter($this->resources, function ($item) use($resource, &$removalCount) {
         if ($item == $resource) {
             $removalCount++;
             return false;
         } else {
             return true;
         }
     }));
     if ($removalCount == 0) {
         throw new InvalidArgumentException(sprintf('Provided resource "%s" could not be removed since it does not exist in definition "%s".', $resource->getSource(), $this->getName()));
     }
     return $this;
 }
 /**
  * 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)));
         }
     }
 }
 /**
  * Calculates new file name for resource that will be dumped onto new location.
  *
  * @param ResourceInterface $resource Resource which will be dumped in new location.
  * @return string New file name.
  */
 private function calculateTargetFilename(ResourceInterface $resource)
 {
     if ($resource instanceof StringResource) {
         $filename = isset($resource->getOptions()['filename']) ? $resource->getOptions()['filename'] : $resource->getKey();
         if ($resource instanceof JavascriptStringResource) {
             $extension = AssetType::JAVASCRIPT;
         } elseif ($resource instanceof StylesheetStringResource) {
             $extension = AssetType::STYLESHEET;
         } else {
             throw new InvalidArgumentException(sprintf('Unable to determine resource type, instance of "%s" expected, "%s" given.', implode('", "', array('RunOpenCode\\AssetsInjection\\Resource\\JavascriptStringResource', 'RunOpenCode\\AssetsInjection\\Resource\\StylesheetStringResource')), get_class($resource)));
         }
     } else {
         $filename = pathinfo($resource->getSource(), PATHINFO_FILENAME);
         $extension = AssetType::guessAssetType($resource->getSource());
     }
     $environment = $this->options['development'] ? $this->options['development_environment_extension_suffix'] : $this->options['production_environment_extension_suffix'];
     return sprintf('%s%s%s%s', $resource->getKey() . '.', $filename . '.', $environment ? $environment . '.' : '', $extension);
 }