Jelajahi Sumber

directory caching + renaming to proxy4ows

Jachym Cepicky 14 tahun lalu
induk
melakukan
c0ff99e20d
5 mengubah file dengan 72 tambahan dan 26 penghapusan
  1. 66 21
      OWS.py
  2. 3 3
      config.cfg-template
  3. 1 1
      proxy4ows.cgi-template
  4. 1 1
      tests/mapfiles/ows.map
  5. 1 0
      wcs/__init__.py

+ 66 - 21
OWS.py

@@ -16,6 +16,8 @@ from osgeo import osr
 from osgeo import ogr
 import OWSExceptions
 from owslib import crs as CRS
+import shutil
+from xml.etree import ElementTree
 
 class OWS:
 
@@ -35,13 +37,6 @@ class OWS:
 
     def __init__(self,url=None,qstring=None,configFile=None):
         self.requestUrl = url
-        if url:
-            self.url = url
-            logging.debug("OWS.py::__init__()::url: '%s'" % url)
-            self.__getCapabilities()
-        if qstring:
-            self.qstring = qstring
-
         configFiles = [ os.path.join(os.path.dirname(__file__),"config.cfg") ]
 
         if sys.platform == "win32":
@@ -55,12 +50,22 @@ class OWS:
         self.config = ConfigParser.ConfigParser()
         self.config.read(configFiles)
 
-        logging.debug("Creating cachedir for %s in %s" % (self.url,self.config.get("OWSProxy","cachedir")))
+        logging.debug("Creating cachedir for %s in %s" % (self.url,self.config.get("Proxy4OWS","cachedir")))
         logging.debug("%s initialized"%self.service)
 
+        if url:
+            self.url = url
+            logging.debug("OWS.py::__init__()::url: '%s'" % url)
+            self.__getCapabilities()
+        if qstring:
+            self.qstring = qstring
+
+
     def __getCapabilities(self):
+        self.__getCacheDir()
         logging.debug("OWS.py::__getCapabilities::self.url: '%s'" % self.url)
         self.parsedUrl = urlparse.urlparse(self.url)
+
         if self.service == "WFS":
             from owslib.wfs import WebFeatureService
             try:
@@ -73,6 +78,9 @@ class OWS:
             from owslib.wcs import WebCoverageService
             self.capabilities = WebCoverageService(url=self.url,version="1.0.0")
 
+        # cache capabilities document
+        open(os.path.join(self.cachedir,"capabilities.xml"),"w").write(ElementTree.tostring(self.capabilities._capabilities))
+
     def getParams(self):
         params =  urlparse.parse_qs(self.qstring)
 
@@ -120,12 +128,20 @@ class OWS:
 
     def __getCacheDir(self):
         
-        self.cachedir = tempfile.mkdtemp(prefix="%s-%s"%(self.service,
-                                        md5.new(self.url).hexdigest()),
-                                        dir=self.config.get("OWSProxy","cachedir"))
-        os.chmod(self.cachedir,  0777)
-        logging.debug("Cachedir %s created" % self.cachedir)
-        open(os.path.join(self.cachedir,"url.txt"),"w").write(self.url)
+        dirname = os.path.join(self.config.get("Proxy4OWS","cachedir"),
+                                "%s-%s" % (self.service, md5.new(self.url).hexdigest()))
+
+        # get existing cache dir
+        if not os.path.isdir(dirname):
+            os.mkdir(dirname)
+            logging.debug("Cachedir %s created" % dirname)
+            os.chmod(dirname,  0777)
+            open(os.path.join(self.cachedir,"url.txt"),"w").write(self.url)
+        else:
+            logging.debug("Cachedir %s found" % dirname)
+
+        self.cachedir = dirname
+
         return self.cachedir
 
     def dispatch(self):
@@ -166,11 +182,37 @@ class OWS:
 
     def getMapObj(self,mapfilename=None):
 
-        self.__getCacheDir()
 
         if self.url is not None and self.capabilities is None:
             self.__getCapabilities()
 
+        # nothing has changed in the capabilities document since last
+        # request ?
+        if os.path.exists(os.path.join(self.cachedir,"capabilities.xml")):
+            oldCapsFile = open(os.path.join(self.cachedir,"capabilities.xml"))
+            oldCaps = oldCapsFile.read()
+            oldCapsFile.close()
+            # the capabilities document is up-to-date, load existing
+            # mapfile
+            newXml = ElementTree.tostring(self.capabilities._capabilities)
+            if md5.new(oldCaps).hexdigest() == md5.new(newXml).hexdigest():
+                newCapsFile = open(os.path.join(self.cachedir,"capabilities.xml"),"w")
+                newCapsFile.write(newXml)
+                logging.debug("Capabilities unchanged, using existing mapfile %s" % self.getMapfileLocation())
+                return mapscript.mapObj(self.getMapfileLocation())
+
+        # finally
+
+        # clear existing cached files
+        logging.debug("Cached capabilities document is outdated, creating new one")
+        shutil.rmtree(self.cachedir)
+        # reate new one
+        self.__getCacheDir()
+        return self._createNewMapObj(mapfilename)
+
+
+    def _createNewMapObj(self,mapfilename=None):
+
         mapobj = mapscript.mapObj()
 
         mapobj.setMetaData("wms_onlineresource",self.getOnlineResource(self.config.get("MapServer","onlineresource"),mapfilename))
@@ -246,13 +288,16 @@ class OWS:
             if time:
                 time = "<DefaultTime>"+time+"</DefaultTime>"
 
-            open(defFileName,'w').write(
-                    Template(open(templatefile).read()).substitute( 
-                            dict(url= layerurl,
-                                name=name,time=time,extras="&BAND=1,2,3")))
-                            # FIXME always takes band 1,2,3 ^^
+            if not os.path.isfile(defFileName):
+                open(defFileName,'w').write(
+                        Template(open(templatefile).read()).substitute( 
+                                dict(url= layerurl,
+                                    name=name,time=time,extras="&BAND=1,2,3")))
+                                # FIXME always takes band 1,2,3 ^^
 
-            logging.debug("Created %s layer definition file" % defFileName)
+                logging.debug("Created %s layer definition file" % defFileName)
+            else:
+                logging.debug("Using existing layer definition file %s" % defFileName)
 
             return defFileName
 

+ 3 - 3
config.cfg-template

@@ -1,13 +1,13 @@
-[OWSProxy]
+[Proxy4OWS]
 cachedir=/tmp/
 logging=DEBUG
 owslib=/home/jachym/usr/src/owslib/OWSLib/
 
 [MapServer]
-name=owsproxy
+name=proxy4ows
 tempdir=/tmp/
 errorfile=stderr
 imagepath=/tmp/mapserv/
-onlineresource=http://localhost/cgi-bin/owsproxy.cgi
+onlineresource=http://localhost/cgi-bin/proxy4ows.cgi
 srs=EPSG:4326 EPSG:102067 EPSG:900913 EPSG:3035 EPSG:3857 EPSG:900913
 

+ 1 - 1
owsproxy.cgi-template → proxy4ows.cgi-template

@@ -4,7 +4,7 @@
 #import rpdb2; rpdb2.start_embedded_debugger("lucerna")
 
 # import sys
-# sys.path.append("/path/to/owsproxy/")
+# sys.path.append("/path/to/proxy4ows/")
 
 import OWS
 import logging

+ 1 - 1
tests/mapfiles/ows.map

@@ -16,7 +16,7 @@ WEB
     "ows_enable_request" "*"
     "ows_updatesequence" "2011-29-05T00:24:00"
     "ows_srs"               "EPSG:4326 EPSG:3035"  ## Recommended
-    "ows_abstract"      "OWS Server for OWSProxy testing purposes"
+    "ows_abstract"      "OWS Server for Proxy4OWS testing purposes"
   END
 END
 

+ 1 - 0
wcs/__init__.py

@@ -57,6 +57,7 @@ class WCS(OWS):
                 lyrobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
                 extent = None
                 # processing
+                import sys
                 if layer.crsOptions:
                     lyrobj.setProjection(layer.crsOptions[0].getcode())
                     extent = self.getLayerExtent(layer,layer.crsOptions[0])