Code Duplication    Length = 95-101 lines in 2 locations

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

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

src/Source/SourceFactory.php 1 location

@@ 17-111 (lines=95) @@
14
 * @author Christoph Ziegenberg <[email protected]>
15
 * @link https://github.com/crossjoin/browscap
16
 */
17
class SourceFactory
18
{
19
    /**
20
     * @var array
21
     */
22
    protected static $defaultSourceClasses  = [
23
        '\Crossjoin\Browscap\Source\Ini\BrowscapOrg',
24
        '\Crossjoin\Browscap\Source\Ini\PhpSetting',
25
    ];
26
27
    /**
28
     * @var array|null
29
     */
30
    protected static $sourceClasses;
31
32
    /**
33
     * @return SourceInterface
34
     * @throws UnexpectedValueException
35
     */
36
    public static function getInstance() : SourceInterface
37
    {
38
        // Initialize adapter classes
39
        if (static::$sourceClasses === null) {
40
            self::setDefaultSourceClasses();
41
        }
42
        
43
        foreach (static::$sourceClasses as $className) {
44
            $instance = static::getInstanceByClassName($className);
45
            if ($instance !== null) {
46
                return $instance;
47
            }
48
        }
49
50
        return new None();
51
    }
52
53
    public static function setDefaultSourceClasses()
54
    {
55
        self::setSourceClasses(self::$defaultSourceClasses);
56
    }
57
58
    /**
59
     * @param array $fullyQualifiedClassNames
60
     *
61
     * @throws InvalidArgumentException
62
     */
63
    public static function setSourceClasses(array $fullyQualifiedClassNames)
64
    {
65
        $rememberClasses = self::$sourceClasses;
66
67
        self::$sourceClasses = [];
68
        foreach ($fullyQualifiedClassNames as $className) {
69
            if (is_string($className)) {
70
                self::$sourceClasses[] = $className;
71
            } else {
72
                // Reset to previous value on error
73
                self::$sourceClasses = $rememberClasses;
74
75
                throw new InvalidArgumentException(
76
                    "A value in the class name array is of type '" . gettype($className) . "'. String expected."
77
                );
78
            }
79
        }
80
    }
81
82
    /**
83
     * @param string $className
84
     *
85
     * @return SourceInterface|null
86
     * @throws UnexpectedValueException
87
     */
88
    protected static function getInstanceByClassName(string $className)
89
    {
90
        if (class_exists($className)) {
91
            $interface = '\Crossjoin\Browscap\Source\SourceFactoryInterface';
92
            $interfaces = class_implements($className);
93
            if (array_key_exists(ltrim($interface, '\\'), $interfaces)) {
94
                try {
95
                    return new $className();
96
                } catch (BrowscapException $e) {
97
                    // Ignore exception, because we just return NULL on failure
98
                }
99
            } else {
100
                throw new UnexpectedValueException(
101
                    "Class '$className' has to implement the interface '$interface'.",
102
                    1459069587
103
                );
104
            }
105
        } else {
106
            throw new UnexpectedValueException("Class '$className' doesn't exist.", 1459069588);
107
        }
108
109
        return null;
110
    }
111
}
112