Passed
Push — master ( 1addec...25d465 )
by Sébastien
09:22 queued 26s
created

Configuration   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 329
Duplicated Lines 0 %

Test Coverage

Coverage 96%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 217
dl 0
loc 329
ccs 192
cts 200
cp 0.96
rs 10
c 2
b 0
f 0
wmc 13

9 Methods

Rating   Name   Duplication   Size   Complexity  
A getTypesNode() 0 18 1
B configureDbalDriverNode() 0 105 3
A getPlatformTypesNode() 0 21 2
A configureConfigurationNode() 0 15 2
A getMigrationNode() 0 19 1
A getCacheNode() 0 21 1
A getConnectionsNode() 0 55 1
A __construct() 0 3 1
A getConfigTreeBuilder() 0 19 1
1
<?php
2
3
namespace Bdf\PrimeBundle\DependencyInjection;
4
5
use Bdf\Prime\Configuration as PrimeConfiguration;
6
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
7
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
8
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
9
use Symfony\Component\Config\Definition\ConfigurationInterface;
10
11
/**
12
 * Configuration.
13
 */
14
class Configuration implements ConfigurationInterface
15
{
16
    /**
17
     * @var bool
18
     */
19
    private $debug;
20
21
    /**
22
     * @param bool $debug Whether to use the debug mode
23
     */
24 7
    public function __construct($debug = false)
25
    {
26 7
        $this->debug = (bool) $debug;
27
    }
28
29
    /**
30
     * {@inheritDoc}
31
     */
32 7
    public function getConfigTreeBuilder()
33
    {
34 7
        $treeBuilder = new TreeBuilder('prime');
35 7
        $node = $treeBuilder->getRootNode();
36
        $node
37 7
            ->children()
38 7
                ->booleanNode('activerecord')->defaultFalse()->end()
39 7
                ->scalarNode('hydrators')->defaultValue('%kernel.cache_dir%/prime/hydrators/loader.php')->end()
40 7
                ->scalarNode('serializer')->info('The bdf serializer service id.')->end()
41 7
                ->scalarNode('default_connection')->defaultNull()->end()
42 7
                ->append($this->getConnectionsNode())
43 7
                ->append($this->getMigrationNode())
44 7
                ->append($this->getCacheNode())
45 7
            ->end()
46
        ;
47
48 7
        $this->configureConfigurationNode($node, true);
49
50 7
        return $treeBuilder;
51
    }
52
53
    /**
54
     * Adds the configuration node of the connection
55
     * Could be the global config or a connection config.
56
     */
57 7
    private function configureConfigurationNode(ArrayNodeDefinition $node, bool $addDefault): void
58
    {
59 7
        $parametersNode = $node->children();
60
61 7
        $loggingNode = $parametersNode->booleanNode('logging');
62 7
        $profilingNode = $parametersNode->booleanNode('profiling');
63 7
        $autoCommitNode = $parametersNode->booleanNode('auto_commit');
64
65 7
        if (true === $addDefault) {
66 7
            $loggingNode->defaultValue($this->debug);
67 7
            $profilingNode->defaultValue($this->debug);
68 7
            $autoCommitNode->defaultNull();
69
        }
70
71 7
        $parametersNode->append($this->getTypesNode());
72
    }
73
74
    /**
75
     * @return NodeDefinition
76
     */
77 7
    private function getConnectionsNode()
78
    {
79 7
        $root = (new TreeBuilder('connections'))->getRootNode();
80
81
        $connectionNode = $root
82 7
            ->requiresAtLeastOneElement()
0 ignored issues
show
Bug introduced by
The method requiresAtLeastOneElement() does not exist on Symfony\Component\Config...\Builder\NodeDefinition. It seems like you code against a sub-type of Symfony\Component\Config...\Builder\NodeDefinition such as Symfony\Component\Config...der\ArrayNodeDefinition. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

82
            ->/** @scrutinizer ignore-call */ requiresAtLeastOneElement()
Loading history...
83 7
            ->useAttributeAsKey('name')
84 7
            ->arrayPrototype()
85 7
            ->isRequired()
86 7
            ->beforeNormalization()
87 7
                ->ifString()
88 7
                ->then(static function ($v) {
89 1
                    return ['url' => $v];
90
                })
91 7
            ->end()
92
        ;
93
94 7
        $this->configureDbalDriverNode($connectionNode);
95 7
        $this->configureConfigurationNode($connectionNode, false);
96
97
        $connectionNode
98 7
            ->children()
99 7
                ->scalarNode('driver')->end()
100 7
                ->scalarNode('platform_service')->end()
101 7
                ->scalarNode('server_version')->end()
102 7
                ->scalarNode('driver_class')->end()
103 7
                ->scalarNode('wrapper_class')->end()
104 7
                ->arrayNode('options')
105 7
                    ->useAttributeAsKey('key')
106 7
                    ->variablePrototype()->end()
107 7
                ->end()
108 7
                ->arrayNode('default_table_options')
109 7
                    ->info("This option is used by the schema-tool and affects generated SQL. Possible keys include 'charset','collate', and 'engine'.")
110 7
                    ->useAttributeAsKey('name')
111 7
                    ->scalarPrototype()->end()
112 7
                ->end()
113 7
                ->append($this->getPlatformTypesNode())
114 7
            ->end();
115
116 7
        $slaveNode = $connectionNode->children()->arrayNode('read');
117
118 7
        $this->configureDbalDriverNode($slaveNode);
119
120
        $shardNode = $connectionNode
121 7
            ->children()
122 7
                ->scalarNode('shard_choser')->end()
123 7
                ->scalarNode('distribution_key')->end()
124 7
                ->arrayNode('shards')
125 7
                    ->requiresAtLeastOneElement()
126 7
                    ->useAttributeAsKey('name')
127 7
                    ->arrayPrototype();
128
129 7
        $this->configureDbalDriverNode($shardNode);
130
131 7
        return $root;
132
    }
133
134
    /**
135
     * Adds config keys related to params processed by the DBAL drivers.
136
     *
137
     * These keys are available for slave configurations too.
138
     */
139 7
    private function configureDbalDriverNode(ArrayNodeDefinition $node): void
140
    {
141
        $node
142 7
            ->children()
143 7
                ->scalarNode('url')->info('A URL with connection information; any parameter value parsed from this string will override explicitly set parameters')->end()
144 7
                ->scalarNode('dbname')->end()
0 ignored issues
show
Bug introduced by
The method scalarNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

144
                ->/** @scrutinizer ignore-call */ scalarNode('dbname')->end()
Loading history...
145 7
                ->scalarNode('host')->end()
146 7
                ->scalarNode('port')->end()
147 7
                ->scalarNode('user')->end()
148 7
                ->scalarNode('password')->end()
149 7
                ->scalarNode('application_name')->end()
150 7
                ->scalarNode('charset')->end()
151 7
                ->scalarNode('path')->end()
152 7
                ->booleanNode('memory')->end()
153 7
                ->scalarNode('unix_socket')->info('The unix socket to use for MySQL')->end()
154 7
                ->booleanNode('persistent')->info('True to use as persistent connection for the ibm_db2 driver')->end()
155 7
                ->scalarNode('protocol')->info('The protocol to use for the ibm_db2 driver (default to TCPIP if omitted)')->end()
156 7
                ->booleanNode('service')
157 7
                    ->info('True to use SERVICE_NAME as connection parameter instead of SID for Oracle')
158 7
                ->end()
159 7
                ->scalarNode('servicename')
160 7
                    ->info(
161
                        'Overrules dbname parameter if given and used as SERVICE_NAME or SID connection parameter '.
162
                        'for Oracle depending on the service parameter.'
163
                    )
164 7
                ->end()
165 7
                ->scalarNode('sessionMode')
166 7
                    ->info('The session mode to use for the oci8 driver')
167 7
                ->end()
168 7
                ->scalarNode('server')
169 7
                    ->info('The name of a running database server to connect to for SQL Anywhere.')
170 7
                ->end()
171 7
                ->scalarNode('default_dbname')
172 7
                    ->info(
173
                        'Override the default database (postgres) to connect to for PostgreSQL connexion.'
174
                    )
175 7
                ->end()
176 7
                ->scalarNode('sslmode')
177 7
                    ->info(
178
                        'Determines whether or with what priority a SSL TCP/IP connection will be negotiated with '.
179
                        'the server for PostgreSQL.'
180
                    )
181 7
                ->end()
182 7
                ->scalarNode('sslrootcert')
183 7
                    ->info(
184
                        'The name of a file containing SSL certificate authority (CA) certificate(s). '.
185
                        'If the file exists, the server\'s certificate will be verified to be signed by one of these authorities.'
186
                    )
187 7
                ->end()
188 7
                ->scalarNode('sslcert')
189 7
                    ->info(
190
                        'The path to the SSL client certificate file for PostgreSQL.'
191
                    )
192 7
                ->end()
193 7
                ->scalarNode('sslkey')
194 7
                    ->info(
195
                        'The path to the SSL client key file for PostgreSQL.'
196
                    )
197 7
                ->end()
198 7
                ->scalarNode('sslcrl')
199 7
                    ->info(
200
                        'The file name of the SSL certificate revocation list for PostgreSQL.'
201
                    )
202 7
                ->end()
203 7
                ->booleanNode('pooled')->info('True to use a pooled server with the oci8/pdo_oracle driver')->end()
204 7
                ->booleanNode('MultipleActiveResultSets')->info('Configuring MultipleActiveResultSets for the pdo_sqlsrv driver')->end()
205
//                ->booleanNode('use_savepoints')->info('Use savepoints for nested transactions')->end()
206 7
                ->scalarNode('instancename')
207 7
                    ->info(
208
                        'Optional parameter, complete whether to add the INSTANCE_NAME parameter in the connection.'.
209
                        ' It is generally used to connect to an Oracle RAC server to select the name'.
210
                        ' of a particular instance.'
211
                    )
212 7
                ->end()
213 7
                ->scalarNode('connectstring')
214 7
                    ->info(
215
                        'Complete Easy Connect connection descriptor, see https://docs.oracle.com/database/121/NETAG/naming.htm.'.
216
                        'When using this option, you will still need to provide the user and password parameters, but the other '.
217
                        'parameters will no longer be used. Note that when using this parameter, the getHost and getPort methods'.
218
                        ' from Doctrine\DBAL\Connection will no longer function as expected.'
219
                    )
220 7
                ->end()
221 7
            ->end()
222 7
            ->beforeNormalization()
223 7
                ->ifTrue(static function ($v) {
224 7
                    return !isset($v['sessionMode']) && isset($v['session_mode']);
225
                })
226 7
                ->then(static function ($v) {
227
                    $v['sessionMode'] = $v['session_mode'];
228
                    unset($v['session_mode']);
229
230
                    return $v;
231
                })
232 7
            ->end()
233 7
            ->beforeNormalization()
234 7
                ->ifTrue(static function ($v) {
235 7
                    return !isset($v['MultipleActiveResultSets']) && isset($v['multiple_active_result_sets']);
236
                })
237 7
                ->then(static function ($v) {
238
                    $v['MultipleActiveResultSets'] = $v['multiple_active_result_sets'];
239
                    unset($v['multiple_active_result_sets']);
240
241
                    return $v;
242
                })
243 7
            ->end();
244
    }
245
246
    /**
247
     * @return NodeDefinition
248
     */
249 7
    private function getTypesNode()
250
    {
251 7
        $root = (new TreeBuilder('types'))->getRootNode();
252
        $root
253 7
            ->useAttributeAsKey('name')
0 ignored issues
show
Bug introduced by
The method useAttributeAsKey() does not exist on Symfony\Component\Config...\Builder\NodeDefinition. It seems like you code against a sub-type of Symfony\Component\Config...\Builder\NodeDefinition such as Symfony\Component\Config...der\ArrayNodeDefinition. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

253
            ->/** @scrutinizer ignore-call */ 
254
              useAttributeAsKey('name')
Loading history...
254 7
            ->arrayPrototype()
255 7
            ->beforeNormalization()
256 7
            ->ifString()
257 7
            ->then(static function ($v) {
258
                return ['class' => $v];
259
            })
260 7
            ->end()
261 7
            ->children()
262 7
                ->scalarNode('class')->isRequired()->end()
263 7
            ->end()
264
        ;
265
266 7
        return $root;
267
    }
268
269
    /**
270
     * @return NodeDefinition
271
     */
272 7
    private function getPlatformTypesNode()
273
    {
274 7
        $root = (new TreeBuilder('platformTypes'))->getRootNode();
275
        $root
276 7
            ->useAttributeAsKey('name')
277 7
            ->arrayPrototype()
278 7
            ->beforeNormalization()
279 7
            ->ifString()
280 7
            ->then(static function ($v) {
281
                return ['class' => $v];
282
            })
283 7
            ->end()
284 7
            ->children()
285 7
                ->scalarNode('class')->isRequired()->end()
286 7
            ->end()
287 7
            ->beforeNormalization()
288 7
            ->ifTrue(function ($value) { return !empty($value) && !method_exists(PrimeConfiguration::class, 'addPlatformType'); })
289 7
            ->thenInvalid('Define platform types is only supported by bdf-prime version >= 2.1')
290
        ;
291
292 7
        return $root;
293
    }
294
295
    /**
296
     * @return NodeDefinition
297
     */
298 7
    private function getMigrationNode()
299
    {
300 7
        $root = (new TreeBuilder('migration'))->getRootNode();
301 7
        $root->children()
302 7
            ->scalarNode('path')
303 7
                ->info('The directory path where the migration file will be stored.')
304 7
                ->isRequired()
305 7
            ->end()
306 7
            ->scalarNode('connection')
307 7
                ->info('The prime connection name to use to access to the version of migrations.')
308 7
                ->defaultNull()
309 7
            ->end()
310 7
            ->scalarNode('table')
311 7
                ->info('The table name to store the version of migrations. The default name is "migrations".')
312 7
                ->defaultValue('migrations')
313 7
            ->end()
314
        ;
315
316 7
        return $root;
317
    }
318
319
    /**
320
     * @return NodeDefinition
321
     */
322 7
    private function getCacheNode()
323
    {
324 7
        $root = (new TreeBuilder('cache'))->getRootNode();
325 7
        $root->children()
326 7
            ->arrayNode('query')
327 7
                ->info('The result cache service. Should implement Bdf\Prime\Cache\CacheInterface.')
328 7
                ->children()
329 7
                    ->scalarNode('pool')->end()
330 7
                    ->scalarNode('service')->end()
331 7
                ->end()
332 7
            ->end()
333 7
            ->arrayNode('metadata')
334 7
                ->info('The metadata cache service. Should implement Psr\SimpleCache\CacheInterface.')
335 7
                ->children()
336 7
                    ->scalarNode('pool')->end()
337 7
                    ->scalarNode('service')->end()
338 7
                ->end()
339 7
            ->end()
340
        ;
341
342 7
        return $root;
343
    }
344
}
345