Completed
Push — master ( d7130a...41d031 )
by Luc
10:22
created

ConfigurableJsonDocumentLanguageAnalyzer   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 2
dl 0
loc 101
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A determineAvailableLanguages() 0 18 2
B determineCompletedLanguages() 0 26 4
A getLanguageStringsFromProperty() 0 10 2
A getLanguageStringsAsValueObjects() 0 9 1
1
<?php
2
3
namespace CultuurNet\UDB3\ReadModel;
4
5
use CultuurNet\UDB3\Language;
6
7
class ConfigurableJsonDocumentLanguageAnalyzer implements JsonDocumentLanguageAnalyzerInterface
8
{
9
    /**
10
     * @var string[]
11
     */
12
    private $translatableProperties;
13
14
    /**
15
     * @param string[] $translatableProperties
16
     *   List of translatable properties (on top level).
17
     */
18
    public function __construct(
19
        array $translatableProperties
20
    ) {
21
        $this->translatableProperties = $translatableProperties;
22
    }
23
24
    /**
25
     * @param JsonDocument $jsonDocument
26
     * @return Language[]
27
     */
28
    public function determineAvailableLanguages(JsonDocument $jsonDocument)
29
    {
30
        $json = $jsonDocument->getBody();
31
        $languageStrings = [];
32
33
        foreach ($this->translatableProperties as $translatableProperty) {
34
            $languageStringsOnProperty = $this->getLanguageStringsFromProperty($json, $translatableProperty);
35
36
            $languageStrings = array_merge(
37
                $languageStrings,
38
                $languageStringsOnProperty
39
            );
40
        }
41
42
        $languageStrings = array_values(array_unique($languageStrings));
43
44
        return $this->getLanguageStringsAsValueObjects($languageStrings);
45
    }
46
47
    /**
48
     * @param JsonDocument $jsonDocument
49
     * @return Language[]
50
     */
51
    public function determineCompletedLanguages(JsonDocument $jsonDocument)
52
    {
53
        $json = $jsonDocument->getBody();
54
        $languageStrings = [];
55
56
        foreach ($this->translatableProperties as $translatableProperty) {
57
            $languageStringsOnProperty = $this->getLanguageStringsFromProperty($json, $translatableProperty);
58
59
            if (empty($languageStringsOnProperty)) {
60
                // Property was not found, which means it's not set for the
61
                // original language either. Skip it, as it can't be translated
62
                // without an original value.
63
                continue;
64
            }
65
66
            if ($translatableProperty == $this->translatableProperties[0]) {
67
                $languageStrings = $languageStringsOnProperty;
68
            } else {
69
                $languageStrings = array_intersect($languageStrings, $languageStringsOnProperty);
70
            }
71
        }
72
73
        $languageStrings = array_values(array_unique($languageStrings));
74
75
        return $this->getLanguageStringsAsValueObjects($languageStrings);
76
    }
77
78
    /**
79
     * @param \stdClass $json
80
     * @param string $propertyName
81
     * @return string[]
82
     */
83
    private function getLanguageStringsFromProperty(\stdClass $json, $propertyName)
84
    {
85
        if (!isset($json->{$propertyName})) {
86
            return [];
87
        }
88
89
        return array_keys(
90
            get_object_vars($json->{$propertyName})
91
        );
92
    }
93
94
    /**
95
     * @param string[] $languageStrings
96
     * @return Language[]
97
     */
98
    private function getLanguageStringsAsValueObjects(array $languageStrings)
99
    {
100
        return array_map(
101
            function ($languageString) {
102
                return new Language($languageString);
103
            },
104
            $languageStrings
105
        );
106
    }
107
}
108