ACK!!!!! Re: [Zope3-checkins] CVS:
Zope3/lib/python/Zope/App/OFS/Services/LocalEventService -
LocalEventChannel.py:1.7 LocalEventService.py:1.11
ProtoServiceEventChannel.py:1.4 LocalServiceSubscribable.py:1.9
LocalSubscribable.py:1.7
Ulrich Eck
ueck@net-labs.de
Thu, 12 Dec 2002 21:19:47 +0100
Hi all,
I'm sorry .. i didn't switch to the branch that i created,
I'll revert my changes in a minute in head and work in my
branch ..
I started working on this today after i encountered problems
with the context of notified objects, that are not called
"in place" ..
sorry folks .. will not happen again
Ulrich Eck
--On Donnerstag, 12. Dezember 2002 15:13 -0500 Gary Poster
<gary@modernsongs.com> wrote:
> ACK!!!!!
>
> I'm assuming this has been discussed quite a bit at the sprint, but I am
> *very* concerned about this approach.
>
> it makes it impossible to use other kinds of indirect subscribers, such
> as object hub subscribers, an implementation of which I have in my
> sandbox. Descriptions are also in the Zope.Event directory.
I'll have a look at the notes .. but it doesn't affect global-eventservice
at all.
>
> OK, yes, sprint people are in charge of the sprint, but SteveA or
> someone, can you at least shoot a mail that this change was thought
> through and blessed and will be explained later?
>
> Gary
>
>
>
> Ulrich Eck wrote:
>> Update of
>> /cvs-repository/Zope3/lib/python/Zope/App/OFS/Services/LocalEventService
>> In directory cvs.zope.org:/tmp/cvs-serv30235
>>
>> Modified Files:
>> LocalEventChannel.py LocalEventService.py
>> ProtoServiceEventChannel.py LocalServiceSubscribable.py
>> LocalSubscribable.py
>> Log Message:
>> Refactored LocalEventService to store and use locations instead of
>> references to subscribers.
>>
>> now every subscriber is notified within correct context to be able
>> to use local services and the like.
>>
>> changes are incompatible to existing subscriptions !!! you need
>> to delete all subscriptions (or subscribables) from your db
>> or reinitialize ...
>>
>>
>>
>> ===
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventChann
>> el.py 1.6 => 1.7 === ---
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventChann
>> el.py:1.6 Mon Nov 11 03:38:36 2002 +++
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventChann
>> el.py Thu Dec 12 15:05:51 2002 @@ -21,7 +21,7 @@
>> from Zope.Event.IEventChannel import IEventChannel
>> from Zope.ContextWrapper import ContextMethod
>> from Zope.Proxy.ProxyIntrospection import removeAllProxies
>> -from Zope.Proxy.ContextWrapper import ContextWrapper
>> +from Zope.App.Traversing import traverse
>>
>> class LocalEventChannel(LocalSubscribable):
>>
>> @@ -38,8 +38,10 @@
>> # subscriptionses = clean_self._registry.getAllForObject(event)
>>
>> for subscriptions in subscriptionses:
>> - for subscriber,filter in subscriptions:
>> + # for subscriber_path, filter in subscriptions:
>> + for subscriber_path, filter in subscriptions:
>> if filter is not None and not filter(event):
>> continue
>> - ContextWrapper(subscriber, wrapped_self).notify(event)
>> + # XXX resolve subscriber_path
>> + traverse(wrapped_self, subscriber_path).notify(event)
>> notify = ContextMethod(notify)
>>
>>
>> ===
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventServi
>> ce.py 1.10 => 1.11 === ---
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventServi
>> ce.py:1.10 Sun Dec 1 05:32:29 2002 +++
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalEventServi
>> ce.py Thu Dec 12 15:05:51 2002 @@ -22,6 +22,7 @@
>> from Zope.Event.IEventService import IEventService
>> from Zope.Event.ISubscriptionAware import ISubscriptionAware
>> from Zope.App.Traversing.ITraverser import ITraverser
>> +from Zope.App.Traversing import traverse
>> from Zope.ComponentArchitecture import getAdapter, getService
>> from Zope.App.ComponentArchitecture.NextService import getNextService
>> from Zope.ContextWrapper import ContextMethod
>> @@ -29,7 +30,8 @@
>> from Zope.Proxy.ContextWrapper import ContextWrapper
>> from Zope.Proxy.ProxyIntrospection import removeAllProxies
>>
>> -from PathSubscriber import PathSubscriber
>> +
>> +
>> from ProtoServiceEventChannel import ProtoServiceEventChannel
>>
>> class LocalEventService(ProtoServiceEventChannel):
>> @@ -58,10 +60,12 @@
>> subscriptionses = clean_self._registry.getAllForObject(event)
>>
>> for subscriptions in subscriptionses:
>> - for subscriber,filter in subscriptions:
>> + # for subscriber_path, filter in subscriptions:
>> + for subscriber_path,filter in subscriptions:
>> if filter is not None and not filter(event):
>> continue
>> - ContextWrapper(subscriber, wrapped_self).notify(event)
>> + # XXX resolve subscriber_path
>> + traverse(wrapped_self, subscriber_path).notify(event)
>>
>> publishedEvents = getattr(clean_self, "_v_publishedEvents",
>> None) if publishedEvents is None:
>> @@ -81,10 +85,12 @@
>> subscriptionses =
>> clean_self._registry.getAllForObject(event)
>>
>> for subscriptions in subscriptionses:
>> - for subscriber,filter in subscriptions:
>> + # for subscriber_path, filter in subscriptions:
>> + for subscriber_path, filter in subscriptions:
>> if filter is not None and not filter(event):
>> continue
>> - ContextWrapper(subscriber,
>> wrapped_self).notify(event) + # XXX resolve
>> subscriber_path
>> + traverse(wrapped_self,
>> subscriber_path).notify(event) notify = ContextMethod(notify)
>>
>> def bound(wrapped_self, name):
>> @@ -98,7 +104,8 @@
>> # global event service we're going to have to
>> # set something special up--something that subscribes
>> # every startup...
>> - es.subscribe(PathSubscriber(wrapped_self))
>> + # XXX just pass wrapped_self
>> + es.subscribe(wrapped_self)
>> bound = ContextMethod(bound)
>>
>> # _unbound = ProtoServiceEventChannel.unbound # see comment below
>> @@ -120,29 +127,34 @@
>> #
>> # so we're doing a copy and paste from ProtoServiceEventChannel:
>> # start copy/paste
>> - subscriber = PathSubscriber(wrapped_self)
>> + # XXX subscriber = wrapped_self
>> for subscription in clean_self._subscriptions:
>> subscribable = getAdapter(
>> wrapped_self, ITraverser).traverse(subscription[0])
>> - subscribable.unsubscribe(subscriber)
>> + subscribable.unsubscribe(wrapped_self)
>> clean_self._subscriptions = ()
>> clean_self._serviceName = None
>> # end copy/paste
>>
>> + # ambigous name subscriber -> (subscriber_path, filter, )
>> for subscriber in clean_self._subscribers:
>> clean_self.__unsubscribeAllFromSelf(wrapped_self,
>> subscriber[0])
>> # unset flag
>> clean_self._v_unbinding = None
>> unbound = ContextMethod(unbound)
>>
>> - def __unsubscribeAllFromSelf(clean_self, wrapped_self, subscriber):
>> + # XXX gets subscriber_path as last argument
>> + def __unsubscribeAllFromSelf(clean_self, wrapped_self,
>> subscriber_path): """this is *not* an interface function, and should not
>> be used outside of this class"""
>> - wrapped_subscriber = ContextWrapper(subscriber, wrapped_self)
>> +
>> + # XXX resolve subscriber from path first
>> + subscriber = traverse(wrapped_self, subscriber_path)
>>
>> for subscriber_index in range(len(clean_self._subscribers)):
>> sub = clean_self._subscribers[subscriber_index]
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> ev_set = sub[1]
>> break
>> else:
>> @@ -154,9 +166,10 @@
>> subs=subscriptions[:]
>> subscriptions[:] = []
>> for sub in subs:
>> - if sub[0] == subscriber: # deleted (not added back)
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path: # deleted (not added back)
>> if do_alert:
>> - wrapped_subscriber.unsubscribedFrom(
>> + subscriber.unsubscribedFrom(
>> wrapped_self, ev_type or IEvent, sub[1])
>> # IEvent switch is to make optimization
>> # transparent
>> else: # kept (added back)
>> @@ -189,6 +202,8 @@
>> # service...
>> # that leaves replacing top level event services an
>> # interesting question, however
>> - context.subscribe(PathSubscriber(wrapped_self))
>> +
>> + # XXX just pass wrapped_self
>> + context.subscribe(wrapped_self)
>> unsubscribedFrom = ContextMethod(unsubscribedFrom)
>>
>>
>>
>> ===
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/ProtoServiceEve
>> ntChannel.py 1.3 => 1.4 === ---
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/ProtoServiceEve
>> ntChannel.py:1.3 Mon Nov 11 03:38:36 2002 +++
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/ProtoServiceEve
>> ntChannel.py Thu Dec 12 15:05:51 2002 @@ -21,7 +21,6 @@
>> from Zope.App.Traversing.ITraverser import ITraverser
>> from Zope.Proxy.ProxyIntrospection import removeAllProxies
>> from Zope.ComponentArchitecture import getAdapter, getService
>> -from PathSubscriber import PathSubscriber
>> from LocalSubscriptionAware import LocalSubscriptionAware
>> from Zope.ContextWrapper import ContextMethod
>> from LocalEventChannel import LocalEventChannel
>> @@ -75,7 +74,7 @@
>> # set something special up -- something that subscribes
>> # every startup...
>> es.subscribe(
>> - PathSubscriber(wrapped_self),
>> + wrapped_self,
>> clean_self._subscribeToServiceInterface,
>> clean_self._subscribeToServiceFilter
>> )
>> @@ -85,11 +84,10 @@
>> def unbound(wrapped_self, name):
>> "see IBindingAware"
>> clean_self = removeAllProxies(wrapped_self)
>> - subscriber = PathSubscriber(wrapped_self)
>> for subscription in clean_self._subscriptions:
>> subscribable = getAdapter(
>> wrapped_self, ITraverser).traverse(subscription[0])
>> - subscribable.unsubscribe(subscriber)
>> + subscribable.unsubscribe(wrapped_self)
>> clean_self._subscriptions = ()
>> clean_self._serviceName = None
>>
>>
>>
>> ===
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalServiceSub
>> scribable.py 1.8 => 1.9 === ---
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalServiceSub
>> scribable.py:1.8 Fri Dec 6 13:03:31 2002 +++
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalServiceSub
>> scribable.py Thu Dec 12 15:05:51 2002 @@ -24,6 +24,7 @@
>> from Zope.Proxy.ContextWrapper import ContextWrapper
>> from LocalSubscribable import LocalSubscribable
>> from Zope.App.ComponentArchitecture.NextService import getNextService,
>> queryNextService +from Zope.App.Traversing import getPhysicalPathString
>>
>> class LocalServiceSubscribable(LocalSubscribable):
>> """a local mix-in for services"""
>> @@ -40,15 +41,15 @@
>> subscriber,
>> event_type=None,
>> filter=None):
>> - # might be wrapped, might not
>> - subscriber = removeAllProxies(subscriber)
>> + # subscriber must be wrapped
>> + subscriber_path = getPhysicalPathString(subscriber)
>>
>> clean_self = removeAllProxies(wrapped_self)
>> - wrapped_subscriber = ContextWrapper(subscriber, wrapped_self)
>>
>> for subscriber_index in range(len(clean_self._subscribers)):
>> sub = clean_self._subscribers[subscriber_index]
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> ev_set = sub[1]
>> break
>> else:
>> @@ -76,15 +77,17 @@
>> else:
>> subscriptions = clean_self._registry.get(ev_type)
>> try:
>> - subscriptions.remove((subscriber, filter))
>> + # XXX subscriber_path
>> + subscriptions.remove((subscriber_path, filter))
>> except ValueError:
>> raise NotFoundError(subscriber, event_type, filter)
>> if do_alert:
>> - wrapped_subscriber.unsubscribedFrom(
>> + subscriber.unsubscribedFrom(
>> wrapped_self, event_type, filter)
>> if len(ev_set) == 1:
>> for sub in subscriptions:
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> break
>> else:
>> del clean_self._subscribers[subscriber_index]
>> @@ -95,9 +98,10 @@
>> subs = subscriptions[:]
>> subscriptions[:] = []
>> for sub in subs:
>> - if sub[0] == subscriber: # deleted (not added back)
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path: # deleted (not added
>> back) if do_alert:
>> - wrapped_subscriber.unsubscribedFrom(
>> + subscriber.unsubscribedFrom(
>> wrapped_self, ev_type or IEvent, sub[1])
>> # IEvent switch is to make optimization
>> # transparent (see *** comment above in
>> @@ -112,9 +116,8 @@
>> unsubscribe = ContextMethod(unsubscribe)
>>
>> def listSubscriptions(wrapped_self, subscriber, event_type=None):
>> - # might be wrapped, might not
>> - subscriber = removeAllProxies(subscriber)
>> -
>> + # subscriber must be wrapped
>> +
>> clean_self = removeAllProxies(wrapped_self)
>> result = LocalSubscribable.listSubscriptions(
>> clean_self, subscriber, event_type)
>>
>>
>> ===
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalSubscribab
>> le.py 1.6 => 1.7 === ---
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalSubscribab
>> le.py:1.6 Wed Nov 27 21:45:47 2002 +++
>> Zope3/lib/python/Zope/App/OFS/Services/LocalEventService/LocalSubscribab
>> le.py Thu Dec 12 15:05:51 2002 @@ -25,6 +25,8 @@
>> from Zope.Proxy.ContextWrapper import ContextWrapper
>> from Zope.Event.Subscribable import Subscribable
>> from Persistence import Persistent
>> +from Zope.App.Traversing import traverse, getPhysicalPathString
>> +from Zope.App.Traversing import locationAsUnicode
>>
>> class LocalSubscribable(Persistent, Subscribable):
>> """a local mix-in"""
>> @@ -39,14 +41,14 @@
>> subscriber,
>> event_type=IEvent,
>> filter=None):
>> - # might be wrapped, might not
>> - subscriber = removeAllProxies(subscriber)
>>
>> + # subscriber needs to be wrapped
>> + subscriber_path = getPhysicalPathString(subscriber)
>> +
>> clean_self = removeAllProxies(wrapped_self)
>> - wrapped_subscriber = ContextWrapper(subscriber, wrapped_self)
>>
>> if ISubscriptionAware.isImplementedBy(subscriber):
>> - wrapped_subscriber.subscribedTo(
>> + subscriber.subscribedTo(
>> wrapped_self,
>> event_type,
>> filter)
>> @@ -58,15 +60,18 @@
>> if subscribers is None:
>> subscribers = []
>> clean_self._registry.register(ev_type, subscribers)
>> - subscribers.append((subscriber, filter))
>> + # XXX subscriber_path
>> + subscribers.append((subscriber_path, filter))
>>
>> subs = clean_self._subscribers
>> for sub in subs:
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> sub[1][ev_type] = 1
>> break
>> else:
>> - subs.append((subscriber,{ev_type:1}))
>> + # XXX subscriber_path
>> + subs.append((subscriber_path,{ev_type:1}))
>>
>> clean_self._p_changed = 1 #trigger persistence
>> # XXX should this and similar be done earlier in the method?
>> @@ -79,15 +84,15 @@
>> subscriber,
>> event_type = None,
>> filter = None):
>> - # subscriber might be wrapped, might not
>> - subscriber = removeAllProxies(subscriber)
>> + # subscriber must be wrapped
>> + subscriber_path = getPhysicalPathString(subscriber)
>>
>> clean_self = removeAllProxies(wrapped_self)
>> - wrapped_subscriber = ContextWrapper(subscriber, wrapped_self)
>>
>> for subscriber_index in range(len(clean_self._subscribers)):
>> sub = clean_self._subscribers[subscriber_index]
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> ev_set = sub[1]
>> break
>> else:
>> @@ -106,15 +111,17 @@
>> if not subscriptions:
>> raise NotFoundError(subscriber, event_type, filter)
>> try:
>> - subscriptions.remove((subscriber, filter))
>> + # XXX subscriber_path
>> + subscriptions.remove((subscriber_path, filter))
>> except ValueError:
>> raise NotFoundError(subscriber, event_type, filter)
>> if do_alert:
>> - wrapped_subscriber.unsubscribedFrom(
>> + subscriber.unsubscribedFrom(
>> wrapped_self, event_type, filter)
>> if len(ev_set) == 1:
>> for sub in subscriptions:
>> - if sub[0] == subscriber:
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path:
>> break
>> else:
>> del clean_self._subscribers[subscriber_index]
>> @@ -124,9 +131,10 @@
>> subs=subscriptions[:]
>> subscriptions[:] = []
>> for sub in subs:
>> - if sub[0] == subscriber: # deleted (not added back)
>> + # XXX subscriber_path
>> + if sub[0] == subscriber_path: # deleted (not added
>> back) if do_alert:
>> - wrapped_subscriber.unsubscribedFrom(
>> + subscriber.unsubscribedFrom(
>> wrapped_self, ev_type or IEvent, sub[1])
>> # IEvent switch is to make optimization
>> # transparent
>> @@ -137,3 +145,36 @@
>> # XXX should be done earlier? Ask Shane
>>
>> unsubscribe = ContextMethod(unsubscribe)
>> +
>> + def listSubscriptions(self, subscriber, event_type=None):
>> + # subscriber must be wrapped
>> + subscriber_path = getPhysicalPathString(subscriber)
>> +
>> + result=[]
>> + if event_type:
>> + ev_type=event_type
>> + if event_type is IEvent:
>> + ev_type=None # handle optimization
>> + subscriptions = self._registry.get(ev_type)
>> + if subscriptions:
>> + for sub in subscriptions:
>> + # XXX subscriber_path
>> + if sub[0]==subscriber_path:
>> + result.append((event_type, sub[1]))
>> + else:
>> + for subscriber_index in range(len(self._subscribers)):
>> + sub=self._subscribers[subscriber_index]
>> + # XXX subscriber_path
>> + if sub[0]==subscriber_path:
>> + ev_set=sub[1]
>> + break
>> + else:
>> + return result
>> + for ev_type in ev_set:
>> + subscriptions = self._registry.get(ev_type)
>> + if subscriptions:
>> + for sub in subscriptions:
>> + # XXX subscriber_path
>> + if sub[0]==subscriber_path:
>> + result.append((ev_type or IEvent, sub[1]))
>> + return result
>>
>>
>> _______________________________________________
>> Zope3-Checkins mailing list
>> Zope3-Checkins@zope.org
>> http://lists.zope.org/mailman/listinfo/zope3-checkins
>>
>>
>
Ulrich Eck
------------------------------------------------------------------------
net-labs Systemhaus GmbH
Ebersberger Str. 46
85570 Markt Schwaben
fon: +49-8121-4747-11
fax: +49-8121-4747-77
email: ueck@net-labs.de
http://www.net-labs.de