mirror of
https://github.com/netzbegruenung/user_saml.git
synced 2024-05-14 14:46:06 +02:00
3435d5093a
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
151 lines
4.1 KiB
PHP
151 lines
4.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Behat.
|
|
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Behat\Behat\Context;
|
|
|
|
use Behat\Testwork\Argument\Validator;
|
|
use Behat\Behat\Context\Argument\ArgumentResolver;
|
|
use Behat\Behat\Context\Initializer\ContextInitializer;
|
|
use Behat\Testwork\Argument\ArgumentOrganiser;
|
|
use ReflectionClass;
|
|
|
|
/**
|
|
* Instantiates contexts using registered argument resolvers and context initializers.
|
|
*
|
|
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
|
*/
|
|
final class ContextFactory
|
|
{
|
|
/**
|
|
* @var ArgumentOrganiser
|
|
*/
|
|
private $argumentOrganiser;
|
|
/**
|
|
* @var ArgumentResolver[]
|
|
*/
|
|
private $argumentResolvers = array();
|
|
/**
|
|
* @var ContextInitializer[]
|
|
*/
|
|
private $contextInitializers = array();
|
|
/**
|
|
* @var Validator
|
|
*/
|
|
private $validator;
|
|
|
|
/**
|
|
* Initialises factory.
|
|
*
|
|
* @param ArgumentOrganiser $argumentOrganiser
|
|
*/
|
|
public function __construct(ArgumentOrganiser $argumentOrganiser)
|
|
{
|
|
$this->argumentOrganiser = $argumentOrganiser;
|
|
$this->validator = new Validator();
|
|
}
|
|
|
|
/**
|
|
* Registers context argument resolver.
|
|
*
|
|
* @param ArgumentResolver $resolver
|
|
*/
|
|
public function registerArgumentResolver(ArgumentResolver $resolver)
|
|
{
|
|
$this->argumentResolvers[] = $resolver;
|
|
}
|
|
|
|
/**
|
|
* Registers context initializer.
|
|
*
|
|
* @param ContextInitializer $initializer
|
|
*/
|
|
public function registerContextInitializer(ContextInitializer $initializer)
|
|
{
|
|
$this->contextInitializers[] = $initializer;
|
|
}
|
|
|
|
/**
|
|
* Creates and initializes context class.
|
|
*
|
|
* @param string $class
|
|
* @param array $arguments
|
|
* @param ArgumentResolver[] $singleUseResolvers
|
|
*
|
|
* @return Context
|
|
*/
|
|
public function createContext($class, array $arguments = array(), array $singleUseResolvers = array())
|
|
{
|
|
$reflection = new ReflectionClass($class);
|
|
$resolvers = array_merge($singleUseResolvers, $this->argumentResolvers);
|
|
$resolvedArguments = $this->resolveArguments($reflection, $arguments, $resolvers);
|
|
$context = $this->createInstance($reflection, $resolvedArguments);
|
|
$this->initializeInstance($context);
|
|
|
|
return $context;
|
|
}
|
|
|
|
/**
|
|
* Resolves arguments for a specific class using registered argument resolvers.
|
|
*
|
|
* @param ReflectionClass $reflection
|
|
* @param array $arguments
|
|
* @param ArgumentResolver[] $resolvers
|
|
*
|
|
* @return mixed[]
|
|
*/
|
|
private function resolveArguments(ReflectionClass $reflection, array $arguments, array $resolvers)
|
|
{
|
|
$newArguments = $arguments;
|
|
|
|
foreach ($resolvers as $resolver) {
|
|
$newArguments = $resolver->resolveArguments($reflection, $newArguments);
|
|
}
|
|
|
|
if (!$reflection->hasMethod('__construct')) {
|
|
return $newArguments;
|
|
}
|
|
|
|
$constructor = $reflection->getConstructor();
|
|
$newArguments = $this->argumentOrganiser->organiseArguments($constructor, $newArguments);
|
|
$this->validator->validateArguments($constructor, $newArguments);
|
|
|
|
return $newArguments;
|
|
}
|
|
|
|
/**
|
|
* Creates context instance.
|
|
*
|
|
* @param ReflectionClass $reflection
|
|
* @param array $arguments
|
|
*
|
|
* @return mixed
|
|
*/
|
|
private function createInstance(ReflectionClass $reflection, array $arguments)
|
|
{
|
|
if (count($arguments)) {
|
|
return $reflection->newInstanceArgs(array_values($arguments));
|
|
}
|
|
|
|
return $reflection->newInstance();
|
|
}
|
|
|
|
/**
|
|
* Initializes context class and returns new context instance.
|
|
*
|
|
* @param Context $context
|
|
*/
|
|
private function initializeInstance(Context $context)
|
|
{
|
|
foreach ($this->contextInitializers as $initializer) {
|
|
$initializer->initializeContext($context);
|
|
}
|
|
}
|
|
}
|