Seditio Source
Root |
./othercms/dle15_0/upload/engine/classes/composer/vendor/aws/aws-sdk-php/src/Arn/Arn.php
<?php
namespace Aws\Arn;

use
Aws\Arn\Exception\InvalidArnException;

/**
 * Amazon Resource Names (ARNs) uniquely identify AWS resources. The Arn class
 * parses and stores a generic ARN object representation that can apply to any
 * service resource.
 *
 * @internal
 */
class Arn implements ArnInterface
{
    protected
$data;
    protected
$string;

    public static function
parse($string)
    {
       
$data = [
           
'arn' => null,
           
'partition' => null,
           
'service' => null,
           
'region' => null,
           
'account_id' => null,
           
'resource' => null,
        ];

       
$length = strlen($string);
       
$lastDelim = 0;
       
$numComponents = 0;
        for (
$i = 0; $i < $length; $i++) {

            if ((
$numComponents < 5 && $string[$i] === ':')) {
               
// Split components between delimiters
               
$data[key($data)] = substr($string, $lastDelim, $i - $lastDelim);

               
// Do not include delimiter character itself
               
$lastDelim = $i + 1;
               
next($data);
               
$numComponents++;
            }

            if (
$i === $length - 1) {
               
// Put the remainder in the last component.
               
if (in_array($numComponents, [5])) {
                   
$data['resource'] = substr($string, $lastDelim);
                } else {
                   
// If there are < 5 components, put remainder in current
                    // component.
                   
$data[key($data)] = substr($string, $lastDelim);
                }
            }
        }

        return
$data;
    }

    public function
__construct($data)
    {
        if (
is_array($data)) {
           
$this->data = $data;
        } elseif (
is_string($data)) {
           
$this->data = static::parse($data);
        } else {
            throw new
InvalidArnException('Constructor accepts a string or an'
               
. ' array as an argument.');
        }

        static::
validate($this->data);
    }

    public function
__toString()
    {
        if (!isset(
$this->string)) {
           
$components = [
               
$this->getPrefix(),
               
$this->getPartition(),
               
$this->getService(),
               
$this->getRegion(),
               
$this->getAccountId(),
               
$this->getResource(),
            ];

           
$this->string = implode(':', $components);
        }
        return
$this->string;
    }

    public function
getPrefix()
    {
        return
$this->data['arn'];
    }

    public function
getPartition()
    {
        return
$this->data['partition'];
    }

    public function
getService()
    {
        return
$this->data['service'];
    }

    public function
getRegion()
    {
        return
$this->data['region'];
    }

    public function
getAccountId()
    {
        return
$this->data['account_id'];
    }

    public function
getResource()
    {
        return
$this->data['resource'];
    }

    public function
toArray()
    {
        return
$this->data;
    }

   
/**
     * Minimally restrictive generic ARN validation
     *
     * @param array $data
     */
   
protected static function validate(array $data)
    {
        if (
$data['arn'] !== 'arn') {
            throw new
InvalidArnException("The 1st component of an ARN must be"
               
. " 'arn'.");
        }

        if (empty(
$data['partition'])) {
            throw new
InvalidArnException("The 2nd component of an ARN"
               
. " represents the partition and must not be empty.");
        }

        if (empty(
$data['service'])) {
            throw new
InvalidArnException("The 3rd component of an ARN"
               
. " represents the service and must not be empty.");
        }

        if (empty(
$data['resource'])) {
            throw new
InvalidArnException("The 6th component of an ARN"
               
. " represents the resource information and must not be empty."
               
. " Individual service ARNs may include additional delimiters"
               
. " to further qualify resources.");
        }
    }

    protected static function
validateAccountId($data, $arnName)
    {
        if (!
self::isValidHostLabel($data['account_id'])) {
            throw new
InvalidArnException("The 5th component of a {$arnName}"
               
. " is required, represents the account ID, and"
               
. " must be a valid host label.");
        }
    }

    protected static function
validateRegion($data, $arnName)
    {
        if (empty(
$data['region'])) {
            throw new
InvalidArnException("The 4th component of a {$arnName}"
               
. " represents the region and must not be empty.");
        }
    }

   
/**
     * Validates whether a string component is a valid host label
     *
     * @param $string
     * @return bool
     */
   
protected static function isValidHostLabel($string)
    {
        if (empty(
$string) || strlen($string) > 63) {
            return
false;
        }
        if (
$value = preg_match("/^[a-zA-Z0-9-]+$/", $string)) {
            return
true;
        }
        return
false;
    }
}