Skip to content

Commit 1018c91

Browse files
committedNov 10, 2014
use connection name in wms,wfs,wcs data item path instead of uri, group ows servers by connection name instead of uri
1 parent cb9bd88 commit 1018c91

File tree

11 files changed

+116
-61
lines changed

11 files changed

+116
-61
lines changed
 

‎python/core/qgsdataitem.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class QgsDataItem : QObject
8282
QIcon icon() const;
8383
QString name() const;
8484
QString path() const;
85+
void setPath( const QString );
8586

8687
void setIcon( QIcon icon );
8788

‎src/core/qgsbrowsermodel.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,6 @@ QModelIndex QgsBrowserModel::findPath( QString path, Qt::MatchFlag matchFlag )
280280
{
281281
foundChild = false; // assume that the next child item will not be found
282282

283-
int bestLength = 0;
284-
QModelIndex bestIndex;
285283
for ( int i = 0; i < rowCount( theIndex ); i++ )
286284
{
287285
QModelIndex idx = index( i, 0, theIndex );
@@ -295,18 +293,19 @@ QModelIndex QgsBrowserModel::findPath( QString path, Qt::MatchFlag matchFlag )
295293
return idx; // we have found the item we have been looking for
296294
}
297295

298-
// not yet perfect, e.g. if a directory was deleted, it can jump to another one which starts with the same name
299-
// but be careful, there are no common path separators, for example WMS contains slashes in its name
300-
if ( path.startsWith( item->path() ) && item->path().length() > bestLength )
296+
// paths are slash separated identifier
297+
if ( path.startsWith( item->path() + "/" ) )
301298
{
302-
// we have found a preceding item: stop searching on this level and go deeper
299+
// We have found a preceding item: stop searching on this level and go deeper.
300+
// Currently some providers (e.g. Postgres) are using multithread in
301+
// QgsDataItem::createChildren(), i.e. we cannot get to children here as they
302+
// are not yet created by separate thread
303303
item->populate();
304304
foundChild = true;
305-
bestIndex = idx;
306-
bestLength = item->path().length();
305+
theIndex = idx;
306+
break;
307307
}
308308
}
309-
theIndex = bestIndex;
310309
}
311310

312311
if ( matchFlag == Qt::MatchStartsWith )

‎src/core/qgsdataitem.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class CORE_EXPORT QgsDataItem : public QObject
119119
QIcon icon() const { return mIcon; }
120120
QString name() const { return mName; }
121121
QString path() const { return mPath; }
122+
void setPath( const QString path ) { mPath = path; }
122123

123124
void setIcon( QIcon icon ) { mIcon = icon; }
124125

@@ -132,7 +133,11 @@ class CORE_EXPORT QgsDataItem : public QObject
132133
QVector<QgsDataItem*> mChildren; // easier to have it always
133134
bool mPopulated;
134135
QString mName;
135-
QString mPath; // it is also used to identify item in tree
136+
// Path is slash ('/') separated chain of item identifiers which are usually item names, but may be differen if it is
137+
// necessary to distinguish paths of two providers to the same source (e.g GRASS location and standard directory have the same
138+
// name but different paths). Identifiers in path must not contain '/' characters.
139+
// The path is used to identify item in tree.
140+
QString mPath;
136141
QString mToolTip;
137142
QIcon mIcon;
138143

‎src/providers/ows/qgsowsdataitems.cpp

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,19 @@ QVector<QgsDataItem*> QgsOWSConnectionItem::createChildren()
3939
{
4040
QgsDebugMsg( "Entered" );
4141
QVector<QgsDataItem*> children;
42-
QVector<QgsDataItem*> serviceItems;
42+
QMap<QgsDataItem*, QString> serviceItems; // service/provider key
4343

4444
int layerCount = 0;
4545
// Try to open with WMS,WFS,WCS
46-
foreach ( QString key, QStringList() << "wms" << "WFS" << "gdal" )
46+
foreach ( QString key, QStringList() << "wms" << "WFS" << "wcs" )
4747
{
4848
QgsDebugMsg( "Add connection for provider " + key );
4949
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( key );
5050
if ( !library )
51+
{
52+
QgsDebugMsg( "Cannot get provider " + key );
5153
continue;
54+
}
5255

5356
dataItem_t * dItem = ( dataItem_t * ) cast_to_fptr( library->resolve( "dataItem" ) );
5457
if ( !dItem )
@@ -57,47 +60,65 @@ QVector<QgsDataItem*> QgsOWSConnectionItem::createChildren()
5760
continue;
5861
}
5962

60-
QgsDataItem *item = dItem( mPath, this ); // empty path -> top level
63+
QString path = key.toLower() + ":/" + name();
64+
QgsDebugMsg( "path = " + path );
65+
QgsDataItem *item = dItem( path, this ); // empty path -> top level
6166
if ( !item )
67+
{
68+
QgsDebugMsg( "Connection not found by provider" );
6269
continue;
70+
}
6371

6472
item->populate();
6573

6674
layerCount += item->rowCount();
6775
if ( item->rowCount() > 0 )
6876
{
6977
QgsDebugMsg( "Add new item : " + item->name() );
70-
serviceItems.append( item );
78+
serviceItems.insert( item, key );
7179
}
7280
else
7381
{
7482
//delete item;
7583
}
7684
}
7785

78-
foreach ( QgsDataItem* item, serviceItems )
86+
foreach ( QgsDataItem* item, serviceItems.keys() )
7987
{
8088
QgsDebugMsg( QString( "serviceItems.size = %1 layerCount = %2 rowCount = %3" ).arg( serviceItems.size() ).arg( layerCount ).arg( item->rowCount() ) );
89+
QString providerKey = serviceItems.value( item );
8190
if ( serviceItems.size() == 1 || layerCount <= 30 || item->rowCount() <= 10 )
8291
{
8392
// Add layers directly to OWS connection
8493
foreach ( QgsDataItem* subItem, item->children() )
8594
{
8695
item->removeChildItem( subItem );
8796
subItem->setParent( this );
97+
replacePath( subItem, providerKey.toLower() + ":/", "ows:/" );
8898
children.append( subItem );
8999
}
90100
delete item;
91101
}
92102
else // Add service
93103
{
104+
replacePath( item, item->path(), path() + "/" + providerKey.toLower() );
94105
children.append( item );
95106
}
96107
}
97108

98109
return children;
99110
}
100111

112+
// reset path recursively
113+
void QgsOWSConnectionItem::replacePath( QgsDataItem* item, QString before, QString after )
114+
{
115+
item->setPath( item->path().replace( before, after ) );
116+
foreach ( QgsDataItem* subItem, item->children() )
117+
{
118+
replacePath( subItem, before, after );
119+
}
120+
}
121+
101122
bool QgsOWSConnectionItem::equal( const QgsDataItem *other )
102123
{
103124
if ( type() != other->type() )
@@ -166,25 +187,20 @@ QVector<QgsDataItem*> QgsOWSRootItem::createChildren()
166187
QgsDebugMsg( "Entered" );
167188
QVector<QgsDataItem*> connections;
168189
// Combine all WMS,WFS,WCS connections
169-
QMap<QString, QStringList> uris;
190+
QStringList connNames;
170191
foreach ( QString service, QStringList() << "WMS" << "WFS" << "WCS" )
171192
{
172193
foreach ( QString connName, QgsOWSConnection::connectionList( service ) )
173194
{
174-
QgsOWSConnection connection( service, connName );
175-
176-
QString encodedUri = connection.uri().encodedUri();
177-
QStringList labels = uris.value( encodedUri );
178-
if ( !labels.contains( connName ) )
195+
if ( !connNames.contains( connName ) )
179196
{
180-
labels << connName;
197+
connNames << connName;
181198
}
182-
uris[encodedUri] = labels;
183199
}
184200
}
185-
foreach ( QString encodedUri, uris.keys() )
201+
foreach ( QString connName, connNames )
186202
{
187-
QgsDataItem * conn = new QgsOWSConnectionItem( this, uris.value( encodedUri ).join( " / " ), encodedUri );
203+
QgsDataItem * conn = new QgsOWSConnectionItem( this, connName, "ows:/" + connName );
188204
connections.append( conn );
189205
}
190206
return connections;

‎src/providers/ows/qgsowsdataitems.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class QgsOWSConnectionItem : public QgsDataCollectionItem
3232
public slots:
3333
void editConnection();
3434
void deleteConnection();
35+
36+
private:
37+
void replacePath( QgsDataItem* item, QString before, QString after );
3538
};
3639

3740
class QgsOWSRootItem : public QgsDataCollectionItem

‎src/providers/wcs/qgswcsdataitems.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
#include <QFileInfo>
2525
#include <QSettings>
2626

27-
QgsWCSConnectionItem::QgsWCSConnectionItem( QgsDataItem* parent, QString name, QString path )
27+
QgsWCSConnectionItem::QgsWCSConnectionItem( QgsDataItem* parent, QString name, QString path , QString uri )
2828
: QgsDataCollectionItem( parent, name, path )
29+
, mUri( uri )
2930
{
3031
mIcon = QgsApplication::getThemeIcon( "mIconWcs.svg" );
3132
}
@@ -40,10 +41,9 @@ QVector<QgsDataItem*> QgsWCSConnectionItem::createChildren()
4041
QgsDebugMsg( "Entered" );
4142
QVector<QgsDataItem*> children;
4243

43-
QString encodedUri = mPath;
4444
QgsDataSourceURI uri;
45-
uri.setEncodedUri( encodedUri );
46-
QgsDebugMsg( "encodedUri = " + encodedUri );
45+
uri.setEncodedUri( mUri );
46+
QgsDebugMsg( "mUri = " + mUri );
4747

4848
mCapabilities.setUri( uri );
4949

@@ -234,9 +234,8 @@ QVector<QgsDataItem*>QgsWCSRootItem::createChildren()
234234
QVector<QgsDataItem*> connections;
235235
foreach ( QString connName, QgsOWSConnection::connectionList( "WCS" ) )
236236
{
237-
//QgsDataItem * conn = new QgsWCSConnectionItem( this, connName, mPath + "/" + connName );
238237
QgsOWSConnection connection( "WCS", connName );
239-
QgsDataItem * conn = new QgsWCSConnectionItem( this, connName, connection.uri().encodedUri() );
238+
QgsDataItem * conn = new QgsWCSConnectionItem( this, connName, mPath + "/" + connName, connection.uri().encodedUri() );
240239

241240
conn->setIcon( QgsApplication::getThemeIcon( "mIconConnect.png" ) );
242241
connections.append( conn );
@@ -298,9 +297,18 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
298297
return new QgsWCSRootItem( parentItem, "WCS", "wcs:" );
299298
}
300299

301-
// OWS server
302-
QgsDebugMsg( "connection found in uri" );
303-
return new QgsWCSConnectionItem( parentItem, "WCS", thePath );
300+
// path schema: wcs:/connection name (used by OWS)
301+
if ( thePath.startsWith( "wcs:/" ) )
302+
{
303+
QString connectionName = thePath.split( '/' ).last();
304+
if ( QgsOWSConnection::connectionList( "WCS" ).contains( connectionName ) )
305+
{
306+
QgsOWSConnection connection( "WCS", connectionName );
307+
return new QgsWCSConnectionItem( parentItem, "WCS", thePath, connection.uri().encodedUri() );
308+
}
309+
}
310+
311+
return 0;
304312
}
305313

306314
QGISEXTERN QgsWCSSourceSelect * selectWidget( QWidget * parent, Qt::WindowFlags fl )

‎src/providers/wcs/qgswcsdataitems.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class QgsWCSConnectionItem : public QgsDataCollectionItem
2323
{
2424
Q_OBJECT
2525
public:
26-
QgsWCSConnectionItem( QgsDataItem* parent, QString name, QString path );
26+
QgsWCSConnectionItem( QgsDataItem* parent, QString name, QString path, QString uri );
2727
~QgsWCSConnectionItem();
2828

2929
QVector<QgsDataItem*> createChildren();
@@ -37,6 +37,9 @@ class QgsWCSConnectionItem : public QgsDataCollectionItem
3737
public slots:
3838
void editConnection();
3939
void deleteConnection();
40+
41+
private:
42+
QString mUri;
4043
};
4144

4245
// WCS Layers may be nested, so that they may be both QgsDataCollectionItem and QgsLayerItem

‎src/providers/wfs/qgswfsdataitems.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ QgsWFSLayerItem::~QgsWFSLayerItem()
3838

3939
////
4040

41-
QgsWFSConnectionItem::QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path )
42-
: QgsDataCollectionItem( parent, name, path ), mName( name ), mCapabilities( NULL )
41+
QgsWFSConnectionItem::QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path , QString uri )
42+
: QgsDataCollectionItem( parent, name, path )
43+
, mUri( uri )
4344
{
4445
mIcon = QgsApplication::getThemeIcon( "mIconWfs.svg" );
4546
}
@@ -52,12 +53,11 @@ QVector<QgsDataItem*> QgsWFSConnectionItem::createChildren()
5253
{
5354
mGotCapabilities = false;
5455

55-
QString encodedUri = mPath;
5656
QgsDataSourceURI uri;
57-
uri.setEncodedUri( encodedUri );
58-
QgsDebugMsg( "encodedUri = " + encodedUri );
57+
uri.setEncodedUri( mUri );
58+
QgsDebugMsg( "mUri = " + mUri );
5959

60-
mCapabilities = new QgsWFSCapabilities( encodedUri );
60+
mCapabilities = new QgsWFSCapabilities( mUri );
6161
connect( mCapabilities, SIGNAL( gotCapabilities() ), this, SLOT( gotCapabilities() ) );
6262

6363
mCapabilities->requestCapabilities();
@@ -153,7 +153,8 @@ QVector<QgsDataItem*> QgsWFSRootItem::createChildren()
153153
foreach ( QString connName, QgsOWSConnection::connectionList( "WFS" ) )
154154
{
155155
QgsOWSConnection connection( "WFS", connName );
156-
QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, connection.uri().encodedUri() );
156+
QString path = "wfs:/" + connName;
157+
QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, path, connection.uri().encodedUri() );
157158
conn->setIcon( QgsApplication::getThemeIcon( "mIconConnect.png" ) );
158159
connections.append( conn );
159160
}
@@ -214,5 +215,16 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
214215
return new QgsWFSRootItem( parentItem, "WFS", "wfs:" );
215216
}
216217

217-
return new QgsWFSConnectionItem( parentItem, "WFS", thePath );
218+
// path schema: wfs:/connection name (used by OWS)
219+
if ( thePath.startsWith( "wfs:/" ) )
220+
{
221+
QString connectionName = thePath.split( '/' ).last();
222+
if ( QgsOWSConnection::connectionList( "WFS" ).contains( connectionName ) )
223+
{
224+
QgsOWSConnection connection( "WFS", connectionName );
225+
return new QgsWFSConnectionItem( parentItem, "WMS", thePath, connection.uri().encodedUri() );
226+
}
227+
}
228+
229+
return 0;
218230
}

‎src/providers/wfs/qgswfsdataitems.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class QgsWFSRootItem : public QgsDataCollectionItem
3434

3535
public slots:
3636
void connectionsChanged();
37-
3837
void newConnection();
3938
};
4039

@@ -44,7 +43,7 @@ class QgsWFSConnectionItem : public QgsDataCollectionItem
4443
{
4544
Q_OBJECT
4645
public:
47-
QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path );
46+
QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path, QString uri );
4847
~QgsWFSConnectionItem();
4948

5049
QVector<QgsDataItem*> createChildren();
@@ -59,7 +58,7 @@ class QgsWFSConnectionItem : public QgsDataCollectionItem
5958
void deleteConnection();
6059

6160
private:
62-
QString mName;
61+
QString mUri;
6362

6463
QgsWFSCapabilities* mCapabilities;
6564
bool mGotCapabilities;

‎src/providers/wms/qgswmsdataitems.cpp

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
#include "qgsapplication.h"
2929

3030
// ---------------------------------------------------------------------------
31-
QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path )
31+
QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path, QString uri )
3232
: QgsDataCollectionItem( parent, name, path )
33+
, mUri( uri )
3334
{
3435
mIcon = QgsApplication::getThemeIcon( "mIconWms.svg" );
3536
}
@@ -43,9 +44,8 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
4344
QgsDebugMsg( "Entered" );
4445
QVector<QgsDataItem*> children;
4546

46-
QString encodedUri = mPath;
4747
QgsDataSourceURI uri;
48-
uri.setEncodedUri( encodedUri );
48+
uri.setEncodedUri( mUri );
4949
#if 0
5050
if ( mPath.contains( "url=" ) )
5151
{
@@ -59,10 +59,10 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
5959
encodedUri = uri.encodedUri();
6060
}
6161
#endif
62-
QgsDebugMsg( "encodedUri = " + encodedUri );
62+
QgsDebugMsg( "mUri = " + mUri );
6363

6464
QgsWmsSettings wmsSettings;
65-
if ( !wmsSettings.parseUri( encodedUri ) )
65+
if ( !wmsSettings.parseUri( mUri ) )
6666
{
6767
children.append( new QgsErrorItem( this, tr( "Failed to parse WMS URI" ), mPath + "/error" ) );
6868
return children;
@@ -259,11 +259,7 @@ QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString pat
259259
mChildren.append( layer );
260260
}
261261

262-
if ( mChildren.isEmpty() )
263-
{
264-
//mIcon = iconRaster();
265-
mIcon = QgsApplication::getThemeIcon( "mIconWms.svg" );
266-
}
262+
mIcon = QgsApplication::getThemeIcon( "mIconWms.svg" );
267263

268264
mPopulated = true;
269265
}
@@ -378,9 +374,8 @@ QVector<QgsDataItem*> QgsWMSRootItem::createChildren()
378374

379375
foreach ( QString connName, QgsWMSConnection::connectionList() )
380376
{
381-
//QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName );
382377
QgsWMSConnection connection( connName );
383-
QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, connection.uri().encodedUri() );
378+
QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName, connection.uri().encodedUri() );
384379

385380
conn->setIcon( QgsApplication::getThemeIcon( "mIconConnect.png" ) );
386381
connections.append( conn );
@@ -441,11 +436,22 @@ QGISEXTERN int dataCapabilities()
441436

442437
QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
443438
{
439+
QgsDebugMsg( "thePath = " + thePath );
444440
if ( thePath.isEmpty() )
445441
{
446442
return new QgsWMSRootItem( parentItem, "WMS", "wms:" );
447443
}
448444

449-
// The path should contain encoded connection URI
450-
return new QgsWMSConnectionItem( parentItem, "WMS", thePath );
445+
// path schema: wms:/connection name (used by OWS)
446+
if ( thePath.startsWith( "wms:/" ) )
447+
{
448+
QString connectionName = thePath.split( '/' ).last();
449+
if ( QgsWMSConnection::connectionList().contains( connectionName ) )
450+
{
451+
QgsWMSConnection connection( connectionName );
452+
return new QgsWMSConnectionItem( parentItem, "WMS", thePath, connection.uri().encodedUri() );
453+
}
454+
}
455+
456+
return 0;
451457
}

‎src/providers/wms/qgswmsdataitems.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class QgsWMSConnectionItem : public QgsDataCollectionItem
2323
{
2424
Q_OBJECT
2525
public:
26-
QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path );
26+
QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path, QString uri );
2727
~QgsWMSConnectionItem();
2828

2929
QVector<QgsDataItem*> createChildren();
@@ -34,6 +34,9 @@ class QgsWMSConnectionItem : public QgsDataCollectionItem
3434
public slots:
3535
void editConnection();
3636
void deleteConnection();
37+
38+
private:
39+
QString mUri;
3740
};
3841

3942
// WMS Layers may be nested, so that they may be both QgsDataCollectionItem and QgsLayerItem

0 commit comments

Comments
 (0)
Please sign in to comment.