--- /dev/null
+#ifndef __PLUGIN_INSTANCE_H__
+#define __PLUGIN_INSTANCE_H__
+
+#include <string>
+#include <memory>
+#include "AbstractSession.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace plugin
+{
+
+//
+// This class and its methods are NOT thread safe
+//
+class AbstractPluginInstance
+{
+public:
+ static const std::string paramPluginVersion;
+ static const std::string paramPluginName;
+
+public:
+ AbstractPluginInstance();
+ virtual ~AbstractPluginInstance();
+
+ virtual void fillSessionBase(PluginType type, const std::string &ver,
+ const std::string &pluginName);
+
+ virtual void fillSession() = 0;
+ virtual void setParam(const std::string &name) = 0;
+ virtual void setParam(const std::string &name, const std::string &value) = 0;
+ virtual void checkConfig() = 0;
+ virtual void *execute(void *data) = 0;
+
+ virtual void setSession(std::shared_ptr<config::AbstractSession> &session);
+ virtual std::shared_ptr<config::AbstractSession> getSession() const;
+
+private:
+ std::shared_ptr<config::AbstractSession> _session;
+};
+
+} // namespace plugin
+} // namespace contrib
+} // namespace nncc
+
+#endif // __PLUGIN_INSTANCE_H__
--- /dev/null
+#include <memory>
+#include "PluginInstance.h"
+#include "PluginException.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace plugin
+{
+
+const std::string AbstractPluginInstance::paramPluginVersion = "version";
+const std::string AbstractPluginInstance::paramPluginName = "plugin name";
+
+void AbstractPluginInstance::fillSessionBase(PluginType type, const std::string &ver,
+ const std::string &pluginName)
+{
+ getSession()->setPluginType(type);
+ getSession()->addInfo(paramPluginVersion, ver);
+ getSession()->addInfo(paramPluginName, pluginName);
+}
+
+void AbstractPluginInstance::setSession(std::shared_ptr<config::AbstractSession> &session)
+{
+ _session = session;
+}
+
+std::shared_ptr<config::AbstractSession> AbstractPluginInstance::getSession() const
+{
+ if (_session == nullptr)
+ throw nncc::contrib::PluginException("session not set!");
+ return _session;
+}
+
+AbstractPluginInstance::AbstractPluginInstance() : _session(nullptr) {}
+AbstractPluginInstance::~AbstractPluginInstance() {}
+
+} // namespace plugin
+} // namespace contrib
+} // namespace nncc