chg: [requestProcessor] Improved processor collection for local tools processor

pull/59/head
mokaddem 2021-06-12 12:09:54 +02:00
parent 274caff4c8
commit 285061c4c6
1 changed files with 70 additions and 9 deletions

View File

@ -4,6 +4,13 @@ namespace App\Model\Table;
use App\Model\Table\AppTable; use App\Model\Table\AppTable;
use Cake\Filesystem\Folder; use Cake\Filesystem\Folder;
use Cake\Http\Exception\MethodNotAllowedException;
use Cake\Core\Exception\Exception;
class MissingRequestProcessorException extends Exception
{
protected $_defaultCode = 404;
}
class RequestProcessorTable extends AppTable class RequestProcessorTable extends AppTable
{ {
@ -42,7 +49,19 @@ class RequestProcessorTable extends AppTable
throw new \Exception(__('Processor {0}.{1} not found', $scope, $action)); throw new \Exception(__('Processor {0}.{1} not found', $scope, $action));
} }
} }
throw new \Exception(__('Processor not found'), 1); throw new MissingRequestProcessorException(__('Processor not found'));
}
public function getLocalToolProcessor($action, $toolName)
{
$scope = "LocalTool";
$specificScope = "{$toolName}LocalTool";
try { // try to get specific processor for module name or fall back to generic local tool processor
$processor = $this->getProcessor($specificScope, $action);
} catch (MissingRequestProcessorException $e) {
$processor = $this->getProcessor($scope, $action);
}
return $processor;
} }
public function listProcessors($scope=null) public function listProcessors($scope=null)
@ -53,7 +72,7 @@ class RequestProcessorTable extends AppTable
if (isset($this->requestProcessors[$scope])) { if (isset($this->requestProcessors[$scope])) {
return $this->requestProcessors[$scope]; return $this->requestProcessors[$scope];
} else { } else {
throw new \Exception(__('Processors for {0} not found', $scope)); throw new MissingRequestProcessorException(__('Processors for {0} not found', $scope));
} }
} }
} }
@ -69,7 +88,7 @@ class RequestProcessorTable extends AppTable
$processorMainClassName = str_replace('.php', '', $processorFile); $processorMainClassName = str_replace('.php', '', $processorFile);
$processorMainClassNameShort = str_replace('RequestProcessor.php', '', $processorFile); $processorMainClassNameShort = str_replace('RequestProcessor.php', '', $processorFile);
$processorMainClass = $this->getProcessorClass($processorDir->pwd() . DS . $processorFile, $processorMainClassName); $processorMainClass = $this->getProcessorClass($processorDir->pwd() . DS . $processorFile, $processorMainClassName);
if ($processorMainClass !== false) { if (is_object($processorMainClass)) {
$this->requestProcessors[$processorMainClassNameShort] = $processorMainClass; $this->requestProcessors[$processorMainClassNameShort] = $processorMainClass;
foreach ($this->requestProcessors[$processorMainClassNameShort]->getRegisteredActions() as $registeredAction) { foreach ($this->requestProcessors[$processorMainClassNameShort]->getRegisteredActions() as $registeredAction) {
$scope = $this->requestProcessors[$processorMainClassNameShort]->getScope(); $scope = $this->requestProcessors[$processorMainClassNameShort]->getScope();
@ -79,17 +98,59 @@ class RequestProcessorTable extends AppTable
$this->requestProcessors[$processorMainClassNameShort]->{$registeredAction}->enabled = false; $this->requestProcessors[$processorMainClassNameShort]->{$registeredAction}->enabled = false;
} }
} }
} else {
$this->requestProcessors[$processorMainClassNameShort] = new \stdClass();
$this->requestProcessors[$processorMainClassNameShort]->{$registeredAction} = new \stdClass();
$this->requestProcessors[$processorMainClassNameShort]->{$registeredAction}->action = "N/A";
$this->requestProcessors[$processorMainClassNameShort]->{$registeredAction}->enabled = false;
$this->requestProcessors[$processorMainClassNameShort]->{$registeredAction}->error = $processorMainClass;
} }
} }
} }
/**
* getProcessorClass
*
* @param string $filePath
* @param string $processorMainClassName
* @return object|string Object loading success, string containing the error if failure
*/
private function getProcessorClass($filePath, $processorMainClassName) private function getProcessorClass($filePath, $processorMainClassName)
{ {
require_once($filePath); try {
$reflection = new \ReflectionClass($processorMainClassName); require_once($filePath);
$processorMainClass = $reflection->newInstance(true); try {
if ($processorMainClass->checkLoading() === 'Assimilation successful!') { $reflection = new \ReflectionClass($processorMainClassName);
return $processorMainClass; } catch (\ReflectionException $e) {
return $e->getMessage();
}
$processorMainClass = $reflection->newInstance(true);
if ($processorMainClass->checkLoading() === 'Assimilation successful!') {
return $processorMainClass;
}
} catch (Exception $e) {
return $e->getMessage();
} }
} }
/**
* createInboxEntry
*
* @param Object|Array $processor can either be the processor object or an array containing data to fetch it
* @param Array $data
* @return Array
*/
public function createInboxEntry($processor, $data)
{
if (!is_object($processor) && !is_array($processor)) {
throw new MethodNotAllowedException(__("Invalid processor passed"));
}
if (is_array($processor)) {
if (empty($processor['scope']) || empty($processor['action'])) {
throw new MethodNotAllowedException(__("Invalid data passed. Missing either `scope` or `action`"));
}
$processor = $this->getProcessor('User', 'Registration');
}
return $processor->create($data);
}
} }