Completed
Push — master ( 0aa154...6fc129 )
by Maksim
05:50
created

Configuration::getPersistenceNode()   C

Complexity

Conditions 7
Paths 1

Size

Total Lines 106
Code Lines 99

Duplication

Lines 2
Ratio 1.89 %

Code Coverage

Tests 99
CRAP Score 7.0003

Importance

Changes 0
Metric Value
dl 2
loc 106
ccs 99
cts 101
cp 0.9802
rs 6.4589
c 0
b 0
f 0
cc 7
eloc 99
nc 1
nop 0
crap 7.0003

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