Skip to content

Commit

Permalink
More work on generalized 'embedded refs' resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
gggeek committed May 1, 2018
1 parent dd049a4 commit 0e25192
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Core/Executor/FileExecutor.php
Expand Up @@ -366,7 +366,7 @@ protected function setReferences($fileName, $dsl)
protected function resolveReferencesInText($text)
{
if (!$this->referenceResolver instanceof EmbeddedReferenceResolverInterface) {
throw new \Exception("Reference resolver passed to HTTPExecutor should implement EmbeddedReferenceResolverInterface");
throw new \Exception("Reference resolver passed to FileExecutor should implement EmbeddedReferenceResolverInterface");
}

return $this->referenceResolver->ResolveEmbeddedReferences($text);
Expand Down
2 changes: 1 addition & 1 deletion Core/Executor/MailExecutor.php
Expand Up @@ -143,7 +143,7 @@ protected function resolveReferencesRecursively($match)
protected function resolveReferencesInText($text)
{
if (!$this->referenceResolver instanceof EmbeddedReferenceResolverInterface) {
throw new \Exception("Reference resolver passed to HTTPExecutor should implement EmbeddedReferenceResolverInterface");
throw new \Exception("Reference resolver passed to MailExecutor should implement EmbeddedReferenceResolverInterface");
}

return $this->referenceResolver->ResolveEmbeddedReferences($text);
Expand Down
2 changes: 1 addition & 1 deletion Core/Executor/ProcessExecutor.php
Expand Up @@ -149,7 +149,7 @@ protected function setReferences(Process $process, $dsl)
protected function resolveReferencesInText($text)
{
if (!$this->referenceResolver instanceof EmbeddedReferenceResolverInterface) {
throw new \Exception("Reference resolver passed to HTTPExecutor should implement EmbeddedReferenceResolverInterface");
throw new \Exception("Reference resolver passed to ProcessExecutor should implement EmbeddedReferenceResolverInterface");
}

return $this->referenceResolver->ResolveEmbeddedReferences($text);
Expand Down
1 change: 1 addition & 0 deletions Core/ReferenceResolver/ChainPrefixResolver.php
Expand Up @@ -22,6 +22,7 @@ public function addResolver(ReferenceResolverInterface $resolver)
public function getRegexp()
{
$regexps = array();
/** @var PrefixBasedResolverInterface $resolver */
foreach ($this->resolvers as $resolver) {
$regexp = preg_replace('/^\^/', '', substr($resolver->getRegexp(), 1, -1));
if ($regexp !== '') {
Expand Down
1 change: 1 addition & 0 deletions Core/ReferenceResolver/ChainRegexpResolver.php
Expand Up @@ -22,6 +22,7 @@ public function addResolver(ReferenceResolverInterface $resolver)
public function getRegexp()
{
$regexps = array();
/** @var RegexpBasedResolverInterface $resolver */
foreach ($this->resolvers as $resolver) {
$regexp = substr($resolver->getRegexp(), 1, -1);
if ($regexp !== '') {
Expand Down
44 changes: 43 additions & 1 deletion Core/ReferenceResolver/ChainResolver.php
Expand Up @@ -6,8 +6,9 @@
use Kaliop\eZMigrationBundle\API\ReferenceBagInterface;
use Kaliop\eZMigrationBundle\API\ReferenceResolverBagInterface;
use Kaliop\eZMigrationBundle\API\EnumerableReferenceResolverInterface;
use Kaliop\eZMigrationBundle\API\EmbeddedReferenceResolverInterface;

class ChainResolver implements ReferenceResolverBagInterface, EnumerableReferenceResolverInterface
class ChainResolver implements ReferenceResolverBagInterface, EnumerableReferenceResolverInterface, EmbeddedReferenceResolverInterface
{
/** @var ReferenceResolverInterface[] $resolvers */
protected $resolvers = array();
Expand Down Expand Up @@ -108,4 +109,45 @@ public function listReferences()

return $refs;
}

/**
* @param string $string
* @return bool true if the given $stringIdentifier contains at least one occurrence of the reference(s)
* @throws \Exception if any resolver in the chain is not an EmbeddedReferenceResolverInterface
*/
public function hasEmbeddedReferences($string)
{
foreach ($this->resolvers as $resolver) {
if ($resolver instanceof EmbeddedReferenceResolverInterface) {
if ($resolver->hasEmbeddedReferences($string)) {
return true;
}
} else {
throw new \Exception("Could not verify embedded references because of chained resolver of type: " . get_class($resolver));
}
}

return false;
}

/**
* Returns the $string with eventual refs resolved.
* Q: SHALL WE GUARANTEE THAT ALL RESOLVERS IN THE CHAIN CAN TAKE PART IN THIS?
*
* @param string $string
* @return string
* @throws \Exception if any resolver in the chain is not an EmbeddedReferenceResolverInterface
*/
public function resolveEmbeddedReferences($string)
{
foreach ($this->resolvers as $resolver) {
if ($resolver instanceof EmbeddedReferenceResolverInterface) {
$string = $resolver->resolveEmbeddedReferences($string);
} else {
throw new \Exception("Could not resolve embedded references because of chained resolver of type: " . get_class($resolver));
}
}

return $string;
}
}
Expand Up @@ -43,14 +43,15 @@ public function resolveEmbeddedReferences($string)
}

/**
* NB: here we assume that all regexp resolvers give us a regexp with a very specific format, notably using '/' as
* delimiter......
* @return string
* @todo make the start and end tokens flexible (it probably wont work well if we use eg. '}}' as end token)
*/
protected function getEmbeddedRegexp()
{
// we need to alter the regexp we usr for std ref resolving, as it will be used to match parts of text, not the whole string
$regexp = substr($this->getRegexp(), 1, -1);
// NB: here we assume that all regexp resolvers give us a regexp with a very specific format...
return '/' . preg_quote($this->beginToken). preg_replace(array('/^\^/'), array(''), $regexp) . '[^' . $this->endToken . ']+' . preg_quote($this->endToken) . '/';
}

Expand Down

0 comments on commit 0e25192

Please sign in to comment.