@@ 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 |
@@ 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 |