Passed
Push — master ( d6ce84...9c42e9 )
by Gaetano
10:07
created

LanguageManager::update()   A

Complexity

Conditions 6
Paths 14

Size

Total Lines 33
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6.2373

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 16
nc 14
nop 1
dl 0
loc 33
ccs 13
cts 16
cp 0.8125
crap 6.2373
rs 9.1111
c 1
b 0
f 0
1
<?php
2
3
namespace Kaliop\eZMigrationBundle\Core\Executor;
4
5
use eZ\Publish\API\Repository\Values\Content\Language;
6
use Kaliop\eZMigrationBundle\API\Collection\LanguageCollection;
7
use Kaliop\eZMigrationBundle\API\MigrationGeneratorInterface;
8
use Kaliop\eZMigrationBundle\API\EnumerableMatcherInterface;
9
use Kaliop\eZMigrationBundle\Core\Matcher\LanguageMatcher;
10
11
/**
12
 * Handles language migrations.
13
 */
14
class LanguageManager extends RepositoryExecutor implements MigrationGeneratorInterface, EnumerableMatcherInterface
15
{
16
    protected $supportedStepTypes = array('language');
17
    protected $supportedActions = array('create', 'load', 'update', 'delete');
18
19
    /** @var LanguageMatcher $languageMatcher */
20
    protected $languageMatcher;
21
22
    /**
23
     * @param LanguageMatcher $languageMatcher
24
     */
25 96
    public function __construct(LanguageMatcher $languageMatcher)
26
    {
27 96
        $this->languageMatcher = $languageMatcher;
28 96
    }
29
30
    /**
31
     * Handles the language create migration action
32
     *
33
     * @todo allow creating disabkled languages
34
     */
35 5
    protected function create($step)
36
    {
37 5
        $languageService = $this->repository->getContentLanguageService();
38
39 5
        if (!isset($step->dsl['lang'])) {
40
            throw new \Exception("The 'lang' key is required to create a new language.");
41
        }
42
43 5
        $languageCreateStruct = $languageService->newLanguageCreateStruct();
44 5
        $languageCreateStruct->languageCode = $this->referenceResolver->resolveReference($step->dsl['lang']);
45 5
        if (isset($step->dsl['name'])) {
46 5
            $languageCreateStruct->name = $this->referenceResolver->resolveReference($step->dsl['name']);
47
        }
48 5
        if (isset($step->dsl['enabled'])) {
49
            $languageCreateStruct->enabled = (bool)$this->referenceResolver->resolveReference($step->dsl['enabled']);
50
        }
51 5
        $language = $languageService->createLanguage($languageCreateStruct);
52
53 5
        $this->setReferences($language, $step);
54
55 5
        return $language;
56
    }
57
58 1
    protected function load($step)
59
    {
60 1
        $languageCollection = $this->matchLanguages('load', $step);
61
62 1
        $this->validateResultsCount($languageCollection, $step);
63
64 1
        $this->setReferences($languageCollection, $step);
65
66
        return $languageCollection;
67
    }
68
69
    /**
70 1
     * Handles the language update migration action
71
     */
72 1
    protected function update($step)
73
    {
74
        if (isset($step->dsl['lang'])) {
75
            // BC
76
            $step->dsl['match'] = array('language_code' => $step->dsl['lang']);
77 1
        }
78
79 1
        $languageCollection = $this->matchLanguages('delete', $step);
80
81
        $this->validateResultsCount($languageCollection, $step);
82
83 1
        $languageService = $this->repository->getContentLanguageService();
84
85 1
        foreach ($languageCollection as $key => $language) {
86
87 1
            if (isset($step->dsl['name'])) {
88 1
                $languageService->updateLanguageName($language, $this->referenceResolver->resolveReference($step->dsl['name']));
89
            }
90
91 1
            if (isset($step->dsl['enabled'])) {
92 1
                if ($this->referenceResolver->resolveReference($step->dsl['enabled'])) {
93
                    $languageService->enableLanguage($language);
94
                } else {
95 1
                    $languageService->disableLanguage($language);
96
                };
97
            }
98
99 1
            $languageCollection[$key] = $languageService->loadLanguageById($key);
100
        }
101
102 1
        $this->setReferences($languageCollection, $step);
103
104 1
        return $languageCollection;
105
    }
106
107
    /**
108
     * Handles the language delete migration action
109
     */
110 1
    protected function delete($step)
111
    {
112 1
        if (isset($step->dsl['lang'])) {
113
            // BC
114
            $step->dsl['match'] = array('language_code' => $step->dsl['lang']);
115
        }
116 1
117
        $languageCollection = $this->matchLanguages('delete', $step);
118 1
119
        $this->validateResultsCount($languageCollection, $step);
120 1
121
        $this->setReferences($languageCollection, $step);
122 1
123 1
        $languageService = $this->repository->getContentLanguageService();
124
125
        foreach ($languageCollection as $language) {
126 1
            $languageService->deleteLanguage($language);
127
        }
128
129
        return $languageCollection;
130
    }
131
132
    /**
133
     * @param string $action
134 1
     * @return LanguageCollection
135
     * @throws \Exception
136 1
     */
137
    protected function matchLanguages($action, $step)
138
    {
139
        if (!isset($step->dsl['match'])) {
140
            throw new \Exception("A match condition is required to $action a language");
141 1
        }
142
143 1
        // convert the references passed in the match
144
        $match = $this->resolveReferencesRecursively($step->dsl['match']);
145
146
        return $this->languageMatcher->match($match);
147
    }
148
149
    /**
150
     * @param Language $language
151
     * @param array $references the definitions of the references to set
152 1
     * @throws \InvalidArgumentException When trying to assign a reference to an unsupported attribute
153
     * @return array key: the reference names, values: the reference values
154 1
     */
155
    protected function getReferencesValues($language, array $references, $step)
156 1
    {
157
        $refs = array();
158 1
159 1
        foreach ($references as $reference) {
160 1
161 1
            switch ($reference['attribute']) {
162 1
                case 'language_id':
163
                case 'id':
164
                    $value = $language->id;
165
                    break;
166
                case 'enabled':
167
                    $value = $language->enabled;
168
                    break;
169
                case 'language_code':
170
                    $value = $language->languageCode;
171
                    break;
172
                case 'language_name':
173
                case 'name':
174
                    $value = $language->name;
175
                    break;
176
                default:
177 1
                    throw new \InvalidArgumentException('Language Manager does not support setting references for attribute ' . $reference['attribute']);
178
            }
179
180 1
            $refs[$reference['identifier']] = $value;
181
        }
182
183
        return $refs;
184
    }
185
186
    /**
187
     * @param array $matchCondition
188
     * @param string $mode
189
     * @param array $context
190 3
     * @throws \Exception
191
     * @return array
192 3
     */
193 3
    public function generateMigration(array $matchCondition, $mode, array $context = array())
194 3
    {
195
        $previousUserId = $this->loginUser($this->getAdminUserIdentifierFromContext($context));
196
        $languageCollection = $this->languageMatcher->match($matchCondition);
197 3
        $data = array();
198
199
        /** @var \eZ\Publish\API\Repository\Values\Content\Language $language */
200 3
        foreach ($languageCollection as $language) {
201 3
202
            $languageData = array(
203
                'type' => reset($this->supportedStepTypes),
204
                'mode' => $mode,
205 3
            );
206 1
207 1
            switch ($mode) {
208
                case 'create':
209 1
                    $languageData = array_merge(
210 1
                        $languageData,
211 1
                        array(
212
                            'lang' => $language->languageCode,
213
                            'name' => $language->name,
214 1
                            'enabled' => $language->enabled
215 2
                        )
216 1
                    );
217 1
                    break;
218
                case 'update':
219
                    $languageData = array_merge(
220 1
                        $languageData,
221
                        array(
222 1
                            'match' => array(
223 1
                                LanguageMatcher::MATCH_LANGUAGE_ID => $language->id
224 1
                            ),
225
                            'lang' => $language->languageCode,
226
                            'name' => $language->name,
227 1
                            'enabled' => $language->enabled
228 1
                        )
229 1
                    );
230 1
                    break;
231
                case 'delete':
232
                    $languageData = array_merge(
233 1
                        $languageData,
234
                        array(
235
                            'match' => array(
236
                                LanguageMatcher::MATCH_LANGUAGE_ID => $language->id
237 1
                            )
238
                        )
239
                    );
240
                    break;
241
                default:
242 3
                    throw new \Exception("Executor 'language' doesn't support mode '$mode'");
243
            }
244
245 3
            $data[] = $languageData;
246 3
        }
247
248
        $this->loginUser($previousUserId);
249
        return $data;
250
    }
251
252
    /**
253
     * @return string[]
254
     */
255
    public function listAllowedConditions()
256
    {
257
        return $this->languageMatcher->listAllowedConditions();
258
    }
259
}
260