Skip to content
Permalink
Browse files

Merge pull request #2092 from elpaso/server-refactoring-3

[SERVER] Server refactoring and Python bindings/tests
  • Loading branch information
mhugent committed Jun 29, 2015
2 parents 1dfe005 + 540165d commit 2b444ac9c887d8c220a7ca72cb87f9c83ce658d2
Showing with 2,630 additions and 488 deletions.
  1. +1 −0 cmake_templates/Doxyfile.in
  2. +1 −1 python/CMakeLists.txt
  3. +43 −0 python/server/qgsconfigcache.sip
  4. +53 −0 python/server/qgsserver.sip
  5. +6 −1 python/server/qgsserverinterface.sip
  6. +121 −0 python/server/qgsserverprojectparser.sip
  7. +68 −0 python/server/qgswcserver.sip
  8. +38 −0 python/server/qgswcsprojectparser.sip
  9. +125 −0 python/server/qgswfserver.sip
  10. +47 −0 python/server/qgswfsprojectparser.sip
  11. +125 −0 python/server/qgswmsconfigparser.sip
  12. +111 −0 python/server/qgswmserver.sip
  13. +151 −0 python/server/qgswmsprojectparser.sip
  14. +13 −1 python/server/server.sip
  15. +12 −3 src/server/CMakeLists.txt
  16. +6 −426 src/server/qgis_map_serv.cpp
  17. +1 −1 src/server/qgsconfigcache.h
  18. +2 −2 src/server/qgsgetrequesthandler.cpp
  19. +1 −1 src/server/qgsgetrequesthandler.h
  20. +70 −21 src/server/qgshttprequesthandler.cpp
  21. +15 −2 src/server/qgshttprequesthandler.h
  22. +3 −1 src/server/qgspostrequesthandler.cpp
  23. +1 −1 src/server/qgspostrequesthandler.h
  24. +14 −4 src/server/qgsrequesthandler.h
  25. +588 −0 src/server/qgsserver.cpp
  26. +134 −0 src/server/qgsserver.h
  27. +2 −2 src/server/qgsserverfilter.cpp
  28. +3 −3 src/server/qgsserverfilter.h
  29. +2 −1 src/server/qgsserverinterface.cpp
  30. +18 −3 src/server/qgsserverinterface.h
  31. +6 −1 src/server/qgsserverinterfaceimpl.cpp
  32. +5 −2 src/server/qgsserverinterfaceimpl.h
  33. +3 −0 src/server/qgsserverplugins.cpp
  34. +3 −1 src/server/qgsserverplugins.h
  35. +1 −1 src/server/qgsserverprojectparser.h
  36. +2 −3 src/server/qgssoaprequesthandler.cpp
  37. +1 −1 src/server/qgssoaprequesthandler.h
  38. +1 −1 src/server/qgswcsprojectparser.h
  39. +1 −1 src/server/qgswfsprojectparser.h
  40. +1 −1 src/server/qgswmsconfigparser.h
  41. +1 −1 src/server/qgswmsprojectparser.h
  42. +1 −1 src/server/qgswmsserver.cpp
  43. +3 −0 tests/src/python/CMakeLists.txt
  44. +121 −0 tests/src/python/test_qgsserver.py
  45. +133 −0 tests/testdata/qgis_server/getcapabilities.txt
  46. +152 −0 tests/testdata/qgis_server/getprojectsettings.txt
  47. BIN tests/testdata/qgis_server/testlayer.dbf
  48. +1 −0 tests/testdata/qgis_server/testlayer.prj
  49. +1 −0 tests/testdata/qgis_server/testlayer.qpj
  50. BIN tests/testdata/qgis_server/testlayer.shp
  51. BIN tests/testdata/qgis_server/testlayer.shx
  52. +418 −0 tests/testdata/qgis_server/testproject.qgs
@@ -597,6 +597,7 @@ INPUT = @CMAKE_SOURCE_DIR@/doc \
@CMAKE_SOURCE_DIR@/src/analysis/raster \
@CMAKE_SOURCE_DIR@/src/analysis/vector \
@CMAKE_SOURCE_DIR@/src/plugins \
@CMAKE_SOURCE_DIR@/src/server/qgsserver.h \
@CMAKE_SOURCE_DIR@/src/server/qgscapabilitiescache.h \
@CMAKE_SOURCE_DIR@/src/server/qgsmapserviceexception.h \
@CMAKE_SOURCE_DIR@/src/server/qgsrequesthandler.h \
@@ -182,7 +182,7 @@ IF (WITH_SERVER AND WITH_SERVER_PLUGINS)
SET(PY_MODULES ${PY_MODULES} server)

FILE(GLOB sip_files_server
server/*.sip
server/server.sip
)
SET(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_server})
SET(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS} -o -a ${CMAKE_BINARY_DIR}/python/qgis.server.api)
@@ -0,0 +1,43 @@
/***************************************************************************
qgsconfigcache.sip
-------------------
begin : 2015-05-19
copyright : (C) 2015 by Alessandro Pasotti
email : a dot pasotti at itopen dot it
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

/**
* \class QgsConfigCache
* \brief A cache for xml documents (by configuration file path)
*/


class QgsConfigCache: QObject
{
%TypeHeaderCode
#include "qgsconfigcache.h"
%End
public:
static QgsConfigCache* instance();
~QgsConfigCache();

QgsServerProjectParser* serverConfiguration( const QString& filePath );
QgsWCSProjectParser* wcsConfiguration( const QString& filePath );
QgsWFSProjectParser* wfsConfiguration( const QString& filePath );
QgsWMSConfigParser* wmsConfiguration( const QString& filePath, const QMap<QString, QString>& parameterMap = QMap< QString, QString >() );

private:
QgsConfigCache();

};


@@ -0,0 +1,53 @@
/***************************************************************************
qgsserver.sip
Qgis Mapserver
-------------------
begin : 2015-05-21
copyright : (C) 2015 by Alessandro Pasotti
email : a dot pasotti at itopen dot it
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/



class QgsServer
{
%TypeHeaderCode
#include "qgsserver.h"
%End

public:
QgsServer();
~QgsServer();
// Original init for the fcgi application:
//void init( int argc, char* argv[] );
// init for python bindings:
void init( );
QByteArray handleRequest( const QString queryString = QString( ) );
// TODO: if HAVE_SERVER_PYTHON
QByteArray handleRequest( const QString queryString,
const bool returnHeaders,
const bool returnBody );
QByteArray handleRequestGetBody( const QString queryString = QString( ) );
QByteArray handleRequestGetHeaders( const QString queryString = QString( ) );
//QgsServerContext& serverContext ( ) /KeepReference/;
%If (HAVE_SERVER_PYTHON_PLUGINS)
QgsServerInterface* serverInterface( );
// Needs %MethodCode
//QMultiMap<int, QgsServerFilter*> pluginFilters( );
%End

// The following is needed because otherwise SIP fails trying to create copy
// ctor
private:
QgsServer( const QgsServer& );
QgsServer & operator=( const QgsServer& );
};
@@ -1,7 +1,7 @@
/***************************************************************************
qgsserverinterface.sip

Class defining the interface made available to server plugins.
Class defining the interface made available to QGIS Server plugins.
-------------------
begin : 2014-09-10
copyright : (C) 2014 by Alessandro Pasotti
@@ -51,6 +51,11 @@ class QgsServerInterface
// Commented because of problems with typedef QgsServerFiltersMap, provided
// methods to alter the filters map into QgsRequestHandler API
// virtual QgsServerFiltersMap filters( ) = 0;
/** Returns the configFilePath as seen by the server, this value is only
* available after requestReady has been called.*/
virtual QString configFilePath( ) = 0;
/** Set the config file path */
virtual void setConfigFilePath( QString configFilePath) = 0;

private:
/** Constructor */
@@ -0,0 +1,121 @@
/***************************************************************************
qgsserverprojectparser.sip
------------------------
begin : March 2, 2015
copyright : (C) 2015 by Alessandro Pasotti
email : a dot pasotti at itopen dot it
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/


class QgsServerProjectParser
{
%TypeHeaderCode
#include "qgsserverprojectparser.h"

%End
public:
/**Takes ownership of the document*/
QgsServerProjectParser( QDomDocument* xmlDoc, const QString& filePath );

QString projectPath();

const QDomDocument* xmlDocument();

/**Returns project layers by id*/
void projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const;

/**Converts a (possibly relative) path to absolute*/
QString convertToAbsolutePath( const QString& file ) const;

/**Creates a maplayer object from <maplayer> element. The layer cash owns the maplayer, so don't delete it
@return the maplayer or 0 in case of error*/
QgsMapLayer* createLayerFromElement( const QDomElement& elem, bool useCache = true ) const;

QgsMapLayer* mapLayerFromLayerId( const QString& lId, bool useCache = true ) const;

/**Returns the layer id under a <legendlayer> tag in the QGIS projectfile*/
QString layerIdFromLegendLayer( const QDomElement& legendLayer ) const;

/**@param considerMapExtent Take user-defined map extent instead of data-calculated extent if present in project file*/
void combineExtentAndCrsOfGroupChildren( QDomElement& groupElement, QDomDocument& doc, bool considerMapExtent = false ) const;

void addLayerProjectSettings( QDomElement& layerElem, QDomDocument& doc, QgsMapLayer* currentLayer ) const;

QgsRectangle layerBoundingBoxInProjectCRS( const QDomElement& layerElem, const QDomDocument &doc ) const;

bool crsSetForLayer( const QDomElement& layerElement, QSet<QString> &crsSet ) const;

const QgsCoordinateReferenceSystem& projectCRS() const;

QgsRectangle mapRectangle() const;

QStringList supportedOutputCrsList() const;

const QList<QDomElement>& projectLayerElements() const;

const QList<QDomElement>& legendGroupElements() const;

QString projectTitle() const;

QDomElement legendElem() const;

QDomElement propertiesElem() const;

const QSet<QString>& restrictedLayers() const;
bool useLayerIDs() const;

const QHash< QString, QDomElement >& projectLayerElementsByName() const;
const QHash< QString, QDomElement >& projectLayerElementsById() const;

// SIP doesn't like QMap:
// void layerFromLegendLayer( const QDomElement& legendLayerElem, QMap< int, QgsMapLayer*>& layers, bool useCache = true ) const;

QStringList wfsLayerNames() const;
QStringList wcsLayerNames() const;

QDomElement firstComposerLegendElement() const;

QList<QDomElement> publishedComposerElements() const;

//QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const;

/**Returns the text of the <layername> element for a layer element
@return id or a null string in case of error*/
QString layerName( const QDomElement& layerElem ) const;

QString serviceUrl() const;
QString wfsServiceUrl() const;
QString wcsServiceUrl() const;

QStringList wfsLayers() const;
QStringList wcsLayers() const;

void addJoinLayersForElement( const QDomElement& layerElem ) const;

void addValueRelationLayersForLayer( const QgsVectorLayer *vl ) const;
/**Add layers which are necessary for the evaluation of the expression function 'getFeature( layer, attributField, value)'*/
void addGetFeatureLayers( const QDomElement& layerElem ) const;

/**Returns the text of the <id> element for a layer element
@return id or a null string in case of error*/
QString layerId( const QDomElement& layerElem ) const;

QgsRectangle projectExtent() const;

int numberOfLayers() const;

bool updateLegendDrawingOrder() const;

void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc, const QString& service, bool sia2045 = false ) const;

};

@@ -0,0 +1,68 @@
/***************************************************************************
qgswcsserver.sip
-------------------
begin : May 2, 2015
copyright : (C) 2015 by Alessandro Pasotti
email : a dot pasotti at itopen dot it
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSWCSSERVER_H
#define QGSWCSSERVER_H

#include <QDomDocument>
#include <QMap>
#include <QString>
#include <map>
#include "qgis.h"
#include "qgsowsserver.h"

class QgsWCSProjectParser;
class QgsRequestHandler;

/**This class handles all the wcs server requests. The parameters and values have to be passed in the form of
a map<QString, QString>. This map is usually generated by a subclass of QgsWMSRequestHandler, which makes QgsWCSServer
independent from any server side technology*/

class QgsWCSServer: public QgsOWSServer
{
public:
/**Constructor. Takes parameter map and a pointer to a renderer object (does not take ownership)*/
QgsWCSServer( const QString& configFilePath, QMap<QString, QString>& parameters, QgsWCSProjectParser* pp,
QgsRequestHandler* rh );
~QgsWCSServer();

void executeRequest() override;

/**Returns an XML file with the capabilities description (as described in the WFS specs)*/
QDomDocument getCapabilities();

/**Returns an XML file with the describe Coverage (as described in the WCS specs)*/
QDomDocument describeCoverage();

/**Creates a file which is the result of the getCoverage request.*/
QByteArray* getCoverage();

/**Sets configuration parser for administration settings. Does not take ownership*/
void setAdminConfigParser( QgsWCSProjectParser* parser ) { mConfigParser = parser; }

private:
/**Don't use the default constructor*/
QgsWCSServer();

/**Get service address from REQUEST_URI if not specified in the configuration*/
QString serviceUrl() const;

QgsWCSProjectParser* mConfigParser;

};

#endif
@@ -0,0 +1,38 @@
/***************************************************************************
qgswcsprojectparser.sip
------------------------
begin : May 2, 2015
copyright : (C) 2015 by Alessandro Pasotti
email : a dot pasotti at itopen dot it
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/


class QgsWCSProjectParser
{
%TypeHeaderCode
#include "qgswcsprojectparser.h"

%End
public:
QgsWCSProjectParser( const QString& filePath );
~QgsWCSProjectParser();

void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
QString wcsServiceUrl() const;
QString serviceUrl() const;
void wcsContentMetadata( QDomElement& parentElement, QDomDocument& doc ) const;
QStringList wcsLayers() const;
void describeCoverage( const QString& aCoveName, QDomElement& parentElement, QDomDocument& doc ) const;
QList<QgsMapLayer*> mapLayerFromCoverage( const QString& cName, bool useCache = true ) const;

};

0 comments on commit 2b444ac

Please sign in to comment.
You can’t perform that action at this time.