      1: <?php
      2: /**
      3:  * Copyright 2012-2014 Rackspace US, Inc.
      4:  *
      5:  * Licensed under the Apache License, Version 2.0 (the "License");
      6:  * you may not use this file except in compliance with the License.
      7:  * You may obtain a copy of the License at
      8:  *
      9:  * http://www.apache.org/licenses/LICENSE-2.0
     10:  *
     11:  * Unless required by applicable law or agreed to in writing, software
     12:  * distributed under the License is distributed on an "AS IS" BASIS,
     13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14:  * See the License for the specific language governing permissions and
     15:  * limitations under the License.
     16:  */
     17:
     18: namespace OpenCloud\ObjectStore\Upload;
     19:
     20: use Guzzle\Http\EntityBody;
     21: use OpenCloud\Common\Exceptions\InvalidArgumentError;
     22: use OpenCloud\ObjectStore\Resource\Container;
     23:
     24: /**
     25:  * Factory which creates Transfer objects, either ConcurrentTransfer or ConsecutiveTransfer.
     26:  */
     27: class TransferBuilder
     28: {
     29:     /**
     30:      * @var Container The container being uploaded to
     31:      */
     32:     protected $container;
     33:
     34:     /**
     35:      * @var EntityBody The data payload.
     36:      */
     37:     protected $entityBody;
     38:
     39:     /**
     40:      * @var array A key/value pair of options.
     41:      */
     42:     protected $options = array();
     43:
     44:     /**
     45:      * @return TransferBuilder
     46:      */
     47:     public static function newInstance()
     48:     {
     49:         return new self();
     50:     }
     51:
     52:     /**
     53:      * @param type $options Available configuration options:
     54:      *
     55:      * * `concurrency'    <bool>   The number of concurrent workers.
     56:      * * `partSize'       <int>    The size, in bytes, for the chunk
     57:      * * `doPartChecksum' <bool>   Enable or disable MD5 checksum in request (ETag)
     58:      *
     59:      * If you are uploading FooBar, its chunks will have the following naming structure:
     60:      *
     61:      * FooBar/1
     62:      * FooBar/2
     63:      * FooBar/3
     64:      *
     65:      * @return \OpenCloud\ObjectStore\Upload\UploadBuilder
     66:      */
     67:     public function setOptions($options)
     68:     {
     69:         $this->options = $options;
     70:
     71:         return $this;
     72:     }
     73:
     74:     /**
     75:      * @param $key   The option name
     76:      * @param $value The option value
     77:      * @return $this
     78:      */
     79:     public function setOption($key, $value)
     80:     {
     81:         $this->options[$key] = $value;
     82:
     83:         return $this;
     84:     }
     85:
     86:     /**
     87:      * @param Container $container
     88:      * @return $this
     89:      */
     90:     public function setContainer(Container $container)
     91:     {
     92:         $this->container = $container;
     93:
     94:         return $this;
     95:     }
     96:
     97:     /**
     98:      * @param EntityBody $entityBody
     99:      * @return $this
    100:      */
    101:     public function setEntityBody(EntityBody $entityBody)
    102:     {
    103:         $this->entityBody = $entityBody;
    104:
    105:         return $this;
    106:     }
    107:
    108:     /**
    109:      * Build the transfer.
    110:      *
    111:      * @return mixed
    112:      * @throws \OpenCloud\Common\Exceptions\InvalidArgumentError
    113:      */
    114:     public function build()
    115:     {
    116:         // Validate properties
    117:         if (!$this->container || !$this->entityBody || !$this->options['objectName']) {
    118:             throw new InvalidArgumentError('A container, entity body and object name must be set');
    119:         }
    120:
    121:         // Create TransferState object for later use
    122:         $transferState = TransferState::factory();
    123:
    124:         // Instantiate Concurrent-/ConsecutiveTransfer
    125:         $transferClass = isset($this->options['concurrency']) && $this->options['concurrency'] > 1
    126:             ? __NAMESPACE__ . '\\ConcurrentTransfer'
    127:             : __NAMESPACE__ . '\\ConsecutiveTransfer';
    128:
    129:         return $transferClass::newInstance()
    130:             ->setClient($this->container->getClient())
    131:             ->setEntityBody($this->entityBody)
    132:             ->setTransferState($transferState)
    133:             ->setOptions($this->options)
    134:             ->setOption('containerName', $this->container->getName())
    135:             ->setOption('containerUrl', $this->container->getUrl())
    136:             ->setup();
    137:     }
    138: }
    139: