summaryrefslogtreecommitdiffstats
path: root/library/Icinga/Application/Libraries.php
blob: 8e4a79d4dc2f5179ebd89b4e515f2c6ba9695d58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
/* Icinga Web 2 | (c) 2020 Icinga GmbH | GPLv2+ */

namespace Icinga\Application;

use ArrayIterator;
use IteratorAggregate;
use Icinga\Application\Libraries\Library;
use Traversable;

class Libraries implements IteratorAggregate
{
    /** @var Library[] */
    protected $libraries = [];

    /**
     * Iterate over registered libraries
     *
     * @return ArrayIterator
     */
    public function getIterator(): Traversable
    {
        return new ArrayIterator($this->libraries);
    }

    /**
     * Register a library from the given path
     *
     * @param string $path
     *
     * @return Library The registered library
     */
    public function registerPath($path)
    {
        $library = new Library($path);
        $this->libraries[] = $library;

        return $library;
    }

    /**
     * Check if a library with the given name has been registered
     *
     * Passing a version constraint also verifies that the library's version matches.
     *
     * @param string $name
     * @param string $version
     *
     * @return bool
     */
    public function has($name, $version = null)
    {
        $library = $this->get($name);
        if ($library === null) {
            return false;
        } elseif ($version === null || $version === true) {
            return true;
        }

        $operator = '=';
        if (preg_match('/^([<>=]{1,2})\s*v?((?:[\d.]+)(?:\D+)?)$/', $version, $match)) {
            $operator = $match[1];
            $version = $match[2];
        }

        return version_compare($library->getVersion(), $version, $operator);
    }

    /**
     * Get a library by name
     *
     * @param string $name
     *
     * @return Library|null
     */
    public function get($name)
    {
        $candidate = null;
        foreach ($this->libraries as $library) {
            $libraryName = $library->getName();
            if ($libraryName === $name) {
                return $library;
            } elseif (strpos($libraryName, '/') !== false && explode('/', $libraryName)[1] === $name) {
                // Also return libs which only partially match
                $candidate = $library;
            }
        }

        return $candidate;
    }
}