feeds_ex-8.x-1.0-alpha4/src/JmesRuntimeFactory.php
src/JmesRuntimeFactory.php
<?php namespace Drupal\feeds_ex; use Drupal\Component\Utility\Crypt; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\State\StateInterface; use JmesPath\AstRuntime; use JmesPath\CompilerRuntime; /** * Defines a factory for generating JMESPath runtime objects. */ class JmesRuntimeFactory implements JmesRuntimeFactoryInterface { /** * The file system. * * @var \Drupal\Core\File\FileSystemInterface */ protected FileSystemInterface $fileSystem; /** * The state key value store. * * @var \Drupal\Core\State\StateInterface */ protected StateInterface $state; /** * Constructs a new JmesRuntimeFactory object. * * @param \Drupal\Core\File\FileSystemInterface $file_system * The file system. * @param \Drupal\Core\State\StateInterface $state * The state key value store. */ public function __construct(FileSystemInterface $file_system, StateInterface $state) { $this->fileSystem = $file_system; $this->state = $state; } /** * {@inheritdoc} */ public function createRuntime($type = NULL) { switch ($type) { case static::AST: return $this->createAstRuntime(); case static::COMPILER: default: try { return $this->createCompilerRuntime($this->fileSystem->realpath($this->getCompileDirectory())); } catch (\RuntimeException $e) { // Fallback to AstRuntime if creating a CompilerRuntime failed. return $this->createRuntime(static::AST); } } } /** * Creates a runtime object of type \JmesPath\AstRuntime. */ public function createAstRuntime() { return new AstRuntime(); } /** * Creates a runtime object of type \JmesPath\CompilerRuntime. * * @param string $directory * The compile directory. */ public function createCompilerRuntime($directory) { return new CompilerRuntime($directory); } /** * Returns the compilation directory. * * @return string * The directory JmesPath uses to store generated code. */ protected function getCompileDirectory() { // Look for a previous directory. $directory = $this->state->get('feeds_ex_jmespath_compile_dir'); // The temp directory doesn't exist, or has moved. if (!$this->validateCompileDirectory($directory)) { $directory = $this->generateCompileDirectory(); $this->state->set('feeds_ex_jmespath_compile_dir', $directory); // Creates the directory with the correct perms. We don't check the // return value since if it didn't work, there's nothing we can do. We // just fallback to the AstRuntime anyway. $this->validateCompileDirectory($directory); } return $directory; } /** * Generates a directory path to store auto-generated PHP files. * * @return string * A temp directory path. */ protected function generateCompileDirectory() { $prefix = Crypt::randomBytesBase64(40); return 'temporary://' . $prefix . '_feeds_ex_jmespath_dir'; } /** * Validates that a compile directory exists and is valid. * * @param string $directory * A directory path. * * @return bool * True if the directory exists and is writable, false if not. */ protected function validateCompileDirectory($directory) { if (!$directory) { return FALSE; } return $this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS); } }