From aa5da6d4e47d0bc7d14e7abbf43029d451bbbc37 Mon Sep 17 00:00:00 2001
From: Stein Magne Bjorklund <steinmb@smbjorklund.com>
Date: Mon, 20 Sep 2021 13:51:48 +0200
Subject: [PATCH] Create module loader

---
 classes/LoadModules.php           | 72 +++++++++++++++++++++++++++++++
 classes/modules/UnknownModule.php | 23 ++++++++++
 index.php                         | 19 ++++----
 3 files changed, 106 insertions(+), 8 deletions(-)
 create mode 100644 classes/LoadModules.php
 create mode 100644 classes/modules/UnknownModule.php

diff --git a/classes/LoadModules.php b/classes/LoadModules.php
new file mode 100644
index 00000000..b15ccbd0
--- /dev/null
+++ b/classes/LoadModules.php
@@ -0,0 +1,72 @@
+<?php declare(strict_types=1);
+
+namespace uib\ub\loadspeakr;
+
+use uib\ub\loadspeakr\modules\ModuleInterface;
+use uib\ub\loadspeakr\modules\UnknownModule;
+
+final class LoadModules
+{
+    private array $conf;
+
+    public function __construct($conf)
+    {
+        $this->conf = $conf;
+    }
+
+  public function loadModule(string $uri): ModuleInterface
+  {
+      $className =  $this->loadClass($uri);
+      $unknown = new UnknownModule();
+
+      switch ($uri) {
+          case 'admin':
+              return new $className();
+          case 'redirect':
+              return new $className();
+          case 'service':
+              return new $className();
+          case 'session':
+              return new $className();
+          case 'sparqlfilter':
+              return new $className();
+          case 'type':
+              return new $className();
+          case 'uri':
+              return new $className();
+          case 'export':
+              return new $className();
+          case 'static':
+              return new $className();
+          case 'default':
+              break;
+      }
+
+      return $unknown;
+  }
+
+    private function loadClass($module): string
+    {
+        if (!$this->moduleAvailable($module)) {
+            HTTPStatus::send500('Module: ' . $module . ' not found.');
+        }
+
+        $className = ucfirst($module) . 'Module';
+
+        if (file_exists(__DIR__ . '/modules/' . $className . '.php')) {
+            return __NAMESPACE__ . '\\modules\\' . $className;
+        }
+
+        return '';
+    }
+
+    private function moduleAvailable(string $module): bool
+    {
+        if (!in_array($module, $this->conf['modules']['available'], true)) {
+            return false;
+        }
+
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/classes/modules/UnknownModule.php b/classes/modules/UnknownModule.php
new file mode 100644
index 00000000..48f45017
--- /dev/null
+++ b/classes/modules/UnknownModule.php
@@ -0,0 +1,23 @@
+<?php declare(strict_types=1);
+
+namespace uib\ub\loadspeakr\modules;
+
+use uib\ub\loadspeakr\HTTPStatus;
+
+/**
+ * Null result Loadspkr module.
+ *
+ * Used when unknown module is requested.
+ */
+final class UnknownModule implements ModuleInterface
+{
+
+    public function match($uri): void
+    {
+        HTTPStatus::send404($uri);
+    }
+
+    public function execute($params): void
+    {
+    }
+}
diff --git a/index.php b/index.php
index bf2a12d1..abc16855 100644
--- a/index.php
+++ b/index.php
@@ -4,6 +4,7 @@ use uib\ub\loadspeakr\Endpoint;
 use uib\ub\loadspeakr\Exporter;
 use uib\ub\loadspeakr\HTTPStatus;
 use uib\ub\loadspeakr\Importer;
+use uib\ub\loadspeakr\LoadModules;
 use uib\ub\loadspeakr\Logging;
 use uib\ub\loadspeakr\Utils;
 
@@ -65,22 +66,24 @@ if ($uri === $conf['basedir']) {
 $localUri = $conf['basedir'] . $_GET['q'];
 $uri = Utils::getMirroredUri($localUri);
 
-// Load Loadspeakr modules.
-foreach ($conf['modules']['available'] as $i) {
-    $className = ucfirst($i) . 'Module';
-    $currentModule = $conf['modules']['directory'] . $className . '.php';
-    $namespacedClassName = 'uib\ub\loadspeakr\modules\\' . $className;
-    $module = new $namespacedClassName();
+/**
+ * Load Loadspeakr modules.
+ */
+foreach ($conf['modules']['available'] as $loadspkrModule) {
+    $loader = new LoadModules($conf);
+    $module = $loader->loadModule($loadspkrModule);
     $matching = $module->match($uri);
 
-    if ($matching !== false) {
+    if ($matching) {
         $module->execute($matching);
-
         if ($conf['logfile'] !== null) {
             fwrite($conf['logfile'], "]}");
             fclose($conf['logfile']);
         }
 
+        /**
+         * Only run first Loadspeakr modules that matches.
+         */
         exit(0);
     }
 }
-- 
GitLab