4 * This file is part of Zippy.
6 * (c) Alchemy <info@alchemy.fr>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Alchemy\Zippy\Resource;
14 use Alchemy\Zippy\Exception\InvalidArgumentException;
15 use Alchemy\Zippy\Resource\Reader\Guzzle\GuzzleReaderFactory;
16 use Alchemy\Zippy\Resource\Reader\Guzzle\LegacyGuzzleReaderFactory;
17 use Alchemy\Zippy\Resource\Resource as ZippyResource;
18 use Alchemy\Zippy\Resource\Teleporter\GenericTeleporter;
19 use Alchemy\Zippy\Resource\Teleporter\LocalTeleporter;
20 use Alchemy\Zippy\Resource\Teleporter\StreamTeleporter;
21 use Alchemy\Zippy\Resource\Teleporter\TeleporterInterface;
22 use Alchemy\Zippy\Resource\Writer\FilesystemWriter;
23 use Symfony\Component\Filesystem\Filesystem;
26 * A container of TeleporterInterface
28 class TeleporterContainer implements \ArrayAccess, \Countable
31 * @var TeleporterInterface[]
33 private $teleporters = array();
38 private $factories = array();
41 * Returns the appropriate TeleporterInterface for a given Resource
43 * @param ZippyResource $resource
45 * @return TeleporterInterface
47 public function fromResource(ZippyResource $resource)
50 case is_resource($resource->getOriginal()):
51 $teleporter = 'stream-teleporter';
53 case is_string($resource->getOriginal()):
54 $data = parse_url($resource->getOriginal());
56 if (!isset($data['scheme']) || 'file' === $data['scheme']) {
57 $teleporter = 'local-teleporter';
58 } elseif (in_array($data['scheme'], array('http', 'https')) && isset($this->factories['guzzle-teleporter'])) {
59 $teleporter = 'guzzle-teleporter';
61 $teleporter = 'stream-teleporter';
65 throw new InvalidArgumentException('No teleporter found');
68 return $this->getTeleporter($teleporter);
71 private function getTeleporter($typeName)
73 if (!isset($this->teleporters[$typeName])) {
74 $factory = $this->factories[$typeName];
75 $this->teleporters[$typeName] = $factory();
78 return $this->teleporters[$typeName];
82 * Instantiates TeleporterContainer and register default teleporters
84 * @return TeleporterContainer
86 public static function load()
88 $container = new static();
90 $container->factories['stream-teleporter'] = function () {
91 return new StreamTeleporter();
94 $container->factories['local-teleporter'] = function () {
95 return new LocalTeleporter(new Filesystem());
98 if (class_exists('GuzzleHttp\Client')) {
99 $container->factories['guzzle-teleporter'] = function () {
100 return new GenericTeleporter(
101 new GuzzleReaderFactory(),
102 new FilesystemWriter(),
103 new ResourceLocator()
107 elseif (class_exists('Guzzle\Http\Client')) {
108 $container->factories['guzzle-teleporter'] = function () {
109 return new GenericTeleporter(
110 new LegacyGuzzleReaderFactory(),
111 new FilesystemWriter(),
112 new ResourceLocator()
121 * (PHP 5 >= 5.0.0)<br/>
122 * Whether a offset exists
124 * @link http://php.net/manual/en/arrayaccess.offsetexists.php
126 * @param mixed $offset <p>
127 * An offset to check for.
130 * @return bool true on success or false on failure.
133 * The return value will be casted to boolean if non-boolean was returned.
135 public function offsetExists($offset)
137 return isset($this->teleporters[$offset]);
141 * (PHP 5 >= 5.0.0)<br/>
143 * @link http://php.net/manual/en/arrayaccess.offsetget.php
144 * @param mixed $offset <p>
145 * The offset to retrieve.
147 * @return mixed Can return all value types.
149 public function offsetGet($offset)
151 return $this->getTeleporter($offset);
155 * (PHP 5 >= 5.0.0)<br/>
157 * @link http://php.net/manual/en/arrayaccess.offsetset.php
158 * @param mixed $offset <p>
159 * The offset to assign the value to.
161 * @param mixed $value <p>
166 public function offsetSet($offset, $value)
168 throw new \BadMethodCallException();
172 * (PHP 5 >= 5.0.0)<br/>
174 * @link http://php.net/manual/en/arrayaccess.offsetunset.php
175 * @param mixed $offset <p>
176 * The offset to unset.
180 public function offsetUnset($offset)
182 throw new \BadMethodCallException();
185 public function count()
187 return count($this->teleporters);