[z3-checkins] r33117 - z3/deliverance/branches/packaged/deliverance

ltucker at codespeak.net ltucker at codespeak.net
Tue Oct 10 17:44:05 CEST 2006


Author: ltucker
Date: Tue Oct 10 17:44:03 2006
New Revision: 33117

Modified:
   z3/deliverance/branches/packaged/deliverance/wsgifilter.py
Log:
refactor simple caching

Modified: z3/deliverance/branches/packaged/deliverance/wsgifilter.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/wsgifilter.py	(original)
+++ z3/deliverance/branches/packaged/deliverance/wsgifilter.py	Tue Oct 10 17:44:03 2006
@@ -26,30 +26,50 @@
         self.app = app
         self.theme_uri = theme_uri
         self.rule_uri = rule_uri
-        self._theme = None
-        self._rule = None
         self._renderer = None
         self._cache_time = datetime.datetime.now()
         self._timeout = datetime.timedelta(0,10)
         self._lock = threading.Lock()
 
+
+    def get_renderer(self,environ):
+        try:
+            self._lock.acquire()
+            if not self._renderer or self.cache_expired():
+                print "rebuild renderer"
+                self._renderer = self.create_renderer(environ)
+                self._cache_time = datetime.datetime.now()
+            return self._renderer
+        finally:
+            self._lock.release()
+
+    def create_renderer(self,environ):
+        theme = self.theme(environ)
+        rule = self.rule(environ)
+        full_theme_uri = urlparse.urljoin(
+            construct_url(environ, with_path_info=False),
+            self.theme_uri)
+
+        def reference_resolver(href, parse, encoding=None):
+            text = self.get_resource(environ,href)
+            if parse == "xml":
+                return etree.XML(text)
+            elif encoding:
+                return text.decode(encoding)
+
+        return Renderer(etree.HTML(theme), full_theme_uri, etree.XML(rule), 
+                        reference_resolver=reference_resolver)
+
+        
     def cache_expired(self):
         return self._cache_time + self._timeout < datetime.datetime.now()
 
     def rule(self, environ):
-        if self._rule is None or self.cache_expired():
-            self._cache_time = datetime.datetime.now()
-            self._renderer = None
-            self._rule = self.get_resource(environ, self.rule_uri)
-        return self._rule
+        return self.get_resource(environ,self.rule_uri)
 
     def theme(self, environ):
-        if self._theme is None or self.cache_expired():
-            self._cache_time = datetime.datetime.now()
-            self._renderer = None
-            self._theme = self.get_resource(environ, self.theme_uri)
-        return self._theme
-        
+        return self.get_resource(environ,self.theme_uri)
+
     def __call__(self, environ, start_response):
         qs = environ.get('QUERY_STRING', '')
         environ[DELIVERANCE_BASE_URL] = construct_url(environ, with_path_info=False)
@@ -77,32 +97,8 @@
         return type.startswith('text/html') or type.startswith('application/xhtml+xml')
 
     def filter_body(self, environ, body):
-        try:
-            self._lock.acquire()
-            theme = self.theme(environ)
-            rule = self.rule(environ)
-            full_theme_uri = urlparse.urljoin(
-                construct_url(environ, with_path_info=False),
-                self.theme_uri)
-
-            def reference_resolver(href, parse, encoding=None):
-                text = self.get_resource(environ,href)
-                if parse == "xml":
-                    return etree.XML(text)
-                elif encoding:
-                    return text.decode(encoding)
-
-            if not self._renderer:
-                self._renderer = Renderer(etree.HTML(theme), full_theme_uri, etree.XML(rule), 
-                                          reference_resolver=reference_resolver)
-
-            content = self._renderer.render(etree.HTML(body))
+            content = self.get_renderer(environ).render(etree.HTML(body))
             return tostring(content)
-        finally:
-                self._lock.release()
-
-
-
 
     def get_resource(self, environ, uri):
         internalBaseURL = environ.get(DELIVERANCE_BASE_URL,None)


More information about the z3-checkins mailing list