1616"""
1717
1818import re
19+ import time
20+ import glob
21+
22+ import os
23+ from xml .etree .ElementTree import ParseError
24+ from urllib2 import urlopen , URLError
25+
1926from owslib .wms import WebMapService
2027from owslib .wfs import WebFeatureService
2128
2229from owslib .wmts import WebMapTileService
2330from owslib .util import ServiceException
2431from qgis .core import QgsMessageLog , QgsApplication
2532
26- import os .path
27- from xml .etree .ElementTree import ParseError
28- from urllib2 import urlopen , URLError
29-
3033from PyQt4 .QtCore import QSettings
3134#from gc import isenabled
3235
@@ -100,7 +103,9 @@ def __init__(self, domain=None, service=None, file=None):
100103 self .file = file
101104 if self .service :
102105 self .file = os .path .join (self .pl_settings_dir ,
103- '{0}_{1}.xml' .format (domain , service .lower ()))
106+ '{0}_{1}_{2}.xml' .format (domain ,
107+ service .lower (),
108+ time .strftime ("%Y%m%d%H%M%S" )))
104109
105110 def ensureSettingsDir (self ):
106111 """
@@ -133,6 +138,7 @@ def delDomainsXML(self, domain):
133138 if not domain :
134139 domain = self .domain
135140
141+ # Should use glob for consistency and simplicity
136142 dir = self .pl_settings_dir
137143 for f in os .listdir (self .pl_settings_dir ):
138144 if re .search (domain , f ):
@@ -149,24 +155,66 @@ def delAllLocalServiceXML(self, services=['wms','wfs','wmts']):
149155
150156 search_str = '|' .join (['_{}.xml' .format (x ) for x in services ])
151157
158+ # Should use glob for consistency and simplicity
152159 dir = self .pl_settings_dir
153160 for f in os .listdir (self .pl_settings_dir ):
154161 if re .search (search_str , f ):
155162 file = os .path .join (dir , f )
156163 self .delLocalSeviceXML (file )
157164
165+ def purgeCache (self ):
166+ """
167+ Delete all cached documents but the
168+ most current
169+ """
170+ file_metadata = {}
171+ os .chdir (self .pl_settings_dir )
172+ cache_files = glob .glob ('*_*_[0-9]*.xml' )
173+
174+ # Get cache metadata
175+ for f in cache_files :
176+ file_data = re .search (r'(?P<domain>.*)(_)(?P<service>wms|wmts|wfs)(_)(?P<time>[0-9]+)\.xml' , f )
177+ domain = file_data .group ('domain' )
178+ service = file_data .group ('service' )
179+ timestamp = file_data .group ('time' )
180+ if domain not in file_metadata :
181+ file_metadata [domain ]= {}
182+ if service not in file_metadata [domain ]:
183+ file_metadata [domain ][service ]= []
184+ file_metadata [domain ][service ].append (timestamp )
185+
186+ # get list of most current
187+ curr_files = []
188+ for dom , v in file_metadata .iteritems ():
189+ for ser , file_times in v .iteritems ():
190+ curr_files .append ('{0}_{1}_{2}.xml' .format (dom ,
191+ ser ,
192+ sorted (file_times )[- 1 ]))
193+
194+ # del old files
195+ for file in cache_files :
196+ if file not in curr_files :
197+ self .delLocalSeviceXML (file )
198+
158199 def serviceXmlIsLocal (self , file = None ):
159200 """
160201 Test if the cached capabilties xml doc exists
202+ and if so set the services file to match this
203+
161204 :param file: file name
162205 :type file: str
163206 @return: boolean. True file exists
164207 @rtype: boolean
165208 """
166209
167210 if not file :
168- file = self .file
169- return os .path .isfile (file )
211+ os .chdir (self .pl_settings_dir )
212+ files = glob .glob ('{0}_{1}_*.xml' .format (self .domain ,
213+ self .service .lower ()))
214+ if files :
215+ self .file = sorted (files )[- 1 ]
216+ return True
217+ return False
170218
171219 def readLocalServiceXml (self , file = None ):
172220 """
@@ -186,7 +234,7 @@ class ServiceData(Localstore):
186234 Get, Store and Process WxS Data
187235 """
188236
189- def __init__ (self , domain , service , service_version , api_key_instance ):
237+ def __init__ (self , domain , service , service_version , api_key_instance , upd_cache = False ):
190238 """
191239 Initialise Service Data instance
192240
@@ -202,6 +250,7 @@ def __init__(self, domain, service, service_version, api_key_instance):
202250
203251 self .version = service_version [service ]
204252 self .api_key_int = api_key_instance # using one instance as the user can change keys on us
253+ self .upd_cache = upd_cache
205254 Localstore .__init__ (self , domain , service )
206255 # Data
207256 self .obj = None #owslib data obj
@@ -231,7 +280,13 @@ def getServiceData(self):
231280 Either via localstore or internet
232281 """
233282
234- # Get service xml
283+ # If cache get new data and overwrite local store
284+ if self .upd_cache :
285+ self .getServiceXml ()
286+ return
287+
288+ # Plugin opened for first time
289+ # Read data from local store if exists
235290 if self .serviceXmlIsLocal ():
236291 self .readLocalServiceXml ()
237292 else :
@@ -240,10 +295,10 @@ def getServiceData(self):
240295 def getServiceDataTryAgain (self ):
241296 """
242297 If the reading of the capability doc fails - Try again.
243- This is for use cases where for some reason the user
244- has corrupted the capability doc in the localstore
298+ This is for use cases where for some reason the capability
299+ doc in the localstore has become corrupted
245300 """
246-
301+
247302 #Clear error, Delete local file and get it a fresh
248303 self .err = None
249304 self .delLocalSeviceXML ()
0 commit comments