Completed
Pull Request — master (#1343)
by Dmitry
04:26
created

Configuration::addClientsSection()   B

Complexity

Conditions 4
Paths 1

Size

Total Lines 92
Code Lines 79

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 83
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 92
ccs 83
cts 83
cp 1
rs 8.3275
c 0
b 0
f 0
cc 4
eloc 79
nc 1
nop 1
crap 4

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/*
4
 * This file is part of the FOSElasticaBundle package.
5
 *
6
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace FOS\ElasticaBundle\DependencyInjection;
13
14
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
16
use Symfony\Component\Config\Definition\ConfigurationInterface;
17
18
class Configuration implements ConfigurationInterface
19
{
20
    const SUPPORTED_DRIVERS = ['orm', 'mongodb', 'phpcr'];
21
22
    /**
23
     * If the kernel is running in debug mode.
24
     *
25
     * @var bool
26
     */
27
    private $debug;
28
29 30
    public function __construct($debug)
30
    {
31 30
        $this->debug = $debug;
32 30
    }
33
34
    /**
35
     * Generates the configuration tree.
36
     *
37
     * @return TreeBuilder
38
     */
39 30
    public function getConfigTreeBuilder()
40
    {
41 30
        $treeBuilder = new TreeBuilder();
42 30
        $rootNode = $treeBuilder->root('fos_elastica', 'array');
43
44 30
        $this->addClientsSection($rootNode);
45 30
        $this->addIndexesSection($rootNode);
46
        $this->addIndexTemplatesSection($rootNode);
47
48 30
        $rootNode
49 30
            ->children()
50 30
                ->scalarNode('default_client')
51 30
                    ->info('Defaults to the first client defined')
52 30
                ->end()
53 30
                ->scalarNode('default_index')
54 30
                    ->info('Defaults to the first index defined')
55 30
                ->end()
56 30
                ->scalarNode('default_manager')->defaultValue('orm')->end()
57 30
                ->arrayNode('serializer')
58 30
                    ->treatNullLike([])
59 30
                    ->children()
60 30
                        ->scalarNode('callback_class')->defaultValue('FOS\ElasticaBundle\Serializer\Callback')->end()
61 30
                        ->scalarNode('serializer')->defaultValue('serializer')->end()
62 30
                    ->end()
63 30
                ->end()
64
            ->end()
65
        ;
66 30
67
        return $treeBuilder;
68
    }
69
70
    /**
71
     * Returns the array node used for "dynamic_templates".
72 30
     */
73
    public function getDynamicTemplateNode()
74 30
    {
75 30
        $builder = new TreeBuilder();
76
        $node = $builder->root('dynamic_templates');
77
78 30
        $node
79 30
            ->prototype('array')
80 30
                ->prototype('array')
81 30
                    ->children()
82 30
                        ->scalarNode('match')->end()
83 30
                        ->scalarNode('unmatch')->end()
84 30
                        ->scalarNode('match_mapping_type')->end()
85 30
                        ->scalarNode('path_match')->end()
86 30
                        ->scalarNode('path_unmatch')->end()
87 30
                        ->scalarNode('match_pattern')->end()
88 30
                        ->arrayNode('mapping')
89 30
                            ->prototype('variable')
90 30
                                ->treatNullLike([])
91 30
                            ->end()
92 30
                        ->end()
93 30
                    ->end()
94 30
                ->end()
95
            ->end()
96
        ;
97 30
98
        return $node;
99
    }
100
101
    /**
102
     * Returns the array node used for "types".
103 30
     */
104
    protected function getTypesNode()
105 30
    {
106 30
        $builder = new TreeBuilder();
107
        $node = $builder->root('types');
108
109 30
        $node
110 30
            ->useAttributeAsKey('name')
111 30
            ->prototype('array')
112 30
                ->treatNullLike([])
113 30
                ->beforeNormalization()
114 30
                ->ifNull()
115 30
                    ->thenEmptyArray()
116
                ->end()
117
                // Support multiple dynamic_template formats to match the old bundle style
118 30
                // and the way ElasticSearch expects them
119 30
                ->beforeNormalization()
120 21
                ->ifTrue(function ($v) {
121 30
                    return isset($v['dynamic_templates']);
122 30
                })
123 3
                ->then(function ($v) {
124 3
                    $dt = [];
125 3
                    foreach ($v['dynamic_templates'] as $key => $type) {
126 3
                        if (is_int($key)) {
127
                            $dt[] = $type;
128 3
                        } else {
129
                            $dt[][$key] = $type;
130
                        }
131
                    }
132 3
133
                    $v['dynamic_templates'] = $dt;
134 3
135 30
                    return $v;
136 30
                })
137 30
                ->end()
138 30
                ->children()
139 30
                    ->booleanNode('date_detection')->end()
140 30
                    ->arrayNode('dynamic_date_formats')->prototype('scalar')->end()->end()
141 30
                    ->scalarNode('analyzer')->end()
142 30
                    ->booleanNode('numeric_detection')->end()
143 30
                    ->scalarNode('dynamic')->end()
144 30
                    ->variableNode('indexable_callback')->end()
145 30
                    ->append($this->getPersistenceNode())
146 30
                    ->append($this->getSerializerNode())
147 30
                ->end()
148 30
                ->append($this->getIdNode())
149 30
                ->append($this->getPropertiesNode())
150 30
                ->append($this->getDynamicTemplateNode())
151 30
                ->append($this->getSourceNode())
152 30
                ->append($this->getRoutingNode())
153 30
                ->append($this->getParentNode())
154 30
                ->append($this->getAllNode())
155
            ->end()
156
        ;
157 30
158
        return $node;
159
    }
160
161
    /**
162
     * Returns the array node used for "properties".
163 30
     */
164
    protected function getPropertiesNode()
165 30
    {
166 30
        $builder = new TreeBuilder();
167
        $node = $builder->root('properties');
168
169 30
        $node
170 30
            ->useAttributeAsKey('name')
171 30
            ->prototype('variable')
172
                ->treatNullLike([]);
173 30
174
        return $node;
175
    }
176
177
    /**
178
     * Returns the array node used for "_id".
179 30
     */
180 View Code Duplication
    protected function getIdNode()
181 30
    {
182 30
        $builder = new TreeBuilder();
183
        $node = $builder->root('_id');
184
185 30
        $node
186 30
            ->children()
187 30
            ->scalarNode('path')->end()
188
            ->end()
189
        ;
190 30
191
        return $node;
192
    }
193
194
    /**
195
     * Returns the array node used for "_source".
196 30
     */
197
    protected function getSourceNode()
198 30
    {
199 30
        $builder = new TreeBuilder();
200
        $node = $builder->root('_source');
201
202 30
        $node
203 30
            ->children()
204 30
                ->arrayNode('excludes')
205 30
                    ->useAttributeAsKey('name')
206 30
                    ->prototype('scalar')->end()
207 30
                ->end()
208 30
                ->arrayNode('includes')
209 30
                    ->useAttributeAsKey('name')
210 30
                    ->prototype('scalar')->end()
211 30
                ->end()
212 30
                ->scalarNode('compress')->end()
213 30
                ->scalarNode('compress_threshold')->end()
214 30
                ->scalarNode('enabled')->defaultTrue()->end()
215
            ->end()
216
        ;
217 30
218
        return $node;
219
    }
220
221
    /**
222
     * Returns the array node used for "_routing".
223 30
     */
224 View Code Duplication
    protected function getRoutingNode()
225 30
    {
226 30
        $builder = new TreeBuilder();
227
        $node = $builder->root('_routing');
228
229 30
        $node
230 30
            ->children()
231 30
                ->scalarNode('required')->end()
232 30
                ->scalarNode('path')->end()
233
            ->end()
234
        ;
235 30
236
        return $node;
237
    }
238
239
    /**
240
     * Returns the array node used for "_parent".
241 30
     */
242
    protected function getParentNode()
243 30
    {
244 30
        $builder = new TreeBuilder();
245
        $node = $builder->root('_parent');
246
247 30
        $node
248 30
            ->children()
249 30
                ->scalarNode('type')->end()
250 30
                ->scalarNode('property')->defaultValue(null)->end()
251 30
                ->scalarNode('identifier')->defaultValue('id')->end()
252
            ->end()
253
        ;
254 30
255
        return $node;
256
    }
257
258
    /**
259
     * Returns the array node used for "_all".
260 30
     */
261
    protected function getAllNode()
262 30
    {
263 30
        $builder = new TreeBuilder();
264
        $node = $builder->root('_all');
265
266 30
        $node
267 30
            ->children()
268 30
            ->scalarNode('enabled')->defaultValue(true)->end()
269 30
            ->scalarNode('analyzer')->end()
270
            ->end()
271
        ;
272 30
273
        return $node;
274
    }
275
276
    /**
277
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
278 30
     */
279
    protected function getPersistenceNode()
280 30
    {
281 30
        $builder = new TreeBuilder();
282
        $node = $builder->root('persistence');
283
284 30
        $node
285 30
            ->validate()
286 17
                ->ifTrue(function ($v) {
287 30
                    return isset($v['driver']) && 'orm' !== $v['driver'] && !empty($v['elastica_to_model_transformer']['hints']);
288 30
                })
289 30
                    ->thenInvalid('Hints are only supported by the "orm" driver')
290 30
            ->end()
291 30
            ->children()
292 30
                ->scalarNode('driver')
293 30
                    ->defaultValue('orm')
294 30
                    ->validate()
295 30
                    ->ifNotInArray(self::SUPPORTED_DRIVERS)
296 30
                        ->thenInvalid('The driver %s is not supported. Please choose one of '.json_encode(self::SUPPORTED_DRIVERS))
297 30
                    ->end()
298 30
                ->end()
299 30
                ->scalarNode('model')->defaultValue(null)->end()
300 30
                ->scalarNode('repository')->end()
301 30
                ->scalarNode('identifier')->defaultValue('id')->end()
302 30
                ->arrayNode('provider')
303 30
                    ->addDefaultsIfNotSet()
304 30
                    ->children()
305 30
                        ->scalarNode('batch_size')->defaultValue(100)->end()
306 30
                        ->scalarNode('clear_object_manager')->defaultTrue()->end()
307 30
                        ->scalarNode('debug_logging')
308 30
                            ->defaultValue($this->debug)
309 30
                            ->treatNullLike(true)
310 30
                        ->end()
311 30
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
312 30
                        ->scalarNode('service')->end()
313 30
                    ->end()
314 30
                ->end()
315 30
                ->arrayNode('listener')
316 30
                    ->addDefaultsIfNotSet()
317 30
                    ->children()
318 30
                        ->booleanNode('enabled')->defaultTrue()->end()
319 30
                        ->scalarNode('insert')->defaultTrue()->end()
320 30
                        ->scalarNode('update')->defaultTrue()->end()
321 30
                        ->scalarNode('delete')->defaultTrue()->end()
322 30
                        ->scalarNode('flush')->defaultTrue()->end()
323 30
                        ->booleanNode('defer')->defaultFalse()->end()
324 30
                        ->scalarNode('logger')
325 30
                            ->defaultFalse()
326 30
                            ->treatNullLike('fos_elastica.logger')
327 30
                            ->treatTrueLike('fos_elastica.logger')
328 30
                        ->end()
329 30
                        ->scalarNode('service')->end()
330 30
                    ->end()
331 30
                ->end()
332 30
                ->arrayNode('finder')
333 30
                    ->addDefaultsIfNotSet()
334 30
                    ->children()
335 30
                        ->scalarNode('service')->end()
336 30
                    ->end()
337 30
                ->end()
338 30
                ->arrayNode('elastica_to_model_transformer')
339 30
                    ->addDefaultsIfNotSet()
340 30
                    ->children()
341 30
                        ->arrayNode('hints')
342 30
                            ->prototype('array')
343 30
                                ->children()
344 30
                                    ->scalarNode('name')->end()
345 30
                                    ->scalarNode('value')->end()
346 30
                                ->end()
347 30
                            ->end()
348 30
                        ->end()
349 30
                        ->booleanNode('hydrate')->defaultTrue()->end()
350 30
                        ->booleanNode('ignore_missing')
351 30
                            ->defaultFalse()
352 30
                            ->info('Silently ignore results returned from Elasticsearch without corresponding persistent object.')
353 30
                        ->end()
354 30
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
355 30
                        ->scalarNode('service')->end()
356 30
                    ->end()
357 30
                ->end()
358 30
                ->arrayNode('model_to_elastica_transformer')
359 30
                    ->addDefaultsIfNotSet()
360 30
                    ->children()
361 30
                        ->scalarNode('service')->end()
362 30
                    ->end()
363 30
                ->end()
364 30
                ->arrayNode('persister')
365 30
                    ->addDefaultsIfNotSet()
366 30
                    ->children()
367 30
                        ->scalarNode('service')->end()
368 30
                    ->end()
369 30
                ->end()
370
            ->end();
371 30
372
        return $node;
373
    }
374
375
    /**
376
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
377 30
     */
378
    protected function getSerializerNode()
379 30
    {
380 30
        $builder = new TreeBuilder();
381
        $node = $builder->root('serializer');
382
383 30
        $node
0 ignored issues
show
Bug introduced by
The method scalarNode() does not seem to exist on object<Symfony\Component...odeDefinitionInterface>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
384 30
            ->addDefaultsIfNotSet()
385 30
            ->children()
386 30
                ->arrayNode('groups')
387 30
                    ->treatNullLike([])
388 30
                    ->prototype('scalar')->end()
389 30
                ->end()
390 30
                ->scalarNode('version')->end()
391 30
                ->booleanNode('serialize_null')
392 30
                    ->defaultFalse()
393 30
                ->end()
394
            ->end();
395 30
396
        return $node;
397
    }
398
399
    /**
400
     * Adds the configuration for the "clients" key.
401 30
     */
402
    private function addClientsSection(ArrayNodeDefinition $rootNode)
403
    {
404 30
        $rootNode
405 30
            ->fixXmlConfig('client')
406 30
            ->children()
407 30
                ->arrayNode('clients')
408 30
                    ->useAttributeAsKey('id')
409 30
                    ->prototype('array')
410
                        ->performNoDeepMerging()
411 30
                        // Elastica names its properties with camel case, support both
412 30
                        ->beforeNormalization()
413 29
                        ->ifTrue(function ($v) {
414 30
                            return isset($v['connection_strategy']);
415 30
                        })
416 3
                        ->then(function ($v) {
417 3
                            $v['connectionStrategy'] = $v['connection_strategy'];
418
                            unset($v['connection_strategy']);
419 3
420 30
                            return $v;
421 30
                        })
422
                        ->end()
423 30
                        // If there is no connections array key defined, assume a single connection.
424 30
                        ->beforeNormalization()
425 29
                        ->ifTrue(function ($v) {
426 30
                            return is_array($v) && !array_key_exists('connections', $v);
427 30
                        })
428
                        ->then(function ($v) {
429 29
                            return [
430
                                'connections' => [$v],
431 30
                            ];
432 30
                        })
433 30
                        ->end()
434 30
                        ->children()
435 30
                            ->arrayNode('connections')
436 30
                                ->requiresAtLeastOneElement()
437 30
                                ->prototype('array')
438 30
                                    ->fixXmlConfig('header')
439 30
                                    ->children()
440 30
                                        ->scalarNode('url')
441 30
                                            ->validate()
442 17
                                                ->ifTrue(function ($url) {
443 30
                                                    return $url && '/' !== substr($url, -1);
444 30
                                                })
445 17
                                                ->then(function ($url) {
446 30
                                                    return $url.'/';
447 30
                                                })
448 30
                                            ->end()
449 30
                                        ->end()
450 30
                                        ->scalarNode('username')->end()
451 30
                                        ->scalarNode('password')->end()
452 30
                                        ->scalarNode('host')->end()
453 30
                                        ->scalarNode('port')->end()
454 30
                                        ->scalarNode('proxy')->end()
455 30
                                        ->scalarNode('aws_access_key_id')->end()
456 30
                                        ->scalarNode('aws_secret_access_key')->end()
457 30
                                        ->scalarNode('aws_region')->end()
458 30
                                        ->scalarNode('aws_session_token')->end()
459 30
                                        ->booleanNode('ssl')->defaultValue(false)->end()
460 30
                                        ->scalarNode('logger')
461 30
                                            ->defaultValue($this->debug ? 'fos_elastica.logger' : false)
462 30
                                            ->treatNullLike('fos_elastica.logger')
463 30
                                            ->treatTrueLike('fos_elastica.logger')
464 30
                                        ->end()
465 30
                                        ->booleanNode('compression')->defaultValue(false)->end()
466 30
                                        ->arrayNode('headers')
467 30
                                            ->normalizeKeys(false)
468 30
                                            ->useAttributeAsKey('name')
469 30
                                            ->prototype('scalar')->end()
470 30
                                        ->end()
471 30
                                        ->arrayNode('curl')
472 30
                                            ->useAttributeAsKey(CURLOPT_SSL_VERIFYPEER)
473 30
                                            ->prototype('boolean')->end()
474 30
                                        ->end()
475 30
                                        ->scalarNode('transport')->end()
476 30
                                        ->scalarNode('timeout')->end()
477 30
                                        ->scalarNode('connectTimeout')->end()
478 30
                                        ->scalarNode('retryOnConflict')
479 30
                                            ->defaultValue(0)
480 30
                                        ->end()
481 30
                                    ->end()
482 30
                                ->end()
483 30
                            ->end()
484 30
                            ->scalarNode('timeout')->end()
485 30
                            ->scalarNode('connectTimeout')->end()
486 30
                            ->scalarNode('headers')->end()
487 30
                            ->scalarNode('connectionStrategy')->defaultValue('Simple')->end()
488 30
                        ->end()
489 30
                    ->end()
490 30
                ->end()
491
            ->end()
492 30
        ;
493
    }
494
495
    /**
496
     * Adds the configuration for the "indexes" key.
497 30
     */
498
    private function addIndexesSection(ArrayNodeDefinition $rootNode)
499
    {
500 30
        $rootNode
501 30
            ->fixXmlConfig('index')
502 30
            ->children()
503 30
                ->arrayNode('indexes')
504 30
                    ->useAttributeAsKey('name')
505 30
                    ->prototype('array')
506 30
                        ->children()
507 30
                            ->scalarNode('index_name')
508 30
                                ->info('Defaults to the name of the index, but can be modified if the index name is different in ElasticSearch')
509 30
                            ->end()
510 30
                            ->booleanNode('use_alias')->defaultValue(false)->end()
511 30
                            ->scalarNode('client')->end()
512 30
                            ->scalarNode('finder')
513 30
                                ->treatNullLike(true)
514 30
                                ->defaultFalse()
515 30
                            ->end()
516 30
                            ->arrayNode('type_prototype')
517 30
                                ->children()
518 30
                                    ->scalarNode('analyzer')->end()
519 30
                                    ->append($this->getPersistenceNode())
520 30
                                    ->append($this->getSerializerNode())
521 30
                                ->end()
522 30
                            ->end()
523 30
                            ->variableNode('settings')->defaultValue([])->end()
524 30
                        ->end()
525 30
                        ->append($this->getTypesNode())
526 30
                    ->end()
527 30
                ->end()
528
            ->end()
529 30
        ;
530
    }
531
532
    /**
533
     * Adds the configuration for the "index_templates" key.
534
     *
535
     * @param ArrayNodeDefinition $rootNode
536
     *
537
     * @return void
538
     */
539
    private function addIndexTemplatesSection(ArrayNodeDefinition $rootNode)
540
    {
541
        $rootNode
542
            ->fixXmlConfig('index_template')
543
            ->children()
544
                ->arrayNode('index_templates')
545
                    ->useAttributeAsKey('name')
546
                    ->prototype('array')
547
                        ->children()
548
                            ->scalarNode('template_name')
549
                                ->info('Defaults to the name of the index template, but can be modified if the index name is different in ElasticSearch')
550
                            ->end()
551
                            ->scalarNode('template')->isRequired()->end()
552
                            ->scalarNode('client')->end()
553
                            ->variableNode('settings')->defaultValue(array())->end()
554
                        ->end()
555
                        ->append($this->getTypesNode())
556
                    ->end()
557
                ->end()
558
            ->end()
559
        ;
560
    }
561
}
562