Skip to content

Commit

Permalink
Fix MapServer connection items in browser do not respond correctly
Browse files Browse the repository at this point in the history
to changes in connection parameters

And modernise code, sync with AFS provider
  • Loading branch information
nyalldawson committed May 30, 2019
1 parent 8e51364 commit 8b9fbed
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 35 deletions.
3 changes: 1 addition & 2 deletions src/providers/arcgisrest/qgsafsdataitems.cpp
Expand Up @@ -391,8 +391,7 @@ QgsDataItem *QgsAfsDataItemProvider::createDataItem( const QString &path, QgsDat
QString connectionName = path.split( '/' ).last();
if ( QgsOwsConnection::connectionList( QStringLiteral( "arcgisfeatureserver" ) ).contains( connectionName ) )
{
QgsOwsConnection connection( QStringLiteral( "arcgisfeatureserver" ), connectionName );
return new QgsAfsConnectionItem( parentItem, QStringLiteral( "ArcGisFeatureServer" ), path, connection.uri().param( QStringLiteral( "url" ) ) );
return new QgsAfsConnectionItem( parentItem, QStringLiteral( "ArcGisFeatureServer" ), path, connectionName );
}
}

Expand Down
92 changes: 81 additions & 11 deletions src/providers/arcgisrest/qgsamsdataitems.cpp
Expand Up @@ -22,6 +22,9 @@
#ifdef HAVE_GUI
#include "qgsamssourceselect.h"
#include "qgsnewhttpconnection.h"
#include <QMenu>
#include <QAction>
#include <QDesktopServices>
#endif

#include <QImageReader>
Expand All @@ -41,9 +44,8 @@ QVector<QgsDataItem *> QgsAmsRootItem::createChildren()
const QStringList connectionList = QgsOwsConnection::connectionList( QStringLiteral( "ARCGISMAPSERVER" ) );
for ( const QString &connName : connectionList )
{
QgsOwsConnection connection( QStringLiteral( "ARCGISMAPSERVER" ), connName );
QString path = "ams:/" + connName;
connections.append( new QgsAmsConnectionItem( this, connName, path, connection.uri().param( QStringLiteral( "url" ) ) ) );
connections.append( new QgsAmsConnectionItem( this, connName, path, connName ) );
}
return connections;
}
Expand Down Expand Up @@ -83,22 +85,23 @@ void QgsAmsRootItem::newConnection()

///////////////////////////////////////////////////////////////////////////////

QgsAmsConnectionItem::QgsAmsConnectionItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &url )
QgsAmsConnectionItem::QgsAmsConnectionItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &connectionName )
: QgsDataCollectionItem( parent, name, path )
, mUrl( url )
, mConnName( connectionName )
{
mIconName = QStringLiteral( "mIconConnect.svg" );
}

QVector<QgsDataItem *> QgsAmsConnectionItem::createChildren()
{
const QgsOwsConnection connection( QStringLiteral( "ARCGISMAPSERVER" ), mConnName );
const QString url = connection.uri().param( QStringLiteral( "url" ) );
const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );

QVector<QgsDataItem *> layers;
QString errorTitle, errorMessage;

QgsOwsConnection connection( QStringLiteral( "ARCGISMAPSERVER" ), mName );

const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );
QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( mUrl, authcfg, errorTitle, errorMessage );
QVariantMap serviceData = QgsArcGisRestUtils::getServiceInfo( url, authcfg, errorTitle, errorMessage );
if ( serviceData.isEmpty() )
{
return layers;
Expand Down Expand Up @@ -129,7 +132,7 @@ QVector<QgsDataItem *> QgsAmsConnectionItem::createChildren()
{
QVariantMap layerInfoMap = layerInfo.toMap();
QString id = layerInfoMap[QStringLiteral( "id" )].toString();
QgsAmsLayerItem *layer = new QgsAmsLayerItem( this, mName, mUrl, id, layerInfoMap[QStringLiteral( "name" )].toString(), authid, format, authcfg );
QgsAmsLayerItem *layer = new QgsAmsLayerItem( this, mName, url, id, layerInfoMap[QStringLiteral( "name" )].toString(), authid, format, authcfg );
layers.append( layer );
}

Expand All @@ -142,6 +145,12 @@ bool QgsAmsConnectionItem::equal( const QgsDataItem *other )
return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
}

QString QgsAmsConnectionItem::url() const
{
const QgsOwsConnection connection( QStringLiteral( "ARCGISMAPSERVER" ), mConnName );
return connection.uri().param( QStringLiteral( "url" ) );
}

#ifdef HAVE_GUI
QList<QAction *> QgsAmsConnectionItem::actions( QWidget *parent )
{
Expand Down Expand Up @@ -178,12 +187,73 @@ void QgsAmsConnectionItem::deleteConnection()

///////////////////////////////////////////////////////////////////////////////

QgsAmsLayerItem::QgsAmsLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &id, const QString &title, const QString &authid, const QString &format, const QString &authcfg )
: QgsLayerItem( parent, title, parent->path() + "/" + name, QString(), QgsLayerItem::Raster, QStringLiteral( "arcgismapserver" ) )
QgsAmsLayerItem::QgsAmsLayerItem( QgsDataItem *parent, const QString &, const QString &url, const QString &id, const QString &title, const QString &authid, const QString &format, const QString &authcfg )
: QgsLayerItem( parent, title, url + '/' + id, QString(), QgsLayerItem::Raster, QStringLiteral( "arcgismapserver" ) )
{
mUri = QStringLiteral( "crs='%1' format='%2' layer='%3' url='%4'" ).arg( authid, format, id, url );
if ( !authcfg.isEmpty() )
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );
setState( Populated );
mIconName = QStringLiteral( "mIconAms.svg" );
setToolTip( mPath );
}

//
// QgsAmsDataItemProvider
//

QgsDataItem *QgsAmsDataItemProvider::createDataItem( const QString &path, QgsDataItem *parentItem )
{
if ( path.isEmpty() )
{
return new QgsAmsRootItem( parentItem, QStringLiteral( "ArcGisMapServer" ), QStringLiteral( "arcgismapserver:" ) );
}

// path schema: ams:/connection name (used by OWS)
if ( path.startsWith( QLatin1String( "ams:/" ) ) )
{
QString connectionName = path.split( '/' ).last();
if ( QgsOwsConnection::connectionList( QStringLiteral( "arcgismapserver" ) ).contains( connectionName ) )
{
return new QgsAmsConnectionItem( parentItem, QStringLiteral( "ArcGisMapServer" ), path, connectionName );
}
}

return nullptr;
}

#ifdef HAVE_GUI

//
// QgsAmsItemGuiProvider
//

QString QgsAmsItemGuiProvider::name()
{
return QStringLiteral( "ams_items" );
}

void QgsAmsItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &, QgsDataItemGuiContext )
{
if ( QgsAmsConnectionItem *connectionItem = qobject_cast< QgsAmsConnectionItem * >( item ) )
{
QAction *viewInfo = new QAction( tr( "View Service Info" ), menu );
connect( viewInfo, &QAction::triggered, this, [ = ]
{
QDesktopServices::openUrl( QUrl( connectionItem->url() ) );
} );
menu->addAction( viewInfo );
}
else if ( QgsAmsLayerItem *layerItem = qobject_cast< QgsAmsLayerItem * >( item ) )
{
QAction *viewInfo = new QAction( tr( "View Service Info" ), menu );
connect( viewInfo, &QAction::triggered, this, [ = ]
{
QDesktopServices::openUrl( QUrl( layerItem->path() ) );
} );
menu->addAction( viewInfo );
menu->addSeparator();
}
}

#endif
41 changes: 40 additions & 1 deletion src/providers/arcgisrest/qgsamsdataitems.h
Expand Up @@ -20,6 +20,11 @@
#include "qgsdataitem.h"
#include "qgsdatasourceuri.h"
#include "qgswkbtypes.h"
#include "qgsdataitemprovider.h"

#ifdef HAVE_GUI
#include "qgsdataitemguiprovider.h"
#endif


class QgsAmsRootItem : public QgsDataCollectionItem
Expand Down Expand Up @@ -52,6 +57,7 @@ class QgsAmsConnectionItem : public QgsDataCollectionItem
QgsAmsConnectionItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &url );
QVector<QgsDataItem *> createChildren() override;
bool equal( const QgsDataItem *other ) override;
QString url() const;
#ifdef HAVE_GUI
QList<QAction *> actions( QWidget *parent ) override;
#endif
Expand All @@ -63,7 +69,7 @@ class QgsAmsConnectionItem : public QgsDataCollectionItem
#endif

private:
QString mUrl;
QString mConnName;
};

class QgsAmsLayerItem : public QgsLayerItem
Expand All @@ -74,4 +80,37 @@ class QgsAmsLayerItem : public QgsLayerItem
QgsAmsLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &id, const QString &title, const QString &authid, const QString &format, const QString &authcfg );
};


//! Provider for ams root data item
class QgsAmsDataItemProvider : public QgsDataItemProvider
{
public:
QString name() override { return QStringLiteral( "AMS" ); }

int capabilities() override { return QgsDataProvider::Net; }

QgsDataItem *createDataItem( const QString &path, QgsDataItem *parentItem ) override;
};


#ifdef HAVE_GUI

class QgsAmsItemGuiProvider : public QObject, public QgsDataItemGuiProvider
{
Q_OBJECT

public:

QgsAmsItemGuiProvider() = default;

QString name() override;

void populateContextMenu( QgsDataItem *item, QMenu *menu,
const QList<QgsDataItem *> &selectedItems, QgsDataItemGuiContext context ) override;


};

#endif

#endif // QGSAMSDATAITEMS_H
24 changes: 24 additions & 0 deletions src/providers/arcgisrest/qgsamsprovider.cpp
Expand Up @@ -24,6 +24,7 @@
#include "qgsfeaturestore.h"
#include "qgsgeometry.h"
#include "qgsapplication.h"
#include "qgsamsdataitems.h"

#ifdef HAVE_GUI
#include "qgsamssourceselect.h"
Expand Down Expand Up @@ -572,3 +573,26 @@ QGISEXTERN QList<QgsSourceSelectProvider *> *sourceSelectProviders()
return providers;
}
#endif


QGISEXTERN QList<QgsDataItemProvider *> *dataItemProviders()
{
QList<QgsDataItemProvider *> *providers = new QList<QgsDataItemProvider *>();

*providers
<< new QgsAmsDataItemProvider;

return providers;
}

#ifdef HAVE_GUI
QGISEXTERN QList<QgsDataItemGuiProvider *> *dataItemGuiProviders()
{
QList<QgsDataItemGuiProvider *> *providers = new QList<QgsDataItemGuiProvider *>();

*providers
<< new QgsAmsItemGuiProvider();

return providers;
}
#endif
21 changes: 0 additions & 21 deletions src/providers/arcgisrest/qgsamsproviderextern.cpp
Expand Up @@ -60,27 +60,6 @@ QGISEXTERN int dataCapabilities()
return QgsDataProvider::Net;
}

QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
{
if ( path.isEmpty() )
{
return new QgsAmsRootItem( parentItem, QStringLiteral( "ArcGisMapServer" ), QStringLiteral( "arcgismapserver:" ) );
}

// path schema: ams:/connection name (used by OWS)
if ( path.startsWith( QLatin1String( "ams:/" ) ) )
{
QString connectionName = path.split( '/' ).last();
if ( QgsOwsConnection::connectionList( QStringLiteral( "arcgismapserver" ) ).contains( connectionName ) )
{
QgsOwsConnection connection( QStringLiteral( "arcgismapserver" ), connectionName );
return new QgsAmsConnectionItem( parentItem, QStringLiteral( "ArcGisMapServer" ), path, connection.uri().param( QStringLiteral( "url" ) ) );
}
}

return nullptr;
}

QGISEXTERN QVariantMap decodeUri( const QString &uri )
{
QgsDataSourceUri dsUri = QgsDataSourceUri( uri );
Expand Down

0 comments on commit 8b9fbed

Please sign in to comment.