Completed
Pull Request — master (#1241)
by Grzegorz
05:56
created

Configuration::getTypesNode()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 56
Code Lines 43

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 41
CRAP Score 3

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 56
ccs 41
cts 41
cp 1
rs 9.7251
cc 3
eloc 43
nc 1
nop 0
crap 3

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