QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgswcsdescribecoverage.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgswcsdescribecoverage.cpp
3  -------------------------
4  begin : January 16 , 2017
5  copyright : (C) 2013 by RenĂ©-Luc D'Hont ( parts from qgswcsserver )
6  (C) 2017 by David Marteau
7  email : rldhont at 3liz dot com
8  david dot marteau at 3liz dot com
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 #include "qgswcsutils.h"
20 #include "qgsserverprojectutils.h"
21 #include "qgswcsdescribecoverage.h"
22 
23 #include "qgsproject.h"
24 #include "qgsmaplayer.h"
25 #include "qgsrasterlayer.h"
26 
27 namespace QgsWcs
28 {
29 
33  void writeDescribeCoverage( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
34  const QgsServerRequest &request, QgsServerResponse &response )
35  {
36 #ifdef HAVE_SERVER_PYTHON_PLUGINS
37  QgsAccessControl *accessControl = serverIface->accessControls();
38 #endif
39  QDomDocument doc;
40  const QDomDocument *describeDocument = nullptr;
41 
42 #ifdef HAVE_SERVER_PYTHON_PLUGINS
43  QgsServerCacheManager *cacheManager = serverIface->cacheManager();
44  if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
45  {
46  describeDocument = &doc;
47  }
48  else //describe feature xml not in cache. Create a new one
49  {
50  doc = createDescribeCoverageDocument( serverIface, project, version, request );
51 
52  if ( cacheManager )
53  {
54  cacheManager->setCachedDocument( &doc, project, request, accessControl );
55  }
56  describeDocument = &doc;
57  }
58 #else
59  doc = createDescribeCoverageDocument( serverIface, project, version, request );
60  describeDocument = &doc;
61 #endif
62  response.setHeader( "Content-Type", "text/xml; charset=utf-8" );
63  response.write( describeDocument->toByteArray() );
64  }
65 
66 
67  QDomDocument createDescribeCoverageDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
68  const QgsServerRequest &request )
69  {
70  Q_UNUSED( version )
71 
72  QDomDocument doc;
73 
74  QgsServerRequest::Parameters parameters = request.parameters();
75 
76 #ifdef HAVE_SERVER_PYTHON_PLUGINS
77  QgsAccessControl *accessControl = serverIface->accessControls();
78 #else
79  ( void )serverIface;
80 #endif
81 
82  //wcs:WCS_Capabilities element
83  QDomElement coveDescElement = doc.createElement( QStringLiteral( "CoverageDescription" )/*wcs:CoverageDescription*/ );
84  coveDescElement.setAttribute( QStringLiteral( "xmlns" ), WCS_NAMESPACE );
85  coveDescElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
86  coveDescElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/describeCoverage.xsd" );
87  coveDescElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE );
88  coveDescElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
89  coveDescElement.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0.0" ) );
90  coveDescElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) );
91  doc.appendChild( coveDescElement );
92 
93  //defining coverage name
94  QString coveNames;
95  //read COVERAGE
96  QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "COVERAGE" ) );
97  if ( cove_name_it != parameters.constEnd() )
98  {
99  coveNames = cove_name_it.value();
100  }
101  if ( coveNames.isEmpty() )
102  {
103  QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "IDENTIFIER" ) );
104  if ( cove_name_it != parameters.constEnd() )
105  {
106  coveNames = cove_name_it.value();
107  }
108  }
109 
110  QStringList coveNameList;
111  if ( !coveNames.isEmpty() )
112  {
113  coveNameList = coveNames.split( ',' );
114  for ( int i = 0; i < coveNameList.size(); ++i )
115  {
116  coveNameList.replace( i, coveNameList.at( i ).trimmed() );
117  }
118  }
119 
120  QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
121  for ( int i = 0; i < wcsLayersId.size(); ++i )
122  {
123  QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );
124  if ( !layer )
125  {
126  continue;
127  }
128  if ( layer->type() != QgsMapLayerType::RasterLayer )
129  {
130  continue;
131  }
132 #ifdef HAVE_SERVER_PYTHON_PLUGINS
133  if ( !accessControl->layerReadPermission( layer ) )
134  {
135  continue;
136  }
137 #endif
138  QString name = layer->name();
139  if ( !layer->shortName().isEmpty() )
140  name = layer->shortName();
141  name = name.replace( ' ', '_' );
142 
143  if ( coveNameList.size() == 0 || coveNameList.contains( name ) )
144  {
145  QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
146  coveDescElement.appendChild( getCoverageOffering( doc, const_cast<QgsRasterLayer *>( rLayer ), project ) );
147  }
148  }
149  return doc;
150  }
151 
152 } // namespace QgsWcs
153 
154 
155 
QgsServerRequest::parameters
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
Definition: qgsserverrequest.cpp:85
qgswcsutils.h
qgsrasterlayer.h
QgsMapLayer::shortName
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
Definition: qgsmaplayer.cpp:179
qgsserverprojectutils.h
QgsAccessControl::layerReadPermission
bool layerReadPermission(const QgsMapLayer *layer) const
Returns the layer read right.
Definition: qgsaccesscontrol.cpp:105
QgsServerRequest
Definition: qgsserverrequest.h:38
QgsProject::mapLayer
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
Definition: qgsproject.cpp:3124
QgsWcs::GML_NAMESPACE
const QString GML_NAMESPACE
Definition: qgswcsutils.h:80
qgswcsdescribecoverage.h
QgsWcs::writeDescribeCoverage
void writeDescribeCoverage(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WCS DescribeCoverage response.
Definition: qgswcsdescribecoverage.cpp:48
QgsServerInterface::accessControls
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
QgsServerProjectUtils::wcsLayerIds
SERVER_EXPORT QStringList wcsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WCS.
Definition: qgsserverprojectutils.cpp:367
QgsProject
Definition: qgsproject.h:92
QgsServerRequest::Parameters
QMap< QString, QString > Parameters
Definition: qgsserverrequest.h:59
QgsServerResponse::write
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device.
Definition: qgsserverresponse.cpp:25
QgsWcs::createDescribeCoverageDocument
QDomDocument createDescribeCoverageDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create describe coverage document.
Definition: qgswcsdescribecoverage.cpp:82
QgsServerCacheManager
A helper class that centralizes caches accesses given by all the server cache filter plugins.
Definition: qgsservercachemanager.h:40
qgsmaplayer.h
QgsMapLayerType::RasterLayer
@ RasterLayer
QgsRasterLayer
Definition: qgsrasterlayer.h:72
QgsAccessControl
A helper class that centralizes restrictions given by all the access control filter plugins.
Definition: qgsaccesscontrol.h:36
QgsServerInterface::cacheManager
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters.
QgsWcs::getCoverageOffering
QDomElement getCoverageOffering(QDomDocument &doc, const QgsRasterLayer *layer, const QgsProject *project, bool brief)
CoverageOffering or CoverageOfferingBrief element.
Definition: qgswcsutils.cpp:48
QgsMapLayer
Definition: qgsmaplayer.h:81
QgsMapLayer::name
QString name
Definition: qgsmaplayer.h:85
QgsServerCacheManager::getCachedDocument
bool getCachedDocument(QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Returns cached document (or 0 if document not in cache) like capabilities.
Definition: qgsservercachemanager.cpp:56
QgsServerCacheManager::setCachedDocument
bool setCachedDocument(const QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Updates or inserts the document in cache like capabilities.
Definition: qgsservercachemanager.cpp:89
QgsMapLayer::type
QgsMapLayerType type() const
Returns the type of the layer.
Definition: qgsmaplayer.cpp:129
QgsWcs::WCS_NAMESPACE
const QString WCS_NAMESPACE
Definition: qgswcsutils.h:79
QgsServerInterface
Definition: qgsserverinterface.h:60
qgsproject.h
QgsWcs
WCS implementation.
Definition: qgswcs.cpp:29
QgsServerResponse
Definition: qgsserverresponse.h:43
QgsServerResponse::setHeader
virtual void setHeader(const QString &key, const QString &value)=0
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...