* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Neutron\TemporaryFilesystem; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Exception\IOException as SfIOException; class Manager implements TemporaryFilesystemInterface { /** @var Filesystem */ private $fs; /** @var TemporaryFilesystem */ private $tmpFs; /** @var array */ private $files = array(); const DEFAULT_SCOPE = '_tmp_fs_'; public function __construct(TemporaryFilesystemInterface $tmpFs, Filesystem $fs) { $this->fs = $fs; $this->tmpFs = $tmpFs; register_shutdown_function(array($this, 'clean'), null, false); } /** * {@inheritdoc} */ public function createEmptyFile($basePath, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) { $file = $this->tmpFs->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry); $this->add($file, $prefix); return $file; } /** * {@inheritdoc} */ public function createTemporaryDirectory($mode = 0777, $maxTry = 65536, $prefix = self::DEFAULT_SCOPE) { $dir = $this->tmpFs->createTemporaryDirectory($mode, $maxTry, $prefix); $this->add($dir, $prefix); return $dir; } /** * {@inheritdoc} */ public function createTemporaryFile($prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) { $file = $this->tmpFs->createTemporaryFile($prefix, $suffix, $extension, $maxTry); $this->add($file, $prefix); return $file; } /** * {@inheritdoc} */ public function createTemporaryFiles($quantity = 1, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) { $files = $this->tmpFs->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry); $this->add($files, $prefix); return $files; } /** * Adds file to be handled by the manager. * * @param string|array $files * @param string $scope * * @return Manager */ public function add($files, $scope = self::DEFAULT_SCOPE) { if (!is_array($files)) { $files = array($files); } if ('' === trim($scope)) { $scope = self::DEFAULT_SCOPE; } if (!isset($this->files[$scope])) { $this->files[$scope] = array(); } $this->files[$scope] = array_merge($this->files[$scope], $files); return $this; } /** * Removes all managed files in a scope. If no scope provided, all scopes * are cleared. * * @param string $scope * * @return Manager * * @throws IOException */ public function clean($scope = null, $throwException = true) { if (null !== $scope) { $this->cleanScope($scope, $throwException); } else { foreach ($this->files as $scope => $files) { $this->cleanScope($scope, $throwException); } } return $this; } /** * Factory for the Manager * * @return Manager */ public static function create() { $fs = new Filesystem(); return new static(new TemporaryFilesystem($fs), $fs); } private function cleanScope($scope, $throwException) { if (!isset($this->files[$scope])) { return; } try { $this->fs->remove($this->files[$scope]); unset($this->files[$scope]); } catch (SfIOException $e) { unset($this->files[$scope]); if ($throwException) { throw new IOException('Unable to remove all the files', $e->getCode(), $e); } } } }