Completed
Pull Request — master (#1290)
by
unknown
04:42
created

Configuration   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 525
Duplicated Lines 5.52 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 99.46%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 25
c 3
b 0
f 0
lcom 1
cbo 6
dl 29
loc 525
ccs 369
cts 371
cp 0.9946
rs 10

14 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B getConfigTreeBuilder() 0 29 1
B addClientsSection() 0 92 4
B addIndexesSection() 0 33 1
A getTypesNode() 0 56 3
A getPropertiesNode() 0 12 1
B getDynamicTemplateNode() 0 27 1
A getIdNode() 13 13 1
A getSourceNode() 0 23 1
A getRoutingNode() 14 14 1
A getParentNode() 0 15 1
A getAllNode() 0 14 1
C getPersistenceNode() 2 102 7
A getSerializerNode() 0 20 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

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
    /**
21
     * Stores supported database drivers.
22
     *
23
     * @var array
24
     */
25
    private $supportedDrivers = ['orm', 'mongodb', 'propel', 'phpcr'];
26
27
    /**
28
     * If the kernel is running in debug mode.
29
     *
30
     * @var bool
31
     */
32
    private $debug;
33
34 17
    public function __construct($debug)
35
    {
36 17
        $this->debug = $debug;
37 17
    }
38
39
    /**
40
     * Generates the configuration tree.
41
     *
42
     * @return TreeBuilder
43
     */
44 17
    public function getConfigTreeBuilder()
45
    {
46 17
        $treeBuilder = new TreeBuilder();
47 17
        $rootNode = $treeBuilder->root('fos_elastica', 'array');
48
49 17
        $this->addClientsSection($rootNode);
50 17
        $this->addIndexesSection($rootNode);
51
52
        $rootNode
53 17
            ->children()
54 17
                ->scalarNode('default_client')
55 17
                    ->info('Defaults to the first client defined')
56 17
                ->end()
57 17
                ->scalarNode('default_index')
58 17
                    ->info('Defaults to the first index defined')
59 17
                ->end()
60 17
                ->scalarNode('default_manager')->defaultValue('orm')->end()
61 17
                ->arrayNode('serializer')
62 17
                    ->treatNullLike([])
63 17
                    ->children()
64 17
                        ->scalarNode('callback_class')->defaultValue('FOS\ElasticaBundle\Serializer\Callback')->end()
65 17
                        ->scalarNode('serializer')->defaultValue('serializer')->end()
66 17
                    ->end()
67 17
                ->end()
68 17
            ->end()
69
        ;
70
71 17
        return $treeBuilder;
72
    }
73
74
    /**
75
     * Adds the configuration for the "clients" key.
76
     */
77 17
    private function addClientsSection(ArrayNodeDefinition $rootNode)
78
    {
79
        $rootNode
80 17
            ->fixXmlConfig('client')
81 17
            ->children()
82 17
                ->arrayNode('clients')
83 17
                    ->useAttributeAsKey('id')
84 17
                    ->prototype('array')
85 17
                        ->performNoDeepMerging()
86
                        // Elastica names its properties with camel case, support both
87 17
                        ->beforeNormalization()
88 17
                        ->ifTrue(function ($v) {
89 16
                            return isset($v['connection_strategy']);
90 17
                        })
91 17
                        ->then(function ($v) {
92 1
                            $v['connectionStrategy'] = $v['connection_strategy'];
93 1
                            unset($v['connection_strategy']);
94
95 1
                            return $v;
96 17
                        })
97 17
                        ->end()
98
                        // If there is no connections array key defined, assume a single connection.
99 17
                        ->beforeNormalization()
100 17
                        ->ifTrue(function ($v) {
101 16
                            return is_array($v) && !array_key_exists('connections', $v);
102 17
                        })
103 17
                        ->then(function ($v) {
104
                            return [
105 16
                                'connections' => [$v],
106
                            ];
107 17
                        })
108 17
                        ->end()
109 17
                        ->children()
110 17
                            ->arrayNode('connections')
111 17
                                ->requiresAtLeastOneElement()
112 17
                                ->prototype('array')
113 17
                                    ->fixXmlConfig('header')
114 17
                                    ->children()
115 17
                                        ->scalarNode('url')
116 17
                                            ->validate()
117 17
                                                ->ifTrue(function ($url) {
118 12
                                                    return $url && substr($url, -1) !== '/';
119 17
                                                })
120 17
                                                ->then(function ($url) {
121 12
                                                    return $url.'/';
122 17
                                                })
123 17
                                            ->end()
124 17
                                        ->end()
125 17
                                        ->scalarNode('username')->end()
126 17
                                        ->scalarNode('password')->end()
127 17
                                        ->scalarNode('host')->end()
128 17
                                        ->scalarNode('port')->end()
129 17
                                        ->scalarNode('proxy')->end()
130 17
                                        ->scalarNode('aws_access_key_id')->end()
131 17
                                        ->scalarNode('aws_secret_access_key')->end()
132 17
                                        ->scalarNode('aws_region')->end()
133 17
                                        ->scalarNode('aws_session_token')->end()
134 17
                                        ->booleanNode('ssl')->defaultValue(false)->end()
135 17
                                        ->scalarNode('logger')
136 17
                                            ->defaultValue($this->debug ? 'fos_elastica.logger' : false)
137 17
                                            ->treatNullLike('fos_elastica.logger')
138 17
                                            ->treatTrueLike('fos_elastica.logger')
139 17
                                        ->end()
140 17
                                        ->booleanNode('compression')->defaultValue(false)->end()
141 17
                                        ->arrayNode('headers')
142 17
                                            ->normalizeKeys(false)
143 17
                                            ->useAttributeAsKey('name')
144 17
                                            ->prototype('scalar')->end()
145 17
                                        ->end()
146 17
                                        ->arrayNode('curl')
147 17
                                            ->useAttributeAsKey(CURLOPT_SSL_VERIFYPEER)
148 17
                                            ->prototype('boolean')->end()
149 17
                                        ->end()
150 17
                                        ->scalarNode('transport')->end()
151 17
                                        ->scalarNode('timeout')->end()
152 17
                                        ->scalarNode('connectTimeout')->end()
153 17
                                        ->scalarNode('retryOnConflict')
154 17
                                            ->defaultValue(0)
155 17
                                        ->end()
156 17
                                    ->end()
157 17
                                ->end()
158 17
                            ->end()
159 17
                            ->scalarNode('timeout')->end()
160 17
                            ->scalarNode('connectTimeout')->end()
161 17
                            ->scalarNode('headers')->end()
162 17
                            ->scalarNode('connectionStrategy')->defaultValue('Simple')->end()
163 17
                        ->end()
164 17
                    ->end()
165 17
                ->end()
166 17
            ->end()
167
        ;
168 17
    }
169
170
    /**
171
     * Adds the configuration for the "indexes" key.
172
     */
173 17
    private function addIndexesSection(ArrayNodeDefinition $rootNode)
174
    {
175
        $rootNode
176 17
            ->fixXmlConfig('index')
177 17
            ->children()
178 17
                ->arrayNode('indexes')
179 17
                    ->useAttributeAsKey('name')
180 17
                    ->prototype('array')
181 17
                        ->children()
182 17
                            ->scalarNode('index_name')
183 17
                                ->info('Defaults to the name of the index, but can be modified if the index name is different in ElasticSearch')
184 17
                            ->end()
185 17
                            ->booleanNode('use_alias')->defaultValue(false)->end()
186 17
                            ->scalarNode('client')->end()
187 17
                            ->scalarNode('finder')
188 17
                                ->treatNullLike(true)
189 17
                                ->defaultFalse()
190 17
                            ->end()
191 17
                            ->arrayNode('type_prototype')
192 17
                                ->children()
193 17
                                    ->scalarNode('analyzer')->end()
194 17
                                    ->append($this->getPersistenceNode())
195 17
                                    ->append($this->getSerializerNode())
196 17
                                ->end()
197 17
                            ->end()
198 17
                            ->variableNode('settings')->defaultValue([])->end()
199 17
                        ->end()
200 17
                        ->append($this->getTypesNode())
201 17
                    ->end()
202 17
                ->end()
203 17
            ->end()
204
        ;
205 17
    }
206
207
    /**
208
     * Returns the array node used for "types".
209
     */
210 17
    protected function getTypesNode()
211
    {
212 17
        $builder = new TreeBuilder();
213 17
        $node = $builder->root('types');
214
215
        $node
216 17
            ->useAttributeAsKey('name')
217 17
            ->prototype('array')
218 17
                ->treatNullLike([])
219 17
                ->beforeNormalization()
220 17
                ->ifNull()
221 17
                    ->thenEmptyArray()
222 17
                ->end()
223
                // Support multiple dynamic_template formats to match the old bundle style
224
                // and the way ElasticSearch expects them
225 17
                ->beforeNormalization()
226 17
                ->ifTrue(function ($v) {
227 8
                    return isset($v['dynamic_templates']);
228 17
                })
229 17
                ->then(function ($v) {
230 1
                    $dt = [];
231 1
                    foreach ($v['dynamic_templates'] as $key => $type) {
232 1
                        if (is_int($key)) {
233 1
                            $dt[] = $type;
234
                        } else {
235 1
                            $dt[][$key] = $type;
236
                        }
237
                    }
238
239 1
                    $v['dynamic_templates'] = $dt;
240
241 1
                    return $v;
242 17
                })
243 17
                ->end()
244 17
                ->children()
245 17
                    ->booleanNode('date_detection')->end()
246 17
                    ->arrayNode('dynamic_date_formats')->prototype('scalar')->end()->end()
247 17
                    ->scalarNode('analyzer')->end()
248 17
                    ->booleanNode('numeric_detection')->end()
249 17
                    ->scalarNode('dynamic')->end()
250 17
                    ->variableNode('indexable_callback')->end()
251 17
                    ->append($this->getPersistenceNode())
252 17
                    ->append($this->getSerializerNode())
253 17
                ->end()
254 17
                ->append($this->getIdNode())
255 17
                ->append($this->getPropertiesNode())
256 17
                ->append($this->getDynamicTemplateNode())
257 17
                ->append($this->getSourceNode())
258 17
                ->append($this->getRoutingNode())
259 17
                ->append($this->getParentNode())
260 17
                ->append($this->getAllNode())
261 17
            ->end()
262
        ;
263
264 17
        return $node;
265
    }
266
267
    /**
268
     * Returns the array node used for "properties".
269
     */
270 17
    protected function getPropertiesNode()
271
    {
272 17
        $builder = new TreeBuilder();
273 17
        $node = $builder->root('properties');
274
275
        $node
276 17
            ->useAttributeAsKey('name')
277 17
            ->prototype('variable')
278 17
                ->treatNullLike([]);
279
280 17
        return $node;
281
    }
282
283
    /**
284
     * Returns the array node used for "dynamic_templates".
285
     */
286 17
    public function getDynamicTemplateNode()
287
    {
288 17
        $builder = new TreeBuilder();
289 17
        $node = $builder->root('dynamic_templates');
290
291
        $node
292 17
            ->prototype('array')
293 17
                ->prototype('array')
294 17
                    ->children()
295 17
                        ->scalarNode('match')->end()
296 17
                        ->scalarNode('unmatch')->end()
297 17
                        ->scalarNode('match_mapping_type')->end()
298 17
                        ->scalarNode('path_match')->end()
299 17
                        ->scalarNode('path_unmatch')->end()
300 17
                        ->scalarNode('match_pattern')->end()
301 17
                        ->arrayNode('mapping')
302 17
                            ->prototype('variable')
303 17
                                ->treatNullLike([])
304 17
                            ->end()
305 17
                        ->end()
306 17
                    ->end()
307 17
                ->end()
308 17
            ->end()
309
        ;
310
311 17
        return $node;
312
    }
313
314
    /**
315
     * Returns the array node used for "_id".
316
     */
317 17 View Code Duplication
    protected function getIdNode()
318
    {
319 17
        $builder = new TreeBuilder();
320 17
        $node = $builder->root('_id');
321
322
        $node
323 17
            ->children()
324 17
            ->scalarNode('path')->end()
325 17
            ->end()
326
        ;
327
328 17
        return $node;
329
    }
330
331
    /**
332
     * Returns the array node used for "_source".
333
     */
334 17
    protected function getSourceNode()
335
    {
336 17
        $builder = new TreeBuilder();
337 17
        $node = $builder->root('_source');
338
339
        $node
0 ignored issues
show
Bug introduced by
The method arrayNode() 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...
340 17
            ->children()
341 17
                ->arrayNode('excludes')
342 17
                    ->useAttributeAsKey('name')
343 17
                    ->prototype('scalar')->end()
344 17
                ->end()
345 17
                ->arrayNode('includes')
346 17
                    ->useAttributeAsKey('name')
347 17
                    ->prototype('scalar')->end()
348 17
                ->end()
349 17
                ->scalarNode('compress')->end()
350 17
                ->scalarNode('compress_threshold')->end()
351 17
                ->scalarNode('enabled')->defaultTrue()->end()
352 17
            ->end()
353
        ;
354
355 17
        return $node;
356
    }
357
358
    /**
359
     * Returns the array node used for "_routing".
360
     */
361 17 View Code Duplication
    protected function getRoutingNode()
362
    {
363 17
        $builder = new TreeBuilder();
364 17
        $node = $builder->root('_routing');
365
366
        $node
367 17
            ->children()
368 17
                ->scalarNode('required')->end()
369 17
                ->scalarNode('path')->end()
370 17
            ->end()
371
        ;
372
373 17
        return $node;
374
    }
375
376
    /**
377
     * Returns the array node used for "_parent".
378
     */
379 17
    protected function getParentNode()
380
    {
381 17
        $builder = new TreeBuilder();
382 17
        $node = $builder->root('_parent');
383
384
        $node
385 17
            ->children()
386 17
                ->scalarNode('type')->end()
387 17
                ->scalarNode('property')->defaultValue(null)->end()
388 17
                ->scalarNode('identifier')->defaultValue('id')->end()
389 17
            ->end()
390
        ;
391
392 17
        return $node;
393
    }
394
395
    /**
396
     * Returns the array node used for "_all".
397
     */
398 17
    protected function getAllNode()
399
    {
400 17
        $builder = new TreeBuilder();
401 17
        $node = $builder->root('_all');
402
403
        $node
404 17
            ->children()
405 17
            ->scalarNode('enabled')->defaultValue(true)->end()
406 17
            ->scalarNode('analyzer')->end()
407 17
            ->end()
408
        ;
409
410 17
        return $node;
411
    }
412
413
    /**
414
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
415
     */
416 17
    protected function getPersistenceNode()
417
    {
418 17
        $builder = new TreeBuilder();
419 17
        $node = $builder->root('persistence');
420
421
        $node
422 17
            ->validate()
423 17 View Code Duplication
                ->ifTrue(function ($v) {
424
                    return isset($v['driver']) && 'propel' === $v['driver'] && isset($v['listener']);
425 17
                })
426 17
                    ->thenInvalid('Propel doesn\'t support listeners')
427 17 View Code Duplication
                ->ifTrue(function ($v) {
428
                    return isset($v['driver']) && 'propel' === $v['driver'] && isset($v['repository']);
429 17
                })
430 17
                    ->thenInvalid('Propel doesn\'t support the "repository" parameter')
431 17
                ->ifTrue(function ($v) {
432 6
                    return isset($v['driver']) && 'orm' !== $v['driver'] && !empty($v['elastica_to_model_transformer']['hints']);
433 17
                })
434 17
                    ->thenInvalid('Hints are only supported by the "orm" driver')
435 17
            ->end()
436 17
            ->children()
437 17
                ->scalarNode('driver')
438 17
                    ->defaultValue('orm')
439 17
                    ->validate()
440 17
                    ->ifNotInArray($this->supportedDrivers)
441 17
                        ->thenInvalid('The driver %s is not supported. Please choose one of '.json_encode($this->supportedDrivers))
442 17
                    ->end()
443 17
                ->end()
444 17
                ->scalarNode('model')->defaultValue(null)->end()
445 17
                ->scalarNode('repository')->end()
446 17
                ->scalarNode('identifier')->defaultValue('id')->end()
447 17
                ->arrayNode('provider')
448 17
                    ->addDefaultsIfNotSet()
449 17
                    ->children()
450 17
                        ->scalarNode('batch_size')->defaultValue(100)->end()
451 17
                        ->scalarNode('clear_object_manager')->defaultTrue()->end()
452 17
                        ->scalarNode('debug_logging')
453 17
                            ->defaultValue($this->debug)
454 17
                            ->treatNullLike(true)
455 17
                        ->end()
456 17
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
457 17
                        ->scalarNode('service')->end()
458 17
                    ->end()
459 17
                ->end()
460 17
                ->arrayNode('listener')
461 17
                    ->addDefaultsIfNotSet()
462 17
                    ->children()
463 17
                        ->scalarNode('insert')->defaultTrue()->end()
464 17
                        ->scalarNode('update')->defaultTrue()->end()
465 17
                        ->scalarNode('delete')->defaultTrue()->end()
466 17
                        ->scalarNode('flush')->defaultTrue()->end()
467 17
                        ->booleanNode('defer')->defaultFalse()->end()
468 17
                        ->scalarNode('logger')
469 17
                            ->defaultFalse()
470 17
                            ->treatNullLike('fos_elastica.logger')
471 17
                            ->treatTrueLike('fos_elastica.logger')
472 17
                        ->end()
473 17
                        ->scalarNode('service')->end()
474 17
                    ->end()
475 17
                ->end()
476 17
                ->arrayNode('finder')
477 17
                    ->addDefaultsIfNotSet()
478 17
                    ->children()
479 17
                        ->scalarNode('service')->end()
480 17
                    ->end()
481 17
                ->end()
482 17
                ->arrayNode('elastica_to_model_transformer')
483 17
                    ->addDefaultsIfNotSet()
484 17
                    ->children()
485 17
                        ->arrayNode('hints')
486 17
                            ->prototype('array')
487 17
                                ->children()
488 17
                                    ->scalarNode('name')->end()
489 17
                                    ->scalarNode('value')->end()
490 17
                                ->end()
491 17
                            ->end()
492 17
                        ->end()
493 17
                        ->booleanNode('hydrate')->defaultTrue()->end()
494 17
                        ->booleanNode('ignore_missing')
495 17
                            ->defaultFalse()
496 17
                            ->info('Silently ignore results returned from Elasticsearch without corresponding persistent object.')
497 17
                        ->end()
498 17
                        ->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
499 17
                        ->scalarNode('service')->end()
500 17
                    ->end()
501 17
                ->end()
502 17
                ->arrayNode('model_to_elastica_transformer')
503 17
                    ->addDefaultsIfNotSet()
504 17
                    ->children()
505 17
                        ->scalarNode('service')->end()
506 17
                    ->end()
507 17
                ->end()
508 17
                ->arrayNode('persister')
509 17
                    ->addDefaultsIfNotSet()
510 17
                    ->children()
511 17
                        ->scalarNode('service')->end()
512 17
                    ->end()
513 17
                ->end()
514 17
            ->end();
515
516 17
        return $node;
517
    }
518
519
    /**
520
     * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition
521
     */
522 17
    protected function getSerializerNode()
523
    {
524 17
        $builder = new TreeBuilder();
525 17
        $node = $builder->root('serializer');
526
527
        $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...
528 17
            ->addDefaultsIfNotSet()
529 17
            ->children()
530 17
                ->arrayNode('groups')
531 17
                    ->treatNullLike([])
532 17
                    ->prototype('scalar')->end()
533 17
                ->end()
534 17
                ->scalarNode('version')->end()
535 17
                ->booleanNode('serialize_null')
536 17
                    ->defaultFalse()
537 17
                ->end()
538 17
            ->end();
539
540 17
        return $node;
541
    }
542
}
543