[CalendarServer-changes] [4892] CalendarServer/trunk/twistedcaldav/directory

source_changes at macosforge.org source_changes at macosforge.org
Wed Dec 23 12:11:57 PST 2009


Revision: 4892
          http://trac.macosforge.org/projects/calendarserver/changeset/4892
Author:   glyph at apple.com
Date:     2009-12-23 12:11:53 -0800 (Wed, 23 Dec 2009)
Log Message:
-----------
Cache the principal resources created from the directory so that subsequent resources will compare the same if their records compare the same.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py

Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/principal.py	2009-12-23 19:13:47 UTC (rev 4891)
+++ CalendarServer/trunk/twistedcaldav/directory/principal.py	2009-12-23 20:11:53 UTC (rev 4892)
@@ -35,6 +35,8 @@
 from urllib import unquote
 from urlparse import urlparse
 
+from weakref import WeakValueDictionary
+
 from twisted.cred.credentials import UsernamePassword
 from twisted.python.failure import Failure
 from twisted.internet.defer import inlineCallbacks, returnValue
@@ -441,6 +443,7 @@
         )
 
         self.parent = parent
+        self._principalResourceCache = WeakValueDictionary()
 
     def principalForUID(self, uid):
         return self.parent.principalForUID(uid)
@@ -452,10 +455,13 @@
         if record is None:
             return None
 
+        if record in self._principalResourceCache:
+            return self._principalResourceCache[record]
         if record.enabledForCalendaring:
             principal = DirectoryCalendarPrincipalResource(self, record)
         else:
             principal = DirectoryPrincipalResource(self, record)
+        self._principalResourceCache[record] = principal
         return principal
 
     ##

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2009-12-23 19:13:47 UTC (rev 4891)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2009-12-23 20:11:53 UTC (rev 4892)
@@ -187,6 +187,19 @@
             self.failIf(principal is None)
             self.assertEquals(record, principal.record)
 
+
+    def test_principalForUIDCache(self):
+        """
+        L{DirectoryPrincipalUIDProvisioningResource.principalForUID} should
+        return an identical principal resource when passed the same principal.
+        """
+        for provisioningResource, recordType, recordResource, record in self._allRecords():
+            principal = provisioningResource.principalForRecord(record)
+            principal2 = provisioningResource.principalForRecord(record)
+            self.assertIdentical(principal, principal2,
+                                 ("mismatch from %s" % (provisioningResource,)))
+
+
     def test_principalForRecord(self):
         """
         DirectoryPrincipalProvisioningResource.principalForRecord()
@@ -476,13 +489,12 @@
                     self.fail("%s should have %s privilege on %r" % (principal.sname(), privilege.sname(), resource))
                 d.addErrback(onError)
             else:
-                def onError(f):
+                def expectAccessDenied(f):
                     f.trap(AccessDeniedError)
                 def onSuccess(_):
                     #print resource.readDeadProperty(davxml.ACL)
                     self.fail("%s should not have %s privilege on %r" % (principal.sname(), privilege.sname(), resource))
-                d.addCallback(onSuccess)
-                d.addErrback(onError)
+                d.addCallbacks(onSuccess, expectAccessDenied)
             return d
 
         d = request.locateResource(url)
@@ -492,12 +504,8 @@
 def _authReadOnlyPrivileges(self, resource, url):
     items = []
     for provisioningResource, recordType, recordResource, record in self._allRecords():
-        if recordResource == resource:
-            items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Read()  , True ))
-            items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Write() , True ))
-        else:
-            items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Read()  , True ))
-            items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Write() , False ))
+        items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Read()  , True ))
+        items.append(( davxml.HRef().fromString(recordResource.principalURL()), davxml.Write() , False ))
     items.append(( davxml.Unauthenticated() , davxml.Read()  , False ))
     items.append(( davxml.Unauthenticated() , davxml.Write() , False ))
             
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20091223/2e30e743/attachment.html>


More information about the calendarserver-changes mailing list