Completed
Push — master ( 0db8da...fd044c )
by Olivier
02:12
created

Configuration::getModulusValidation()   C

Complexity

Conditions 8
Paths 1

Size

Total Lines 29
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 8

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
ccs 14
cts 14
cp 1
rs 5.3846
cc 8
eloc 14
nc 1
nop 0
crap 8
1
<?php
2
3
namespace Ola\RabbitMqAdminToolkitBundle\DependencyInjection;
4
5
use Ola\RabbitMqAdminToolkitBundle\Manager\QueueManager;
6
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
7
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
8
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
9
use Symfony\Component\Config\Definition\ConfigurationInterface;
10
11
class Configuration implements ConfigurationInterface
12
{
13
    /**
14
     * {@inheritdoc}
15
     */
16 7
    public function getConfigTreeBuilder()
17
    {
18 7
        $treeBuilder = new TreeBuilder();
19 7
        $rootNode = $treeBuilder->root('ola_rabbit_mq_admin_toolkit');
20
21
        $rootNode
22 7
            ->addDefaultsIfNotSet()
23 7
            ->children()
24 7
                ->scalarNode('default_vhost')->defaultValue('default')->end()
25 7
                ->scalarNode('delete_allowed')->defaultFalse()->end()
26 7
                ->scalarNode('silent_failure')->defaultFalse()->end()
27 7
                ->arrayNode('connections')
28 7
                    ->useAttributeAsKey('identifier')
29 7
                    ->prototype('scalar')->end()
30 7
                ->end()
31 7
                ->arrayNode('vhosts')
32 7
                    ->useAttributeAsKey('identifier')
33 7
                    ->canBeUnset(true)
34 7
                    ->prototype('array')
35 7
                        ->children()
36 7
                            ->scalarNode('name')->end()
37 7
                            ->scalarNode('connection')->defaultValue('default')->end()
38 7
                            ->scalarNode('delete_allowed')->end()
39 7
                            ->append($this->getPermissionsConfiguration())
40 7
                            ->append($this->getExchangesConfiguration())
41 7
                            ->append($this->getQueuesConfiguration())
42 7
                        ->end()
43 7
                    ->end()
44 7
                ->end()
45 7
            ->end()
46
        ;
47 7
        return $treeBuilder;
48
    }
49
50
    /**
51
     * @return NodeDefinition
52
     */
53 7 View Code Duplication
    private function getPermissionsConfiguration()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
54
    {
55 7
        $node = new ArrayNodeDefinition('permissions');
56
57
        return $node
58 7
            ->useAttributeAsKey('identifier')
59 7
            ->canBeUnset(true)
60 7
            ->prototype('array')
61 7
                ->children()
62 7
                    ->scalarNode('configure')->defaultValue('.*')->end()
63 7
                    ->scalarNode('read')->defaultValue('.*')->end()
64 7
                    ->scalarNode('write')->defaultValue('.*')->end()
65 7
                ->end()
66 7
            ->end();
67
    }
68
69
    /**
70
     * @return NodeDefinition
71
     */
72 7 View Code Duplication
    private function getExchangesConfiguration()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
73
    {
74 7
        $node = new ArrayNodeDefinition('exchanges');
75
76 7
        $this->appendNameNormalization($node);
77
78
        return $node
79 7
            ->useAttributeAsKey('identifier')
80 7
            ->canBeUnset(true)
81 7
            ->prototype('array')
82 7
                ->children()
83 7
                    ->scalarNode('name')->end()
84 7
                    ->scalarNode('type')->defaultValue('topic')->end()
85 7
                    ->scalarNode('durable')->defaultTrue()->end()
86 7
                ->end()
87 7
            ->end();
88
    }
89
90
    /**
91
     * @return NodeDefinition
92
     */
93 7
    private function getQueuesConfiguration()
94
    {
95 7
        $modulusValidation = $this->getModulusValidation();
96
97 7
        $node = new ArrayNodeDefinition('queues');
98
99 7
        $this->appendNameNormalization($node);
100
101
        return $node
102 7
            ->useAttributeAsKey('identifier')
103 7
            ->validate()
104 7
                ->ifTrue($modulusValidation)
105 7
                ->thenInvalid('If queue.modulus is defined queue.name & at least one associated routing_key should contain a {modulus} part')
106 7
            ->end()
107 7
            ->prototype('array')
108 7
                ->canBeUnset(true)
109 7
                ->children()
110 7
                    ->scalarNode('name')->end()
111 7
                    ->scalarNode('durable')->defaultTrue()->end()
112 7
                    ->scalarNode('modulus')->defaultNull()->end()
113 7
                    ->append($this->getQueueArgumentsConfiguration())
114 7
                    ->arrayNode('bindings')
115 7
                        ->performNoDeepMerging()
116 7
                        ->prototype('array')
117 7
                            ->children()
118 7
                                ->scalarNode('exchange')->end()
119 7
                                ->scalarNode('routing_key')->end()
120 7
                            ->end()
121 7
                        ->end()
122 7
                    ->end()
123 7
                ->end()
124 7
            ->end();
125
    }
126
127
    /**
128
     * Get modulus validation closure
129
     *
130
     * @return \Closure
131
     */
132 7
    private function getModulusValidation()
133
    {
134
        return function($queues) {
135
136
            $hasModulus = function($string) {
137 4
                return strpos($string, QueueManager::MODULUS_PLACEHOLDER) !== false;
138 7
            };
139
140 7
            foreach ($queues as $name => $queue) {
141 7
                if (isset($queue['modulus']) && is_int($queue['modulus'])) {
142
143 4
                    if (!$hasModulus($queue['name'])) {
144 1
                        return true;
145
                    }
146
147 3
                    $bindingsHaveModulus = false;
148 3
                    foreach ($queue['bindings'] as $binding) {
149 3
                        if ($hasModulus($binding['routing_key'])) {
150 3
                            $bindingsHaveModulus = true;
151
                        }
152
                    }
153
154 3
                    if (!$bindingsHaveModulus) {
155 6
                        return true;
156
                    }
157
                }
158
            }
159 7
        };
160
    }
161
162
    /**
163
     * @param NodeDefinition $node
164
     *
165
     * @return NodeDefinition
166
     */
167 7
    private function appendNameNormalization(NodeDefinition $node)
168
    {
169
        return $node
170 7
            ->beforeNormalization()
171
                ->ifTrue(function($array) {
172 7
                    foreach ($array as $item) {
173 7
                        if (false !== $item && !isset($item['name'])) {
174 7
                            return true;
175
                        }
176
                    }
177 7
                })
178
                ->then(function($array) {
179 7
                    foreach ($array as $name => $item) {
180 7
                        if (false !== $item && !isset($item['name'])) {
181 7
                            $array[$name]['name'] = $name;
182
                        }
183
                    }
184
185 7
                    return $array;
186 7
                })
187 7
            ->end();
188
    }
189
190
    /**
191
     * @return NodeDefinition
192
     */
193 7
    private function getQueueArgumentsConfiguration()
194
    {
195 7
        $node = new ArrayNodeDefinition('arguments');
196
197
        return $node
198
            // We have to un-normalize arguments keys, as this is not configurable in SF 2.1
199 7
            ->beforeNormalization()
200
                ->ifTrue(function($arguments) {
201 1
                    foreach ($arguments as $k => $v) {
202
                        //Un-normalize keys
203 1
                        if (false !== strpos($k, '_')) {
204 1
                            return true;
205
                        }
206
                    }
207 7
                })
208 7
                ->then(function($arguments) {
209 1
                    foreach ($arguments as $k => $v) {
210 1
                        if (false !== strpos($k, '_')) {
211 1
                            $arguments[str_replace('_', '-', $k)] = $v;
212 1
                            unset($arguments[$k]);
213
                        }
214
                    }
215
216 1
                    return $arguments;
217 7
                })
218 7
            ->end()
219 7
            ->prototype('scalar')->end();
220
    }
221
}
222