annotate vendor/typo3/phar-stream-wrapper/src/Resolver/PharInvocationCollection.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@18 1 <?php
Chris@18 2 namespace TYPO3\PharStreamWrapper\Resolver;
Chris@18 3
Chris@18 4 /*
Chris@18 5 * This file is part of the TYPO3 project.
Chris@18 6 *
Chris@18 7 * It is free software; you can redistribute it and/or modify it under the terms
Chris@18 8 * of the MIT License (MIT). For the full copyright and license information,
Chris@18 9 * please read the LICENSE file that was distributed with this source code.
Chris@18 10 *
Chris@18 11 * The TYPO3 project - inspiring people to share!
Chris@18 12 */
Chris@18 13
Chris@18 14 use TYPO3\PharStreamWrapper\Collectable;
Chris@18 15
Chris@18 16 class PharInvocationCollection implements Collectable
Chris@18 17 {
Chris@18 18 const UNIQUE_INVOCATION = 1;
Chris@18 19 const UNIQUE_BASE_NAME = 2;
Chris@18 20 const DUPLICATE_ALIAS_WARNING = 32;
Chris@18 21
Chris@18 22 /**
Chris@18 23 * @var PharInvocation[]
Chris@18 24 */
Chris@18 25 private $invocations = array();
Chris@18 26
Chris@18 27 /**
Chris@18 28 * @param PharInvocation $invocation
Chris@18 29 * @return bool
Chris@18 30 */
Chris@18 31 public function has(PharInvocation $invocation)
Chris@18 32 {
Chris@18 33 return in_array($invocation, $this->invocations, true);
Chris@18 34 }
Chris@18 35
Chris@18 36 /**
Chris@18 37 * @param PharInvocation $invocation
Chris@18 38 * @param null|int $flags
Chris@18 39 * @return bool
Chris@18 40 */
Chris@18 41 public function collect(PharInvocation $invocation, $flags = null)
Chris@18 42 {
Chris@18 43 if ($flags === null) {
Chris@18 44 $flags = static::UNIQUE_INVOCATION | static::DUPLICATE_ALIAS_WARNING;
Chris@18 45 }
Chris@18 46 if ($invocation->getBaseName() === ''
Chris@18 47 || $invocation->getAlias() === ''
Chris@18 48 || !$this->assertUniqueBaseName($invocation, $flags)
Chris@18 49 || !$this->assertUniqueInvocation($invocation, $flags)
Chris@18 50 ) {
Chris@18 51 return false;
Chris@18 52 }
Chris@18 53 if ($flags & static::DUPLICATE_ALIAS_WARNING) {
Chris@18 54 $this->triggerDuplicateAliasWarning($invocation);
Chris@18 55 }
Chris@18 56
Chris@18 57 $this->invocations[] = $invocation;
Chris@18 58 return true;
Chris@18 59 }
Chris@18 60
Chris@18 61 /**
Chris@18 62 * @param callable $callback
Chris@18 63 * @param bool $reverse
Chris@18 64 * @return null|PharInvocation
Chris@18 65 */
Chris@18 66 public function findByCallback($callback, $reverse = false)
Chris@18 67 {
Chris@18 68 foreach ($this->getInvocations($reverse) as $invocation) {
Chris@18 69 if (call_user_func($callback, $invocation) === true) {
Chris@18 70 return $invocation;
Chris@18 71 }
Chris@18 72 }
Chris@18 73 return null;
Chris@18 74 }
Chris@18 75
Chris@18 76 /**
Chris@18 77 * Asserts that base-name is unique. This disallows having multiple invocations for
Chris@18 78 * same base-name but having different alias names.
Chris@18 79 *
Chris@18 80 * @param PharInvocation $invocation
Chris@18 81 * @param int $flags
Chris@18 82 * @return bool
Chris@18 83 */
Chris@18 84 private function assertUniqueBaseName(PharInvocation $invocation, $flags)
Chris@18 85 {
Chris@18 86 if (!($flags & static::UNIQUE_BASE_NAME)) {
Chris@18 87 return true;
Chris@18 88 }
Chris@18 89 return $this->findByCallback(
Chris@18 90 function (PharInvocation $candidate) use ($invocation) {
Chris@18 91 return $candidate->getBaseName() === $invocation->getBaseName();
Chris@18 92 }
Chris@18 93 ) === null;
Chris@18 94 }
Chris@18 95
Chris@18 96 /**
Chris@18 97 * Asserts that combination of base-name and alias is unique. This allows having multiple
Chris@18 98 * invocations for same base-name but having different alias names (for whatever reason).
Chris@18 99 *
Chris@18 100 * @param PharInvocation $invocation
Chris@18 101 * @param int $flags
Chris@18 102 * @return bool
Chris@18 103 */
Chris@18 104 private function assertUniqueInvocation(PharInvocation $invocation, $flags)
Chris@18 105 {
Chris@18 106 if (!($flags & static::UNIQUE_INVOCATION)) {
Chris@18 107 return true;
Chris@18 108 }
Chris@18 109 return $this->findByCallback(
Chris@18 110 function (PharInvocation $candidate) use ($invocation) {
Chris@18 111 return $candidate->equals($invocation);
Chris@18 112 }
Chris@18 113 ) === null;
Chris@18 114 }
Chris@18 115
Chris@18 116 /**
Chris@18 117 * Triggers warning for invocations with same alias and same confirmation state.
Chris@18 118 *
Chris@18 119 * @param PharInvocation $invocation
Chris@18 120 * @see \TYPO3\PharStreamWrapper\PharStreamWrapper::collectInvocation()
Chris@18 121 */
Chris@18 122 private function triggerDuplicateAliasWarning(PharInvocation $invocation)
Chris@18 123 {
Chris@18 124 $sameAliasInvocation = $this->findByCallback(
Chris@18 125 function (PharInvocation $candidate) use ($invocation) {
Chris@18 126 return $candidate->isConfirmed() === $invocation->isConfirmed()
Chris@18 127 && $candidate->getAlias() === $invocation->getAlias();
Chris@18 128 },
Chris@18 129 true
Chris@18 130 );
Chris@18 131 if ($sameAliasInvocation === null) {
Chris@18 132 return;
Chris@18 133 }
Chris@18 134 trigger_error(
Chris@18 135 sprintf(
Chris@18 136 'Alias %s cannot be used by %s, already used by %s',
Chris@18 137 $invocation->getAlias(),
Chris@18 138 $invocation->getBaseName(),
Chris@18 139 $sameAliasInvocation->getBaseName()
Chris@18 140 ),
Chris@18 141 E_USER_WARNING
Chris@18 142 );
Chris@18 143 }
Chris@18 144
Chris@18 145 /**
Chris@18 146 * @param bool $reverse
Chris@18 147 * @return PharInvocation[]
Chris@18 148 */
Chris@18 149 private function getInvocations($reverse = false)
Chris@18 150 {
Chris@18 151 if ($reverse) {
Chris@18 152 return array_reverse($this->invocations);
Chris@18 153 }
Chris@18 154 return $this->invocations;
Chris@18 155 }
Chris@18 156 }