Code Duplication    Length = 77-83 lines in 2 locations

src/Parser/Sqlite/Adapter/AdapterFactory.php 1 location

@@ 18-100 (lines=83) @@
15
 * @author Christoph Ziegenberg <[email protected]>
16
 * @link https://github.com/crossjoin/browscap
17
 */
18
class AdapterFactory
19
{
20
    const DEFAULT_CLASSES = [
21
        '\Crossjoin\Browscap\Parser\Sqlite\Adapter\Pdo',
22
        '\Crossjoin\Browscap\Parser\Sqlite\Adapter\Sqlite3',
23
    ];
24
25
    protected static $adapterClasses = self::DEFAULT_CLASSES;
26
27
    /**
28
     * @param string $fileName
29
     *
30
     * @return AdapterInterface
31
     * @throws ParserConditionNotSatisfiedException
32
     * @throws UnexpectedValueException
33
     */
34
    public static function getInstance(string $fileName) : AdapterInterface
35
    {
36
        foreach (static::$adapterClasses as $className) {
37
            $instance = static::getInstanceByClassName($className, $fileName);
38
            if ($instance !== null) {
39
                return $instance;
40
            }
41
        }
42
43
        throw new ParserConditionNotSatisfiedException(
44
            "No Sqlite extension found. Either 'pdo_sqlite' or 'sqlite3' extension required."
45
        );
46
    }
47
48
    /**
49
     * @param array $fullyQualifiedClassNames
50
     *
51
     * @throws InvalidArgumentException
52
     */
53
    public static function setAdapterClasses(array $fullyQualifiedClassNames)
54
    {
55
        $rememberClasses = self::$adapterClasses;
56
57
        self::$adapterClasses = [];
58
        foreach ($fullyQualifiedClassNames as $className) {
59
            if (is_string($className)) {
60
                self::$adapterClasses[] = $className;
61
            } else {
62
                // Reset to previous value on error
63
                self::$adapterClasses = $rememberClasses;
64
65
                throw new InvalidArgumentException(
66
                    "A value in the class name array is of type '" . gettype($className) . "'. String expected."
67
                );
68
            }
69
        }
70
    }
71
72
    /**
73
     * @param string $className
74
     * @param string $fileName
75
     *
76
     * @return AdapterInterface|null
77
     * @throws UnexpectedValueException
78
     */
79
    protected static function getInstanceByClassName(string $className, string $fileName)
80
    {
81
        if (class_exists($className)) {
82
            $interface = '\Crossjoin\Browscap\Parser\Sqlite\Adapter\AdapterFactoryInterface';
83
            $interfaces = class_implements($className);
84
            if (array_key_exists(ltrim($interface, '\\'), $interfaces)) {
85
                try {
86
                    return new $className($fileName);
87
                } catch (BrowscapException $e) {
88
                    // Ignore exception, because we just return NULL on failure
89
                }
90
            } else {
91
                throw new UnexpectedValueException(
92
                    "Class '$className' has to implement the interface '$interface'.",
93
                    1459000689
94
                );
95
            }
96
        } else {
97
            throw new UnexpectedValueException("Class '$className' doesn't exist.", 1459000690);
98
        }
99
100
        return null;
101
    }
102
}
103

src/Source/SourceFactory.php 1 location

@@ 17-93 (lines=77) @@
14
 * @author Christoph Ziegenberg <[email protected]>
15
 * @link https://github.com/crossjoin/browscap
16
 */
17
class SourceFactory
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