123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- <?php
- /**
- * This file is part of the ramsey/uuid library
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
- * @license http://opensource.org/licenses/MIT MIT
- * @link https://benramsey.com/projects/ramsey-uuid/ Documentation
- * @link https://packagist.org/packages/ramsey/uuid Packagist
- * @link https://github.com/ramsey/uuid GitHub
- */
- namespace Ramsey\Uuid;
- use Ramsey\Uuid\Converter\TimeConverterInterface;
- use Ramsey\Uuid\Generator\PeclUuidTimeGenerator;
- use Ramsey\Uuid\Provider\Node\FallbackNodeProvider;
- use Ramsey\Uuid\Provider\Node\RandomNodeProvider;
- use Ramsey\Uuid\Provider\Node\SystemNodeProvider;
- use Ramsey\Uuid\Converter\NumberConverterInterface;
- use Ramsey\Uuid\Converter\Number\BigNumberConverter;
- use Ramsey\Uuid\Converter\Number\DegradedNumberConverter;
- use Ramsey\Uuid\Converter\Time\BigNumberTimeConverter;
- use Ramsey\Uuid\Converter\Time\DegradedTimeConverter;
- use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
- use Ramsey\Uuid\Provider\Time\SystemTimeProvider;
- use Ramsey\Uuid\Builder\UuidBuilderInterface;
- use Ramsey\Uuid\Builder\DefaultUuidBuilder;
- use Ramsey\Uuid\Codec\CodecInterface;
- use Ramsey\Uuid\Codec\StringCodec;
- use Ramsey\Uuid\Codec\GuidStringCodec;
- use Ramsey\Uuid\Builder\DegradedUuidBuilder;
- use Ramsey\Uuid\Generator\RandomGeneratorFactory;
- use Ramsey\Uuid\Generator\RandomGeneratorInterface;
- use Ramsey\Uuid\Generator\TimeGeneratorFactory;
- use Ramsey\Uuid\Generator\TimeGeneratorInterface;
- use Ramsey\Uuid\Provider\TimeProviderInterface;
- use Ramsey\Uuid\Provider\NodeProviderInterface;
- /**
- * FeatureSet detects and exposes available features in the current environment
- * (32- or 64-bit, available dependencies, etc.)
- */
- class FeatureSet
- {
- /**
- * @var bool
- */
- private $disableBigNumber = false;
- /**
- * @var bool
- */
- private $disable64Bit = false;
- /**
- * @var bool
- */
- private $ignoreSystemNode = false;
- /**
- * @var bool
- */
- private $enablePecl = false;
- /**
- * @var UuidBuilderInterface
- */
- private $builder;
- /**
- * @var CodecInterface
- */
- private $codec;
- /**
- * @var NodeProviderInterface
- */
- private $nodeProvider;
- /**
- * @var NumberConverterInterface
- */
- private $numberConverter;
- /**
- * @var RandomGeneratorInterface
- */
- private $randomGenerator;
- /**
- * @var TimeGeneratorInterface
- */
- private $timeGenerator;
- /**
- * Constructs a `FeatureSet` for use by a `UuidFactory` to determine or set
- * features available to the environment
- *
- * @param bool $useGuids Whether to build UUIDs using the `GuidStringCodec`
- * @param bool $force32Bit Whether to force the use of 32-bit functionality
- * (primarily for testing purposes)
- * @param bool $forceNoBigNumber Whether to disable the use of moontoast/math
- * `BigNumber` (primarily for testing purposes)
- * @param bool $ignoreSystemNode Whether to disable attempts to check for
- * the system host ID (primarily for testing purposes)
- * @param bool $enablePecl Whether to enable the use of the `PeclUuidTimeGenerator`
- * to generate version 1 UUIDs
- */
- public function __construct(
- $useGuids = false,
- $force32Bit = false,
- $forceNoBigNumber = false,
- $ignoreSystemNode = false,
- $enablePecl = false
- ) {
- $this->disableBigNumber = $forceNoBigNumber;
- $this->disable64Bit = $force32Bit;
- $this->ignoreSystemNode = $ignoreSystemNode;
- $this->enablePecl = $enablePecl;
- $this->numberConverter = $this->buildNumberConverter();
- $this->builder = $this->buildUuidBuilder();
- $this->codec = $this->buildCodec($useGuids);
- $this->nodeProvider = $this->buildNodeProvider();
- $this->randomGenerator = $this->buildRandomGenerator();
- $this->setTimeProvider(new SystemTimeProvider());
- }
- /**
- * Returns the builder configured for this environment
- *
- * @return UuidBuilderInterface
- */
- public function getBuilder()
- {
- return $this->builder;
- }
- /**
- * Returns the UUID UUID coder-decoder configured for this environment
- *
- * @return CodecInterface
- */
- public function getCodec()
- {
- return $this->codec;
- }
- /**
- * Returns the system node ID provider configured for this environment
- *
- * @return NodeProviderInterface
- */
- public function getNodeProvider()
- {
- return $this->nodeProvider;
- }
- /**
- * Returns the number converter configured for this environment
- *
- * @return NumberConverterInterface
- */
- public function getNumberConverter()
- {
- return $this->numberConverter;
- }
- /**
- * Returns the random UUID generator configured for this environment
- *
- * @return RandomGeneratorInterface
- */
- public function getRandomGenerator()
- {
- return $this->randomGenerator;
- }
- /**
- * Returns the time-based UUID generator configured for this environment
- *
- * @return TimeGeneratorInterface
- */
- public function getTimeGenerator()
- {
- return $this->timeGenerator;
- }
- /**
- * Sets the time provider for use in this environment
- *
- * @param TimeProviderInterface $timeProvider
- */
- public function setTimeProvider(TimeProviderInterface $timeProvider)
- {
- $this->timeGenerator = $this->buildTimeGenerator($timeProvider);
- }
- /**
- * Determines which UUID coder-decoder to use and returns the configured
- * codec for this environment
- *
- * @param bool $useGuids Whether to build UUIDs using the `GuidStringCodec`
- * @return CodecInterface
- */
- protected function buildCodec($useGuids = false)
- {
- if ($useGuids) {
- return new GuidStringCodec($this->builder);
- }
- return new StringCodec($this->builder);
- }
- /**
- * Determines which system node ID provider to use and returns the configured
- * system node ID provider for this environment
- *
- * @return NodeProviderInterface
- */
- protected function buildNodeProvider()
- {
- if ($this->ignoreSystemNode) {
- return new RandomNodeProvider();
- }
- return new FallbackNodeProvider([
- new SystemNodeProvider(),
- new RandomNodeProvider()
- ]);
- }
- /**
- * Determines which number converter to use and returns the configured
- * number converter for this environment
- *
- * @return NumberConverterInterface
- */
- protected function buildNumberConverter()
- {
- if ($this->hasBigNumber()) {
- return new BigNumberConverter();
- }
- return new DegradedNumberConverter();
- }
- /**
- * Determines which random UUID generator to use and returns the configured
- * random UUID generator for this environment
- *
- * @return RandomGeneratorInterface
- */
- protected function buildRandomGenerator()
- {
- return (new RandomGeneratorFactory())->getGenerator();
- }
- /**
- * Determines which time-based UUID generator to use and returns the configured
- * time-based UUID generator for this environment
- *
- * @param TimeProviderInterface $timeProvider
- * @return TimeGeneratorInterface
- */
- protected function buildTimeGenerator(TimeProviderInterface $timeProvider)
- {
- if ($this->enablePecl) {
- return new PeclUuidTimeGenerator();
- }
- return (new TimeGeneratorFactory(
- $this->nodeProvider,
- $this->buildTimeConverter(),
- $timeProvider
- ))->getGenerator();
- }
- /**
- * Determines which time converter to use and returns the configured
- * time converter for this environment
- *
- * @return TimeConverterInterface
- */
- protected function buildTimeConverter()
- {
- if ($this->is64BitSystem()) {
- return new PhpTimeConverter();
- }
- if ($this->hasBigNumber()) {
- return new BigNumberTimeConverter();
- }
- return new DegradedTimeConverter();
- }
- /**
- * Determines which UUID builder to use and returns the configured UUID
- * builder for this environment
- *
- * @return UuidBuilderInterface
- */
- protected function buildUuidBuilder()
- {
- if ($this->is64BitSystem()) {
- return new DefaultUuidBuilder($this->numberConverter);
- }
- return new DegradedUuidBuilder($this->numberConverter);
- }
- /**
- * Returns true if the system has `Moontoast\Math\BigNumber`
- *
- * @return bool
- */
- protected function hasBigNumber()
- {
- return class_exists('Moontoast\Math\BigNumber') && !$this->disableBigNumber;
- }
- /**
- * Returns true if the system is 64-bit, false otherwise
- *
- * @return bool
- */
- protected function is64BitSystem()
- {
- return PHP_INT_SIZE == 8 && !$this->disable64Bit;
- }
- }
|