Test Setup Failed
Branch master (6c5155)
by Delete
02:37
created

SourceFactory::getInstanceByClassName()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 23
Code Lines 15

Duplication

Lines 22
Ratio 95.65 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 22
loc 23
rs 8.7972
cc 4
eloc 15
nc 4
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Crossjoin\Browscap\Source;
5
6
use Crossjoin\Browscap\Exception\BrowscapException;
7
use Crossjoin\Browscap\Exception\InvalidArgumentException;
8
use Crossjoin\Browscap\Exception\UnexpectedValueException;
9
10
/**
11
 * Class SourceFactory
12
 *
13
 * @package Crossjoin\Browscap\Source
14
 * @author Christoph Ziegenberg <[email protected]>
15
 * @link https://github.com/crossjoin/browscap
16
 */
17 View Code Duplication
class SourceFactory
1 ignored issue
show
Duplication introduced by
This class seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
18
{
19
    const DEFAULT_CLASSES = [
20
        '\Crossjoin\Browscap\Source\Ini\BrowscapOrg',
21
        '\Crossjoin\Browscap\Source\Ini\PhpSetting',
22
    ];
23
24
    protected static $sourceClasses = self::DEFAULT_CLASSES;
25
26
    /**
27
     * @return SourceInterface
28
     * @throws UnexpectedValueException
29
     */
30
    public static function getInstance() : SourceInterface
31
    {
32
        foreach (static::$sourceClasses as $className) {
33
            $instance = static::getInstanceByClassName($className);
34
            if ($instance !== null) {
35
                return $instance;
36
            }
37
        }
38
39
        return new None();
40
    }
41
42
    /**
43
     * @param array $fullyQualifiedClassNames
44
     *
45
     * @throws InvalidArgumentException
46
     */
47
    public static function setSourceClasses(array $fullyQualifiedClassNames)
48
    {
49
        $rememberClasses = self::$sourceClasses;
50
51
        self::$sourceClasses = [];
52
        foreach ($fullyQualifiedClassNames as $className) {
53
            if (is_string($className)) {
54
                self::$sourceClasses[] = $className;
55
            } else {
56
                // Reset to previous value on error
57
                self::$sourceClasses = $rememberClasses;
58
59
                throw new InvalidArgumentException(
60
                    "A value in the class name array is of type '" . gettype($className) . "'. String expected."
61
                );
62
            }
63
        }
64
    }
65
66
    /**
67
     * @param string $className
68
     *
69
     * @return SourceInterface|null
70
     * @throws UnexpectedValueException
71
     */
72
    protected static function getInstanceByClassName(string $className)
73
    {
74
        if (class_exists($className)) {
75
            $interface = '\Crossjoin\Browscap\Source\SourceFactoryInterface';
76
            $interfaces = class_implements($className);
77
            if (array_key_exists(ltrim($interface, '\\'), $interfaces)) {
78
                try {
79
                    return new $className();
80
                } catch (BrowscapException $e) {
81
                    // Ignore exception, because we just return NULL on failure
82
                }
83
            } else {
84
                throw new UnexpectedValueException(
85
                    "Class '$className' has to implement the interface '$interface'.",
86
                    1459069587
87
                );
88
            }
89
        } else {
90
            throw new UnexpectedValueException("Class '$className' doesn't exist.", 1459069588);
91
        }
92
93
        return null;
94
    }
95
}
96