33 QString makeServiceKey(
const QString &name,
const QString &version )
35 return QString(
"%1_%2" ).arg( name, version );
45 bool isVersionGreater(
const QString &v1,
const QString &v2 )
47 QStringList l1 = v1.split(
'.' );
48 QStringList l2 = v2.split(
'.' );
49 QStringList::iterator it1 = l1.begin();
50 QStringList::iterator it2 = l2.begin();
52 while ( it1 != l1.end() && it2 != l2.end() )
57 int i1 = it1->toInt( &isint );
60 int i2 = it2->toInt( &isint );
61 if ( isint && i1 != i2 )
95 VersionTable::const_iterator v = mServiceVersions.constFind( name );
96 if ( v != mServiceVersions.constEnd() )
98 key = version.isEmpty() ? v->second : makeServiceKey( name, version );
99 ServiceTable::const_iterator it = mServices.constFind( key );
100 if ( it != mServices.constEnd() )
108 service = mServices[v->second].get();
120 QString name = service->
name();
121 QString version = service->
version();
124 QString key = makeServiceKey( name, version );
125 if ( mServices.constFind( key ) != mServices.constEnd() )
132 mServices.insert( key, std::shared_ptr<QgsService>( service ) );
139 VersionTable::const_iterator v = mServiceVersions.constFind( name );
140 if ( v == mServiceVersions.constEnd() )
143 mServiceVersions.insert( name, VersionTable::mapped_type( version, key ) );
167 VersionTable::const_iterator v = mApiVersions.constFind( name );
168 if ( v != mApiVersions.constEnd() )
170 if ( version.isEmpty() )
173 ApiTable::iterator it = mApis.begin();
174 while ( it != mApis.end() )
176 if ( ( *it )->name() == name )
179 it = mApis.erase( it );
188 mApiVersions.remove( name );
192 const QString key = makeServiceKey( name, version );
193 ApiTable::iterator found = mApis.find( key );
194 if ( found != mApis.end() )
197 mApis.erase( found );
204 std::function < void ( const ApiTable::mapped_type & ) >
205 findGreaterVersion = [name, &maxVer](
const ApiTable::mapped_type & api )
207 if ( api->name() == name &&
208 ( maxVer.isEmpty() || isVersionGreater( api->version(), maxVer ) ) )
209 maxVer = api->version();
212 mApiVersions.remove( name );
214 std::for_each( mApis.constBegin(), mApis.constEnd(), findGreaterVersion );
215 if ( !maxVer.isEmpty() )
218 const QString key = makeServiceKey( name, maxVer );
219 mApiVersions.insert( name, VersionTable::mapped_type( version, key ) );
229 for (
const auto &api : mApis )
232 if ( api->accept( request.
url() ) )
234 Q_ASSERT( !api->name().isEmpty() );
248 VersionTable::const_iterator v = mApiVersions.constFind( name );
249 if ( v != mApiVersions.constEnd() )
251 key = version.isEmpty() ? v->second : makeServiceKey( name, version );
252 ApiTable::const_iterator it = mApis.constFind( key );
253 if ( it != mApis.constEnd() )
261 api = mApis[v->second].get();
275 VersionTable::const_iterator v = mServiceVersions.constFind( name );
276 if ( v != mServiceVersions.constEnd() )
278 if ( version.isEmpty() )
281 ServiceTable::iterator it = mServices.begin();
282 while ( it != mServices.end() )
284 if ( ( *it )->name() == name )
287 it = mServices.erase( it );
296 mServiceVersions.remove( name );
300 QString key = makeServiceKey( name, version );
301 ServiceTable::iterator found = mServices.find( key );
302 if ( found != mServices.end() )
305 mServices.erase( found );
312 std::function < void ( const ServiceTable::mapped_type & ) >
313 findGreaterVersion = [name, &maxVer](
const ServiceTable::mapped_type & service )
315 if ( service->name() == name &&
316 ( maxVer.isEmpty() || isVersionGreater( service->version(), maxVer ) ) )
317 maxVer = service->version();
320 mServiceVersions.remove( name );
322 std::for_each( mServices.constBegin(), mServices.constEnd(), findGreaterVersion );
323 if ( !maxVer.isEmpty() )
326 QString key = makeServiceKey( name, maxVer );
327 mServiceVersions.insert( name, VersionTable::mapped_type( version, key ) );
337 mNativeLoader.
loadModules( nativeModulePath, *
this, serverIface );
343 mServiceVersions.clear();
352 const QString name = api->
name();
353 const QString version = api->
version();
356 const QString key = makeServiceKey( name, version );
357 if ( mApis.constFind( key ) != mApis.constEnd() )
364 mApis.insert( key, std::shared_ptr<QgsServerApi>( api ) );
371 VersionTable::const_iterator v = mApiVersions.constFind( name );
372 if ( v == mApiVersions.constEnd() )
375 mApiVersions.insert( name, VersionTable::mapped_type( version, key ) );
Server generic API endpoint abstract base class.
void cleanUp()
Clean up registered service and unregister modules.
virtual QString name() const =0
~QgsServiceRegistry()
Destructor.
int unregisterApi(const QString &name, const QString &version=QString())
Unregisters API from its name and version.
QgsServerApi * getApi(const QString &name, const QString &version=QString())
Retrieves an API from its name.
void unloadModules()
Unload all modules.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
virtual const QString name() const =0
Returns the API name.
void init(const QString &nativeModulepath, QgsServerInterface *serverIface=nullptr)
Initialize registry, load modules and auto register services.
void registerService(QgsService *service)
Register a service by its name and version.
QgsService Class defining interfaces for QGIS server services.
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins...
QgsService * getService(const QString &name, const QString &version=QString())
Retrieve a service from its name.
int unregisterService(const QString &name, const QString &version=QString())
Unregister service from its name and version.
void loadModules(const QString &modulePath, QgsServiceRegistry ®istrar, QgsServerInterface *serverIface=nullptr)
Load all modules from path.
QgsServerApi * apiForRequest(const QgsServerRequest &request) const
Searches the API register for an API matching the request and returns a (possibly NULL) pointer to it...
virtual const QString version() const
Returns the version of the service.
bool registerApi(QgsServerApi *api)
Registers the QgsServerApi api.
virtual QString version() const =0