Chris@18: invocations, true); Chris@18: } Chris@18: Chris@18: /** Chris@18: * @param PharInvocation $invocation Chris@18: * @param null|int $flags Chris@18: * @return bool Chris@18: */ Chris@18: public function collect(PharInvocation $invocation, $flags = null) Chris@18: { Chris@18: if ($flags === null) { Chris@18: $flags = static::UNIQUE_INVOCATION | static::DUPLICATE_ALIAS_WARNING; Chris@18: } Chris@18: if ($invocation->getBaseName() === '' Chris@18: || $invocation->getAlias() === '' Chris@18: || !$this->assertUniqueBaseName($invocation, $flags) Chris@18: || !$this->assertUniqueInvocation($invocation, $flags) Chris@18: ) { Chris@18: return false; Chris@18: } Chris@18: if ($flags & static::DUPLICATE_ALIAS_WARNING) { Chris@18: $this->triggerDuplicateAliasWarning($invocation); Chris@18: } Chris@18: Chris@18: $this->invocations[] = $invocation; Chris@18: return true; Chris@18: } Chris@18: Chris@18: /** Chris@18: * @param callable $callback Chris@18: * @param bool $reverse Chris@18: * @return null|PharInvocation Chris@18: */ Chris@18: public function findByCallback($callback, $reverse = false) Chris@18: { Chris@18: foreach ($this->getInvocations($reverse) as $invocation) { Chris@18: if (call_user_func($callback, $invocation) === true) { Chris@18: return $invocation; Chris@18: } Chris@18: } Chris@18: return null; Chris@18: } Chris@18: Chris@18: /** Chris@18: * Asserts that base-name is unique. This disallows having multiple invocations for Chris@18: * same base-name but having different alias names. Chris@18: * Chris@18: * @param PharInvocation $invocation Chris@18: * @param int $flags Chris@18: * @return bool Chris@18: */ Chris@18: private function assertUniqueBaseName(PharInvocation $invocation, $flags) Chris@18: { Chris@18: if (!($flags & static::UNIQUE_BASE_NAME)) { Chris@18: return true; Chris@18: } Chris@18: return $this->findByCallback( Chris@18: function (PharInvocation $candidate) use ($invocation) { Chris@18: return $candidate->getBaseName() === $invocation->getBaseName(); Chris@18: } Chris@18: ) === null; Chris@18: } Chris@18: Chris@18: /** Chris@18: * Asserts that combination of base-name and alias is unique. This allows having multiple Chris@18: * invocations for same base-name but having different alias names (for whatever reason). Chris@18: * Chris@18: * @param PharInvocation $invocation Chris@18: * @param int $flags Chris@18: * @return bool Chris@18: */ Chris@18: private function assertUniqueInvocation(PharInvocation $invocation, $flags) Chris@18: { Chris@18: if (!($flags & static::UNIQUE_INVOCATION)) { Chris@18: return true; Chris@18: } Chris@18: return $this->findByCallback( Chris@18: function (PharInvocation $candidate) use ($invocation) { Chris@18: return $candidate->equals($invocation); Chris@18: } Chris@18: ) === null; Chris@18: } Chris@18: Chris@18: /** Chris@18: * Triggers warning for invocations with same alias and same confirmation state. Chris@18: * Chris@18: * @param PharInvocation $invocation Chris@18: * @see \TYPO3\PharStreamWrapper\PharStreamWrapper::collectInvocation() Chris@18: */ Chris@18: private function triggerDuplicateAliasWarning(PharInvocation $invocation) Chris@18: { Chris@18: $sameAliasInvocation = $this->findByCallback( Chris@18: function (PharInvocation $candidate) use ($invocation) { Chris@18: return $candidate->isConfirmed() === $invocation->isConfirmed() Chris@18: && $candidate->getAlias() === $invocation->getAlias(); Chris@18: }, Chris@18: true Chris@18: ); Chris@18: if ($sameAliasInvocation === null) { Chris@18: return; Chris@18: } Chris@18: trigger_error( Chris@18: sprintf( Chris@18: 'Alias %s cannot be used by %s, already used by %s', Chris@18: $invocation->getAlias(), Chris@18: $invocation->getBaseName(), Chris@18: $sameAliasInvocation->getBaseName() Chris@18: ), Chris@18: E_USER_WARNING Chris@18: ); Chris@18: } Chris@18: Chris@18: /** Chris@18: * @param bool $reverse Chris@18: * @return PharInvocation[] Chris@18: */ Chris@18: private function getInvocations($reverse = false) Chris@18: { Chris@18: if ($reverse) { Chris@18: return array_reverse($this->invocations); Chris@18: } Chris@18: return $this->invocations; Chris@18: } Chris@18: }