diff --git a/composer.json b/composer.json index ea205ca..e91ed29 100644 --- a/composer.json +++ b/composer.json @@ -10,10 +10,10 @@ ], "minimum-stability": "dev", "require": { - "php": ">=5.3.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~11.3" }, "autoload": { "psr-0": { "ConfigToken\\": "lib/" } diff --git a/composer.phar b/composer.phar new file mode 100755 index 0000000..15c4a20 Binary files /dev/null and b/composer.phar differ diff --git a/lib/ConfigToken/LoggerInterface.php b/lib/ConfigToken/LoggerInterface.php new file mode 100644 index 0000000..35ada92 --- /dev/null +++ b/lib/ConfigToken/LoggerInterface.php @@ -0,0 +1,14 @@ +Iterator or Traversable */ - public function getIterator() + public function getIterator(): \Traversable { return new \ArrayIterator($this->tokens); } @@ -342,6 +342,7 @@ public function findWithUnresolvedFilters() * @param TokenResolverInterface $tokenResolver * @param boolean|null $ignoreUnknownTokens Null to use token resolver option. * @param boolean|null $ignoreUnknownFilters Null to use collection option. + * @param LoggerInterface|null $logger * @throws UnknownFilterException * * If using RegisteredTokenResolver: @@ -355,7 +356,7 @@ public function findWithUnresolvedFilters() * @return $this */ public function resolve(TokenResolverInterface $tokenResolver, - $ignoreUnknownTokens = null, $ignoreUnknownFilters = null) + $ignoreUnknownTokens = null, $ignoreUnknownFilters = null, LoggerInterface $logger=null) { if (is_null($ignoreUnknownTokens)) { $ignoreUnknownTokens = $tokenResolver->getIgnoreUnknownTokens(); @@ -377,4 +378,4 @@ public function resolve(TokenResolverInterface $tokenResolver, return $this; } -} \ No newline at end of file +} diff --git a/lib/ConfigToken/TokenInjector.php b/lib/ConfigToken/TokenInjector.php index 5aab138..e9f0a85 100644 --- a/lib/ConfigToken/TokenInjector.php +++ b/lib/ConfigToken/TokenInjector.php @@ -15,10 +15,11 @@ class TokenInjector * @param string $string The string where to inject the resolved token values. * @param TokenCollection $tokens The tokens. * @param boolean $checkHash If true, the hash of the string must match the source hash of the tokens. + * @param LoggerInterface|null $logger * @throws UnknownTokenSourceException * @return string */ - public static function injectString($string, TokenCollection $tokens, $checkHash = False) { + public static function injectString($string, TokenCollection $tokens, $checkHash = False, LoggerInterface $logger=null) { if ($checkHash) { $hash = md5($string); if ($tokens->hasSourceHash() && ($tokens->getSourceHash() !== $hash)) { @@ -52,6 +53,15 @@ public static function injectString($string, TokenCollection $tokens, $checkHash $blocks[] = $tokenValue; $lastOffset = $offset + strlen($tokenString); $offsetDelta += strlen($tokenValue) - strlen($tokenString); + if (isset($logger) && (!isset($injected[$tokenString]))) { + $logger->addRecord( + LoggerInterface::DEBUG, + sprintf( + 'Replaced token "%s" with value "%s".', + $token + ) + ); + } $injected[$tokenString] = $token; } } diff --git a/lib/ConfigToken/TreeCompiler.php b/lib/ConfigToken/TreeCompiler.php index d68ae2c..6ce1c89 100644 --- a/lib/ConfigToken/TreeCompiler.php +++ b/lib/ConfigToken/TreeCompiler.php @@ -71,6 +71,8 @@ class TreeCompiler protected $xrefTokenResolverRequiredOptionKeys = array(); /** @var string[] */ protected $xrefTokenResolverOptionSetterMapping = array(); + /** @var array $headers */ + protected $headers = array(); /** @var string */ protected $removeKey = 'remove'; @@ -85,8 +87,9 @@ class TreeCompiler const INCLUDE_TYPE_GROUP = 'group'; const INCLUDE_TYPE_XREF = 'xref'; - public function __construct(XrefCollection $xrefs = null) + public function __construct(XrefCollection $xrefs = null, $headers=array()) { + $this->headers = $headers; if (!isset($xrefs)) { $xrefs = new XrefCollection(); } @@ -341,11 +344,14 @@ protected function validateXrefTokenResolverOptions($xrefKey, $tokenResolverDefi * @param string|array $xrefInfo * @param XrefTokenResolverCollection $xrefTokenResolvers * @param Xref[] $xrefPath + * @param Xref $currentXref + * @param LoggerInterface|null $logger * @return Xref|mixed * @throws TreeCompilerFormatException * @throws \Exception */ - protected function parseXrefInfo($xrefKey, $xrefInfo, XrefTokenResolverCollection $xrefTokenResolvers = null, $xrefPath) + protected function parseXrefInfo($xrefKey, $xrefInfo, XrefTokenResolverCollection $xrefTokenResolvers = null, + $xrefPath, Xref $currentXref, LoggerInterface $logger=null) { $xrefData = null; if (gettype($xrefInfo) == 'string') { @@ -390,11 +396,33 @@ protected function parseXrefInfo($xrefKey, $xrefInfo, XrefTokenResolverCollectio if (isset($xrefData)) { if (isset($xrefTokenResolvers)) { - $xrefTokenResolvers->applyToArray($xrefData); + $xrefTokenResolvers->applyToArray($xrefData, $logger); } } else { if (isset($xrefTokenResolvers)) { - $xrefLocation = $xrefTokenResolvers->applyToString($xrefLocation); + if (isset($logger)) { + $logger->addRecord( + LoggerInterface::DEBUG, + sprintf( + 'Resolving tokens in xref location "%s" included by "%s"', + $xrefLocation, + $currentXref->getLocation() + ) + ); + } + $newXrefLocation = $xrefTokenResolvers->applyToString($xrefLocation, $logger); + if (isset($logger)) { + $logger->addRecord( + LoggerInterface::DEBUG, + sprintf( + 'Xref location "%s" changed to "%s"', + $xrefLocation, + $newXrefLocation, + $currentXref->getLocation() + ) + ); + } + $xrefLocation = $newXrefLocation; } $xrefLocation = Xref::computeAbsoluteLocation($xrefType, $xrefLocation, $xrefPath); } @@ -418,10 +446,14 @@ protected function parseXrefInfo($xrefKey, $xrefInfo, XrefTokenResolverCollectio * @param array $tokenResolversInfo * @param XrefTokenResolverCollection $tokenResolvers * @param Xref[] $xrefPath + * @param Xref $currentXref + * @param LoggerInterface|null $logger * @return XrefTokenResolverCollection * @throws \Exception */ - protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversInfo, XrefTokenResolverCollection $tokenResolvers = null, $xrefPath) + protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversInfo, + XrefTokenResolverCollection $tokenResolvers=null, $xrefPath, + Xref $currentXref, LoggerInterface $logger=null) { $resolverValues = array(); $tokenResolverDefinitionIndex = 0; @@ -500,10 +532,12 @@ protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversIn sprintf('%s.%s[%d]', $xrefKey, $this->includeXrefResolversKey, $tokenResolverDefinitionIndex), $xrefInfo, $tokenResolvers, - $xrefPath + $xrefPath, + $currentXref, + $logger ); // pass down current token resolvers - $values = $this->recursiveCompileXref($xref, $tokenResolvers, null, null, $xrefPath); + $values = $this->recursiveCompileXref($xref, $tokenResolvers, null, null, $xrefPath, $logger); } if (!is_array($values)) { throw new TokenResolverDefinitionException( @@ -521,6 +555,7 @@ protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversIn } $result = new XrefTokenResolverCollection(); + $tokenResolverPosition = 0; // parse foreach ($tokenResolversInfo as $tokenResolverKey => $tokenResolverInfo) { if (isset($tokenResolverInfo[$this->xrefTokenResolverOptionsKey])) { @@ -530,6 +565,10 @@ protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversIn } $tokenResolver = TokenResolverFactory::get($tokenResolverInfo[$this->xrefTokenResolverTypeKey]); $xrefTokenResolver = new XrefTokenResolver($tokenResolver); + $xrefTokenResolver + ->setSourceXrefLocation($currentXref->getLocation()) + ->setSourceXrefPosition($tokenResolverPosition++) + ; $values = $resolverValues[$tokenResolverKey]; $xrefTokenResolver->setRegisteredTokenValues($values); if (isset($options)) { @@ -580,6 +619,7 @@ protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversIn * @param string|null $includeType * @param string|array|null $includeTypeValue * @param array $xrefPath + * @param LoggerInterface|null $logger * @return array * * @throws CircularReferenceException @@ -590,14 +630,19 @@ protected function parseXrefTokenResolverDefinitions($xrefKey, $tokenResolversIn * @throws \Exception */ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $tokenResolvers = null, - $includeType = null, $includeTypeValue = null, &$xrefPath) + $includeType = null, $includeTypeValue = null, &$xrefPath = null, + LoggerInterface $logger=null) { static $XREF_KEY = 0; static $XREF_RESOLVERS_KEY = 1; - + if (!isset($includeType)) { $includeType = static::INCLUDE_TYPE_GROUP; } + + if (isset($logger)) { + $logger->addRecord(LoggerInterface::DEBUG, sprintf('Compiling %s', $xref->getLocation())); + } switch ($includeType) { case static::INCLUDE_TYPE_GROUP: @@ -627,7 +672,7 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection } $mustIncludeSpecificGroup = $includeTypeValue != $this->includeMainKey; - $xref->resolve(); + $xref->resolve(false, $logger, $this->headers); $xrefData = $xref->getData(); if (empty($xrefData)) { @@ -663,7 +708,7 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $result = $xrefData; } if (isset($tokenResolvers)) { - $tokenResolvers->applyToArray($result); + $tokenResolvers->applyToArray($result, $logger); } return $result; } @@ -704,7 +749,7 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $result = $xrefData; } if (isset($tokenResolvers)) { - $tokenResolvers->applyToArray($result); + $tokenResolvers->applyToArray($result, $logger); } return $result; } @@ -753,7 +798,9 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $xrefKey, $xrefInfo, $tokenResolvers, - $xrefPath + $xrefPath, + $xref, + $logger ); if (is_array($xrefInfo) && isset($xrefInfo[$this->includeXrefResolversKey])) { @@ -761,7 +808,8 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $xrefKey, $xrefInfo[$this->includeXrefResolversKey], $tokenResolvers, - $xrefPath + $xrefPath, + $xref ); } else { $xrefTokenResolvers = null; @@ -803,7 +851,8 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection $downTokenResolvers, static::INCLUDE_TYPE_GROUP, $this->includeMainKey, - $xrefPath + $xrefPath, + $logger ); $this->recursiveAddData($includeData, $result); } @@ -811,14 +860,34 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection if (isset($xrefData[$this->removeKey])) { if (isset($tokenResolvers)) { - $tokenResolvers->applyToArray($xrefData[$this->removeKey]); + if (isset($logger)) { + $logger->addRecord( + LoggerInterface::DEBUG, + sprintf( + 'Applying token resolvers to "%s" key in "%s"', + $this->removeKey, + $xref->getLocation() + ) + ); + } + $tokenResolvers->applyToArray($xrefData[$this->removeKey], $logger); } $this->recursiveRemoveData($xrefData[$this->removeKey], $result); } if (isset($xrefData[$this->addKey])) { if (isset($tokenResolvers)) { - $tokenResolvers->applyToArray($xrefData[$this->addKey]); + if (isset($logger)) { + $logger->addRecord( + LoggerInterface::DEBUG, + sprintf( + 'Applying token resolvers to "%s" key in "%s"', + $this->addKey, + $xref->getLocation() + ) + ); + } + $tokenResolvers->applyToArray($xrefData[$this->addKey], $logger); } $this->recursiveAddData($xrefData[$this->addKey], $result); } @@ -826,23 +895,23 @@ protected function recursiveCompileXref(Xref $xref, XrefTokenResolverCollection return $result; } - public function compileXref(Xref $xref, $includeType = null, $includeTypeValue = null) + public function compileXref(Xref $xref, $includeType = null, $includeTypeValue = null, LoggerInterface $logger=null) { $xrefPath = array(); - $compiledData = $this->recursiveCompileXref($xref, null, $includeType, $includeTypeValue, $xrefPath); + $compiledData = $this->recursiveCompileXref($xref, null, $includeType, $includeTypeValue, $xrefPath, $logger); return $compiledData; } - public function compileLocalFile($inputFileName, $includeType = null, $includeKeyValue = null) + public function compileLocalFile($inputFileName, $includeType = null, $includeKeyValue = null, LoggerInterface $logger=null) { $xref = new Xref(LocalFileXrefResolver::getType(), $inputFileName); - return $this->compileXref($xref, $includeType, $includeKeyValue); + return $this->compileXref($xref, $includeType, $includeKeyValue, $logger); } - public function compileUrl($inputUrl, $includeType = null, $includeKeyValue = null) + public function compileUrl($inputUrl, $includeType = null, $includeKeyValue = null, LoggerInterface $logger=null) { $xref = new Xref(UrlXrefResolver::getType(), $inputUrl); - return $this->compileXref($xref, $includeType, $includeKeyValue); + return $this->compileXref($xref, $includeType, $includeKeyValue, $logger); } public function save(array $tree, $fileName) diff --git a/lib/ConfigToken/TreeCompiler/Xref.php b/lib/ConfigToken/TreeCompiler/Xref.php index bcdd624..812a73f 100644 --- a/lib/ConfigToken/TreeCompiler/Xref.php +++ b/lib/ConfigToken/TreeCompiler/Xref.php @@ -2,6 +2,7 @@ namespace ConfigToken\TreeCompiler; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\XrefResolver\XrefResolverFactory; @@ -92,7 +93,7 @@ public function getResolver() return XrefResolverFactory::getByType($this->type); } - public function resolve($force = false) + public function resolve($force = false, LoggerInterface $logger=null, $headers=array()) { if ($this->isResolved() && (!$force)) { return; @@ -101,7 +102,7 @@ public function resolve($force = false) throw new \Exception('Unable to resolve Xref without type.'); } $resolver = $this->getResolver(); - $resolver::resolve($this, $force); + $resolver::resolve($this, $force, $logger, $headers); } public function hasType() diff --git a/lib/ConfigToken/TreeCompiler/XrefCollection.php b/lib/ConfigToken/TreeCompiler/XrefCollection.php index 892f5d6..d55c91f 100644 --- a/lib/ConfigToken/TreeCompiler/XrefCollection.php +++ b/lib/ConfigToken/TreeCompiler/XrefCollection.php @@ -16,18 +16,18 @@ public function __construct() } /** - * (PHP 5 >= 5.0.0)
+ * (PHP 8 >= 8.3.0)
* Retrieve an external iterator * @link http://php.net/manual/en/iteratoraggregate.getiterator.php * @return \Traversable An instance of an object implementing Iterator or Traversable */ - public function getIterator() + public function getIterator(): \Traversable { return new \ArrayIterator($this->collection); } /** - * (PHP 5 >= 5.0.0)
+ * (PHP 8 >= 8.3.0)
* Whether a offset exists * @link http://php.net/manual/en/arrayaccess.offsetexists.php * @param mixed $offset

@@ -38,13 +38,13 @@ public function getIterator() *

* The return value will be casted to boolean if non-boolean was returned. */ - public function offsetExists($offset) + public function offsetExists($offset): bool { return $this->hasById($offset); } /** - * (PHP 5 >= 5.0.0)
+ * (PHP 8 >= 8.3.0)
* Offset to retrieve * @link http://php.net/manual/en/arrayaccess.offsetget.php * @param mixed $offset

@@ -52,13 +52,13 @@ public function offsetExists($offset) *

* @return mixed Can return all value types. */ - public function offsetGet($offset) + public function offsetGet($offset): mixed { return $this->getById($offset); } /** - * (PHP 5 >= 5.0.0)
+ * (PHP 8 >= 8.3.0)
* Offset to set * @link http://php.net/manual/en/arrayaccess.offsetset.php * @param mixed $offset

@@ -70,7 +70,7 @@ public function offsetGet($offset) * @return void * @throws \Exception */ - public function offsetSet($offset, $value) + public function offsetSet($offset, $value): void { if (!$value instanceof Xref) { throw new \Exception('Value is not an Xref.'); @@ -83,7 +83,7 @@ public function offsetSet($offset, $value) } /** - * (PHP 5 >= 5.0.0)
+ * (PHP 8 >= 8.3.0)
* Offset to unset * @link http://php.net/manual/en/arrayaccess.offsetunset.php * @param mixed $offset

@@ -91,7 +91,7 @@ public function offsetSet($offset, $value) *

* @return void */ - public function offsetUnset($offset) + public function offsetUnset($offset): void { if (!isset($offset)) { return; @@ -233,4 +233,4 @@ public function resolve($force = false) $xref->resolve($force); } } -} \ No newline at end of file +} diff --git a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/AbstractXrefResolver.php b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/AbstractXrefResolver.php index fa694fb..da31d4d 100644 --- a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/AbstractXrefResolver.php +++ b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/AbstractXrefResolver.php @@ -2,6 +2,7 @@ namespace ConfigToken\TreeCompiler\XrefResolver\Types; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\XrefResolver\Exception\InvalidXrefTypeException; use ConfigToken\TreeCompiler\Xref; use ConfigToken\TreeCompiler\XrefResolver\XrefResolverInterface; @@ -37,9 +38,11 @@ public static function getPlatformSpecificLocation($xrefLocation) * * @param Xref $xref * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again. + * @param LoggerInterface|null $logger + * @param array $headers * @throws \Exception */ - public static function resolve(Xref $xref, $force = false) + public static function resolve(Xref $xref, $force = false, LoggerInterface $logger=null, $headers=array()) { throw new \Exception( sprintf( diff --git a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/InlineXrefResolver.php b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/InlineXrefResolver.php index e7df3ed..9203dbb 100644 --- a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/InlineXrefResolver.php +++ b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/InlineXrefResolver.php @@ -3,6 +3,7 @@ namespace ConfigToken\TreeCompiler\XrefResolver\Types; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\Xref; class InlineXrefResolver extends AbstractXrefResolver @@ -22,9 +23,11 @@ public static function getType() * * @param Xref $xref * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again. + * @param LoggerInterface|null $logger + * @param array $headers * @throws \Exception */ - public static function resolve(Xref $xref, $force = false) + public static function resolve(Xref $xref, $force = false, LoggerInterface $logger=null, $headers=array()) { $xref->setResolved(true); } diff --git a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/LocalFileXrefResolver.php b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/LocalFileXrefResolver.php index 5c969d6..0145f5c 100644 --- a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/LocalFileXrefResolver.php +++ b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/LocalFileXrefResolver.php @@ -2,6 +2,7 @@ namespace ConfigToken\TreeCompiler\XrefResolver\Types; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\XrefResolver\Exception\XrefResolverFetchException; use ConfigToken\TreeCompiler\Xref; use ConfigToken\TreeSerializer\Exception\TreeSerializerSyntaxException; @@ -96,9 +97,11 @@ public static function getPlatformSpecificLocation($xrefLocation) * * @param Xref $xref * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again. + * @param array $headers + * @param LoggerInterface|null $logger * @throws XrefResolverFetchException */ - public static function resolve(Xref $xref, $force = false) + public static function resolve(Xref $xref, $force = false, LoggerInterface $logger=null, $headers=array()) { if ($xref->isResolved() && (!$force)) { return; diff --git a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/UrlXrefResolver.php b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/UrlXrefResolver.php index a20d18f..1a31c2b 100644 --- a/lib/ConfigToken/TreeCompiler/XrefResolver/Types/UrlXrefResolver.php +++ b/lib/ConfigToken/TreeCompiler/XrefResolver/Types/UrlXrefResolver.php @@ -4,6 +4,7 @@ use ConfigToken\Event; use ConfigToken\EventManager; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\XrefResolver\Exception\UnknownXrefTypeException; use ConfigToken\TreeCompiler\XrefResolver\Exception\XrefResolverFetchException; use ConfigToken\TreeCompiler\Xref; @@ -32,13 +33,15 @@ public static function getType() * * @param Xref $xref * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again. + * @param LoggerInterface|null $logger + * @param array $headers * @throws UnknownXrefTypeException * @throws XrefResolverFetchException * @throws \ConfigToken\TreeCompiler\XrefResolver\Exception\InvalidXrefTypeException * @throws \ConfigToken\TreeSerializer\Exception\UnknownContentTypeException * @throws \ConfigToken\TreeSerializer\Exception\UnknownFileExtensionException */ - public static function resolve(Xref $xref, $force = false) + public static function resolve(Xref $xref, $force = false, LoggerInterface $logger=null, $headers=array()) { if ($xref->isResolved() && (!$force)) { return; @@ -80,6 +83,7 @@ public static function resolve(Xref $xref, $force = false) curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); diff --git a/lib/ConfigToken/TreeCompiler/XrefResolver/XrefResolverInterface.php b/lib/ConfigToken/TreeCompiler/XrefResolver/XrefResolverInterface.php index 2ea1fb7..2c5d00d 100644 --- a/lib/ConfigToken/TreeCompiler/XrefResolver/XrefResolverInterface.php +++ b/lib/ConfigToken/TreeCompiler/XrefResolver/XrefResolverInterface.php @@ -2,6 +2,7 @@ namespace ConfigToken\TreeCompiler\XrefResolver; +use ConfigToken\LoggerInterface; use ConfigToken\TreeCompiler\Xref; @@ -36,6 +37,7 @@ public static function getPlatformSpecificLocation($xrefLocation); * * @param Xref $xref * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again. + * @param LoggerInterface|null $logger */ - public static function resolve(Xref $xref, $force = false); + public static function resolve(Xref $xref, $force = false, LoggerInterface $logger=null, $headers=array()); } \ No newline at end of file diff --git a/lib/ConfigToken/TreeCompiler/XrefTokenResolver.php b/lib/ConfigToken/TreeCompiler/XrefTokenResolver.php index d3230c8..8b200a6 100644 --- a/lib/ConfigToken/TreeCompiler/XrefTokenResolver.php +++ b/lib/ConfigToken/TreeCompiler/XrefTokenResolver.php @@ -2,6 +2,7 @@ namespace ConfigToken\TreeCompiler; +use ConfigToken\LoggerInterface; use ConfigToken\TokenCollection; use ConfigToken\TokenParser; use ConfigToken\TokenResolver\TokenResolverInterface; @@ -27,12 +28,80 @@ class XrefTokenResolver protected $tokenFilterDelimiter; /** @var TokenParser */ protected $tokenParser; + /** @var string */ + protected $sourceXrefLocation; + /** @var integer */ + protected $sourceXrefPosition; public function __construct(TokenResolverInterface $tokenResolver = null) { $this->setTokenResolver($tokenResolver); } + /** + * Check if the source Xref location was set. + * + * @return boolean + */ + public function hasSourceXrefLocation() + { + return isset($this->sourceXrefLocation); + } + + /** + * Get the source Xref location. + * + * @return string|null + */ + public function getSourceXrefLocation() + { + return $this->sourceXrefLocation; + } + + /** + * Set the source Xref location. + * + * @param string $value The new value. + * @return $this + */ + public function setSourceXrefLocation($value) + { + $this->sourceXrefLocation = $value; + return $this; + } + + /** + * Check if the source Xref position of this token resolver was set. + * + * @return boolean + */ + public function hasSourceXrefPosition() + { + return isset($this->sourceXrefPosition); + } + + /** + * Get the source Xref position of this token resolver. + * + * @return integer|null + */ + public function getSourceXrefPosition() + { + return $this->sourceXrefPosition; + } + + /** + * Set the source Xref position of this token resolver. + * + * @param integer $value The new value. + * @return $this + */ + public function setSourceXrefPosition($value) + { + $this->sourceXrefPosition = $value; + return $this; + } + /** * Check if token resolver was set. * @@ -343,9 +412,9 @@ public function getTokenParser() return $this->tokenParser; } - public function resolve(TokenCollection $tokens) + public function resolve(TokenCollection $tokens, LoggerInterface $logger=null) { - $tokens->resolve($this->tokenResolver, null, $this->ignoreUnknownFilters); + $tokens->resolve($this->tokenResolver, null, $this->ignoreUnknownFilters, $logger); return $this; } } \ No newline at end of file diff --git a/lib/ConfigToken/TreeCompiler/XrefTokenResolverCollection.php b/lib/ConfigToken/TreeCompiler/XrefTokenResolverCollection.php index 2b346ef..2037ca2 100644 --- a/lib/ConfigToken/TreeCompiler/XrefTokenResolverCollection.php +++ b/lib/ConfigToken/TreeCompiler/XrefTokenResolverCollection.php @@ -3,6 +3,7 @@ namespace ConfigToken\TreeCompiler; +use ConfigToken\LoggerInterface; use ConfigToken\TokenCollection; use ConfigToken\TokenInjector; use ConfigToken\TokenParser; @@ -43,8 +44,21 @@ public function prependCollection(XrefTokenResolverCollection $xrefTokenResolver $this->collection = array_merge($xrefTokenResolverCollection->collection, $this->collection); } - protected function resolveTokens(TokenCollection $tokens, XrefTokenResolver $xrefTokenResolver) + protected function resolveTokens(TokenCollection $tokens, XrefTokenResolver $xrefTokenResolver, + LoggerInterface $logger=null) { + if (isset($logger)) { + $message = sprintf( + 'Applying token resolver #%d from \'%s\'', + $xrefTokenResolver->getSourceXrefPosition(), + $xrefTokenResolver->getSourceXrefLocation(), + $xrefTokenResolver->getIgnoreUnknownFilters() + ); + if (!$xrefTokenResolver->getTokenResolver()->getIgnoreUnknownTokens()) { + $message .= '. WARNING! Unknown tokens will not be ignored!'; + } + $logger->addRecord(LoggerInterface::DEBUG, $message); + } if (!$xrefTokenResolver->hasTokenResolver()) { throw new \Exception('No token resolver found for Xref token resolver.'); } @@ -75,7 +89,7 @@ protected function resolveTokens(TokenCollection $tokens, XrefTokenResolver $xre $tokenResolver->setScope($values); } } - $xrefTokenResolver->resolve($tokens); + $xrefTokenResolver->resolve($tokens, $logger); } protected function getTokensFromArray(&$array, TokenParser $parser, &$result, $level=0) @@ -116,18 +130,18 @@ protected function getTokensFromArray(&$array, TokenParser $parser, &$result, $l } } - public function applyToString($string) + public function applyToString($string, LoggerInterface $logger=null) { foreach ($this->collection as $xrefTokenResolver) { $tokenParser = $xrefTokenResolver->getTokenParser(); $tokens = $tokenParser->parseString($string); - $this->resolveTokens($tokens, $xrefTokenResolver); + $this->resolveTokens($tokens, $xrefTokenResolver, $logger); $string = TokenInjector::injectString($string, $tokens); } return $string; } - public function applyToArray(&$array) + public function applyToArray(&$array, LoggerInterface $logger=null) { foreach ($this->collection as $xrefTokenResolver) { $tokenParser = $xrefTokenResolver->getTokenParser(); @@ -135,10 +149,10 @@ public function applyToArray(&$array) $this->getTokensFromArray($array, $tokenParser, $lookup); foreach ($lookup as $record) { if (isset($record[self::_VALUE_TOKENS])) { - $this->resolveTokens($record[self::_VALUE_TOKENS], $xrefTokenResolver); + $this->resolveTokens($record[self::_VALUE_TOKENS], $xrefTokenResolver, $logger); } if (isset($record[self::_KEY_TOKENS])) { - $this->resolveTokens($record[self::_KEY_TOKENS], $xrefTokenResolver); + $this->resolveTokens($record[self::_KEY_TOKENS], $xrefTokenResolver, $logger); } } foreach ($lookup as &$record) {