Overview
  • Namespace
  • Class

Namespaces

  • OpenCloud
    • Autoscale
      • Resource
    • CDN
      • Resource
    • CloudMonitoring
      • Collection
      • Exception
      • Resource
    • Common
      • Collection
      • Constants
      • Exceptions
      • Http
        • Message
      • Log
      • Resource
      • Service
    • Compute
      • Constants
      • Exception
      • Resource
    • Database
      • Resource
    • DNS
      • Collection
      • Resource
    • Identity
      • Constants
      • Resource
    • Image
      • Enum
      • Resource
        • JsonPatch
        • Schema
    • LoadBalancer
      • Collection
      • Enum
      • Resource
    • Networking
      • Resource
    • ObjectStore
      • Constants
      • Enum
      • Exception
      • Resource
      • Upload
    • Orchestration
      • Resource
    • Queues
      • Collection
      • Exception
      • Resource
    • Volume
      • Resource

Classes

  • OpenCloud\Autoscale\Resource\AbstractResource
  • OpenCloud\Autoscale\Resource\Group
  • OpenCloud\Autoscale\Resource\GroupConfiguration
  • OpenCloud\Autoscale\Resource\LaunchConfiguration
  • OpenCloud\Autoscale\Resource\ScalingPolicy
  • OpenCloud\Autoscale\Resource\Webhook
  • OpenCloud\Autoscale\Service
  • OpenCloud\CDN\Resource\Flavor
  • OpenCloud\CDN\Resource\Service
  • OpenCloud\CDN\Service
  • OpenCloud\CloudMonitoring\Collection\MonitoringIterator
  • OpenCloud\CloudMonitoring\Resource\AbstractResource
  • OpenCloud\CloudMonitoring\Resource\Agent
  • OpenCloud\CloudMonitoring\Resource\AgentConnection
  • OpenCloud\CloudMonitoring\Resource\AgentHost
  • OpenCloud\CloudMonitoring\Resource\AgentHostInfo
  • OpenCloud\CloudMonitoring\Resource\AgentTarget
  • OpenCloud\CloudMonitoring\Resource\AgentToken
  • OpenCloud\CloudMonitoring\Resource\Alarm
  • OpenCloud\CloudMonitoring\Resource\Changelog
  • OpenCloud\CloudMonitoring\Resource\Check
  • OpenCloud\CloudMonitoring\Resource\CheckType
  • OpenCloud\CloudMonitoring\Resource\Entity
  • OpenCloud\CloudMonitoring\Resource\Metric
  • OpenCloud\CloudMonitoring\Resource\MetricDataPoint
  • OpenCloud\CloudMonitoring\Resource\Notification
  • OpenCloud\CloudMonitoring\Resource\NotificationHistory
  • OpenCloud\CloudMonitoring\Resource\NotificationPlan
  • OpenCloud\CloudMonitoring\Resource\NotificationType
  • OpenCloud\CloudMonitoring\Resource\ReadOnlyResource
  • OpenCloud\CloudMonitoring\Resource\View
  • OpenCloud\CloudMonitoring\Resource\Zone
  • OpenCloud\CloudMonitoring\Service
  • OpenCloud\Common\ArrayAccess
  • OpenCloud\Common\Base
  • OpenCloud\Common\Collection
  • OpenCloud\Common\Collection\ArrayCollection
  • OpenCloud\Common\Collection\PaginatedIterator
  • OpenCloud\Common\Collection\ResourceIterator
  • OpenCloud\Common\Constants\Datetime
  • OpenCloud\Common\Constants\Header
  • OpenCloud\Common\Constants\Mime
  • OpenCloud\Common\Constants\Service
  • OpenCloud\Common\Constants\Size
  • OpenCloud\Common\Constants\State
  • OpenCloud\Common\Http\Client
  • OpenCloud\Common\Http\Message\Formatter
  • OpenCloud\Common\Http\Message\RequestSubscriber
  • OpenCloud\Common\Lang
  • OpenCloud\Common\Log\Logger
  • OpenCloud\Common\Metadata
  • OpenCloud\Common\PersistentObject
  • OpenCloud\Common\Resource\BaseResource
  • OpenCloud\Common\Resource\NovaResource
  • OpenCloud\Common\Resource\PersistentResource
  • OpenCloud\Common\Resource\ReadOnlyResource
  • OpenCloud\Common\Service\AbstractService
  • OpenCloud\Common\Service\Catalog
  • OpenCloud\Common\Service\CatalogItem
  • OpenCloud\Common\Service\CatalogService
  • OpenCloud\Common\Service\Endpoint
  • OpenCloud\Common\Service\NovaService
  • OpenCloud\Common\Service\ServiceBuilder
  • OpenCloud\Compute\Constants\ImageState
  • OpenCloud\Compute\Constants\Network
  • OpenCloud\Compute\Constants\ServerState
  • OpenCloud\Compute\Resource\Flavor
  • OpenCloud\Compute\Resource\Image
  • OpenCloud\Compute\Resource\KeyPair
  • OpenCloud\Compute\Resource\Network
  • OpenCloud\Compute\Resource\Server
  • OpenCloud\Compute\Resource\ServerMetadata
  • OpenCloud\Compute\Resource\VolumeAttachment
  • OpenCloud\Compute\Service
  • OpenCloud\Database\Resource\Backup
  • OpenCloud\Database\Resource\Configuration
  • OpenCloud\Database\Resource\Database
  • OpenCloud\Database\Resource\Datastore
  • OpenCloud\Database\Resource\DatastoreVersion
  • OpenCloud\Database\Resource\Instance
  • OpenCloud\Database\Resource\User
  • OpenCloud\Database\Service
  • OpenCloud\DNS\Collection\DnsIterator
  • OpenCloud\DNS\Resource\AbstractResource
  • OpenCloud\DNS\Resource\AsyncResponse
  • OpenCloud\DNS\Resource\Domain
  • OpenCloud\DNS\Resource\PtrRecord
  • OpenCloud\DNS\Resource\Record
  • OpenCloud\DNS\Resource\Subdomain
  • OpenCloud\DNS\Service
  • OpenCloud\Identity\Constants\User
  • OpenCloud\Identity\Resource\Role
  • OpenCloud\Identity\Resource\Tenant
  • OpenCloud\Identity\Resource\Token
  • OpenCloud\Identity\Resource\User
  • OpenCloud\Identity\Service
  • OpenCloud\Image\Enum\Document
  • OpenCloud\Image\Enum\MemberStatus
  • OpenCloud\Image\Enum\OperationType
  • OpenCloud\Image\Enum\Schema
  • OpenCloud\Image\Resource\AbstractSchemaResource
  • OpenCloud\Image\Resource\Image
  • OpenCloud\Image\Resource\JsonPatch\Document
  • OpenCloud\Image\Resource\JsonPatch\Encoder
  • OpenCloud\Image\Resource\JsonPatch\Operation
  • OpenCloud\Image\Resource\Member
  • OpenCloud\Image\Resource\Schema\AbstractSchemaItem
  • OpenCloud\Image\Resource\Schema\Property
  • OpenCloud\Image\Resource\Schema\Schema
  • OpenCloud\Image\Service
  • OpenCloud\LoadBalancer\Collection\LoadBalancerIterator
  • OpenCloud\LoadBalancer\Enum\IpType
  • OpenCloud\LoadBalancer\Enum\NodeCondition
  • OpenCloud\LoadBalancer\Enum\NodeType
  • OpenCloud\LoadBalancer\Resource\AbstractResource
  • OpenCloud\LoadBalancer\Resource\Access
  • OpenCloud\LoadBalancer\Resource\Algorithm
  • OpenCloud\LoadBalancer\Resource\AllowedDomain
  • OpenCloud\LoadBalancer\Resource\CertificateMapping
  • OpenCloud\LoadBalancer\Resource\ConnectionLogging
  • OpenCloud\LoadBalancer\Resource\ConnectionThrottle
  • OpenCloud\LoadBalancer\Resource\ContentCaching
  • OpenCloud\LoadBalancer\Resource\ErrorPage
  • OpenCloud\LoadBalancer\Resource\HealthMonitor
  • OpenCloud\LoadBalancer\Resource\LoadBalancer
  • OpenCloud\LoadBalancer\Resource\Metadata
  • OpenCloud\LoadBalancer\Resource\Node
  • OpenCloud\LoadBalancer\Resource\NodeEvent
  • OpenCloud\LoadBalancer\Resource\NonIdUriResource
  • OpenCloud\LoadBalancer\Resource\Protocol
  • OpenCloud\LoadBalancer\Resource\ReadOnlyResource
  • OpenCloud\LoadBalancer\Resource\SessionPersistence
  • OpenCloud\LoadBalancer\Resource\SSLTermination
  • OpenCloud\LoadBalancer\Resource\Stats
  • OpenCloud\LoadBalancer\Resource\UsageRecord
  • OpenCloud\LoadBalancer\Resource\VirtualIp
  • OpenCloud\LoadBalancer\Service
  • OpenCloud\Networking\Resource\Network
  • OpenCloud\Networking\Resource\Port
  • OpenCloud\Networking\Resource\SecurityGroup
  • OpenCloud\Networking\Resource\SecurityGroupRule
  • OpenCloud\Networking\Resource\Subnet
  • OpenCloud\Networking\Service
  • OpenCloud\ObjectStore\AbstractService
  • OpenCloud\ObjectStore\CDNService
  • OpenCloud\ObjectStore\Constants\Header
  • OpenCloud\ObjectStore\Constants\UrlType
  • OpenCloud\ObjectStore\Enum\ReturnType
  • OpenCloud\ObjectStore\Resource\AbstractContainer
  • OpenCloud\ObjectStore\Resource\AbstractResource
  • OpenCloud\ObjectStore\Resource\Account
  • OpenCloud\ObjectStore\Resource\CDNContainer
  • OpenCloud\ObjectStore\Resource\Container
  • OpenCloud\ObjectStore\Resource\ContainerMetadata
  • OpenCloud\ObjectStore\Resource\DataObject
  • OpenCloud\ObjectStore\Service
  • OpenCloud\ObjectStore\Upload\AbstractTransfer
  • OpenCloud\ObjectStore\Upload\ConcurrentTransfer
  • OpenCloud\ObjectStore\Upload\ConsecutiveTransfer
  • OpenCloud\ObjectStore\Upload\ContainerMigration
  • OpenCloud\ObjectStore\Upload\DirectorySync
  • OpenCloud\ObjectStore\Upload\TransferBuilder
  • OpenCloud\ObjectStore\Upload\TransferPart
  • OpenCloud\ObjectStore\Upload\TransferState
  • OpenCloud\OpenStack
  • OpenCloud\Orchestration\Resource\BuildInfo
  • OpenCloud\Orchestration\Resource\Event
  • OpenCloud\Orchestration\Resource\Resource
  • OpenCloud\Orchestration\Resource\ResourceType
  • OpenCloud\Orchestration\Resource\Stack
  • OpenCloud\Orchestration\Service
  • OpenCloud\Queues\Collection\MessageIterator
  • OpenCloud\Queues\Resource\Claim
  • OpenCloud\Queues\Resource\Message
  • OpenCloud\Queues\Resource\Queue
  • OpenCloud\Queues\Service
  • OpenCloud\Rackspace
  • OpenCloud\Version
  • OpenCloud\Volume\Resource\Snapshot
  • OpenCloud\Volume\Resource\Volume
  • OpenCloud\Volume\Resource\VolumeType
  • OpenCloud\Volume\Service

Interfaces

  • OpenCloud\Common\Service\ServiceInterface
  • OpenCloud\DNS\Resource\HasPtrRecordsInterface
  • OpenCloud\Image\Resource\ImageInterface
  • OpenCloud\Networking\Resource\NetworkInterface

Exceptions

  • OpenCloud\CloudMonitoring\Exception\AgentException
  • OpenCloud\CloudMonitoring\Exception\AlarmException
  • OpenCloud\CloudMonitoring\Exception\CheckException
  • OpenCloud\CloudMonitoring\Exception\CloudMonitoringException
  • OpenCloud\CloudMonitoring\Exception\EntityException
  • OpenCloud\CloudMonitoring\Exception\MetricException
  • OpenCloud\CloudMonitoring\Exception\NotificationHistoryException
  • OpenCloud\CloudMonitoring\Exception\NotificationPlanException
  • OpenCloud\CloudMonitoring\Exception\ServiceException
  • OpenCloud\CloudMonitoring\Exception\TestException
  • OpenCloud\CloudMonitoring\Exception\ZoneException
  • OpenCloud\Common\Exceptions\AsyncError
  • OpenCloud\Common\Exceptions\AsyncHttpError
  • OpenCloud\Common\Exceptions\AsyncTimeoutError
  • OpenCloud\Common\Exceptions\AttributeError
  • OpenCloud\Common\Exceptions\AuthenticationError
  • OpenCloud\Common\Exceptions\BackupInstanceError
  • OpenCloud\Common\Exceptions\BackupNameError
  • OpenCloud\Common\Exceptions\BaseException
  • OpenCloud\Common\Exceptions\CdnError
  • OpenCloud\Common\Exceptions\CdnHttpError
  • OpenCloud\Common\Exceptions\CdnNotAvailableError
  • OpenCloud\Common\Exceptions\CdnTtlError
  • OpenCloud\Common\Exceptions\CollectionException
  • OpenCloud\Common\Exceptions\ContainerCreateError
  • OpenCloud\Common\Exceptions\ContainerDeleteError
  • OpenCloud\Common\Exceptions\ContainerError
  • OpenCloud\Common\Exceptions\ContainerNameError
  • OpenCloud\Common\Exceptions\ContainerNotEmptyError
  • OpenCloud\Common\Exceptions\ContainerNotFoundError
  • OpenCloud\Common\Exceptions\CreateError
  • OpenCloud\Common\Exceptions\CreateUpdateError
  • OpenCloud\Common\Exceptions\CredentialError
  • OpenCloud\Common\Exceptions\DatabaseCreateError
  • OpenCloud\Common\Exceptions\DatabaseDeleteError
  • OpenCloud\Common\Exceptions\DatabaseListError
  • OpenCloud\Common\Exceptions\DatabaseNameError
  • OpenCloud\Common\Exceptions\DatabaseUpdateError
  • OpenCloud\Common\Exceptions\DeleteError
  • OpenCloud\Common\Exceptions\DocumentError
  • OpenCloud\Common\Exceptions\DomainError
  • OpenCloud\Common\Exceptions\DomainNotFoundException
  • OpenCloud\Common\Exceptions\EmptyResponseError
  • OpenCloud\Common\Exceptions\EndpointError
  • OpenCloud\Common\Exceptions\FlavorError
  • OpenCloud\Common\Exceptions\ForbiddenOperationException
  • OpenCloud\Common\Exceptions\HttpError
  • OpenCloud\Common\Exceptions\HttpForbiddenError
  • OpenCloud\Common\Exceptions\HttpOverLimitError
  • OpenCloud\Common\Exceptions\HttpResponseException
  • OpenCloud\Common\Exceptions\HttpRetryError
  • OpenCloud\Common\Exceptions\HttpTimeoutError
  • OpenCloud\Common\Exceptions\HttpUnauthorizedError
  • OpenCloud\Common\Exceptions\HttpUrlError
  • OpenCloud\Common\Exceptions\IdRequiredError
  • OpenCloud\Common\Exceptions\ImageError
  • OpenCloud\Common\Exceptions\InstanceCreateError
  • OpenCloud\Common\Exceptions\InstanceDeleteError
  • OpenCloud\Common\Exceptions\InstanceError
  • OpenCloud\Common\Exceptions\InstanceFlavorError
  • OpenCloud\Common\Exceptions\InstanceNotFound
  • OpenCloud\Common\Exceptions\InstanceUpdateError
  • OpenCloud\Common\Exceptions\InvalidArgumentError
  • OpenCloud\Common\Exceptions\InvalidIdTypeError
  • OpenCloud\Common\Exceptions\InvalidIpTypeError
  • OpenCloud\Common\Exceptions\InvalidParameterError
  • OpenCloud\Common\Exceptions\InvalidRequestError
  • OpenCloud\Common\Exceptions\InvalidTemplateError
  • OpenCloud\Common\Exceptions\IOError
  • OpenCloud\Common\Exceptions\JsonError
  • OpenCloud\Common\Exceptions\LoggingException
  • OpenCloud\Common\Exceptions\MetadataCreateError
  • OpenCloud\Common\Exceptions\MetadataDeleteError
  • OpenCloud\Common\Exceptions\MetadataError
  • OpenCloud\Common\Exceptions\MetadataJsonError
  • OpenCloud\Common\Exceptions\MetadataKeyError
  • OpenCloud\Common\Exceptions\MetadataPrefixError
  • OpenCloud\Common\Exceptions\MetadataUpdateError
  • OpenCloud\Common\Exceptions\MisMatchedChecksumError
  • OpenCloud\Common\Exceptions\MissingValueError
  • OpenCloud\Common\Exceptions\NameError
  • OpenCloud\Common\Exceptions\NetworkCreateError
  • OpenCloud\Common\Exceptions\NetworkDeleteError
  • OpenCloud\Common\Exceptions\NetworkError
  • OpenCloud\Common\Exceptions\NetworkUpdateError
  • OpenCloud\Common\Exceptions\NetworkUrlError
  • OpenCloud\Common\Exceptions\NoContentTypeError
  • OpenCloud\Common\Exceptions\NoNameError
  • OpenCloud\Common\Exceptions\ObjectCopyError
  • OpenCloud\Common\Exceptions\ObjectError
  • OpenCloud\Common\Exceptions\ObjFetchError
  • OpenCloud\Common\Exceptions\RebuildError
  • OpenCloud\Common\Exceptions\RecordTypeError
  • OpenCloud\Common\Exceptions\ResourceBucketException
  • OpenCloud\Common\Exceptions\ResourceNotFoundException
  • OpenCloud\Common\Exceptions\RuntimeException
  • OpenCloud\Common\Exceptions\ServerActionError
  • OpenCloud\Common\Exceptions\ServerCreateError
  • OpenCloud\Common\Exceptions\ServerDeleteError
  • OpenCloud\Common\Exceptions\ServerImageScheduleError
  • OpenCloud\Common\Exceptions\ServerIpsError
  • OpenCloud\Common\Exceptions\ServerJsonError
  • OpenCloud\Common\Exceptions\ServerUpdateError
  • OpenCloud\Common\Exceptions\ServerUrlError
  • OpenCloud\Common\Exceptions\ServiceException
  • OpenCloud\Common\Exceptions\SnapshotError
  • OpenCloud\Common\Exceptions\TempUrlMethodError
  • OpenCloud\Common\Exceptions\UnknownError
  • OpenCloud\Common\Exceptions\UnknownParameterError
  • OpenCloud\Common\Exceptions\UnrecognizedServiceError
  • OpenCloud\Common\Exceptions\UnsupportedExtensionError
  • OpenCloud\Common\Exceptions\UnsupportedFeatureExtension
  • OpenCloud\Common\Exceptions\UnsupportedVersionError
  • OpenCloud\Common\Exceptions\UpdateError
  • OpenCloud\Common\Exceptions\UrlError
  • OpenCloud\Common\Exceptions\UserCreateError
  • OpenCloud\Common\Exceptions\UserDeleteError
  • OpenCloud\Common\Exceptions\UserListError
  • OpenCloud\Common\Exceptions\UserNameError
  • OpenCloud\Common\Exceptions\UserUpdateError
  • OpenCloud\Common\Exceptions\VolumeError
  • OpenCloud\Common\Exceptions\VolumeTypeError
  • OpenCloud\Compute\Exception\KeyPairException
  • OpenCloud\ObjectStore\Exception\BulkOperationException
  • OpenCloud\ObjectStore\Exception\ContainerException
  • OpenCloud\ObjectStore\Exception\ObjectNotEmptyException
  • OpenCloud\ObjectStore\Exception\ObjectNotFoundException
  • OpenCloud\ObjectStore\Exception\StreamException
  • OpenCloud\ObjectStore\Exception\UploadException
  • OpenCloud\Queues\Exception\DeleteMessageException
  • OpenCloud\Queues\Exception\MessageException
  • OpenCloud\Queues\Exception\QueueException
  • OpenCloud\Queues\Exception\QueueMetadataException
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 
<?php
/**
 * Copyright 2012-2014 Rackspace US, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace OpenCloud\ObjectStore\Upload;

use Guzzle\Http\Message\Response;
use Guzzle\Http\Url;
use OpenCloud\Common\Constants\Header;

/**
 * Represents an individual part of the EntityBody being uploaded.
 *
 * @codeCoverageIgnore
 */
class TransferPart
{
    /**
     * @var int Its position in the upload queue.
     */
    protected $partNumber;

    /**
     * @var string This upload's ETag checksum.
     */
    protected $eTag;

    /**
     * @var int The length of this upload in bytes.
     */
    protected $contentLength;

    /**
     * @var string The API path of this upload.
     */
    protected $path;

    /**
     * @param int $contentLength
     * @return $this
     */
    public function setContentLength($contentLength)
    {
        $this->contentLength = $contentLength;

        return $this;
    }

    /**
     * @return int
     */
    public function getContentLength()
    {
        return $this->contentLength;
    }

    /**
     * @param  string $etag
     * @return $this
     */
    public function setETag($etag)
    {
        $this->etag = $etag;

        return $this;
    }

    /**
     * @return string
     */
    public function getETag()
    {
        return $this->etag;
    }

    /**
     * @param int $partNumber
     * @return $this
     */
    public function setPartNumber($partNumber)
    {
        $this->partNumber = $partNumber;

        return $this;
    }

    /**
     * @return int
     */
    public function getPartNumber()
    {
        return $this->partNumber;
    }

    /**
     * @param $path
     * @return $this
     */
    public function setPath($path)
    {
        $this->path = $path;

        return $this;
    }

    /**
     * @return string
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * Create the request needed for this upload to the API.
     *
     * @param EntityBody $part    The entity body being uploaded
     * @param int        $number  Its number/position, needed for name
     * @param OpenStack  $client  Client responsible for issuing requests
     * @param array      $options Set by the Transfer object
     * @return OpenCloud\Common\Http\Request
     */
    public static function createRequest($part, $number, $client, $options)
    {
        $name = sprintf('%s/%s/%d', $options['objectName'], $options['prefix'], $number);
        $url = clone $options['containerUrl'];
        $url->addPath($name);

        $headers = array(
            Header::CONTENT_LENGTH => $part->getContentLength(),
            Header::CONTENT_TYPE   => $part->getContentType()
        );

        if ($options['doPartChecksum'] === true) {
            $headers['ETag'] = $part->getContentMd5();
        }

        $request = $client->put($url, $headers, $part);

        if (isset($options['progress'])) {
            $request->getCurlOptions()->add('progress', true);
            if (is_callable($options['progress'])) {
                $request->getCurlOptions()->add('progressCallback', $options['progress']);
            }
        }

        return $request;
    }

    /**
     * Construct a TransferPart from a HTTP response delivered by the API.
     *
     * @param Response $response
     * @param int      $partNumber
     * @return TransferPart
     */
    public static function fromResponse(Response $response, $partNumber = 1)
    {
        $responseUri = Url::factory($response->getEffectiveUrl());

        $object = new self();

        $object->setPartNumber($partNumber)
            ->setContentLength($response->getHeader(Header::CONTENT_LENGTH))
            ->setETag($response->getHeader(Header::ETAG))
            ->setPath($responseUri->getPath());

        return $object;
    }
}
API documentation generated by ApiGen