Completed
Push — master ( 3a149f...186020 )
by Tomasz
06:25
created

rivers()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 18
ccs 15
cts 15
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 12
nc 4
nop 1
crap 3
1
<?php
2
3
namespace Gendoria\CommandQueueBundle\DependencyInjection;
4
5
use Gendoria\CommandQueue\QueueManager\NullQueueManager;
6
use Gendoria\CommandQueue\QueueManager\SimpleQueueManager;
7
use Gendoria\CommandQueue\Serializer\NullSerializer;
8
use Gendoria\CommandQueueBundle\Serializer\JmsSerializer;
9
use Gendoria\CommandQueueBundle\Serializer\SymfonySerializer;
10
use InvalidArgumentException;
11
use JMS\SerializerBundle\JMSSerializerBundle;
12
use Symfony\Component\Config\FileLocator;
13
use Symfony\Component\DependencyInjection\ContainerBuilder;
14
use Symfony\Component\DependencyInjection\Definition;
15
use Symfony\Component\DependencyInjection\Loader;
16
use Symfony\Component\DependencyInjection\Reference;
17
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
18
use Symfony\Component\Serializer\Serializer;
19
20
/**
21
 * This is the class that loads and manages your bundle configuration.
22
 *
23
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
24
 */
25
class GendoriaCommandQueueExtension extends Extension
26
{
27
    /**
28
     * Get extension alias.
29
     *
30
     * @return string
31
     */
32 6
    public function getAlias()
33
    {
34 6
        return 'gendoria_command_queue';
35
    }
36
37
    /**
38
     * Load extension.
39
     *
40
     * @param array            $configs
41
     * @param ContainerBuilder $container
42
     * @throws InvalidArgumentException Thrown, when pool required in configuration is not present.
43
     */
44 6
    public function load(array $configs, ContainerBuilder $container)
45
    {
46 6
        $configuration = new Configuration($this->getAlias());
47 6
        $config = $this->processConfiguration($configuration, $configs);
48
49 5
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
50 5
        $loader->load('services.yml');
51
52 5
        $container->setParameter('gendoria_command_queue.pools', $config['pools']);
53 5
        if (!$config['enable']) {
54 1
            $managerDefinition = $container->getDefinition('gendoria_command_queue.manager');
55 1
            $managerDefinition->setClass(NullQueueManager::class);
56 1
        }
57 5
        $this->setupManagers($config, $container);
58 4
    }
59
    
60 5
    private function setupManagers($config, ContainerBuilder $container)
61
    {
62
        //Create simple managers for each pool and tag multiple manager to receive all pools
63 5
        $managerDefinition = $container->getDefinition('gendoria_command_queue.manager');
64 5
        $poolNames = array_keys($config['pools']);
65 5
        foreach ($config['pools'] as $poolName => $poolConfig) {
66 4
            $definition = new Definition(SimpleQueueManager::class);
67 4
            $definition->addTag('gendoria_command_queue.send_manager', array('pool' => $poolName));
68 4
            $container->setDefinition('gendoria_command_queue.manager.'.$poolName, $definition);
69 4
            $managerDefinition->addTag('gendoria_command_queue.send_manager', array('pool' => $poolName, 'default' => $poolName == 'default'));
70 5
        }
71
        //Inject command routing to default manager
72 5
        foreach ($config['routes'] as $commandExpression => $poolName) {
73 2
            if (!in_array($poolName, $poolNames)) {
74 1
                throw new InvalidArgumentException(sprintf("Pool \"%s\" required in command routing is not present.", $poolName));
75
            }
76 1
            $managerDefinition->addMethodCall('addCommandRoute', array($commandExpression, $poolName));
77 4
        }
78 4
    }
79
}
80