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 } |