diff --git a/inmail.drush.inc b/inmail.drush.inc index 9932620..80434b1 100644 --- a/inmail.drush.inc +++ b/inmail.drush.inc @@ -70,6 +70,10 @@ function drush_inmail_process() { drush_set_error(dt('Deliverer "@deliverer_id" not found', ['@deliverer_id' => $deliverer_config_id])); return; } + if (!$deliverer->isAvailable()) { + drush_set_error(dt('Deliverer "@deliverer_id" is not available', ['@deliverer_id' => $deliverer_config_id])); + return; + } if (count($args) > 0) { $raws = array(); diff --git a/inmail.install b/inmail.install index 61a4396..aa33b32 100644 --- a/inmail.install +++ b/inmail.install @@ -10,38 +10,48 @@ function inmail_requirements($phase) { $requirements = []; if ($phase == 'runtime') { - $requirements += inmail_get_plugin_requirements(); + $requirements += inmail_get_requirements(); } return $requirements; } /** - * Returns plugin requirements for enabled instances. + * Returns plugin and instance requirements. * * @return array - * An array of plugin requirements. + * An array of plugin and instance requirements. */ -function inmail_get_plugin_requirements() { +function inmail_get_requirements() { /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ $entity_type_manager = \Drupal::entityTypeManager(); - $plugin_types = ['analyzer', 'deliverer', 'handler']; - $plugin_requirements = []; + $plugin_types = [ + 'analyzer' => \Drupal::service('plugin.manager.inmail.analyzer'), + 'deliverer' => \Drupal::service('plugin.manager.inmail.deliverer'), + 'handler' => \Drupal::service('plugin.manager.inmail.handler'), + ]; + $requirements = []; + + /** @var Drupal\Core\Plugin\DefaultPluginManager $plugin_manager */ + foreach ($plugin_types as $plugin_type => $plugin_manager) { + // Check plugin requirements for the current plugin type. + foreach ($plugin_manager->getDefinitions() as $plugin_id => $definition) { + $plugin_instance = $plugin_manager->createInstance($plugin_id); + $requirements[$plugin_type . '_plugin_' . $plugin_id] = $plugin_instance->checkPluginRequirements(); + } - foreach ($plugin_types as $plugin_type) { + // Check instance requirements. $enabled_instances = $entity_type_manager->getStorage("inmail_$plugin_type")->loadByProperties(['status' => TRUE]); /** @var \Drupal\inmail\Entity\PluginConfigEntity $enabled_instance */ foreach ($enabled_instances as $enabled_instance) { - if (!$enabled_instance->isAvailable()) { - $key = $plugin_type . '_' . $enabled_instance->getPluginId(); - if (!isset($plugin_requirements[$key])) { - $plugin_requirements[$key] = $enabled_instance->checkRequirements(); - } - } + $requirements[$plugin_type . '_config_' . $enabled_instance->id()] = $enabled_instance->checkInstanceRequirements(); } } - return $plugin_requirements; + // Filter plugins/instances with no requirements. + $requirements = array_filter($requirements); + + return $requirements; } /** diff --git a/inmail_demo/src/Form/PasteForm.php b/inmail_demo/src/Form/PasteForm.php index 26d3368..fe541c4 100644 --- a/inmail_demo/src/Form/PasteForm.php +++ b/inmail_demo/src/Form/PasteForm.php @@ -187,17 +187,20 @@ class PasteForm extends FormBase { } /** - * Loads and returns all deliverer configs using the Paste deliverer. + * Loads and returns all available deliverer configs using Paste deliverer. * * @return \Drupal\inmail\Entity\DelivererConfig[] - * All enabled Paste deliverer configs. + * All enabled and available Paste deliverer configs. */ protected function getDelivererConfigs() { $ids = $this->delivererStorage->getQuery() ->condition('plugin', 'paste') ->condition('status', TRUE) ->execute(); - return $this->delivererStorage->loadMultiple($ids); + $deliverers = $this->delivererStorage->loadMultiple($ids); + return array_filter($deliverers, function ($deliverer) { + return $deliverer->isAvailable(); + }); } /** diff --git a/src/Entity/PluginConfigEntity.php b/src/Entity/PluginConfigEntity.php index f704a3d..2ccb1fd 100644 --- a/src/Entity/PluginConfigEntity.php +++ b/src/Entity/PluginConfigEntity.php @@ -114,11 +114,25 @@ abstract class PluginConfigEntity extends ConfigEntityBase implements PluginRequ /** * {@inheritdoc} */ - public function checkRequirements() { + public function checkPluginRequirements() { $requirements = []; if ($plugin = $this->getPluginInstance()) { - return $plugin->checkRequirements(); + return $plugin->checkPluginRequirements(); + } + + return $requirements; + } + + /** + * {@inheritdoc} + */ + public function checkInstanceRequirements() { + // Add title. + $requirements['title'] = $this->label(); + + if ($plugin = $this->getPluginInstance()) { + $requirements += $plugin->checkInstanceRequirements(); } return $requirements; diff --git a/src/Form/DelivererListForm.php b/src/Form/DelivererListForm.php index ab84e80..ecde679 100644 --- a/src/Form/DelivererListForm.php +++ b/src/Form/DelivererListForm.php @@ -77,7 +77,7 @@ class DelivererListForm extends FormBase { // Get plugin instance. $deliverer = $this->delivererManager->createInstance($deliverer_config->getPluginId(), $deliverer_config->getConfiguration()); // Update plugin. - if ($deliverer instanceof FetcherInterface) { + if ($deliverer instanceof FetcherInterface && $deliverer->isAvailable()) { $deliverer->update(); $deliverer->setLastCheckedTime(REQUEST_TIME); $fetchers_count++; diff --git a/src/PluginBase.php b/src/PluginBase.php index a5914e3..5bdfa4e 100644 --- a/src/PluginBase.php +++ b/src/PluginBase.php @@ -12,7 +12,14 @@ abstract class PluginBase extends CorePluginBase implements PluginRequirementsIn /** * {@inheritdoc} */ - public function checkRequirements() { + public function checkPluginRequirements() { + return []; + } + + /** + * {@inheritdoc} + */ + public function checkInstanceRequirements() { return []; } diff --git a/src/PluginRequirementsInterface.php b/src/PluginRequirementsInterface.php index 052bcf4..114ead6 100644 --- a/src/PluginRequirementsInterface.php +++ b/src/PluginRequirementsInterface.php @@ -14,7 +14,16 @@ interface PluginRequirementsInterface { * Returns the structured verbose output if requirements are not met. * In case of no plugin requirements, an empty array is returned. */ - public function checkRequirements(); + public function checkPluginRequirements(); + + /** + * Checks requirements of the current configuration instance. + * + * @return array + * Returns the structured verbose output if requirements are not met. + * In case of no instance requirements, an empty array is returned. + */ + public function checkInstanceRequirements(); /** * Flag determining whether a plugin is available to be used in processing. diff --git a/tests/modules/inmail_test/src/Plugin/inmail/Analyzer/UnavailableAnalyzer.php b/tests/modules/inmail_test/src/Plugin/inmail/Analyzer/UnavailableAnalyzer.php index 9076853..9c275a0 100644 --- a/tests/modules/inmail_test/src/Plugin/inmail/Analyzer/UnavailableAnalyzer.php +++ b/tests/modules/inmail_test/src/Plugin/inmail/Analyzer/UnavailableAnalyzer.php @@ -32,7 +32,7 @@ class UnavailableAnalyzer extends AnalyzerBase { /** * {@inheritdoc} */ - public function checkRequirements() { + public function checkPluginRequirements() { return [ 'title' => $this->t('Unavailable Analyzer'), 'description' => $this->t('Unavailable Analyzer cannot be used.'), @@ -43,6 +43,16 @@ class UnavailableAnalyzer extends AnalyzerBase { /** * {@inheritdoc} */ + public function checkInstanceRequirements() { + return [ + 'description' => $this->t('Wrong instance configuration.'), + 'severity' => REQUIREMENT_ERROR, + ]; + } + + /** + * {@inheritdoc} + */ public function isAvailable() { return FALSE; } diff --git a/tests/src/Kernel/ProcessorTest.php b/tests/src/Kernel/ProcessorTest.php index f385fb1..0c4ea2e 100644 --- a/tests/src/Kernel/ProcessorTest.php +++ b/tests/src/Kernel/ProcessorTest.php @@ -63,7 +63,11 @@ EOF; AnalyzerConfig::create(['id' => 'test_analyzer', 'plugin' => 'test_analyzer'])->save(); // Add an unavailable analyzer. - $unavailable_analyzer = AnalyzerConfig::create(['id' => 'unavailable_analyzer', 'plugin' => 'unavailable_analyzer']); + $unavailable_analyzer = AnalyzerConfig::create([ + 'id' => 'unavailable_analyzer', + 'label' => 'Unavailable Analyzer', + 'plugin' => 'unavailable_analyzer', + ]); $unavailable_analyzer->save(); HandlerConfig::create(['id' => 'result_keeper', 'plugin' => 'result_keeper'])->save(); @@ -78,12 +82,17 @@ EOF; // Assert the account was switched on handler's level. $this->assertEquals('Demo User', ResultKeeperHandler::getAccountName()); - // Assert the requirements message. + // Assert the requirements messages. $this->assertEquals([ 'title' => t('Unavailable Analyzer'), 'description' => t('Unavailable Analyzer cannot be used.'), 'severity' => REQUIREMENT_ERROR, - ], $unavailable_analyzer->checkRequirements()); + ], $unavailable_analyzer->checkPluginRequirements()); + $this->assertEquals([ + 'title' => t('Unavailable Analyzer'), + 'description' => t('Wrong instance configuration.'), + 'severity' => REQUIREMENT_ERROR, + ], $unavailable_analyzer->checkInstanceRequirements()); $this->assertEquals(FALSE, $unavailable_analyzer->isAvailable()); // The body message has not changed. It implies UnavailableAnalyzer // did not run.