Completed
Pull Request — master (#30)
by Matthew
19:54
created

DtcQueueExtension   B

Complexity

Total Complexity 51

Size/Duplication

Total Lines 175
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 98.11%

Importance

Changes 0
Metric Value
wmc 51
lcom 1
cbo 7
dl 0
loc 175
ccs 52
cts 53
cp 0.9811
rs 8.3206
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
B load() 0 33 3
B configDeprecated() 0 20 6
B configClassDeprecated() 0 18 6
B configOtherDeprecated() 0 18 6
A configRedis() 0 13 4
B configPhpRedis() 0 11 7
A configAdmin() 0 4 1
B configClasses() 0 8 6
A configRecordTimings() 0 5 2
A configRabbitMQ() 0 12 4
B configBeanstalkd() 0 15 5
A getAlias() 0 4 1

How to fix   Complexity   

Complex Class

Complex classes like DtcQueueExtension often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use DtcQueueExtension, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Dtc\QueueBundle\DependencyInjection;
4
5
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
6
use Symfony\Component\Config\Definition\Processor;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
9
use Symfony\Component\Config\FileLocator;
10
use Symfony\Component\DependencyInjection\Loader;
11
12
class DtcQueueExtension extends Extension
13
{
14 4
    public function load(array $configs, ContainerBuilder $container)
15
    {
16 4
        $processor = new Processor();
17 4
        $configuration = new Configuration();
18
19 4
        $config = $processor->processConfiguration($configuration, $configs);
20 4
        $this->configBeanstalkd($config, $container);
21 4
        $this->configRabbitMQ($config, $container);
22
        $this->configRedis($config, $container);
23 4
24 4
        $container->setParameter('dtc_queue.manager.job', $config['manager']['job']);
25 4
        $container->setParameter('dtc_queue.odm.document_manager', $config['odm']['document_manager']);
26 4
        $container->setParameter('dtc_queue.orm.entity_manager', $config['orm']['entity_manager']);
27 4
        $container->setParameter('dtc_queue.manager.run', isset($config['manager']['run']) ? $config['manager']['run'] : $config['manager']['job']);
28 4
        $container->setParameter('dtc_queue.manager.job_timing', isset($config['manager']['job_timing']) ? $config['manager']['job_timing'] : $container->getParameter('dtc_queue.manager.run'));
29 4
        $container->setParameter('dtc_queue.priority.direction', $config['priority']['direction']);
30 4
        $container->setParameter('dtc_queue.priority.max', $config['priority']['max']);
31 4
        $container->setParameter('dtc_queue.retry.max.retries', $config['retry']['max']['retries']);
32
        $container->setParameter('dtc_queue.retry.max.failures', $config['retry']['max']['failures']);
33
        $container->setParameter('dtc_queue.retry.max.exceptions', $config['retry']['max']['exceptions']);
34 4
        $container->setParameter('dtc_queue.retry.max.stalls', $config['retry']['max']['stalls']);
35
        $container->setParameter('dtc_queue.retry.auto.failure', $config['retry']['auto']['failure']);
36 4
        $container->setParameter('dtc_queue.retry.auto.exception', $config['retry']['auto']['exception']);
37 4
        $this->configClasses($config, $container);
38
        $this->configRecordTimings($config, $container);
39 4
        $this->configAdmin($config, $container);
40
        $this->configDeprecated($config, $container);
41 4
42 4
        // Load Grid if Dtc\GridBundle Bundle is registered
43
        $yamlLoader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
44 4
45
        $yamlLoader->load('queue.yml');
46 4
    }
47 4
48 4
    protected function configDeprecated(array $config, ContainerBuilder $container)
49 4
    {
50 4
        if (isset($config['default_manager'])) {
51 4
            $container->setParameter('dtc_queue.manager.job', $config['default_manager']);
52
        }
53 4
        if (isset($config['run_manager'])) {
54
            $container->setParameter('dtc_queue.manager.run', $config['run_manager']);
55 4
        }
56 4
        if (isset($config['job_timing_manager'])) {
57 4
            $container->setParameter('dtc_queue.manager.run', $config['job_timing_manager']);
58
        }
59
        if (isset($config['document_manager'])) {
60 4
            $container->setParameter('dtc_queue.odm.document_manager', $config['document_manager']);
61
        }
62 4
        if (isset($config['entity_manager'])) {
63
            $container->setParameter('dtc_queue.odm.entity_manager', $config['entity_manager']);
64 4
        }
65 1
        $this->configClassDeprecated($config, $container);
66 1
        $this->configOtherDeprecated($config, $container);
67 1
    }
68
69
    protected function configClassDeprecated(array $config, ContainerBuilder $container)
70 1
    {
71 1
        if (isset($config['class_job'])) {
72
            $container->setParameter('dtc_queue.class.job', $config['class_job']);
73 4
        }
74
        if (isset($config['class_job_archive'])) {
75 4
            $container->setParameter('dtc_queue.class.job_archive', $config['class_job_archive']);
76
        }
77 4
        if (isset($config['class_run'])) {
78 1
            $container->setParameter('dtc_queue.class.run', $config['class_run']);
79 1
        }
80
        if (isset($config['class_run_archive'])) {
81
            $container->setParameter('dtc_queue.class.run_archive', $config['class_run_archive']);
82
        }
83 4
        if (isset($config['class_job_timing'])) {
84 1
            $container->setParameter('dtc_queue.class.job_timing', $config['class_job_timing']);
85
        }
86 4
    }
87 1
88
    protected function configOtherDeprecated(array $config, ContainerBuilder $container)
89 4
    {
90
        if (isset($config['record_timings'])) {
91 1
            $container->setParameter('dtc_queue.timings.record', $config['record_timings']);
92
        }
93 1
        if (isset($config['record_timings_timezone_offset'])) {
94
            $container->setParameter('dtc_queue.timings.timezone_offset', $config['record_timings_timezone_offset']);
95
        }
96
        if (isset($config['record_timings_timezone_offset'])) {
97
            $container->setParameter('dtc_queue.timings.timezone_offset', $config['record_timings_timezone_offset']);
98
        }
99
        if (isset($config['priority_max'])) {
100
            $container->setParameter('dtc_queue.priority.max', $config['priority_max']);
101
        }
102
        if (isset($config['priority_direction'])) {
103
            $container->setParameter('dtc_queue.priority.direction', $config['priority_direction']);
104
        }
105
    }
106
107
    protected function configRedis(array $config, ContainerBuilder $container)
108
    {
109
        $container->setParameter('dtc_queue.redis.prefix', $config['redis']['prefix']);
110
        if (isset($config['redis']['snc_redis']['type'])) {
111
            $container->setParameter('dtc_queue.redis.snc_redis.type', $config['redis']['snc_redis']['type']);
112
            $container->setParameter('dtc_queue.redis.snc_redis.alias', $config['redis']['snc_redis']['alias']);
113
        } elseif (isset($config['redis']['predis']['dsn'])) {
114
            $container->setParameter('dtc_queue.redis.predis.dsn', $config['redis']['predis']['dsn']);
115
        } elseif (isset($config['redis']['predis']['connection_parameters']['host'])) {
116
            $container->setParameter('dtc_queue.redis.predis.connection_parameters', $config['redis']['predis']['connection_parameters']);
117
        }
118
        $this->configPhpRedis($config, $container);
119
    }
120
121
    protected function configPhpRedis(array $config, ContainerBuilder $container)
122
    {
123
        $container->setParameter('dtc_queue.redis.phpredis.host', isset($config['redis']['phpredis']['host']) ? $config['redis']['phpredis']['host'] : null);
124
        $container->setParameter('dtc_queue.redis.phpredis.port', isset($config['redis']['phpredis']['port']) ? $config['redis']['phpredis']['port'] : null);
125
        $container->setParameter('dtc_queue.redis.phpredis.timeout', isset($config['redis']['phpredis']['timeout']) ? $config['redis']['phpredis']['timeout'] : null);
126
        $container->setParameter('dtc_queue.redis.phpredis.retry_interval', isset($config['redis']['phpredis']['retry_interval']) ? $config['redis']['phpredis']['retry_interval'] : null);
127
        $container->setParameter('dtc_queue.redis.phpredis.read_timeout', isset($config['redis']['phpredis']['read_timeout']) ? $config['redis']['phpredis']['read_timeout'] : null);
128
        if (isset($config['redis']['phpredis']['auth'])) {
129
            $container->setParameter('dtc_queue.redis.phpredis.auth', $config['redis']['phpredis']['auth']);
130
        }
131
    }
132
133
    protected function configAdmin(array $config, ContainerBuilder $container)
134
    {
135
        $container->setParameter('dtc_queue.admin.chartjs', $config['admin']['chartjs']);
136
    }
137
138
    protected function configClasses(array $config, ContainerBuilder $container)
139
    {
140
        $container->setParameter('dtc_queue.class.job', isset($config['class']['job']) ? $config['class']['job'] : null);
141
        $container->setParameter('dtc_queue.class.job_archive', isset($config['class']['job_archive']) ? $config['class']['job_archive'] : null);
142
        $container->setParameter('dtc_queue.class.run', isset($config['class']['run']) ? $config['class']['run'] : null);
143
        $container->setParameter('dtc_queue.class.run_archive', isset($config['class']['run_archive']) ? $config['class']['run_archive'] : null);
144
        $container->setParameter('dtc_queue.class.job_timing', isset($config['class']['job_timing']) ? $config['class']['job_timing'] : null);
145
    }
146
147
    protected function configRecordTimings(array $config, ContainerBuilder $container)
148
    {
149
        $container->setParameter('dtc_queue.timings.record', isset($config['timings']['record']) ? $config['timings']['record'] : false);
150
        $container->setParameter('dtc_queue.timings.timezone_offset', $config['timings']['timezone_offset']);
151
    }
152
153
    protected function configRabbitMQ(array $config, ContainerBuilder $container)
154
    {
155
        if (isset($config['rabbit_mq'])) {
156
            foreach (['host', 'port', 'user', 'password'] as $value) {
157
                if (!isset($config['rabbit_mq'][$value])) {
158
                    throw new InvalidConfigurationException('dtc_queue: rabbit_mq must have '.$value.' in config.yml');
159
                }
160
            }
161
            $config['rabbit_mq']['queue_args']['max_priority'] = $config['priority']['max'];
162
            $container->setParameter('dtc_queue.rabbit_mq', $config['rabbit_mq']);
163
        }
164
    }
165
166
    protected function configBeanstalkd(array $config, ContainerBuilder $container)
167
    {
168
        if (isset($config['beanstalkd'])) {
169
            if (!isset($config['beanstalkd']['host'])) {
170
                throw new InvalidConfigurationException('dtc_queue: beanstalkd requires host in config.yml');
171
            }
172
        }
173
174
        if (isset($config['beanstalkd']['host'])) {
175
            $container->setParameter('dtc_queue.beanstalkd.host', $config['beanstalkd']['host']);
176
        }
177
        if (isset($config['beanstalkd']['tube'])) {
178
            $container->setParameter('dtc_queue.beanstalkd.tube', $config['beanstalkd']['tube']);
179
        }
180
    }
181
182
    public function getAlias()
183
    {
184
        return 'dtc_queue';
185
    }
186
}
187