]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/ide/activegrid/util/cachedloader.py
Added the ActiveGrid IDE as a sample application
[wxWidgets.git] / wxPython / samples / ide / activegrid / util / cachedloader.py
diff --git a/wxPython/samples/ide/activegrid/util/cachedloader.py b/wxPython/samples/ide/activegrid/util/cachedloader.py
new file mode 100644 (file)
index 0000000..f0fc69d
--- /dev/null
@@ -0,0 +1,87 @@
+#----------------------------------------------------------------------------
+# Name:         cachedloader.py
+# Purpose:
+#
+# Author:       Joel Hare
+#
+# Created:      8/31/04
+# CVS-ID:       $Id$
+# Copyright:    (c) 2004-2005 ActiveGrid, Inc.
+# License:      wxWindows License
+#----------------------------------------------------------------------------
+
+import copy
+import os.path
+import string
+import cStringIO
+
+import time
+
+# TODO: Instantiate the database and create a pool
+
+
+class CachedLoader(object):
+    def __init__(self):
+        self.cache = {}
+        self.baseLoadDir = None
+        
+    def fullPath(self, fileName):
+        if os.path.isabs(fileName):
+            absPath = fileName
+        elif self.baseLoadDir:
+            absPath = os.path.join(self.baseLoadDir, fileName)
+        else:
+            absPath = os.path.abspath(fileName)
+        return absPath
+        
+    def setPrototype(self, fileName, loadedFile):
+        absPath = self.fullPath(fileName)
+        mtime = time.time() + 31536000.0 # Make sure prototypes aren't replaced by files on disk
+        self.cache[absPath] = (mtime, loadedFile)
+
+    def update(self, loader):
+        self.cache.update(loader.cache)
+        
+    def clear(self):
+        self.cache.clear()
+
+    def delete(self, fileName):
+        absPath = self.fullPath(fileName)
+        del self.cache[absPath]
+        
+    def needsLoad(self, fileName):
+        absPath = self.fullPath(fileName)
+        try:
+            cached = self.cache[absPath]
+            cachedTime = cached[0]
+            if cachedTime >= os.path.getmtime(absPath):
+                return False
+        except KeyError:
+            pass
+        return True
+        
+    def load(self, fileName, loader):
+        absPath = self.fullPath(fileName)
+        loadedFile = None
+        try:
+            cached = self.cache[absPath]
+        except KeyError:
+            cached = None
+    
+        if cached:
+            cachedTime = cached[0]
+            # ToDO We might need smarter logic for checking if a file needs to be reloaded
+            # ToDo We need a way to disable checking if this is a production server
+            if cachedTime >= os.path.getmtime(absPath):
+                loadedFile = cached[1]
+    
+        if not loadedFile:
+            targetFile = file(absPath)
+            try:
+                mtime = os.path.getmtime(absPath)
+                loadedFile = loader(targetFile)
+                self.cache[absPath] = (mtime, loadedFile)
+            finally:
+                targetFile.close()
+        return loadedFile
+