[Checkins]
SVN: five.localsitemanager/trunk/src/five/localsitemanager/registry.py
sprint refactoring snapshot
Yvo Schubbe
y.2007- at wcm-solutions.de
Wed Jun 6 09:22:12 EDT 2007
Log message for revision 76409:
sprint refactoring snapshot
Changed:
U five.localsitemanager/trunk/src/five/localsitemanager/registry.py
-=-
Modified: five.localsitemanager/trunk/src/five/localsitemanager/registry.py
===================================================================
--- five.localsitemanager/trunk/src/five/localsitemanager/registry.py 2007-06-06 13:14:47 UTC (rev 76408)
+++ five.localsitemanager/trunk/src/five/localsitemanager/registry.py 2007-06-06 13:22:11 UTC (rev 76409)
@@ -1,69 +1,132 @@
import Acquisition
+from zope.app.component.hooks import getSite
from zope.component.interfaces import ComponentLookupError
-import zope.component.persistentregistry
+from zope.component.persistentregistry import PersistentAdapterRegistry
+from zope.component.persistentregistry import PersistentComponents
+from zope.interface.adapter import VerifyingAdapterLookup
+from zope.interface.adapter import _lookup
+from zope.interface.adapter import _lookupAll
+from zope.interface.adapter import _subscriptions
import OFS.ObjectManager
_marker = object()
-class PersistentComponents \
- (zope.component.persistentregistry.PersistentComponents,
- OFS.ObjectManager.ObjectManager):
- """An implementation of a component registry that can be persisted
- and looks like a standard ObjectManager. It also ensures that all
- utilities have the the parent of this site manager (which should be
- the ISite) as their acquired parent.
- """
+class FiveVerifyingAdapterLookup(VerifyingAdapterLookup):
- def _wrap(self, comp):
- """Return an aq wrapped component with the site as the parent but
- only if the comp has an aq wrapper to begin with.
- """
+ def _uncached_lookup(self, required, provided, name=u''):
+ result = None
+ order = len(required)
+ for registry in self._registry.ro:
+ byorder = registry._adapters
+ if order >= len(byorder):
+ continue
- # BBB: The primary reason for doing this sort of wrapping of
- # returned utilities is to support CMF tool-like functionality where
- # a tool expects it's aq_parent to be the portal object. New code
- # (ie new utilities) should not rely on this predictability to
- # get the portal object and should search out an alternate means
- # (possibly retrieve the ISiteRoot utility). Although in most
- # cases getting at the portal object shouldn't be the required pattern
- # but instead looking up required functionality via other (possibly
- # local) components.
+ extendors = registry._v_lookup._extendors.get(provided)
+ if not extendors:
+ continue
- if Acquisition.interfaces.IAcquirer.providedBy(comp):
- parent = Acquisition.aq_parent(self)
- if parent is None:
- raise ValueError('Not enough context to acquire parent')
+ components = byorder[order]
+ result = _lookup(components, required, extendors, name, 0,
+ order)
+ if result is not None:
+ result = _wrap(result, registry)
+ break
- base = Acquisition.aq_base(comp)
+ self._subscribe(*required)
- if base is not Acquisition.aq_base(parent):
- # If the component is not the cmoponent registry container,
- # wrap it in the parent
- comp = base.__of__(parent)
+ return result
+
+ def _uncached_lookupAll(self, required, provided):
+ order = len(required)
+ result = {}
+ for registry in reversed(self._registry.ro):
+ byorder = registry._adapters
+ if order >= len(byorder):
+ continue
+ extendors = registry._v_lookup._extendors.get(provided)
+ if not extendors:
+ continue
+ components = byorder[order]
+ tmp_result = {}
+ _lookupAll(components, required, extendors, tmp_result, 0, order)
+ for k, v in tmp_result.iteritems():
+ tmp_result[k] = _wrap(v, registry)
+ result.update(tmp_result)
+
+ self._subscribe(*required)
+
+ return tuple(result.iteritems())
+
+ def _uncached_subscriptions(self, required, provided):
+ order = len(required)
+ result = []
+ for registry in reversed(self._registry.ro):
+ byorder = registry._subscribers
+ if order >= len(byorder):
+ continue
+
+ if provided is None:
+ extendors = (provided, )
else:
- # If the component happens to be the component registry
- # container we are looking up a ISiteRoot.
- # We are not wrapping it in itself but in its own parent
- comp = base.__of__(Acquisition.aq_parent(parent))
+ extendors = registry._v_lookup._extendors.get(provided)
+ if extendors is None:
+ continue
- return comp
+ _subscriptions(byorder[order], required, extendors, u'',
+ result, 0, order)
- def queryUtility(self, provided, name=u'', default=None):
- comp = self.utilities.lookup((), provided, name, default)
- if comp is not default:
- comp = self._wrap(comp)
- return comp
+ self._subscribe(*required)
- def getUtility(self, provided, name=u''):
- utility = self.queryUtility(provided, name, _marker)
- if utility is _marker:
- raise ComponentLookupError(provided, name)
- return utility
+ return result
- def getUtilitiesFor(self, interface):
- return ((name, self._wrap(utility))
- for name, utility in self.utilities.lookupAll((), interface))
- def getAllUtilitiesRegisteredFor(self, interface):
- return (self._wrap(x)
- for x in self.utilities.subscriptions((), interface))
+class FivePersistentAdapterRegistry(PersistentAdapterRegistry):
+
+ LookupClass = FiveVerifyingAdapterLookup
+
+def _wrap(comp, registry):
+ """Return an aq wrapped component with the site as the parent but
+ only if the comp has an aq wrapper to begin with.
+ """
+
+ # BBB: The primary reason for doing this sort of wrapping of
+ # returned utilities is to support CMF tool-like functionality where
+ # a tool expects it's aq_parent to be the portal object. New code
+ # (ie new utilities) should not rely on this predictability to
+ # get the portal object and should search out an alternate means
+ # (possibly retrieve the ISiteRoot utility). Although in most
+ # cases getting at the portal object shouldn't be the required pattern
+ # but instead looking up required functionality via other (possibly
+ # local) components.
+
+ if Acquisition.interfaces.IAcquirer.providedBy(comp):
+ parent = getSite()
+ if parent is None:
+ raise ValueError('Not enough context to acquire parent')
+
+ base = Acquisition.aq_base(comp)
+
+ if base is not Acquisition.aq_base(parent):
+ # If the component is not the cmoponent registry container,
+ # wrap it in the parent
+ comp = base.__of__(parent)
+ else:
+ # If the component happens to be the component registry
+ # container we are looking up a ISiteRoot.
+ # We are not wrapping it in itself but in its own parent
+ comp = base.__of__(Acquisition.aq_parent(parent))
+
+ return comp
+
+class PersistentComponents \
+ (PersistentComponents,
+ OFS.ObjectManager.ObjectManager):
+ """An implementation of a component registry that can be persisted
+ and looks like a standard ObjectManager. It also ensures that all
+ utilities have the the parent of this site manager (which should be
+ the ISite) as their acquired parent.
+ """
+
+ def _init_registries(self):
+ self.adapters = PersistentAdapterRegistry()
+ self.utilities = FivePersistentAdapterRegistry()
More information about the Checkins
mailing list