diff idavoll/memory_storage.py @ 206:274a45d2a5ab

Implement root collection that includes all leaf nodes.
author Ralph Meijer <ralphm@ik.nu>
date Mon, 04 Aug 2008 13:47:10 +0000
parents b4bf0a5ce50d
children aecfacb5a571
line wrap: on
line diff
--- a/idavoll/memory_storage.py	Mon Aug 04 07:10:45 2008 +0000
+++ b/idavoll/memory_storage.py	Mon Aug 04 13:47:10 2008 +0000
@@ -6,19 +6,30 @@
 from twisted.internet import defer
 from twisted.words.protocols.jabber import jid
 
-from idavoll import error, iidavoll
+from wokkel.pubsub import Subscription
 
-defaultConfig = {"pubsub#persist_items": True,
-                  "pubsub#deliver_payloads": True,
-                  "pubsub#send_last_published_item": 'on_sub',
-                  "pubsub#node_type": "leaf"}
+from idavoll import error, iidavoll
 
 class Storage:
 
     implements(iidavoll.IStorage)
 
+    defaultConfig = {
+            'leaf': {
+                "pubsub#persist_items": True,
+                "pubsub#deliver_payloads": True,
+                "pubsub#send_last_published_item": 'on_sub',
+            },
+            'collection': {
+                "pubsub#deliver_payloads": True,
+                "pubsub#send_last_published_item": 'on_sub',
+            }
+    }
+
     def __init__(self):
-        self._nodes = {}
+        rootNode = CollectionNode('', jid.JID('localhost'),
+                                  copy.copy(self.defaultConfig['collection']))
+        self._nodes = {'': rootNode}
 
 
     def getNode(self, nodeIdentifier):
@@ -34,15 +45,12 @@
         return defer.succeed(self._nodes.keys())
 
 
-    def createNode(self, nodeIdentifier, owner, config=None):
+    def createNode(self, nodeIdentifier, owner, config):
         if nodeIdentifier in self._nodes:
             return defer.fail(error.NodeExists())
 
-        if not config:
-            config = copy.copy(defaultConfig)
-
         if config['pubsub#node_type'] != 'leaf':
-            raise NotImplementedError
+            raise error.NoCollections()
 
         node = LeafNode(nodeIdentifier, owner, config)
         self._nodes[nodeIdentifier] = node
@@ -72,12 +80,17 @@
             for subscriber, subscription in node._subscriptions.iteritems():
                 subscriber = jid.internJID(subscriber)
                 if subscriber.userhostJID() == entity.userhostJID():
-                    subscriptions.append((node.nodeIdentifier, subscriber,
-                                          subscription.state))
+                    subscriptions.append(subscription)
 
         return defer.succeed(subscriptions)
 
 
+    def getDefaultConfiguration(self, nodeType):
+        if nodeType == 'collection':
+            raise error.NoCollections()
+
+        return self.defaultConfig[nodeType]
+
 
 class Node:
 
@@ -120,17 +133,25 @@
         try:
             subscription = self._subscriptions[subscriber.full()]
         except KeyError:
-            state = None
+            return defer.succeed(None)
         else:
-            state = subscription.state
-        return defer.succeed(state)
+            return defer.succeed(subscription)
 
 
-    def addSubscription(self, subscriber, state):
+    def getSubscriptions(self, state=None):
+        return defer.succeed(
+                [subscription
+                 for subscription in self._subscriptions.itervalues()
+                 if state is None or subscription.state == state])
+
+
+
+    def addSubscription(self, subscriber, state, options):
         if self._subscriptions.get(subscriber.full()):
             return defer.fail(error.SubscriptionExists())
 
-        subscription = Subscription(state)
+        subscription = Subscription(self.nodeIdentifier, subscriber, state,
+                                    options)
         self._subscriptions[subscriber.full()] = subscription
         return defer.succeed(None)
 
@@ -144,14 +165,6 @@
         return defer.succeed(None)
 
 
-    def getSubscribers(self):
-        subscribers = [jid.internJID(subscriber) for subscriber, subscription
-                       in self._subscriptions.iteritems()
-                       if subscription.state == 'subscribed']
-
-        return defer.succeed(subscribers)
-
-
     def isSubscribed(self, entity):
         for subscriber, subscription in self._subscriptions.iteritems():
             if jid.internJID(subscriber).userhost() == entity.userhost() and \
@@ -187,11 +200,14 @@
 
 
 
-class LeafNodeMixin:
+class LeafNode(Node):
+
+    implements(iidavoll.ILeafNode)
 
     nodeType = 'leaf'
 
-    def __init__(self):
+    def __init__(self, nodeIdentifier, owner, config):
+        Node.__init__(self, nodeIdentifier, owner, config)
         self._items = {}
         self._itemlist = []
 
@@ -251,21 +267,8 @@
         return defer.succeed(None)
 
 
-
-class LeafNode(Node, LeafNodeMixin):
-
-    implements(iidavoll.ILeafNode)
-
-    def __init__(self, nodeIdentifier, owner, config):
-        Node.__init__(self, nodeIdentifier, owner, config)
-        LeafNodeMixin.__init__(self)
-
-
-
-class Subscription:
-
-    def __init__(self, state):
-        self.state = state
+class CollectionNode(Node):
+    nodeType = 'collection'