Skip to content

Commit

Permalink
Merged from trunk:
Browse files Browse the repository at this point in the history
  r26391 | jim | 2004-07-10 08:47:23 -0400 (Sat, 10 Jul 2004) | 6 lines

Added caching of the adapter_hook method used for simple adapter
lookup.

This provides about a 10% speedup in my test case and should simplify
debugging a little bit.
  • Loading branch information
Jim Fulton committed Jul 10, 2004
1 parent 9adb59f commit e464d72
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 22 deletions.
69 changes: 69 additions & 0 deletions configure.zcml
@@ -0,0 +1,69 @@
<configure xmlns="http://namespaces.zope.org/zope">

<serviceType
id="Utilities"
interface="zope.component.interfaces.IUtilityService" />

<service
serviceType="Utilities"
permission="zope.Public"
factory="zope.component.utility.GlobalUtilityService" />

<serviceType
id="Adapters"
interface="zope.component.interfaces.IAdapterService" />

<service
serviceType="Adapters"
permission="zope.Public"
factory="zope.component.adapter.GlobalAdapterService" />

<serviceType
id="Presentation"
interface="zope.component.interfaces.IPresentationService" />

<service
serviceType="Presentation"
permission="zope.Public"
factory="zope.component.presentation.GlobalPresentationService" />

<vocabulary
name="Interfaces"
factory="zope.app.utility.vocabulary.UtilityVocabulary"
interface="zope.interface.interfaces.IInterface" />

<hook
module="zope.component"
name="getServices"
implementation="zope.app.component.hooks.getServices_hook" />

<hook
module="zope.component"
name="adapter_hook"
implementation="zope.app.component.hooks.adapter_hook" />

<hook
module="zope.component"
name="queryView"
implementation="zope.app.component.hooks.queryView" />

<interface interface="zope.interface.Interface" />

<adapter
factory=".localservice.serviceServiceAdapter"
provides="zope.component.IServiceService"
for="zope.interface.Interface" />

<subscriber
factory=".localservice.threadSiteSubscriber"
for="zope.app.publication.interfaces.IBeforeTraverseEvent"
/>

<subscriber
factory=".localservice.clearThreadSiteSubscriber"
for="zope.app.publication.interfaces.IEndRequestEvent"
/>

</configure>


64 changes: 42 additions & 22 deletions hooks.py
Expand Up @@ -27,41 +27,56 @@
from zope.app.location import locate
from zope.component.servicenames import Presentation
from zope.interface import Interface
from zope.component.servicenames import Adapters
import warnings
import zope.thread

siteinfo = zope.thread.local()
class read_property(object):
def __init__(self, func):
self.func = func

def __get__(self, inst, cls):
if inst is None:
return self

return self.func(inst)

class SiteInfo(zope.thread.local):
site = None
services = serviceManager

def adapter_hook(self):
services = self.services
adapters = services.getService(Adapters)
adapter_hook = adapters.adapter_hook
self.adapter_hook = adapter_hook
return adapter_hook

adapter_hook = read_property(adapter_hook)

siteinfo = SiteInfo()

def setSite(site=None):
if site is None:
siteinfo.services = None
services = serviceManager
else:
siteinfo.services = trustedRemoveSecurityProxy(site.getSiteManager())
site = trustedRemoveSecurityProxy(site)
services = site.getSiteManager()

def getSite():
siteinfo.site = site
siteinfo.services = services
try:
services = siteinfo.services
del siteinfo.adapter_hook
except AttributeError:
services = siteinfo.services = None

if services is None:
return None

return services.__parent__
pass

def getSite():
return siteinfo.site


def getServices_hook(context=None):

if context is None:
try:
services = siteinfo.services
except AttributeError:
services = siteinfo.services = None

if services is None:
return serviceManager

return services
return siteinfo.services

# Deprecated support for a context that isn't adaptable to
# IServiceService. Return the default service manager.
Expand All @@ -70,8 +85,13 @@ def getServices_hook(context=None):
serviceManager))
except ComponentLookupError:
return serviceManager


def adapter_hook(interface, object, name='', default=None):
try:
return siteinfo.adapter_hook(interface, object, name, default)
except ComponentLookupError:
return default

def queryView(object, name, request, default=None,
providing=Interface, context=None):
views = getService(Presentation, context)
Expand Down

0 comments on commit e464d72

Please sign in to comment.