diff options
Diffstat (limited to 'lib/BridgeFactory.php')
-rw-r--r-- | lib/BridgeFactory.php | 92 |
1 files changed, 30 insertions, 62 deletions
diff --git a/lib/BridgeFactory.php b/lib/BridgeFactory.php index 6bd832bf..db2c394a 100644 --- a/lib/BridgeFactory.php +++ b/lib/BridgeFactory.php @@ -2,101 +2,69 @@ final class BridgeFactory { - /** @var array<class-string<BridgeInterface>> */ private $bridgeClassNames = []; - - /** @var array<class-string<BridgeInterface>> */ - private $whitelist = []; + private $enabledBridges = []; public function __construct() { - // create names + // Create all possible bridge class names from fs foreach (scandir(__DIR__ . '/../bridges/') as $file) { if (preg_match('/^([^.]+Bridge)\.php$/U', $file, $m)) { $this->bridgeClassNames[] = $m[1]; } } - // create whitelist - if (file_exists(WHITELIST)) { - $contents = trim(file_get_contents(WHITELIST)); - } elseif (file_exists(WHITELIST_DEFAULT)) { - $contents = trim(file_get_contents(WHITELIST_DEFAULT)); - } else { - $contents = ''; + $enabledBridges = Configuration::getConfig('system', 'enabled_bridges'); + if ($enabledBridges === null) { + throw new \Exception('No bridges are enabled... wtf?'); } - - if ($contents === '*') { - // Whitelist all bridges - $this->whitelist = $this->getBridgeClassNames(); - } else { - foreach (explode("\n", $contents) as $bridgeName) { - $bridgeClassName = $this->sanitizeBridgeName($bridgeName); - if ($bridgeClassName !== null) { - $this->whitelist[] = $bridgeClassName; - } + foreach ($enabledBridges as $enabledBridge) { + if ($enabledBridge === '*') { + $this->enabledBridges = $this->bridgeClassNames; + break; } + $this->enabledBridges[] = $this->createBridgeClassName($enabledBridge); } } - /** - * @param class-string<BridgeInterface> $name - */ public function create(string $name): BridgeInterface { return new $name(); } - /** - * @return array<class-string<BridgeInterface>> - */ - public function getBridgeClassNames(): array + public function isEnabled(string $bridgeName): bool { - return $this->bridgeClassNames; + return in_array($bridgeName, $this->enabledBridges); } - /** - * @param class-string<BridgeInterface>|null $name - */ - public function isWhitelisted(string $name): bool + public function createBridgeClassName(string $bridgeName): ?string { - return in_array($name, $this->whitelist); - } + $name = self::normalizeBridgeName($bridgeName); + $namesLoweredCase = array_map('strtolower', $this->bridgeClassNames); + $nameLoweredCase = strtolower($name); - /** - * Tries to turn a potentially human produced bridge name into a class name. - * - * @param mixed $name - * @return class-string<BridgeInterface>|null - */ - public function sanitizeBridgeName($name): ?string - { - if (!is_string($name)) { - return null; + if (! in_array($nameLoweredCase, $namesLoweredCase)) { + throw new \Exception(sprintf('Bridge name invalid: %s', $bridgeName)); } - // Trim trailing '.php' if exists + $index = array_search($nameLoweredCase, $namesLoweredCase); + + return $this->bridgeClassNames[$index]; + } + + public static function normalizeBridgeName(string $name) + { if (preg_match('/(.+)(?:\.php)/', $name, $matches)) { $name = $matches[1]; } - - // Append 'Bridge' suffix if not present. if (!preg_match('/(Bridge)$/i', $name)) { $name = sprintf('%sBridge', $name); } + return $name; + } - // Improve performance for correctly written bridge names - if (in_array($name, $this->getBridgeClassNames())) { - $index = array_search($name, $this->getBridgeClassNames()); - return $this->getBridgeClassNames()[$index]; - } - - // The name is valid if a corresponding bridge file is found on disk - if (in_array(strtolower($name), array_map('strtolower', $this->getBridgeClassNames()))) { - $index = array_search(strtolower($name), array_map('strtolower', $this->getBridgeClassNames())); - return $this->getBridgeClassNames()[$index]; - } - - return null; + public function getBridgeClassNames(): array + { + return $this->bridgeClassNames; } } |