--- /dev/null
+#ifndef __ABSTRACT_MODULE_H__
+#define __ABSTRACT_MODULE_H__
+
+#include <vector>
+
+#include "module/plugin/PluginData.h"
+#include "module/plugin/PluginProxy.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace module
+{
+
+class AbstractModule
+{
+public:
+ AbstractModule();
+ explicit AbstractModule(contrib::plugin::PluginType moduleType);
+ virtual ~AbstractModule();
+
+ void registerPlugin(std::shared_ptr<plugin::PluginProxy> &pl);
+ virtual void *execute(void *data);
+ virtual void configure(std::shared_ptr<config::DataList> conf);
+ contrib::plugin::PluginType getModuleType() const;
+
+ friend std::ostream &operator<<(std::ostream &st, const AbstractModule &m);
+
+private:
+ std::shared_ptr<plugin::PluginProxy> _activePlugin;
+ std::vector<std::shared_ptr<plugin::PluginProxy>> _plugins;
+ contrib::plugin::PluginType _moduleType;
+};
+
+} // namespace module
+} // namespace contrib
+} // namespace nncc
+
+#endif /* __ABSTRACT_MODULE_H__ */
--- /dev/null
+#include <iostream>
+#include <cstring>
+#include <ConfigException.h>
+
+#include "module/AbstractModule.h"
+#include "PluginInstance.h"
+#include "module/plugin/PluginSession.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace module
+{
+
+AbstractModule::AbstractModule() : _activePlugin(nullptr) {}
+
+AbstractModule::AbstractModule(contrib::plugin::PluginType moduleType)
+ : _activePlugin(nullptr), _moduleType(moduleType) {
+}
+
+AbstractModule::~AbstractModule() {}
+
+void AbstractModule::registerPlugin(std::shared_ptr<plugin::PluginProxy> &pl) { _plugins.push_back(pl); }
+
+void AbstractModule::configure(std::shared_ptr<config::DataList> conf) {
+ _activePlugin = nullptr;
+ for (auto &pl : _plugins) {
+ try {
+ auto pluginInstance = pl->getPluginInstance();
+ auto *session = dynamic_cast<config::PluginSession *>(pluginInstance->getSession().get());
+ auto resParams = config::DataList::intersection(*conf, session->getSupportedParams());
+
+ for (auto param : resParams->getElements()) {
+ if (param.second.hasValue())
+ pluginInstance->setParam(param.second.getName(), param.second.getValue());
+ else
+ pluginInstance->setParam(param.second.getName());
+ }
+
+ pluginInstance->checkConfig();
+ _activePlugin = pl;
+ break;
+ }
+ catch (nncc::contrib::ConfigException &e) {
+ std::cout << e.what() << std::endl;
+ }
+ catch (contrib::config::DataException &e) {
+ std::cout << e.what() << std::endl;
+ }
+ catch (PluginException &e) {
+ std::cout << e.what() << std::endl;
+ }
+
+ std::cout << "plugin cannot be configured (" << pl->getPluginName() << ")" << std::endl;
+ }
+
+ if (_activePlugin == nullptr)
+ throw ConfigException("Module <" + pluginTypeToStr(_moduleType) +
+ "> cannot be configured");
+}
+
+void *AbstractModule::execute(void *data) {
+ if (_activePlugin == nullptr)
+ throw ConfigException("Module <" + pluginTypeToStr(_moduleType) +
+ "> has not been configured!");
+ return _activePlugin->getPluginInstance()->execute(data);
+}
+
+contrib::plugin::PluginType AbstractModule::getModuleType() const { return _moduleType; }
+
+std::ostream &operator<<(std::ostream &st, const AbstractModule &m) {
+ st << "=== MODULE " << pluginTypeToStr(m._moduleType) << " ===" << std::endl;
+ st << "plugins {" << std::endl;
+ for (auto p : m._plugins)
+ st << " " << p << std::endl;
+ st << "}" << std::endl;
+ return st;
+}
+
+} // namespace module
+} // namespace contrib
+} // namespace nncc