VocabularyConfig   F
last analyzed

Complexity

Total Complexity 124

Size/Duplication

Total Lines 789
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 124
eloc 284
dl 0
loc 789
rs 2
c 0
b 0
f 0

48 Methods

Rating   Name   Duplication   Size   Complexity  
B setParameterizedPlugins() 0 19 7
A getSparqlDialect() 0 8 2
A getSparqlGraph() 0 8 2
A setPluginParameters() 0 17 4
A getTitle() 0 3 1
A getFeedbackRecipient() 0 4 2
A getShortName() 0 9 2
A getSparqlEndpoint() 0 7 2
A setPropertyLabelOverrides() 0 7 3
B getPluginArray() 0 32 9
A getDefaultLanguage() 0 14 3
A setLabelOverride() 0 18 4
A __construct() 0 7 1
A getPropertyLabelOverrides() 0 3 1
B getDataURLs() 0 41 7
A getId() 0 12 2
A isUseModifiedDate() 0 3 1
A getTypes() 0 10 3
A showConceptSchemesInHierarchy() 0 3 1
A showNotation() 0 3 1
A getDescription() 0 3 1
A searchByNotation() 0 3 1
A getExtProperties() 0 3 1
A getShowLangCodes() 0 3 1
A getSortByNotation() 0 10 4
A getLanguages() 0 11 2
A getShowStatistics() 0 3 1
A getPluginRegister() 0 3 1
A getArrayClassURI() 0 8 2
A getExternalResourcesLoading() 0 3 1
A getShowDeprecatedChanges() 0 3 1
A hasMultiLingualProperty() 0 15 4
A getGroupClassURI() 0 8 2
A getHierarchyProperty() 0 13 4
A getMarcSourceCode() 0 3 1
A getAdditionalSearchProperties() 0 13 3
B getPropertyOrder() 0 27 8
A getShowNotationAsProperty() 0 3 1
A getAlphabeticalListQualifier() 0 3 1
A getShowDeprecated() 0 3 1
A getIndexClasses() 0 3 1
A getMainConceptSchemeURI() 0 8 2
B getLanguageOrder() 0 23 8
A getShowTopConcepts() 0 3 1
A getPluginParameters() 0 3 1
A getSidebarViews() 0 13 4
A getDefaultSidebarView() 0 17 4
A getDefaultConceptSidebarView() 0 17 4

How to fix   Complexity   

Complex Class

Complex classes like VocabularyConfig 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.

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 VocabularyConfig, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/**
4
 * VocabularyConfig provides access to the vocabulary configuration defined in config.ttl.
5
 */
6
class VocabularyConfig extends BaseConfig
7
{
8
    private $globalPlugins;
9
    private $pluginRegister;
10
    private $pluginParameters = array();
11
    private $languageOrderCache = array();
12
    private $labelOverrides = array();
13
14
    public const DEFAULT_PROPERTY_ORDER = array("rdf:type", "dc:isReplacedBy",
15
    "skos:definition", "skos:broader", "isothes:broaderGeneric",
16
    "isothes:broaderPartitive", "isothes:broaderInstantial",
17
    "skos:narrower", "isothes:narrowerGeneric", "isothes:narrowerPartitive",
18
    "isothes:narrowerInstantial", "skos:related", "skos:altLabel",
19
    "skos:note", "skos:scopeNote", "skos:historyNote", "rdfs:comment",
20
    "dc11:source", "dc:source", "skosmos:memberOf", "skosmos:memberOfArray");
21
22
    public const ISO25964_PROPERTY_ORDER = array("rdf:type", "dc:isReplacedBy",
23
    // ISO 25964 allows placing all text fields (inc. SN and DEF) together
24
    // so we will do that, except for HN, which is clearly administrative
25
    "skos:note", "skos:scopeNote", "skos:definition", "rdfs:comment",
26
    "dc11:source", "dc:source", "skos:altLabel", "skos:broader",
27
    "isothes:broaderGeneric", "isothes:broaderPartitive",
28
    "isothes:broaderInstantial", "skos:narrower", "isothes:narrowerGeneric",
29
    "isothes:narrowerPartitive", "isothes:narrowerInstantial",
30
    "skos:related", "skos:historyNote", "skosmos:memberOf",
31
    "skosmos:memberOfArray");
32
33
    public function __construct(Model $model, EasyRdf\Resource $resource, array $globalPlugins = array())
34
    {
35
        parent::__construct($model, $resource);
36
        $this->globalPlugins = $globalPlugins;
37
        $this->setPropertyLabelOverrides();
38
        $pluginArray = $this->getPluginArray();
39
        $this->pluginRegister = new PluginRegister($pluginArray);
40
    }
41
42
    /**
43
     * Get an ordered array of plugin names with order configured in skosmos:vocabularyPlugins
44
     * @return array of plugin names
45
     */
46
    public function getPluginArray(): array
47
    {
48
        $this->setParameterizedPlugins();
49
        $pluginArray = array();
50
        $vocabularyPlugins = $this->resource->getResource('skosmos:vocabularyPlugins');
51
        if (!$vocabularyPlugins instanceof EasyRdf\Collection) {
52
            $vocabularyPlugins = $this->resource->all('skosmos:vocabularyPlugins');
53
        }
54
        if ($vocabularyPlugins) {
55
            foreach ($vocabularyPlugins as $plugin) {
56
                if ($plugin instanceof EasyRdf\Literal) {
57
                    $pluginArray[] = $plugin->getValue();
58
                } else {
59
                    $pluginArray[] = $plugin->getLiteral('skosmos:usePlugin')->getValue();
60
                }
61
            }
62
        }
63
        $pluginArray = array_merge($pluginArray, $this->globalPlugins);
64
65
        $paramPlugins = $this->resource->allResources('skosmos:useParamPlugin');
66
        if ($paramPlugins) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $paramPlugins of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
67
            foreach ($paramPlugins as $plugin) {
68
                $pluginArray[] = $plugin->getLiteral('skosmos:usePlugin')->getValue();
69
            }
70
        }
71
        $plugins = $this->resource->allLiterals('skosmos:usePlugin');
72
        if ($plugins) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $plugins of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
73
            foreach ($plugins as $pluginlit) {
74
                $pluginArray[] = $pluginlit->getValue();
75
            }
76
        }
77
        return array_values(array_unique($pluginArray));
78
    }
79
80
    /**
81
     * Sets array of parameterized plugins
82
     * @return void
83
     */
84
    private function setParameterizedPlugins(): void
85
    {
86
        $this->pluginParameters = array();
87
88
        $vocabularyPlugins = $this->resource->getResource('skosmos:vocabularyPlugins');
89
        if (!$vocabularyPlugins instanceof EasyRdf\Collection) {
90
            $vocabularyPlugins = $this->resource->all('skosmos:vocabularyPlugins');
91
        }
92
        if ($vocabularyPlugins) {
93
            foreach ($vocabularyPlugins as $plugin) {
94
                if ($plugin instanceof EasyRdf\Resource) {
95
                    $this->setPluginParameters($plugin);
96
                }
97
            }
98
        }
99
        $pluginResources = $this->resource->allResources('skosmos:useParamPlugin');
100
        if ($pluginResources) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $pluginResources of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
101
            foreach ($pluginResources as $pluginResource) {
102
                $this->setPluginParameters($pluginResource);
103
            }
104
        }
105
    }
106
107
    /**
108
     * Updates array of parameterized plugins adding parameter values
109
     * @param Easyrdf\Resource $pluginResource
110
     * @return void
111
     */
112
    private function setPluginParameters(Easyrdf\Resource $pluginResource): void
113
    {
114
        $pluginName = $pluginResource->getLiteral('skosmos:usePlugin')->getValue();
115
        $this->pluginParameters[$pluginName] = array();
116
117
        $pluginParams = $pluginResource->allResources('skosmos:parameters');
118
        foreach ($pluginParams as $parameter) {
119
120
            $paramLiterals = $parameter->allLiterals('schema:value');
121
            foreach ($paramLiterals as $paramLiteral) {
122
                $paramName = $parameter->getLiteral('schema:propertyID')->getValue();
123
                $paramValue = $paramLiteral->getValue();
124
                $paramLang = $paramLiteral->getLang();
125
                if ($paramLang) {
126
                    $paramName .= '_' . $paramLang;
127
                }
128
                $this->pluginParameters[$pluginName][$paramName] = $paramValue;
129
            }
130
        }
131
    }
132
133
    /**
134
     * Sets array of configured property label overrides
135
     *  @return void
136
     */
137
    private function setPropertyLabelOverrides(): void
138
    {
139
        $this->labelOverrides = array();
140
        $overrides = $this->resource->allResources('skosmos:propertyLabelOverride');
141
        if (!empty($overrides)) {
142
            foreach ($overrides as $override) {
143
                $this->setLabelOverride($override);
144
            }
145
        }
146
    }
147
148
    /**
149
     * Updates array of label overrides by adding a new override from the configuration file
150
     * @param Easyrdf\Resource $labelOverride
151
     * @return void
152
     */
153
    private function setLabelOverride(Easyrdf\Resource $override): void
154
    {
155
        $labelProperty = $override->getResource('skosmos:property');
156
        $labelPropUri = $labelProperty->shorten();
157
        if (empty($this->labelOverrides[$labelPropUri])) {
158
            $this->labelOverrides[$labelPropUri]  = array();
159
        }
160
        $newOverrides = array();
161
162
        $labels = $override->allLiterals('rdfs:label'); //property label overrides
163
        foreach ($labels as $label) {
164
            $newOverrides['label'][$label->getLang()] = $label->getValue();
165
        }
166
        $descriptions = $override->allLiterals('rdfs:comment'); //optionally override property label tooltips
167
        foreach ($descriptions as $description) {
168
            $newOverrides['description'][$description->getLang()] = $description->getValue();
169
        }
170
        $this->labelOverrides[$labelPropUri] = array_merge($newOverrides, $this->labelOverrides[$labelPropUri]);
171
    }
172
173
    /**
174
     * Get the SPARQL endpoint URL for this vocabulary
175
     *
176
     * @return string|null endpoint URL, or null if not set
177
     */
178
    public function getSparqlEndpoint()
179
    {
180
        $endpoint = $this->resource->get('void:sparqlEndpoint');
181
        if ($endpoint) {
182
            return $endpoint->getUri();
183
        }
184
        return null;
185
    }
186
187
    /**
188
     * Get the SPARQL graph URI for this vocabulary
189
     *
190
     * @return string|null graph URI, or null if not set
191
     */
192
    public function getSparqlGraph()
193
    {
194
        $graph = $this->resource->get('skosmos:sparqlGraph');
195
        if ($graph) {
196
            $graph = $graph->getUri();
197
        }
198
199
        return $graph;
200
    }
201
202
    /**
203
     * Get the SPARQL dialect for this vocabulary
204
     *
205
     * @return string|null dialect name
206
     */
207
    public function getSparqlDialect()
208
    {
209
        $dialect = $this->resource->get('skosmos:sparqlDialect');
210
        if ($dialect) {
211
            $dialect = $dialect->getValue();
212
        }
213
214
        return $dialect;
215
    }
216
217
    /**
218
     * Get the default language of this vocabulary
219
     * @return string default language, e.g. 'en'
220
     */
221
222
    public function getDefaultLanguage()
223
    {
224
        $deflang = $this->resource->getLiteral('skosmos:defaultLanguage');
225
        if ($deflang) {
0 ignored issues
show
introduced by
$deflang is of type EasyRdf\Literal, thus it always evaluated to true.
Loading history...
226
            return $deflang->getValue();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $deflang->getValue() also could return the type DateTime|boolean which is incompatible with the documented return type string.
Loading history...
227
        }
228
229
        $langs = $this->getLanguages();
230
        $deflang = reset($langs); // picking the first one from the list with reset since the keys are not numeric
231
        if (sizeof($langs) > 1) {
232
            trigger_error("Default language for vocabulary '" . $this->getShortName() . "' unknown, choosing '$deflang'.", E_USER_WARNING);
233
        }
234
235
        return $deflang;
236
    }
237
238
    /**
239
     * Returns a short name for a vocabulary if configured. If that has not been set
240
     * using vocabId as a fallback.
241
     * @return string
242
     */
243
    public function getShortName()
244
    {
245
        $shortname = $this->getLiteral('skosmos:shortName');
246
        if ($shortname) {
247
            return $shortname;
248
        }
249
250
        // if no shortname exists fall back to the id
251
        return $this->getId();
252
    }
253
254
    /**
255
     * Get the vocabulary feedback e-mail address and return it.
256
     *
257
     * @return string e-mail address or null if not defined.
258
     */
259
    public function getFeedbackRecipient()
260
    {
261
        $email = $this->resource->get('skosmos:feedbackRecipient');
262
        return isset($email) ? $email->getValue() : null;
263
    }
264
265
    /**
266
     * Returns the human readable vocabulary title.
267
     * @return string the title of the vocabulary
268
     */
269
    public function getTitle($lang = null)
270
    {
271
        return $this->getLiteral('dc:title', false, $lang);
0 ignored issues
show
Bug introduced by
false of type false is incompatible with the type string expected by parameter $default of BaseConfig::getLiteral(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

271
        return $this->getLiteral('dc:title', /** @scrutinizer ignore-type */ false, $lang);
Loading history...
272
    }
273
274
    /**
275
     * Returns the human readable vocabulary description.
276
     * @return string the description of the vocabulary
277
     */
278
    public function getDescription($lang = null)
279
    {
280
        return $this->getLiteral('dc:description', false, $lang);
0 ignored issues
show
Bug introduced by
false of type false is incompatible with the type string expected by parameter $default of BaseConfig::getLiteral(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

280
        return $this->getLiteral('dc:description', /** @scrutinizer ignore-type */ false, $lang);
Loading history...
281
    }
282
283
    /**
284
     * Returns the sorting strategy for notation codes set in the config.ttl
285
     * config: either "lexical", "natural", or null if sorting by notations is
286
     * disabled. A "true" value in the configuration file is interpreted as
287
     * "lexical".
288
     * @return string|bool
289
     */
290
    public function getSortByNotation(): ?string
291
    {
292
        $value = $this->getLiteral('skosmos:sortByNotation');
293
        if ($value == "lexical" || $value == "natural") {
294
            return $value;
295
        }
296
        // not a special value - interpret as boolean instead
297
        $bvalue = $this->getBoolean('skosmos:sortByNotation');
298
        // "true" is interpreted as "lexical"
299
        return $bvalue ? "lexical" : null;
300
    }
301
302
    /**
303
     * get the URLs from which the vocabulary data can be downloaded
304
     * @return array Array with MIME type as key, URL as value
305
     */
306
    public function getDataURLs()
307
    {
308
        $ret = array();
309
        $urls = $this->resource->allResources("void:dataDump");
310
        foreach ($urls as $url) {
311
            // first try dc:format and dc11:format
312
            $mimetypelit = $url->getLiteral('dc:format');
313
            if ($mimetypelit === null) {
314
                $mimetypelit = $url->getLiteral('dc11:format');
315
            }
316
317
            if ($mimetypelit !== null) {
318
                $mimetype = $mimetypelit->getValue();
319
            } else {
320
                $format = EasyRdf\Format::guessFormat(null, $url->getURI());
321
                if ($format === null) {
322
                    trigger_error("Could not guess format for <$url>.", E_USER_WARNING);
323
                    continue;
324
                }
325
                $mimetypes = array_keys($format->getMimeTypes());
326
                $mimetype = $mimetypes[0];
327
            }
328
329
            $langLit = $url->getLiteral('dc:language');
330
331
            if ($langLit != null) {
332
                //when the mimetype has language variants
333
                $dataUrlLang = $langLit->getValue();
334
335
                if (!isset($ret[$mimetype])) {
336
                    $arr = array();
337
                } else {
338
                    $arr = $ret[$mimetype];
339
                }
340
                $arr[$dataUrlLang] = $url->getURI();
341
                $ret[$mimetype] = $arr;
342
            } else {
343
                $ret[$mimetype] = $url->getURI();
344
            }
345
        }
346
        return $ret;
347
    }
348
349
    /**
350
     * Returns the main Concept Scheme URI of that Vocabulary,
351
     * or null if not set.
352
     * @return string concept scheme URI or null
353
     */
354
355
    public function getMainConceptSchemeURI()
356
    {
357
        $val = $this->resource->getResource("skosmos:mainConceptScheme");
358
        if ($val) {
0 ignored issues
show
introduced by
$val is of type EasyRdf\Resource, thus it always evaluated to true.
Loading history...
359
            return $val->getURI();
360
        }
361
362
        return null;
363
    }
364
365
    /**
366
     * Returns the class URI used for concept groups in this vocabulary,
367
     * or null if not set.
368
     * @return string group class URI or null
369
     */
370
371
    public function getGroupClassURI()
372
    {
373
        $val = $this->resource->getResource("skosmos:groupClass");
374
        if ($val) {
0 ignored issues
show
introduced by
$val is of type EasyRdf\Resource, thus it always evaluated to true.
Loading history...
375
            return $val->getURI();
376
        }
377
378
        return null;
379
    }
380
381
    /**
382
     * Returns the class URI used for thesaurus arrays in this vocabulary,
383
     * or null if not set.
384
     * @return string array class URI or null
385
     */
386
387
    public function getArrayClassURI()
388
    {
389
        $val = $this->resource->getResource("skosmos:arrayClass");
390
        if ($val) {
0 ignored issues
show
introduced by
$val is of type EasyRdf\Resource, thus it always evaluated to true.
Loading history...
391
            return $val->getURI();
392
        }
393
394
        return null;
395
    }
396
397
    /**
398
     * Returns custom properties displayed on the search page if configured.
399
     * @return array array class URI or null
400
     */
401
402
    public function getAdditionalSearchProperties()
403
    {
404
        $resources = $this->resource->allResources("skosmos:showPropertyInSearch");
405
        $ret = array();
406
        foreach ($resources as $res) {
407
            $prop = $res->getURI();
408
            if (EasyRdf\RdfNamespace::shorten($prop) !== null) { // shortening property labels if possible
409
                $prop = EasyRdf\RdfNamespace::shorten($prop);
410
            }
411
412
            $ret[] = $prop;
413
        }
414
        return $ret;
415
    }
416
417
    /**
418
     * Queries whether the property should be shown with all the label language variations.
419
     * @param string $property
420
     * @return boolean
421
     */
422
    public function hasMultiLingualProperty($property)
423
    {
424
        $resources = $this->resource->allResources("skosmos:hasMultiLingualProperty");
425
        foreach ($resources as $res) {
426
            $prop = $res->getURI();
427
            if (EasyRdf\RdfNamespace::shorten($prop) !== null) { // shortening property labels if possible
428
                $prop = EasyRdf\RdfNamespace::shorten($prop);
429
            }
430
431
            if ($prop === $property) {
432
                return true;
433
            }
434
435
        }
436
        return false;
437
    }
438
439
    /**
440
     * Returns a boolean value set in the config.ttl config.
441
     * @return boolean
442
     */
443
    public function getShowTopConcepts()
444
    {
445
        return $this->getBoolean('skosmos:showTopConcepts');
446
    }
447
448
    /**
449
     * Returns a boolean value set in the config.ttl config.
450
     * @return boolean
451
     */
452
    public function showConceptSchemesInHierarchy()
453
    {
454
        return $this->getBoolean('skosmos:conceptSchemesInHierarchy');
455
    }
456
457
    /**
458
     * Returns a boolean value set in the config.ttl config.
459
     * @return boolean defaults to true if fetching hasn't been explicitly denied.
460
     */
461
    public function getExternalResourcesLoading()
462
    {
463
        return $this->getBoolean('skosmos:loadExternalResources', true);
464
    }
465
466
    /**
467
     * Returns a boolean value set in the config.ttl config.
468
     * @return boolean
469
     */
470
    public function getShowLangCodes()
471
    {
472
        return $this->getBoolean('skosmos:explicitLanguageTags');
473
    }
474
475
    /**
476
     * Returns a boolean value set in the config.ttl config.
477
     * @return boolean
478
     */
479
    public function searchByNotation()
480
    {
481
        return $this->getBoolean('skosmos:searchByNotation');
482
    }
483
484
    /**
485
     * Returns skosmos:marcSourcecode value set in config.ttl.
486
     * @return string marcsource name
487
     */
488
    public function getMarcSourceCode($lang = null)
489
    {
490
        return $this->getLiteral('skosmos:marcSourceCode', false, $lang);
0 ignored issues
show
Bug introduced by
false of type false is incompatible with the type string expected by parameter $default of BaseConfig::getLiteral(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

490
        return $this->getLiteral('skosmos:marcSourceCode', /** @scrutinizer ignore-type */ false, $lang);
Loading history...
491
    }
492
493
    /**
494
     * Returns the boolean value of the skosmos:showNotationAsProperty setting.
495
     * @return boolean
496
     */
497
    public function getShowNotationAsProperty()
498
    {
499
        return $this->getBoolean('skosmos:showNotationAsProperty', true);
500
    }
501
502
    /**
503
     * Returns a boolean value set in the config.ttl config.
504
     * @return array array of concept class URIs (can be empty)
505
     */
506
    public function getIndexClasses()
507
    {
508
        return $this->getResources("skosmos:indexShowClass");
509
    }
510
511
    /**
512
     * Returns skosmos:externalProperty values set in the config.ttl config.
513
     * @return array array of external property URIs (can be empty)
514
     */
515
    public function getExtProperties()
516
    {
517
        return $this->getResources("skosmos:externalProperty");
518
    }
519
520
    /**
521
     * Get the languages supported by this vocabulary
522
     * @return array languages supported by this vocabulary (as language tag strings)
523
     */
524
    public function getLanguages()
525
    {
526
        $langs = $this->resource->allLiterals('skosmos:language');
527
        $ret = array();
528
        foreach ($langs as $lang) {
529
            $langlit = Punic\Language::getName($lang->getValue(), $this->getLang());
530
            $ret[$langlit] = $lang->getValue();
531
        }
532
        ksort($ret);
533
534
        return $ret;
535
    }
536
537
    /**
538
     * Returns the parameters of parameterized plugins
539
     * @return array of plugin parameters
540
     */
541
    public function getPluginParameters()
542
    {
543
        return $this->pluginParameters;
544
    }
545
546
    /**
547
     * Get the list of property label overrides
548
     * @return array of custom property labels
549
     */
550
    public function getPropertyLabelOverrides()
551
    {
552
        return $this->labelOverrides;
553
    }
554
555
    /**
556
     * Returns the vocabulary default sidebar view.
557
     * @return string name of the view
558
     */
559
    public function getDefaultSidebarView()
560
    {
561
        $defview = $this->resource->getLiteral('skosmos:defaultSidebarView');
562
        $sidebarViews = $this->getSidebarViews();
563
        if ($defview) {
0 ignored issues
show
introduced by
$defview is of type EasyRdf\Literal, thus it always evaluated to true.
Loading history...
564
            $value = $defview->getValue();
565
            if (in_array($value, $sidebarViews)) {
566
                return $value;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $value also could return the type DateTime|boolean which is incompatible with the documented return type string.
Loading history...
567
            } else {
568
                return $sidebarViews[0]; // if not in sidebarViews, displaying first provided view
569
            }
570
        }
571
572
        if (in_array('alphabetical', $sidebarViews)) {
573
            return 'alphabetical'; // if not defined, displaying alphabetical index
574
        } else {
575
            return $sidebarViews[0]; // if no alphabetical index, displaying first provided view
576
        }
577
    }
578
579
    /**
580
     * Returns the concept page default sidebar view.
581
     * @return string name of the view
582
     */
583
    public function getDefaultConceptSidebarView()
584
    {
585
        $defview = $this->resource->getLiteral('skosmos:defaultConceptSidebarView');
586
        $sidebarViews = $this->getSidebarViews();
587
        if ($defview) {
0 ignored issues
show
introduced by
$defview is of type EasyRdf\Literal, thus it always evaluated to true.
Loading history...
588
            $value = $defview->getValue();
589
            if (in_array($value, $sidebarViews)) {
590
                return $value;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $value also could return the type DateTime|boolean which is incompatible with the documented return type string.
Loading history...
591
            } else {
592
                return $sidebarViews[0]; // if not in sidebarViews, displaying first provided view
593
            }
594
        }
595
596
        if (in_array('hierarchy', $sidebarViews)) {
597
            return 'hierarchy'; // if not defined, displaying hierarchy
598
        } else {
599
            return $sidebarViews[0]; // if no hierarchy, displaying first provided view
600
        }
601
    }
602
603
    /**
604
     * Returns sidebar views used in this vocabulary
605
     * @return array of available views
606
     */
607
    public function getSidebarViews()
608
    {
609
        $views = $this->resource->getResource('skosmos:sidebarViews');
610
        if ($views) {
0 ignored issues
show
introduced by
$views is of type EasyRdf\Resource, thus it always evaluated to true.
Loading history...
611
            $viewsArray = array();
612
            foreach ($views as $view) {
613
                if (in_array($view, array('hierarchy', 'alphabetical', 'fullalphabetical', 'changes', 'groups'))) {
614
                    $viewsArray[] = $view->getValue();
615
                }
616
            }
617
            return $viewsArray;
618
        }
619
        return array('alphabetical', 'hierarchy', 'groups', 'changes'); // if not defined, using all views in default order
620
621
    }
622
623
    /**
624
     * Extracts the vocabulary id string from the baseuri of the vocabulary.
625
     * @return string identifier eg. 'mesh'.
626
     */
627
    public function getId()
628
    {
629
        $uriparts = explode("#", $this->resource->getURI());
630
        if (count($uriparts) != 1) {
631
            // hash namespace
632
            return $uriparts[1];
633
        }
634
635
        // slash namespace
636
        $uriparts = explode("/", $this->resource->getURI());
637
638
        return $uriparts[count($uriparts) - 1];
639
    }
640
641
    public function getShowStatistics()
642
    {
643
        return $this->getBoolean('skosmos:showStatistics', true);
644
    }
645
646
    public function getPluginRegister()
647
    {
648
        return $this->pluginRegister;
649
    }
650
651
    /**
652
     * Returns the property/properties used for visualizing concept hierarchies.
653
     * @return array array class URI or null
654
     */
655
656
    public function getHierarchyProperty()
657
    {
658
        $resources = $this->resource->allResources("skosmos:hierarchyProperty");
659
        $ret = array();
660
        foreach ($resources as $res) {
661
            $prop = $res->getURI();
662
            if (EasyRdf\RdfNamespace::shorten($prop) !== null) { // prefixing if possible
663
                $prop = EasyRdf\RdfNamespace::shorten($prop);
664
            }
665
666
            $ret[] = $prop;
667
        }
668
        return empty($ret) ? array('skos:broader') : $ret;
669
    }
670
671
    /**
672
     * Returns a boolean value set in the config.ttl config.
673
     * @return boolean
674
     */
675
    public function showNotation()
676
    {
677
        return $this->getBoolean('skosmos:showNotation', true);
678
    }
679
680
    /**
681
     * Returns the alphabetical list qualifier in this vocabulary,
682
     * or null if not set.
683
     * @return EasyRdf\Resource|null alphabetical list qualifier resource or null
684
     */
685
    public function getAlphabeticalListQualifier()
686
    {
687
        return $this->resource->getResource('skosmos:alphabeticalListQualifier');
688
    }
689
690
    /**
691
     * Returns a boolean value set in the config.ttl config.
692
     * @return boolean
693
     */
694
    public function getShowDeprecated()
695
    {
696
        return $this->getBoolean('skosmos:showDeprecated', false);
697
    }
698
699
    /**
700
     * Returns a boolean value set in the config.ttl config.
701
     * @return boolean
702
     */
703
    public function getShowDeprecatedChanges()
704
    {
705
        return $this->getBoolean('skosmos:showDeprecatedChanges', false);
706
    }
707
708
    /**
709
     * Returns the vocabulary dc:type value(s) with their labels and uris, if set in the vocabulary configuration.
710
     * @return array of objects or an empty array
711
     */
712
    public function getTypes($lang = null)
713
    {
714
        $resources = $this->resource->allResources("dc:type");
715
        $ret = array();
716
        foreach ($resources as $res) {
717
            $prop = $res->getURI();
718
            $label = $res->label($lang) ? $res->label($lang) : $res->label($this->getDefaultLanguage());
719
            $ret[] = array('uri' => $prop, 'prefLabel' =>  $label->getValue());
720
        }
721
        return $ret;
722
    }
723
724
    /**
725
     * Returns an array of fallback languages that is ordered by priority and
726
     * defined in the vocabulary configuration as a collection.
727
     * Additionally, the chosen content language is inserted with the highest priority
728
     * and the vocab default language is inserted with the lowest priority.
729
     * @param string $clang
730
     * @return array of language code strings
731
     */
732
    public function getLanguageOrder($clang)
733
    {
734
        if (array_key_exists($clang, $this->languageOrderCache)) {
735
            return $this->languageOrderCache[$clang];
736
        }
737
        $ret = array($clang);
738
        $fallbacks = !empty($this->resource->get('skosmos:fallbackLanguages')) ? $this->resource->get('skosmos:fallbackLanguages') : array();
739
        foreach ($fallbacks as $lang) {
740
            if (!in_array($lang, $ret)) {
741
                $ret[] = (string)$lang; // Literal to string conversion
742
            }
743
        }
744
        if (!in_array($this->getDefaultLanguage(), $ret)) {
745
            $ret[] = (string)$this->getDefaultLanguage();
746
        }
747
        foreach ($this->getLanguages() as $lang) {
748
            if (!in_array($lang, $ret)) {
749
                $ret[] = $lang;
750
            }
751
        }
752
        // store in cache so this doesn't have to be computed again
753
        $this->languageOrderCache[$clang] = $ret;
754
        return $ret;
755
    }
756
757
    /**
758
     * @return boolean
759
     */
760
    public function isUseModifiedDate()
761
    {
762
        return $this->getBoolean('skosmos:useModifiedDate', false);
763
    }
764
765
    /**
766
     * @return array
767
     */
768
    public function getPropertyOrder()
769
    {
770
        $order = $this->getResource()->getResource('skosmos:propertyOrder');
771
        if ($order === null) {
772
            return self::DEFAULT_PROPERTY_ORDER;
773
        }
774
775
        $short = EasyRdf\RdfNamespace::shorten($order);
776
        if ($short == 'skosmos:iso25964PropertyOrder') {
777
            return self::ISO25964_PROPERTY_ORDER;
778
        } elseif ($short == 'skosmos:defaultPropertyOrder') {
779
            return self::DEFAULT_PROPERTY_ORDER;
780
        }
781
782
        // check for custom order definition
783
        $orderList = $order->getResource('rdf:value');
784
        if ($orderList !== null && $orderList instanceof EasyRdf\Collection) {
785
            $ret = array();
786
            foreach ($orderList as $prop) {
787
                $short = $prop->shorten();
0 ignored issues
show
Bug introduced by
The method shorten() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

787
                /** @scrutinizer ignore-call */ 
788
                $short = $prop->shorten();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
788
                $ret[] = ($short !== null) ? $short : $prop->getURI();
789
            }
790
            return $ret;
791
        }
792
793
        trigger_error("Property order for vocabulary '{$this->getShortName()}' unknown, using default order", E_USER_WARNING);
794
        return self::DEFAULT_PROPERTY_ORDER;
795
    }
796
}
797