Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #35790 from alexbruy/connections-fixes
import/export for ArcGIS Map and FeatureServer connections (fix #27485)
  • Loading branch information
alexbruy committed Apr 15, 2020
2 parents 869e148 + 840d204 commit 2770c49
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 10 deletions.
4 changes: 3 additions & 1 deletion python/gui/auto_generated/qgsmanageconnectionsdialog.sip.in
Expand Up @@ -32,7 +32,9 @@ class QgsManageConnectionsDialog : QDialog
WCS,
Oracle,
GeoNode,
XyzTiles
XyzTiles,
ArcgisMapServer,
ArcgisFeatureServer
};

QgsManageConnectionsDialog( QWidget *parent /TransferThis/ = 0, Mode mode = Export, Type type = WMS, const QString &fileName = QString() );
Expand Down
141 changes: 140 additions & 1 deletion src/gui/qgsmanageconnectionsdialog.cpp
Expand Up @@ -136,6 +136,12 @@ void QgsManageConnectionsDialog::doExportImport()
case XyzTiles:
doc = saveXyzTilesConnections( items );
break;
case ArcgisMapServer:
doc = saveArcgisConnections( items, QStringLiteral( "ARCGISMAPSERVER" ) );
break;
case ArcgisFeatureServer:
doc = saveArcgisConnections( items, QStringLiteral( "ARCGISFEATURESERVER" ) );
break;
}

QFile file( mFileName );
Expand Down Expand Up @@ -207,6 +213,12 @@ void QgsManageConnectionsDialog::doExportImport()
case XyzTiles:
loadXyzTilesConnections( doc, items );
break;
case ArcgisMapServer:
loadArcgisConnections( doc, items, QStringLiteral( "ARCGISMAPSERVER" ) );
break;
case ArcgisFeatureServer:
loadArcgisConnections( doc, items, QStringLiteral( "ARCGISFEATURESERVER" ) );
break;
}
// clear connections list and close window
listConnections->clear();
Expand Down Expand Up @@ -251,6 +263,12 @@ bool QgsManageConnectionsDialog::populateConnections()
case XyzTiles:
settings.beginGroup( QStringLiteral( "/qgis/connections-xyz" ) );
break;
case ArcgisMapServer:
settings.beginGroup( QStringLiteral( "/qgis/connections-arcgismapserver" ) );
break;
case ArcgisFeatureServer:
settings.beginGroup( QStringLiteral( "/qgis/connections-arcgisfeatureserver" ) );
break;
}
QStringList keys = settings.childGroups();
QStringList::Iterator it = keys.begin();
Expand Down Expand Up @@ -370,6 +388,22 @@ bool QgsManageConnectionsDialog::populateConnections()
return false;
}
break;
case ArcgisMapServer:
if ( root.tagName() != QLatin1String( "qgsARCGISMAPSERVERConnections" ) )
{
QMessageBox::information( this, tr( "Loading Connections" ),
tr( "The file is not a ArcGIS MapServer connections exchange file." ) );
return false;
}
break;
case ArcgisFeatureServer:
if ( root.tagName() != QLatin1String( "qgsARCGISFEATURESERVERConnections" ) )
{
QMessageBox::information( this, tr( "Loading Connections" ),
tr( "The file is not a ArcGIS FeatureServer connections exchange file." ) );
return false;
}
break;
}

QDomElement child = root.firstChildElement();
Expand Down Expand Up @@ -669,6 +703,33 @@ QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( const QStringL
return doc;
}

QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( const QStringList &connections, const QString &service )
{
QDomDocument doc( QStringLiteral( "connections" ) );
QDomElement root = doc.createElement( "qgs" + service.toUpper() + "Connections" );
root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0" ) );
doc.appendChild( root );

QgsSettings settings;
QString path;
for ( int i = 0; i < connections.count(); ++i )
{
path = "/qgis/connections-" + service.toLower() + '/';
QDomElement el = doc.createElement( service.toLower() );
el.setAttribute( QStringLiteral( "name" ), connections[ i ] );
el.setAttribute( QStringLiteral( "url" ), settings.value( path + connections[ i ] + "/url", "" ).toString() );
el.setAttribute( QStringLiteral( "referer" ), settings.value( path + connections[ i ] + "/referer", "" ).toString() );

path = "/qgis/" + service.toUpper() + '/';
el.setAttribute( QStringLiteral( "username" ), settings.value( path + connections[ i ] + "/username", "" ).toString() );
el.setAttribute( QStringLiteral( "password" ), settings.value( path + connections[ i ] + "/password", "" ).toString() );
el.setAttribute( QStringLiteral( "authcfg" ), settings.value( path + connections[ i ] + "/authcfg", "" ).toString() );
root.appendChild( el );
}

return doc;
}

void QgsManageConnectionsDialog::loadOWSConnections( const QDomDocument &doc, const QStringList &items, const QString &service )
{
QDomElement root = doc.documentElement();
Expand Down Expand Up @@ -836,7 +897,6 @@ void QgsManageConnectionsDialog::loadWfsConnections( const QDomDocument &doc, co
}
}


void QgsManageConnectionsDialog::loadPgConnections( const QDomDocument &doc, const QStringList &items )
{
QDomElement root = doc.documentElement();
Expand Down Expand Up @@ -1352,6 +1412,85 @@ void QgsManageConnectionsDialog::loadXyzTilesConnections( const QDomDocument &do
}
}

void QgsManageConnectionsDialog::loadArcgisConnections( const QDomDocument &doc, const QStringList &items, const QString &service )
{
QDomElement root = doc.documentElement();
if ( root.tagName() != "qgs" + service.toUpper() + "Connections" )
{
QMessageBox::information( this, tr( "Loading Connections" ),
tr( "The file is not a %1 connections exchange file." ).arg( service ) );
return;
}

QString connectionName;
QgsSettings settings;
settings.beginGroup( "/qgis/connections-" + service.toLower() );
QStringList keys = settings.childGroups();
settings.endGroup();
QDomElement child = root.firstChildElement();
bool prompt = true;
bool overwrite = true;

while ( !child.isNull() )
{
connectionName = child.attribute( QStringLiteral( "name" ) );
if ( !items.contains( connectionName ) )
{
child = child.nextSiblingElement();
continue;
}

// check for duplicates
if ( keys.contains( connectionName ) && prompt )
{
int res = QMessageBox::warning( this,
tr( "Loading Connections" ),
tr( "Connection with name '%1' already exists. Overwrite?" )
.arg( connectionName ),
QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );

switch ( res )
{
case QMessageBox::Cancel:
return;
case QMessageBox::No:
child = child.nextSiblingElement();
continue;
case QMessageBox::Yes:
overwrite = true;
break;
case QMessageBox::YesToAll:
prompt = false;
overwrite = true;
break;
case QMessageBox::NoToAll:
prompt = false;
overwrite = false;
break;
}
}

if ( keys.contains( connectionName ) && !overwrite )
{
child = child.nextSiblingElement();
continue;
}

// no dups detected or overwrite is allowed
settings.beginGroup( "/qgis/connections-" + service.toLower() );
settings.setValue( QString( '/' + connectionName + "/url" ), child.attribute( QStringLiteral( "url" ) ) );
settings.setValue( QString( '/' + connectionName + "/referer" ), child.attribute( QStringLiteral( "referer" ) ) );
settings.endGroup();

settings.beginGroup( "/qgis/" + service.toUpper() + '/' + connectionName );
settings.setValue( QStringLiteral( "/username" ), child.attribute( QStringLiteral( "username" ) ) );
settings.setValue( QStringLiteral( "/password" ), child.attribute( QStringLiteral( "password" ) ) );
settings.setValue( QStringLiteral( "/authcfg" ), child.attribute( QStringLiteral( "authcfg" ) ) );
settings.endGroup();

child = child.nextSiblingElement();
}
}

void QgsManageConnectionsDialog::selectAll()
{
Expand Down
6 changes: 5 additions & 1 deletion src/gui/qgsmanageconnectionsdialog.h
Expand Up @@ -49,7 +49,9 @@ class GUI_EXPORT QgsManageConnectionsDialog : public QDialog, private Ui::QgsMan
WCS,
Oracle,
GeoNode,
XyzTiles
XyzTiles,
ArcgisMapServer,
ArcgisFeatureServer
};

/**
Expand All @@ -74,6 +76,7 @@ class GUI_EXPORT QgsManageConnectionsDialog : public QDialog, private Ui::QgsMan
QDomDocument saveDb2Connections( const QStringList &connections );
QDomDocument saveGeonodeConnections( const QStringList &connections );
QDomDocument saveXyzTilesConnections( const QStringList &connections );
QDomDocument saveArcgisConnections( const QStringList &connections, const QString &service );

void loadOWSConnections( const QDomDocument &doc, const QStringList &items, const QString &service );
void loadWfsConnections( const QDomDocument &doc, const QStringList &items );
Expand All @@ -83,6 +86,7 @@ class GUI_EXPORT QgsManageConnectionsDialog : public QDialog, private Ui::QgsMan
void loadDb2Connections( const QDomDocument &doc, const QStringList &items );
void loadGeonodeConnections( const QDomDocument &doc, const QStringList &items );
void loadXyzTilesConnections( const QDomDocument &doc, const QStringList &items );
void loadArcgisConnections( const QDomDocument &doc, const QStringList &items, const QString &service );

QString mFileName;
Mode mDialogMode;
Expand Down
3 changes: 0 additions & 3 deletions src/providers/arcgisrest/qgsafssourceselect.cpp
Expand Up @@ -29,9 +29,6 @@
QgsAfsSourceSelect::QgsAfsSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode widgetMode )
: QgsArcGisServiceSourceSelect( QStringLiteral( "ARCGISFEATURESERVER" ), QgsArcGisServiceSourceSelect::FeatureService, parent, fl, widgetMode )
{
// import/export of connections not supported yet
btnLoad->hide();
btnSave->hide();
}

bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
Expand Down
4 changes: 0 additions & 4 deletions src/providers/arcgisrest/qgsamssourceselect.cpp
Expand Up @@ -28,10 +28,6 @@
QgsAmsSourceSelect::QgsAmsSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode widgetMode )
: QgsArcGisServiceSourceSelect( QStringLiteral( "ARCGISMAPSERVER" ), QgsArcGisServiceSourceSelect::MapService, parent, fl, widgetMode )
{

// import/export of connections not supported yet
btnLoad->hide();
btnSave->hide();
}

bool QgsAmsSourceSelect::connectToService( const QgsOwsConnection &connection )
Expand Down
24 changes: 24 additions & 0 deletions src/providers/arcgisrest/qgsarcgisservicesourceselect.cpp
Expand Up @@ -63,6 +63,8 @@ QgsArcGisServiceSourceSelect::QgsArcGisServiceSourceSelect( const QString &servi
connect( btnEdit, &QAbstractButton::clicked, this, &QgsArcGisServiceSourceSelect::modifyEntryOfServerList );
connect( btnDelete, &QAbstractButton::clicked, this, &QgsArcGisServiceSourceSelect::deleteEntryOfServerList );
connect( btnConnect, &QAbstractButton::clicked, this, &QgsArcGisServiceSourceSelect::connectToServer );
connect( btnSave, &QPushButton::clicked, this, &QgsArcGisServiceSourceSelect::btnSave_clicked );
connect( btnLoad, &QPushButton::clicked, this, &QgsArcGisServiceSourceSelect::btnLoad_clicked );
connect( btnChangeSpatialRefSys, &QAbstractButton::clicked, this, &QgsArcGisServiceSourceSelect::changeCrs );
connect( lineFilter, &QLineEdit::textChanged, this, &QgsArcGisServiceSourceSelect::filterChanged );
populateConnectionList();
Expand Down Expand Up @@ -460,3 +462,25 @@ void QgsArcGisServiceSourceSelect::showHelp()
{
QgsHelp::openHelp( QStringLiteral( "managing_data_source/index.html" ) );
}

void QgsArcGisServiceSourceSelect::btnSave_clicked()
{
QgsManageConnectionsDialog::Type serverType = mServiceType == FeatureService ? QgsManageConnectionsDialog::ArcgisFeatureServer : QgsManageConnectionsDialog::ArcgisMapServer;
QgsManageConnectionsDialog dlg( this, QgsManageConnectionsDialog::Export, serverType );
dlg.exec();
}

void QgsArcGisServiceSourceSelect::btnLoad_clicked()
{
QString fileName = QFileDialog::getOpenFileName( this, tr( "Load Connections" ), QDir::homePath(),
tr( "XML files (*.xml *.XML)" ) );
if ( fileName.isEmpty() )
{
return;
}

QgsManageConnectionsDialog::Type serverType = mServiceType == FeatureService ? QgsManageConnectionsDialog::ArcgisFeatureServer : QgsManageConnectionsDialog::ArcgisMapServer;
QgsManageConnectionsDialog dlg( this, QgsManageConnectionsDialog::Import, serverType, fileName );
dlg.exec();
populateConnectionList();
}
2 changes: 2 additions & 0 deletions src/providers/arcgisrest/qgsarcgisservicesourceselect.h
Expand Up @@ -126,6 +126,8 @@ class QgsArcGisServiceSourceSelect : public QgsAbstractDataSourceWidget, protect
void showHelp();
void treeWidgetItemDoubleClicked( const QModelIndex &index );
void treeWidgetCurrentRowChanged( const QModelIndex &current, const QModelIndex &previous );
void btnSave_clicked();
void btnLoad_clicked();
};

/**
Expand Down

0 comments on commit 2770c49

Please sign in to comment.