diff options
Diffstat (limited to 'library/Director/Hook/ImportSourceHook.php')
-rw-r--r-- | library/Director/Hook/ImportSourceHook.php | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/library/Director/Hook/ImportSourceHook.php b/library/Director/Hook/ImportSourceHook.php new file mode 100644 index 0000000..dba1c87 --- /dev/null +++ b/library/Director/Hook/ImportSourceHook.php @@ -0,0 +1,136 @@ +<?php + +namespace Icinga\Module\Director\Hook; + +use Icinga\Module\Director\Objects\ImportSource; +use Icinga\Module\Director\Web\Form\QuickForm; +use Icinga\Module\Director\Db; +use Icinga\Exception\ConfigurationError; + +abstract class ImportSourceHook +{ + protected $settings = []; + + public function getName() + { + $parts = explode('\\', get_class($this)); + $class = preg_replace('/ImportSource/', '', array_pop($parts)); + + if (array_shift($parts) === 'Icinga' && array_shift($parts) === 'Module') { + $module = array_shift($parts); + if ($module !== 'Director') { + if ($class === '') { + return sprintf('%s module', $module); + } + return sprintf('%s (%s)', $class, $module); + } + } + + return $class; + } + + public static function forImportSource(ImportSource $source) + { + $db = $source->getDb(); + $settings = $db->fetchPairs( + $db->select()->from( + 'import_source_setting', + ['setting_name', 'setting_value'] + )->where('source_id = ?', $source->get('id')) + ); + + $className = $source->get('provider_class'); + if (! class_exists($className)) { + throw new ConfigurationError( + 'Cannot load import provider class %s', + $className + ); + } + + /** @var ImportSourceHook $obj */ + $obj = new $className; + $obj->setSettings($settings); + return $obj; + } + + public static function loadByName($name, Db $db) + { + $db = $db->getDbAdapter(); + $source = $db->fetchRow( + $db->select()->from( + 'import_source', + array('id', 'provider_class') + )->where('source_name = ?', $name) + ); + + $settings = $db->fetchPairs( + $db->select()->from( + 'import_source_setting', + array('setting_name', 'setting_value') + )->where('source_id = ?', $source->id) + ); + + if (! class_exists($source->provider_class)) { + throw new ConfigurationError( + 'Cannot load import provider class %s', + $source->provider_class + ); + } + /** @var ImportSourceHook $obj */ + $obj = new $source->provider_class; + $obj->setSettings($settings); + + return $obj; + } + + public function setSettings($settings) + { + $this->settings = $settings; + return $this; + } + + public function getSetting($name, $default = null) + { + if (array_key_exists($name, $this->settings)) { + return $this->settings[$name]; + } else { + return $default; + } + } + + /** + * Returns an array containing importable objects + * + * @return array + */ + abstract public function fetchData(); + + /** + * Returns a list of all available columns + * + * @return array + */ + abstract public function listColumns(); + + /** + * Override this method in case you want to suggest a default + * key column + * + * @return string|null Default key column + */ + public static function getDefaultKeyColumnName() + { + return null; + } + + /** + * Override this method if you want to extend the settings form + * + * @param QuickForm $form QuickForm that should be extended + * @return QuickForm + */ + public static function addSettingsFormFields(QuickForm $form) + { + return $form; + } +} |