Completed
Pull Request — master (#1246)
by Istvan
04:23
created

Configuration::getPersistenceNode()   C

Complexity

Conditions 7
Paths 1

Size

Total Lines 102
Code Lines 95

Duplication

Lines 2
Ratio 1.96 %

Code Coverage

Tests 93
CRAP Score 7.0004

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 2
loc 102
ccs 93
cts 95
cp 0.9789
rs 6.4589
cc 7
eloc 95
nc 1
nop 0
crap 7.0004

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