Version 1
[yaffs-website] / vendor / alchemy / zippy / src / Adapter / AbstractBinaryAdapter.php
diff --git a/vendor/alchemy/zippy/src/Adapter/AbstractBinaryAdapter.php b/vendor/alchemy/zippy/src/Adapter/AbstractBinaryAdapter.php
new file mode 100644 (file)
index 0000000..4ed40db
--- /dev/null
@@ -0,0 +1,240 @@
+<?php
+
+/*
+ * This file is part of Zippy.
+ *
+ * (c) Alchemy <info@alchemy.fr>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ */
+
+namespace Alchemy\Zippy\Adapter;
+
+use Alchemy\Zippy\Adapter\Resource\FileResource;
+use Alchemy\Zippy\Archive\MemberInterface;
+use Alchemy\Zippy\Exception\RuntimeException;
+use Alchemy\Zippy\Exception\InvalidArgumentException;
+use Alchemy\Zippy\Parser\ParserFactory;
+use Alchemy\Zippy\Parser\ParserInterface;
+use Alchemy\Zippy\ProcessBuilder\ProcessBuilderFactory;
+use Alchemy\Zippy\ProcessBuilder\ProcessBuilderFactoryInterface;
+use Alchemy\Zippy\Resource\ResourceManager;
+use Symfony\Component\Process\ExecutableFinder;
+use Symfony\Component\Process\ProcessBuilder;
+
+abstract class AbstractBinaryAdapter extends AbstractAdapter implements BinaryAdapterInterface
+{
+    /**
+     * The parser to use to parse command output
+     *
+     * @var ParserInterface
+     */
+    protected $parser;
+
+    /**
+     * The deflator process builder factory to use to build binary command line
+     *
+     * @var ProcessBuilderFactoryInterface
+     */
+    protected $deflator;
+
+    /**
+     * The inflator process builder factory to use to build binary command line
+     *
+     * @var ProcessBuilderFactoryInterface
+     */
+    protected $inflator;
+
+    /**
+     * Constructor
+     *
+     * @param ParserInterface $parser An output parser
+     * @param ResourceManager $manager A resource manager
+     * @param ProcessBuilderFactoryInterface $inflator A process builder factory for the inflator binary
+     * @param ProcessBuilderFactoryInterface $deflator A process builder factory for the deflator binary
+     */
+    public function __construct(
+        ParserInterface $parser,
+        ResourceManager $manager,
+        ProcessBuilderFactoryInterface $inflator,
+        ProcessBuilderFactoryInterface $deflator
+    ) {
+        $this->parser = $parser;
+        parent::__construct($manager);
+        $this->deflator = $deflator;
+        $this->inflator = $inflator;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getParser()
+    {
+        return $this->parser;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function setParser(ParserInterface $parser)
+    {
+        $this->parser = $parser;
+
+        return $this;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getDeflator()
+    {
+        return $this->deflator;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getInflator()
+    {
+        return $this->inflator;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function setDeflator(ProcessBuilderFactoryInterface $processBuilder)
+    {
+        $this->deflator = $processBuilder;
+
+        return $this;
+    }
+
+    public function setInflator(ProcessBuilderFactoryInterface $processBuilder)
+    {
+        $this->inflator = $processBuilder;
+
+        return $this;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getInflatorVersion()
+    {
+        $this->requireSupport();
+
+        return $this->doGetInflatorVersion();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getDeflatorVersion()
+    {
+        $this->requireSupport();
+
+        return $this->doGetDeflatorVersion();
+    }
+
+    /**
+     * Returns a new instance of the invoked adapter
+     *
+     * @param ExecutableFinder $finder
+     * @param ResourceManager  $manager
+     * @param string|null      $inflatorBinaryName The inflator binary name to use
+     * @param string|null      $deflatorBinaryName The deflator binary name to use
+     *
+     * @return AbstractBinaryAdapter
+     */
+    public static function newInstance(
+        ExecutableFinder $finder,
+        ResourceManager $manager,
+        $inflatorBinaryName = null,
+        $deflatorBinaryName = null
+    ) {
+        $inflator = $inflatorBinaryName instanceof ProcessBuilderFactoryInterface ? $inflatorBinaryName : self::findABinary($inflatorBinaryName,
+            static::getDefaultInflatorBinaryName(), $finder);
+        $deflator = $deflatorBinaryName instanceof ProcessBuilderFactoryInterface ? $deflatorBinaryName : self::findABinary($deflatorBinaryName,
+            static::getDefaultDeflatorBinaryName(), $finder);
+
+        try {
+            $outputParser = ParserFactory::create(static::getName());
+        } catch (InvalidArgumentException $e) {
+            throw new RuntimeException(sprintf(
+                'Failed to get a new instance of %s',
+                get_called_class()), $e->getCode(), $e
+            );
+        }
+
+        if (null === $inflator) {
+            throw new RuntimeException(sprintf('Unable to create the inflator'));
+        }
+
+        if (null === $deflator) {
+            throw new RuntimeException(sprintf('Unable to create the deflator'));
+        }
+
+        return new static($outputParser, $manager, $inflator, $deflator);
+    }
+
+    private static function findABinary($wish, array $defaults, ExecutableFinder $finder)
+    {
+        $possibles = $wish ? (array) $wish : $defaults;
+
+        $binary = null;
+
+        foreach ($possibles as $possible) {
+            if (null !== $found = $finder->find($possible)) {
+                $binary = new ProcessBuilderFactory($found);
+                break;
+            }
+        }
+
+        return $binary;
+    }
+
+    /**
+     * Adds files to argument list
+     *
+     * @param MemberInterface[]|\SplFileInfo[]|string[] $files   An array of files
+     * @param ProcessBuilder                            $builder A Builder instance
+     *
+     * @return bool
+     */
+    protected function addBuilderFileArgument(array $files, ProcessBuilder $builder)
+    {
+        $iterations = 0;
+
+        array_walk($files, function($file) use ($builder, &$iterations) {
+            $builder->add(
+                $file instanceof \SplFileInfo ?
+                    $file->getRealPath() : ($file instanceof MemberInterface ? $file->getLocation() : $file)
+            );
+
+            $iterations++;
+        });
+
+        return 0 !== $iterations;
+    }
+
+    protected function createResource($path)
+    {
+        return new FileResource($path);
+    }
+
+    /**
+     * Fetch the inflator version after having check that the current adapter is supported
+     *
+     * @return string
+     */
+    abstract protected function doGetInflatorVersion();
+
+    /**
+     * Fetch the Deflator version after having check that the current adapter is supported
+     *
+     * @return string
+     */
+    abstract protected function doGetDeflatorVersion();
+}