1 #ifndef CONNECTORFACTORY_H
2 #define CONNECTORFACTORY_H
4 #include "Kernel_global.h"
5 #include <QScopedPointer>
10 class ConnectorInterface;
11 class CatalogExplorer;
13 typedef std::function<Ilwis::CatalogExplorer*(const Ilwis::Resource &resource,const PrepareOptions& options)> createCatalogExplorer;
18 ConnectorFilter(quint64 types,
const QString& provider) : _objectTypes(types), _provider(provider) {}
24 ConnectorFormatSelector(
const QString& format,
const QString& provider=sUNDEF) : _format(format), _provider(provider) {}
62 void addCreator(quint64 objecttypes,
const QString &provider, ConnectorCreate);
68 void addCreator(
const QString& format,
const QString &provider, ConnectorCreate);
81 auto iter = _creatorsPerObject.find(filter);
82 if ( iter == _creatorsPerObject.end())
84 ConnectorCreate createConnector = iter.value();
85 if ( createConnector ) {
87 if ( cif && cif->canUse(resource))
88 return dynamic_cast<T *>(cif);
91 kernel()->
issues()->log(TR(ERR_COULDNT_CREATE_OBJECT_FOR_2).arg(
"Connector",resource.
name()));
96 template<
class T=ConnectorInterface> QList<T*> connectorsForResource(
const Resource& resource,
const QString &provider=
"*",
const PrepareOptions& options=
PrepareOptions())
const{
99 for(
auto key : _creatorsPerObject.keys()){
100 if ( filter == key) {
101 ConnectorCreate createConnector = _creatorsPerObject[key];
102 if ( createConnector ) {
104 if ( cif && cif->canUse(resource)){
105 T* conn =
dynamic_cast<T *
>(cif);
107 results.push_back(conn);
125 auto iter = _creatorsPerFormat.find(filter);
126 if ( iter == _creatorsPerFormat.end())
128 ConnectorCreate createConnector = iter.value();
129 if ( createConnector ) {
133 return dynamic_cast<T *
>(cif);
138 kernel()->
issues()->log(TR(ERR_COULDNT_CREATE_OBJECT_FOR_2).arg(
"Connector",resource.
name()));
142 template<
class T=ConnectorInterface> T *createContainerConnector(
const Resource& resource,
const QString &provider=sUNDEF,
const PrepareOptions& options=
PrepareOptions())
const{
143 for(
auto iter=_creatorsPerObject.begin(); iter != _creatorsPerObject.end(); ++iter){
144 if ( !hasType(iter.key()._objectTypes, resource.
ilwisType()))
146 ConnectorCreate createConnector = iter.value();
147 if ( createConnector && ( iter.key()._provider == provider || provider == sUNDEF)) {
149 if ( cif && cif->canUse(resource))
150 return dynamic_cast<T *>(cif);
154 kernel()->
issues()->log(TR(ERR_COULDNT_CREATE_OBJECT_FOR_2).arg(
"Connector",resource.
name()));
159 std::vector<CatalogExplorer*> explorersForResource(
const Resource& resource,
const QString &provider=sUNDEF,
const PrepareOptions& options=PrepareOptions())
const;
161 static std::nullptr_t registerCatalogExplorer(createCatalogExplorer func);
164 QHash<ConnectorFilter, ConnectorCreate > _creatorsPerObject;
165 QHash<ConnectorFormatSelector, ConnectorCreate > _creatorsPerFormat;
166 static std::vector<createCatalogExplorer> _explorers;
171 #endif // CONNECTORFACTORY_H