getAlias()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Gendoria\CommandQueueRabbitMqDriverBundle\DependencyInjection;
4
5
use Gendoria\CommandQueueBundle\DependencyInjection\Pass\WorkerRunnersPass;
6
use Symfony\Component\Config\FileLocator;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
9
use Symfony\Component\DependencyInjection\Loader;
10
use Symfony\Component\DependencyInjection\Reference;
11
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
12
13
/**
14
 * This is the class that loads and manages your bundle configuration.
15
 *
16
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
17
 */
18
class GendoriaCommandQueueRabbitMqDriverExtension extends Extension implements PrependExtensionInterface
19
{
20
    /**
21
     * Get extension alias.
22
     *
23
     * @return string
24
     */
25 2
    public function getAlias()
26
    {
27 2
        return 'gendoria_command_queue_rabbit_mq_driver';
28
    }
29
30
    /**
31
     * Load extension.
32
     *
33
     * @param array            $configs
34
     * @param ContainerBuilder $container
35
     */
36 1
    public function load(array $configs, ContainerBuilder $container)
37
    {
38 1
        $configuration = new Configuration($this->getAlias());
39 1
        $config = $this->processConfiguration($configuration, $configs);
40
41 1
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
42 1
        $loader->load('services.yml');
43
44 1
        $this->loadDrivers($config, $container);
45 1
        $container->removeDefinition('gendoria_command_queue_rabbit_mq_driver.send_driver');
46 1
        $container->removeDefinition('gendoria_command_queue_rabbit_mq_driver.external_data_worker');
47 1
    }
48
    
49 1
    private function loadDrivers(array $config, ContainerBuilder $container)
50
    {
51 1
        $serializer = substr($config['serializer'], 1);
52 1
        $workerRunner = $container->getDefinition('gendoria_command_queue_rabbit_mq_driver.worker_runner');
53 1
        foreach ($config['drivers'] as $driverId => $driver) {
54 1
            $producerName = sprintf('old_sound_rabbit_mq.%s_producer', $driver['producer_name']);
55 1
            $delayedProducerName = sprintf('old_sound_rabbit_mq.%s_reschedule_delayed_producer', $driver['producer_name']);
56
            
57 1
            $newDriver = clone $container->getDefinition('gendoria_command_queue_rabbit_mq_driver.send_driver');
58 1
            $newDriver->replaceArgument(0, new Reference($serializer));
59 1
            $newDriver->replaceArgument(1, new Reference($producerName));
60 1
            $container->setDefinition('gendoria_command_queue_rabbit_mq_driver.driver.'.$driverId, $newDriver);
61
62 1
            $newWorker = clone $container->getDefinition('gendoria_command_queue_rabbit_mq_driver.external_data_worker');
63 1
            $newWorker->replaceArgument(2, new Reference($serializer));
64 1
            $newWorker->replaceArgument(3, new Reference($delayedProducerName));
65 1
            $workerRunner->addTag(WorkerRunnersPass::WORKER_RUNNER_TAG, array('name' => 'rmq.'.$driverId, 'options' => json_encode($driver)));
66 1
            $workerRunner->addTag(WorkerRunnersPass::WORKER_RUNNER_TAG, array('name' => 'rmq.'.$driverId.'.reschedule', 'options' => json_encode(array_merge($driver, array('reschedule' => true)))));
67 1
            $container->setDefinition('gendoria_command_queue_rabbit_mq_driver.worker.'.$driverId, $newWorker);
68 1
        }
69 1
    }
70
71
    /**
72
     * Prepend configuration.
73
     *
74
     * @param ContainerBuilder $container
75
     */
76 1
    public function prepend(ContainerBuilder $container)
77
    {
78 1
        $this->prependRabbitMq($container);
79 1
    }
80
    
81
    /**
82
     * Prepend configuration to OldSoundRabbitMQBundle.
83
     *
84
     * @param ContainerBuilder $container
85
     */
86 2
    private function prependRabbitMq(ContainerBuilder $container) {
87 1
        $configs = $container->getExtensionConfig($this->getAlias());
88 1
        $currentConfig = $this->processConfiguration(new Configuration($this->getAlias()), $configs);
89
90
        $rabbitMQConfig = array(
91 1
            'consumers' => array(),
92 1
            'producers' => array(),
93 1
        );
94
95 1
        foreach ($currentConfig['drivers'] as $driverId => $driver) {
96
            $exchangeOptions = array(
97 2
                'name' => $driver['exchange_name'],
98 1
                'type' => 'topic',
99 1
            );
100
101 1
            $rabbitMQConfig['producers'][$driver['producer_name']] = array(
102 1
                'connection' => $driver['rabbitmq_connection'],
103 1
                'exchange_options' => $exchangeOptions,
104
            );
105
106 1
            $rabbitMQConfig['consumers'][$driver['consumer_name']] = array(
107 1
                'connection' => $driver['rabbitmq_connection'],
108 1
                'exchange_options' => $exchangeOptions,
109
                'queue_options' => array(
110 1
                    'name' => $driver['consumer_queue_name'],
111 1
                    'durable' => true,
112 1
                    'auto_delete' => false,
113 1
                    'routing_keys' => array('*'),
114 1
                ),
115
                'qos_options' => array(
116 1
                    'prefetch_size' => 0,
117 1
                    'prefetch_count' => 1,
118 1
                    'global' => false,
119 1
                ),
120 1
                'callback' => 'gendoria_command_queue_rabbit_mq_driver.worker.'.$driverId,
121
            );
122
123 1
            $rabbitMQConfig['producers'][$driver['producer_name'].'_reschedule_delayed'] = array(
124 1
                'connection' => $driver['rabbitmq_connection'],
125 1
                'exchange_options' => array_merge($exchangeOptions, array(
126 1
                    'name' => $driver['exchange_name'].'-reschedule-delayed',
127 1
                )),
128
            );
129
130 1
            $rabbitMQConfig['consumers'][$driver['consumer_name'].'_reschedule_delayed'] = array(
131 1
                'connection' => $driver['rabbitmq_connection'],
132 1
                'exchange_options' => $rabbitMQConfig['producers'][$driver['producer_name'].'_reschedule_delayed']['exchange_options'],
133
                'queue_options' => array(
134 1
                    'name' => $driver['consumer_queue_name'].'-reschedule-delayed',
135 1
                    'durable' => true,
136 1
                    'auto_delete' => false,
137 1
                    'routing_keys' => array('*'),
138
                    'arguments' => array(
139 1
                        'x-dead-letter-exchange' => array('S', $exchangeOptions['name']),
140 1
                        'x-message-ttl' => array('I', 600000), //10 minutes
141 1
                    ),
142 1
                ),
143 1
                'callback' => 'gendoria_command_queue_rabbit_mq_driver.services_reschedule_worker',
144
            );
145 1
        }
146
147 1
        $container->prependExtensionConfig('old_sound_rabbit_mq', $rabbitMQConfig);
148 1
    }    
149
}
150