Skip to content

Commit

Permalink
[afs] fix listing of afs services for saved servers starting in a sub…
Browse files Browse the repository at this point in the history
…-folder
  • Loading branch information
nirvn committed Dec 10, 2018
1 parent be8438b commit d136e92
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 20 deletions.
11 changes: 5 additions & 6 deletions src/providers/arcgisrest/qgsafsdataitems.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -96,15 +96,14 @@ void addFolderItems( QVector< QgsDataItem * > &items, const QVariantMap &service
}, serviceData, baseUrl ); }, serviceData, baseUrl );
} }


void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent, void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent )
const QString &parentName )
{ {
QgsArcGisRestUtils::visitServiceItems( QgsArcGisRestUtils::visitServiceItems(
[&items, parent, authcfg]( const QString & name, const QString & url ) [&items, parent, authcfg]( const QString & name, const QString & url )
{ {
std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg ); std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg );
items.append( serviceItem.release() ); items.append( serviceItem.release() );
}, serviceData, baseUrl, parentName ); }, serviceData, baseUrl );
} }


void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, QgsDataItem *parent ) void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, QgsDataItem *parent )
Expand Down Expand Up @@ -176,7 +175,7 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
} }


addFolderItems( items, serviceData, url, authcfg, this ); addFolderItems( items, serviceData, url, authcfg, this );
addServiceItems( items, serviceData, url, authcfg, this, QString() ); addServiceItems( items, serviceData, url, authcfg, this );
addLayerItems( items, serviceData, url, authcfg, this ); addLayerItems( items, serviceData, url, authcfg, this );


return items; return items;
Expand Down Expand Up @@ -287,7 +286,7 @@ QVector<QgsDataItem *> QgsAfsFolderItem::createChildren()
} }


addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this ); addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this, mName ); addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
addLayerItems( items, serviceData, mPath, mAuthCfg, this ); addLayerItems( items, serviceData, mPath, mAuthCfg, this );
return items; return items;
} }
Expand Down Expand Up @@ -328,7 +327,7 @@ QVector<QgsDataItem *> QgsAfsServiceItem::createChildren()
} }


addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this ); addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this, mName ); addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
addLayerItems( items, serviceData, mPath, mAuthCfg, this ); addLayerItems( items, serviceData, mPath, mAuthCfg, this );
return items; return items;
} }
Expand Down
12 changes: 6 additions & 6 deletions src/providers/arcgisrest/qgsafssourceselect.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) ); const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );
const QString baseUrl = connection.uri().param( QStringLiteral( "url" ) ); const QString baseUrl = connection.uri().param( QStringLiteral( "url" ) );


std::function< bool( const QString &, QStandardItem *, const QString & )> visitItemsRecursive; std::function< bool( const QString &, QStandardItem * )> visitItemsRecursive;
visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem, const QString & parentName ) -> bool visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem ) -> bool
{ {
const QVariantMap serviceInfoMap = QgsArcGisRestUtils::getServiceInfo( baseItemUrl, authcfg, errorTitle, errorMessage ); const QVariantMap serviceInfoMap = QgsArcGisRestUtils::getServiceInfo( baseItemUrl, authcfg, errorTitle, errorMessage );


Expand All @@ -62,7 +62,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
else else
mModel->appendRow( QList<QStandardItem *>() << nameItem ); mModel->appendRow( QList<QStandardItem *>() << nameItem );


if ( !visitItemsRecursive( url, nameItem, name ) ) if ( !visitItemsRecursive( url, nameItem ) )
res = false; res = false;
}, serviceInfoMap, baseUrl ); }, serviceInfoMap, baseUrl );


Expand All @@ -76,9 +76,9 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
else else
mModel->appendRow( QList<QStandardItem *>() << nameItem ); mModel->appendRow( QList<QStandardItem *>() << nameItem );


if ( !visitItemsRecursive( url, nameItem, name ) ) if ( !visitItemsRecursive( url, nameItem ) )
res = false; res = false;
}, serviceInfoMap, baseUrl, parentName ); }, serviceInfoMap, baseUrl );


QMap< QString, QList<QStandardItem *> > layerItems; QMap< QString, QList<QStandardItem *> > layerItems;
QMap< QString, QString > parents; QMap< QString, QString > parents;
Expand Down Expand Up @@ -143,7 +143,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
return res; return res;
}; };


if ( !visitItemsRecursive( baseUrl, nullptr, QString() ) ) if ( !visitItemsRecursive( baseUrl, nullptr ) )
QMessageBox::warning( this, tr( "Error" ), tr( "Failed to retrieve service capabilities:\n%1: %2" ).arg( errorTitle, errorMessage ) ); QMessageBox::warning( this, tr( "Error" ), tr( "Failed to retrieve service capabilities:\n%1: %2" ).arg( errorTitle, errorMessage ) );


return true; return true;
Expand Down
49 changes: 42 additions & 7 deletions src/providers/arcgisrest/qgsarcgisrestutils.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1056,18 +1056,50 @@ void QgsArcGisAsyncParallelQuery::handleReply()
} }
} }


void QgsArcGisRestUtils::adjustBaseUrl( QString &baseUrl, const QString name )
{
QStringList parts = name.split( '/' );
QString checkString;
for ( const QString &part : parts )
{
if ( !checkString.isEmpty() )
checkString += QString( '/' );

checkString += part;
if ( baseUrl.indexOf( QRegularExpression( checkString.replace( '/', QStringLiteral( "\\/" ) ) + QStringLiteral( "\\/?$" ) ) ) > -1 )
{
baseUrl = baseUrl.left( baseUrl.length() - checkString.length() - 1 );
break;
}
}
}

void QgsArcGisRestUtils::visitFolderItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl ) void QgsArcGisRestUtils::visitFolderItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl )
{ {
QString base( baseUrl );
bool baseChecked = false;
if ( !base.endsWith( '/' ) )
base += QStringLiteral( "/" );

const QStringList folderList = serviceData.value( QStringLiteral( "folders" ) ).toStringList(); const QStringList folderList = serviceData.value( QStringLiteral( "folders" ) ).toStringList();
for ( const QString &folder : folderList ) for ( const QString &folder : folderList )
{ {
visitor( folder, baseUrl + ( baseUrl.endsWith( '/' ) ? QString() : QString( '/' ) ) + folder ); if ( !baseChecked )
{
adjustBaseUrl( base, folder );
baseChecked = true;
}
visitor( folder, base + folder );
} }
} }


void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl, void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl )
const QString &parentName )
{ {
QString base( baseUrl );
bool baseChecked = false;
if ( !base.endsWith( '/' ) )
base += QStringLiteral( "/" );

const QVariantList serviceList = serviceData.value( QStringLiteral( "services" ) ).toList(); const QVariantList serviceList = serviceData.value( QStringLiteral( "services" ) ).toList();
for ( const QVariant &service : serviceList ) for ( const QVariant &service : serviceList )
{ {
Expand All @@ -1077,11 +1109,14 @@ void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QSt
continue; continue;


const QString serviceName = serviceMap.value( QStringLiteral( "name" ) ).toString(); const QString serviceName = serviceMap.value( QStringLiteral( "name" ) ).toString();
QString displayName = serviceName; QString displayName = serviceName.split( '/' ).last();
if ( displayName.startsWith( parentName + '/' ) ) if ( !baseChecked )
displayName = displayName.mid( parentName.length() + 1 ); {
adjustBaseUrl( base, serviceName );
baseChecked = true;
}


visitor( displayName, baseUrl + ( baseUrl.endsWith( '/' ) ? QString() : QString( '/' ) ) + serviceName + '/' + serviceType ); visitor( displayName, base + serviceName + '/' + serviceType );
} }
} }


Expand Down
3 changes: 2 additions & 1 deletion src/providers/arcgisrest/qgsarcgisrestutils.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ class QgsArcGisRestUtils
static QDateTime parseDateTime( const QVariant &value ); static QDateTime parseDateTime( const QVariant &value );


static QUrl parseUrl( const QUrl &url ); static QUrl parseUrl( const QUrl &url );
static void adjustBaseUrl( QString &baseUrl, const QString name );
static void visitFolderItems( const std::function<void ( const QString &folderName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl ); static void visitFolderItems( const std::function<void ( const QString &folderName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const QString &parentName ); static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
static void addLayerItems( const std::function<void ( const QString &parentLayerId, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QString &authid )> &visitor, const QVariantMap &serviceData, const QString &parentUrl ); static void addLayerItems( const std::function<void ( const QString &parentLayerId, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QString &authid )> &visitor, const QVariantMap &serviceData, const QString &parentUrl );
}; };


Expand Down

0 comments on commit d136e92

Please sign in to comment.