Completed
Push — master ( bf73c4...f46316 )
by Nikola
02:17
created

Extension   A

Complexity

Total Complexity 31

Size/Duplication

Total Lines 170
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 94.44%

Importance

Changes 3
Bugs 0 Features 1
Metric Value
wmc 31
c 3
b 0
f 1
lcom 1
cbo 8
dl 0
loc 170
ccs 102
cts 108
cp 0.9444
rs 9.8

8 Methods

Rating   Name   Duplication   Size   Complexity  
A load() 0 15 1
A configureExchangeRateService() 0 14 2
C configureSourcesRegistry() 0 33 7
C configureProcessorsRegistry() 0 28 7
B configureRatesRegistry() 0 26 5
B configureFileRepository() 0 23 6
A configureController() 0 11 2
A getAlias() 0 4 1
1
<?php
2
3
namespace RunOpenCode\Bundle\ExchangeRate\DependencyInjection;
4
5
use RunOpenCode\ExchangeRate\Configuration as RateConfiguration;
6
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\DependencyInjection\ContainerBuilder;
9
use Symfony\Component\DependencyInjection\Definition;
10
use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;
11
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
12
use Symfony\Component\DependencyInjection\Reference;
13
14
class Extension extends BaseExtension
15
{
16
    /**
17
     * {@inheritdoc}
18
     */
19 2
    public function load(array $config, ContainerBuilder $container)
20
    {
21 2
        $configuration = new Configuration();
22 2
        $config = $this->processConfiguration($configuration, $config);
23
24 2
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25 2
        $loader->load('services.xml');
26
27 2
        $this->configureExchangeRateService($config, $container);
28 2
        $this->configureSourcesRegistry($config, $container);
29 2
        $this->configureProcessorsRegistry($config, $container);
30 2
        $this->configureRatesRegistry($config, $container);
31 2
        $this->configureFileRepository($config, $container);
32 2
        $this->configureController($config, $container);
33 2
    }
34
35 2
    protected function configureExchangeRateService(array $config, ContainerBuilder $container)
36
    {
37 2
        if ($container->hasDefinition('run_open_code.exchange_rate')) {
38 2
            $definition = $container->getDefinition('run_open_code.exchange_rate');
39
40 2
            $definition->setArguments(array(
41 2
                $config['base_currency'],
42 2
                new Reference($config['repository']),
43 2
                new Reference('run_open_code.exchange_rate.registry.sources'),
44 2
                new Reference('run_open_code.exchange_rate.registry.processors'),
45 2
                new Reference('run_open_code.exchange_rate.registry.rates')
46 2
            ));
47 2
        }
48 2
    }
49
50 2
    protected function configureSourcesRegistry(array $config, ContainerBuilder $container)
51
    {
52 2
        if ($container->hasDefinition('run_open_code.exchange_rate.registry.sources')) {
53
54 2
            $definition = $container->getDefinition('run_open_code.exchange_rate.registry.sources');
55
56 2
            $requiredSources = array();
57
58 2
            foreach ($config['rates'] as $rate) {
59 2
                $requiredSources[$rate['source']] = $rate['source'];
60 2
            }
61
62
63 2
            foreach ($container->findTaggedServiceIds('run_open_code.exchange_rate.source') as $id => $tags) {
64
65 2
                foreach ($tags as $attributes) {
66
67 2
                    if (array_key_exists($attributes['alias'], $requiredSources)) {
68
69 2
                        $definition->addMethodCall('add', array(
70 2
                            new Reference($id)
71 2
                        ));
72
73 2
                        unset($requiredSources[$attributes['alias']]);
74 2
                    }
75 2
                }
76 2
            }
77
78 2
            if (count($requiredSources) > 0) {
79
                throw new InvalidConfigurationException(sprintf('Required source(s) "%s" does not exists.', implode(', ', $requiredSources)));
80
            }
81 2
        }
82 2
    }
83
84 2
    protected function configureProcessorsRegistry(array $config, ContainerBuilder $container)
85
    {
86 2
        if ($container->hasDefinition('run_open_code.exchange_rate.registry.processors')) {
87
88 2
            $definition = $container->getDefinition('run_open_code.exchange_rate.registry.processors');
89
90 2
            $processors = array();
91
92 2
            foreach ($container->findTaggedServiceIds('run_open_code.exchange_rate.processor') as $id => $tags) {
93
94 2
                if (!in_array($id, $config['processors'], true)) {
95
                    continue;
96
                }
97
98 2
                foreach ($tags as $attributes) {
99 2
                    $processors[$id] = (isset($attributes['priority'])) ? intval($attributes['priority']) : 0;
100 2
                }
101 2
            }
102
103 2
            asort($processors);
104
105 2
            foreach (array_keys($processors) as $id) {
106 2
                $definition->addMethodCall('add', array(
107 2
                    new Reference($id)
108 2
                ));
109 2
            }
110 2
        }
111 2
    }
112
113 2
    protected function configureRatesRegistry(array $config, ContainerBuilder $container)
114
    {
115 2
        if ($container->hasDefinition('run_open_code.exchange_rate.registry.rates')) {
116
117 2
            $definition = $container->getDefinition('run_open_code.exchange_rate.registry.rates');
118
119 2
            $processed = array();
120
121 2
            foreach ($config['rates'] as $rateConfiguration) {
122
123 2
                $key = sprintf('%s_%s', $rateConfiguration['currency_code'], $rateConfiguration['rate_type']);
124
125 2
                if (isset($processed[$key])) {
126
                    throw new InvalidConfigurationException(sprintf('Currency code "%s" for rate type "%s" is configured twice.', $rateConfiguration['currency_code'], $rateConfiguration['rate_type']));
127
                }
128
129 2
                $rateConfiguration['extra'] = (isset($ratesConfiguration['extra'])) ? $ratesConfiguration['extra'] : array();
130
131 2
                $processed[$key] = $rateConfiguration;
132 2
            }
133
134 2
            $definition->setArguments(array(
135 2
                array_values($processed)
136 2
            ));
137 2
        }
138 2
    }
139
140 2
    protected function configureFileRepository(array $config, ContainerBuilder $container)
141
    {
142
        if (
143 2
            $config['repository'] === 'run_open_code.exchange_rate.repository.file_repository'
144 2
            &&
145 2
            $container->hasDefinition('run_open_code.exchange_rate.repository.file_repository')
146 2
        ) {
147
148 2
            if (!empty($config['file_repository']) && !empty($config['file_repository']['path'])) {
149 2
                $definition = $container->getDefinition('run_open_code.exchange_rate.repository.file_repository');
150 2
                $definition->setArguments(array(
151 2
                    $config['file_repository']['path']
152 2
                ));
153 2
            } else {
154
                throw new InvalidConfigurationException('You must configure location to the file where file repository will store exchange rates.');
155
            }
156
157 2
        } elseif ($config['repository'] === 'run_open_code.exchange_rate.repository.file_repository') {
158
            throw new InvalidConfigurationException('File repository is used to store exchange rates, but it is not available in container.');
159
        } else {
160
            $container->removeDefinition('run_open_code.exchange_rate.repository.file_repository');
161
        }
162 2
    }
163
164 2
    public function configureController(array $config, ContainerBuilder $container)
165
    {
166 2
        if ($container->has('run_open_code.exchange_rate.controller')) {
167 2
            $definition = $container->getDefinition('run_open_code.exchange_rate.controller');
168 2
            $definition->setArguments(array(
169 2
                new Reference($config['repository']),
170 2
                $config['base_currency'],
171 2
                $config['view']
172 2
            ));
173 2
        }
174 2
    }
175
176
    /**
177
     * {@inheritdoc}
178
     */
179 4
    public function getAlias()
180
    {
181 4
        return "run_open_code_exchange_rate";
182
    }
183
}
184