diff idavoll/iidavoll.py @ 167:ef22e4150caa

Move protocol implementations (pubsub, disco, forms) to and depend on wokkel. Author: ralphm Fixes: #4
author Ralph Meijer <ralphm@ik.nu>
date Wed, 03 Oct 2007 12:41:43 +0000
parents
children 246911bcb699
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idavoll/iidavoll.py	Wed Oct 03 12:41:43 2007 +0000
@@ -0,0 +1,417 @@
+# Copyright (c) 2003-2007 Ralph Meijer
+# See LICENSE for details.
+
+"""
+Interfaces for idavoll.
+"""
+
+from zope.interface import Interface
+
+class IBackendService(Interface):
+    """ Interface to a backend service of a pubsub service. """
+
+    def __init__(storage):
+        """
+        @param storage: L{storage} object.
+        """
+
+    def supports_publisher_affiliation():
+        """ Reports if the backend supports the publisher affiliation.
+
+        @rtype: C{bool}
+        """
+
+    def supports_outcast_affiliation():
+        """ Reports if the backend supports the publisher affiliation.
+
+        @rtype: C{bool}
+        """
+
+    def supports_persistent_items():
+        """ Reports if the backend supports persistent items.
+
+        @rtype: C{bool}
+        """
+
+    def get_node_type(node_id):
+        """ Return type of a node.
+
+        @return: a deferred that returns either 'leaf' or 'collection'
+        """
+
+    def get_nodes():
+        """ Returns list of all nodes.
+
+        @return: a deferred that returns a C{list} of node ids.
+        """
+
+    def get_node_meta_data(node_id):
+        """ Return meta data for a node.
+
+        @return: a deferred that returns a C{list} of C{dict}s with the
+                 metadata.
+        """
+
+    def create_node(node_id, requestor):
+        """ Create a node.
+
+        @return: a deferred that fires when the node has been created.
+        """
+
+    def register_pre_delete(pre_delete_fn):
+        """ Register a callback that is called just before a node deletion.
+
+        The function C{pre_deleted_fn} is added to a list of functions
+        to be called just before deletion of a node. The callback
+        C{pre_delete_fn} is called with the C{node_id} that is about to be
+        deleted and should return a deferred that returns a list of deferreds
+        that are to be fired after deletion. The backend collects the lists
+        from all these callbacks before actually deleting the node in question.
+        After deletion all collected deferreds are fired to do post-processing.
+
+        The idea is that you want to be able to collect data from the
+        node before deleting it, for example to get a list of subscribers
+        that have to be notified after the node has been deleted. To do this,
+        C{pre_delete_fn} fetches the subscriber list and passes this
+        list to a callback attached to a deferred that it sets up. This
+        deferred is returned in the list of deferreds.
+        """
+
+    def delete_node(node_id, requestor):
+        """ Delete a node.
+
+        @return: a deferred that fires when the node has been deleted.
+        """
+
+    def purge_node(node_id, requestor):
+        """ Removes all items in node from persistent storage """
+
+    def subscribe(node_id, subscriber, requestor):
+        """ Request the subscription of an entity to a pubsub node.
+
+        Depending on the node's configuration and possible business rules, the
+        C{subscriber} is added to the list of subscriptions of the node with id
+        C{node_id}. The C{subscriber} might be different from the C{requestor},
+        and if the C{requestor} is not allowed to subscribe this entity an
+        exception should be raised.
+
+        @return: a deferred that returns the subscription state
+        """
+
+    def unsubscribe(node_id, subscriber, requestor):
+        """ Cancel the subscription of an entity to a pubsub node.
+
+        The subscription of C{subscriber} is removed from the list of
+        subscriptions of the node with id C{node_id}. If the C{requestor}
+        is not allowed to unsubscribe C{subscriber}, an an exception should
+        be raised.
+
+        @return: a deferred that fires when unsubscription is complete.
+        """
+
+    def get_subscribers(node_id):
+        """ Get node subscriber list.
+
+        @return: a deferred that fires with the list of subscribers.
+        """
+
+    def get_subscriptions(entity):
+        """ Report the list of current subscriptions with this pubsub service.
+
+        Report the list of the current subscriptions with all nodes within this
+        pubsub service, for the C{entity}.
+
+        @return: a deferred that returns the list of all current subscriptions
+                 as tuples C{(node_id, subscriber, subscription)}.
+        """
+
+    def get_affiliations(entity):
+        """ Report the list of current affiliations with this pubsub service.
+
+        Report the list of the current affiliations with all nodes within this
+        pubsub service, for the C{entity}.
+
+        @return: a deferred that returns the list of all current affiliations
+                 as tuples C{(node_id, affiliation)}.
+        """
+
+    def publish(node_id, items, requestor):
+        """ Publish items to a pubsub node.
+
+        @return: a deferred that fires when the items have been published.
+        """
+
+    def register_notifier(observerfn, *args, **kwargs):
+        """ Register callback which is called for notification. """
+
+    def get_notification_list(node_id, items):
+        """
+        Get list of entities to notify.
+        """
+
+    def get_items(node_id, requestor, max_items=None, item_ids=[]):
+        """ Retrieve items from persistent storage
+
+        If C{max_items} is given, return the C{max_items} last published
+        items, else if C{item_ids} is not empty, return the items requested.
+        If neither is given, return all items.
+
+        @return: a deferred that returns the requested items
+        """
+
+    def retract_item(node_id, item_id, requestor):
+        """ Removes item in node from persistent storage """
+
+
+class IStorage(Interface):
+    """
+    Storage interface.
+    """
+
+    def get_node(node_id):
+        """
+        Get Node.
+
+        @param node_id: NodeID of the desired node.
+        @type node_id: L{str}
+        @return: deferred that returns a L{Node} object.
+        """
+
+    def get_node_ids():
+        """
+        Return all NodeIDs.
+
+        @return: deferred that returns a list of NodeIDs (L{str}).
+        """
+
+    def create_node(node_id, owner, config = None, type='leaf'):
+        """
+        Create new node.
+
+        The implementation should make sure, the passed owner JID is stripped
+        of the resource (e.g. using C{owner.userhostJID()}).
+
+        @param node_id: NodeID of the new node.
+        @type node_id: L{str}
+        @param owner: JID of the new nodes's owner.
+        @type owner: L{jid.JID}
+        @param config: Configuration
+        @param type: Node type. Can be either C{'leaf'} or C{'collection'}.
+        @return: deferred that fires on creation.
+        """
+
+    def delete_node(node_id):
+        """
+        Delete a node.
+
+        @param node_id: NodeID of the new node.
+        @type node_id: L{str}
+        @return: deferred that fires on deletion.
+        """
+
+    def get_affiliations(entity):
+        """
+        Get all affiliations for entity.
+
+        The implementation should make sure, the passed owner JID is stripped
+        of the resource (e.g. using C{owner.userhostJID()}).
+
+        @param entity: JID of the entity.
+        @type entity: L{jid.JID}
+        @return: deferred that returns a L{list} of tuples of the form
+                 C{(node_id, affiliation)}, where C{node_id} is of the type
+                 L{str} and C{affiliation} is one of C{'owner'}, C{'publisher'}
+                 and C{'outcast'}.
+        """
+
+    def get_subscriptions(entity):
+        """
+        Get all subscriptions for an entity.
+
+        The implementation should make sure, the passed owner JID is stripped
+        of the resource (e.g. using C{owner.userhostJID()}).
+
+        @param entity: JID of the entity.
+        @type entity: L{jid.JID}
+        @return: deferred that returns a L{list} of tuples of the form
+                 C{(node_id, subscriber, state)}, where C{node_id} is of the
+                 type L{str}, C{subscriber} of the type {jid.JID}, and
+                 C{state} is C{'subscribed'} or C{'pending'}.
+        """
+
+
+class INode(Interface):
+    """
+    Interface to the class of objects that represent nodes.
+    """
+
+    def get_type():
+        """
+        Get node's type.
+
+        @return: C{'leaf'} or C{'collection'}.
+        """
+
+    def get_configuration():
+        """
+        Get node's configuration.
+
+        The configuration must at least have two options:
+        C{pubsub#persist_items}, and C{pubsub#deliver_payloads}.
+
+        @return: L{dict} of configuration options.
+        """
+
+    def get_meta_data():
+        """
+        Get node's meta data.
+
+        The meta data must be a superset of the configuration options, and
+        also at least should have a C{pubsub#node_type} entry.
+
+        @return: L{dict} of meta data.
+        """
+
+    def set_configuration(options):
+        """
+        Set node's configuration.
+
+        The elements of {options} will set the new values for those
+        configuration items. This means that only changing items have to
+        be given.
+
+        @param options: a dictionary of configuration options.
+        @returns: a deferred that fires upon success.
+        """
+
+    def get_affiliation(entity):
+        """
+        Get affiliation of entity with this node.
+
+        @param entity: JID of entity.
+        @type entity: L{jid.JID}
+        @return: deferred that returns C{'owner'}, C{'publisher'}, C{'outcast'}
+                 or C{None}.
+        """
+
+    def get_subscription(subscriber):
+        """
+        Get subscription to this node of subscriber.
+
+        @param subscriber: JID of the new subscriptions' entity.
+        @type subscriber: L{jid.JID}
+        @return: deferred that returns the subscription state (C{'subscribed'},
+                 C{'pending'} or C{None}).
+        """
+
+    def add_subscription(subscriber, state):
+        """
+        Add new subscription to this node with given state.
+
+        @param subscriber: JID of the new subscriptions' entity.
+        @type subscriber: L{jid.JID}
+        @param state: C{'subscribed'} or C{'pending'}
+        @type state: L{str}
+        @return: deferred that fires on subscription.
+        """
+
+    def remove_subscription(subscriber):
+        """
+        Remove subscription to this node.
+
+        @param subscriber: JID of the subscriptions' entity.
+        @type subscriber: L{jid.JID}
+        @return: deferred that fires on removal.
+        """
+
+    def get_subscribers():
+        """
+        Get list of subscribers to this node.
+
+        Retrieves the list of entities that have a subscription to this
+        node. That is, having the state C{'subscribed'}.
+
+        @return: a deferred that returns a L{list} of L{jid.JID}s.
+        """
+
+    def is_subscribed(entity):
+        """
+        Returns whether entity has any subscription to this node.
+
+        Only returns C{True} when the subscription state (if present) is
+        C{'subscribed'} for any subscription that matches the bare JID.
+
+        @param subscriber: bare JID of the subscriptions' entity.
+        @type subscriber: L{jid.JID}
+        @return: deferred that returns a L{bool}.
+        """
+
+    def get_affiliations():
+        """
+        Get affiliations of entities with this node.
+
+        @return: deferred that returns a L{list} of tuples (jid, affiliation),
+        where jid is a L(jid.JID) and affiliation is one of C{'owner'},
+        C{'publisher'}, C{'outcast'}.
+        """
+
+class ILeafNode(Interface):
+    """
+    Interface to the class of objects that represent leaf nodes.
+    """
+
+    def store_items(items, publisher):
+        """
+        Store items in persistent storage for later retrieval.
+
+        @param items: The list of items to be stored. Each item is the
+                      L{domish} representation of the XML fragment as defined
+                      for C{<item/>} in the
+                      C{http://jabber.org/protocol/pubsub} namespace.
+        @type items: L{list} of {domish.Element}
+        @param publisher: JID of the publishing entity.
+        @type publisher: L{jid.JID}
+        @return: deferred that fires upon success.
+        """
+
+    def remove_items(item_ids):
+        """
+        Remove items by id.
+
+        @param item_ids: L{list} of item ids.
+        @return: deferred that fires with a L{list} of ids of the items that
+                 were deleted
+        """
+
+    def get_items(max_items=None):
+        """
+        Get items.
+
+        If C{max_items} is not given, all items in the node are returned,
+        just like C{get_items_by_id}. Otherwise, C{max_items} limits
+        the returned items to a maximum of that number of most recently
+        published items.
+
+        @param max_items: if given, a natural number (>0) that limits the
+                          returned number of items.
+        @return: deferred that fires with a L{list} of found items.
+        """
+
+    def get_items_by_id(item_ids):
+        """
+        Get items by item id.
+
+        Each item in the returned list is a unicode string that
+        represent the XML of the item as it was published, including the
+        item wrapper with item id.
+
+        @param item_ids: L{list} of item ids.
+        @return: deferred that fires with a L{list} of found items.
+        """
+
+    def purge():
+        """
+        Purge node of all items in persistent storage.
+
+        @return: deferred that fires when the node has been purged.
+        """