Andi Vajda wrote:
On Fri, 10 Mar 2006, Ted Leung wrote:
The "collection item notifications" seem to have a distinctly
different API than the other notifications. instead of
'subscriber.watchXXX(item, ..., methodName)' it is in the form
'collection.notificationQueueSubscribe(subscriber)'
Is there a reason it has this different API? The other methods are
actual methods on the subscriber, rather than the item being
subscribed to. Second, the other systems allow you to specify a
method name, which seems quite valuable.. It seems like it would be
nice to be consistent with the APIs across all the notification
systems.
The original collection mechanism allow the subscriber to specify a
method name by adding an attribute with the name of the method to the
subscriber.
+1 for consistent API.
No particular reason other than history. I've been wondering about
that myself. Maybe I'll add a watchQueue(collectionItem, methodName)
API....
I think that something like watchQueue would be a good idea. Also,
implementing transient subscriptions by indirecting of the itsView
attribute is not very intuitive. Could you have a transient version
of the method or pass a flag as an argument?
+1 for a flag
Hmm, dunno, I wanted to make it clear that it was for the view it was
called on...
On the collections API, you've switched a create at construction time
model. Does this mean it will be impossible to restructure the
collection tree, short of destroying a subtree and constructing an
entirely new one?
Yes, that will be impossible without destroying and re-constructing.
The way the code was written before wouldn't have worked anyway, the
hard part here is that when a collection tree is modified in place, a
large, potentially huge, number of notifications have to be sent
around (at least to maintain upstream indexes). None of that was in
place in the old code, except for the add/removeSource method in
collections.py, which is still there and still works as before. Once
we have a use case for such in-place collection structure rearranging,
beyond what is implemented and functional today, we can reconsider this.
I think we could get away with not sending any notifications when
rearranging the collection tree and recompute everything after the
rearrangement. Independent of whether or not the old code actually
worked, I suspect not allowing rearrangement will end eventually end up
biting us, but I don't think we should work on it until we end up with a
use case.
In your post, the collections that you show descend from Collection
but also need to have their __metaclass__ set to
schema.CollectionClass, since this is always needed (if I understand
correctly), is there a way to make it so that setting the
__metaclass__ is unnecessary?
This is only needed for concrete base Collection subclasses. For
example, in osaf/pim/collections.py, the collection classes defined
there need this __metaclass__ but any of their subclasses wouldn't.
Basically, you need this __metaclass__ wherever you use __collection__.
It is my understanding that __metaclass__ is not inherited to
subclasses, so it has to be specified wherever it is needed, that is,
wherever you use __collection__ as well, in other words, wherever you
declare the attribute that is going to contain the wrapped set or ref
collection value.
Finally, I understand that using an explicit __collection__ attribute
is more general, but if you look at the way that collections are
used, the application will probably never make use of that
generality. But now all the collection classes require passing
tuples including __collection__ arguments, which makes for more
boilerplate code in the common case. It seems like there could be
better defaults for the common cases.
Actually, no. With the bi-directional abstract set I recently added,
it became even more important not to hardcode this value. The designer
of a collection item subclass needs to have control over the name of
the attribute the set/ref-collection value that is being wrapped.
As for the boilerplate you're referring to, it could be removed if
only repository/item/Sets.py were to know about
repository/item/Collection.py. Consider that a bug :)
Andi..
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "Dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/dev
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "Dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/dev