Completed
Push — master ( 955b04...f00653 )
by André
38:12 queued 16:07
created

CachingHandler::initializeCache()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 0
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File containing the Language Handler class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 */
9
namespace eZ\Publish\Core\Persistence\Legacy\Content\Language;
10
11
use eZ\Publish\Core\Persistence\Cache\InMemory\InMemoryCache;
12
use eZ\Publish\SPI\Persistence\Content\Language;
13
use eZ\Publish\SPI\Persistence\Content\Language\Handler as BaseLanguageHandler;
14
use eZ\Publish\SPI\Persistence\Content\Language\CreateStruct;
15
16
/**
17
 * Language Handler.
18
 */
19
class CachingHandler implements BaseLanguageHandler
20
{
21
    /**
22
     * Inner Language handler.
23
     *
24
     * @var \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler
25
     */
26
    protected $innerHandler;
27
28
    /**
29
     * Language cache.
30
     *
31
     * @var \eZ\Publish\Core\Persistence\Cache\InMemory\InMemoryCache
32
     */
33
    protected $cache;
34
35
    /**
36
     * Creates a caching handler around $innerHandler.
37
     *
38
     * @param \eZ\Publish\SPI\Persistence\Content\Language\Handler $innerHandler
39
     * @param \eZ\Publish\Core\Persistence\Cache\InMemory\InMemoryCache $cache
40
     */
41
    public function __construct(BaseLanguageHandler $innerHandler, InMemoryCache $cache)
42
    {
43
        $this->innerHandler = $innerHandler;
0 ignored issues
show
Documentation Bug introduced by
$innerHandler is of type object<eZ\Publish\SPI\Pe...ntent\Language\Handler>, but the property $innerHandler was declared to be of type object<eZ\Publish\Core\P...ntent\Language\Handler>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
44
        $this->cache = $cache;
45
    }
46
47
    /**
48
     * Create a new language.
49
     *
50
     * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct
51
     *
52
     * @return \eZ\Publish\SPI\Persistence\Content\Language
53
     */
54
    public function create(CreateStruct $struct)
55
    {
56
        $language = $this->innerHandler->create($struct);
57
        $this->storeCache([$language]);
58
59
        return $language;
60
    }
61
62
    /**
63
     * Update language.
64
     *
65
     * @param \eZ\Publish\SPI\Persistence\Content\Language $language
66
     */
67
    public function update(Language $language)
68
    {
69
        $this->innerHandler->update($language);
70
        $this->storeCache([$language]);
71
    }
72
73
    /**
74
     * Get language by id.
75
     *
76
     * @param mixed $id
77
     *
78
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id
79
     *
80
     * @return \eZ\Publish\SPI\Persistence\Content\Language
81
     */
82 View Code Duplication
    public function load($id)
83
    {
84
        $language = $this->cache->get('ez-language-' . $id);
85
        if ($language === null) {
86
            $language = $this->innerHandler->load($id);
87
            $this->storeCache([$language]);
88
        }
89
90
        return $language;
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96 View Code Duplication
    public function loadList(array $ids): iterable
97
    {
98
        $missing = [];
99
        $languages = [];
100
        foreach ($ids as $id) {
101
            if ($language = $this->cache->get('ez-language-' . $id)) {
102
                $languages[$id] = $language;
103
            } else {
104
                $missing[] = $id;
105
            }
106
        }
107
108
        if (!empty($missing)) {
109
            $loaded = $this->innerHandler->loadList($missing);
110
            $this->storeCache($loaded);
111
            /** @noinspection AdditionOperationOnArraysInspection */
112
            $languages += $loaded;
113
        }
114
115
        return $languages;
116
    }
117
118
    /**
119
     * Get language by Language Code (eg: eng-GB).
120
     *
121
     * @param string $languageCode
122
     *
123
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode
124
     *
125
     * @return \eZ\Publish\SPI\Persistence\Content\Language
126
     */
127 View Code Duplication
    public function loadByLanguageCode($languageCode)
128
    {
129
        $language = $this->cache->get('ez-language-code-' . $languageCode);
130
        if ($language === null) {
131
            $language = $this->innerHandler->loadByLanguageCode($languageCode);
132
            $this->storeCache([$language]);
133
        }
134
135
        return $language;
136
    }
137
138
    /**
139
     * {@inheritdoc}
140
     */
141 View Code Duplication
    public function loadListByLanguageCodes(array $languageCodes): iterable
142
    {
143
        $missing = [];
144
        $languages = [];
145
        foreach ($languageCodes as $languageCode) {
146
            if ($language = $this->cache->get('ez-language-code-' . $languageCode)) {
147
                $languages[$languageCode] = $language;
148
            } else {
149
                $missing[] = $languageCode;
150
            }
151
        }
152
153
        if (!empty($missing)) {
154
            $loaded = $this->innerHandler->loadListByLanguageCodes($missing);
155
            $this->storeCache($loaded);
156
            /** @noinspection AdditionOperationOnArraysInspection */
157
            $languages += $loaded;
158
        }
159
160
        return $languages;
161
    }
162
163
    /**
164
     * Get all languages.
165
     *
166
     * @return \eZ\Publish\SPI\Persistence\Content\Language[]
167
     */
168 View Code Duplication
    public function loadAll()
169
    {
170
        $languages = $this->cache->get('ez-language-list');
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->cache->get('ez-language-list'); of type null|object adds the type object to the return on line 176 which is incompatible with the return type declared by the interface eZ\Publish\SPI\Persisten...nguage\Handler::loadAll of type eZ\Publish\SPI\Persistence\Content\Language[].
Loading history...
171
        if ($languages === null) {
172
            $languages = $this->innerHandler->loadAll();
173
            $this->storeCache($languages, 'ez-language-list');
174
        }
175
176
        return $languages;
177
    }
178
179
    /**
180
     * Delete a language.
181
     *
182
     * @param mixed $id
183
     */
184
    public function delete($id)
185
    {
186
        $this->innerHandler->delete($id);
187
        // Delete by primary key will remove the object, so we don't need to clear `ez-language-code-` here.
188
        $this->cache->deleteMulti(['ez-language-' . $id, 'ez-language-list']);
189
    }
190
191
    /**
192
     * Clear internal in-memory cache.
193
     */
194
    public function clearCache(): void
195
    {
196
        $this->cache->clear();
197
    }
198
199
    /**
200
     * Helper to store languages in internal in-memory cache with all needed keys.
201
     *
202
     * @param array $languages
203
     * @param string|null $listIndex
204
     */
205
    protected function storeCache(array $languages, string $listIndex = null): void
206
    {
207
        $this->cache->setMulti(
208
            $languages,
209
            static function (Language $language) {
210
                return [
211
                        'ez-language-' . $language->id,
212
                        'ez-language-code-' . $language->languageCode,
213
                    ];
214
            },
215
            $listIndex
216
        );
217
    }
218
}
219