Esempio n. 1
0
    def subscribe(cls, connection, subscription):
        if connection == None:
            raise custom_exceptions.PubsubException("Subscriber not connected")

        key = subscription.get_key()
        session = ConnectionRegistry.get_session(connection)
        if session == None:
            raise custom_exceptions.PubsubException("No session found")

        subscription.connection_ref = weakref.ref(connection)
        session.setdefault('subscriptions', {})

        if key in session['subscriptions']:
            raise custom_exceptions.AlreadySubscribedException(
                "This connection is already subscribed for such event.")

        session['subscriptions'][key] = subscription

        cls.__subscriptions.setdefault(subscription.event,
                                       weakref.WeakKeyDictionary())
        cls.__subscriptions[subscription.event][subscription] = None

        if hasattr(subscription, 'after_subscribe'):
            if connection.on_finish != None:
                # If subscription is processed during the request, wait to
                # finish and then process the callback
                connection.on_finish.addCallback(subscription.after_subscribe)
            else:
                # If subscription is NOT processed during the request (any real use case?),
                # process callback instantly (better now than never).
                subscription.after_subscribe(True)

        # List of 2-tuples is prepared for future multi-subscriptions
        return ((subscription.event, key, subscription), )
Esempio n. 2
0
 def subscribe(cls, connection, subscription):
     if connection == None:
         raise custom_exceptions.PubsubException("Subscriber not connected")
     
     key = subscription.get_key()
     session = ConnectionRegistry.get_session(connection)
     if session == None:
         raise custom_exceptions.PubsubException("No session found")
     
     subscription.connection_ref = weakref.ref(connection)
     session.setdefault('subscriptions', {})
     
     if key in session['subscriptions']:
         raise custom_exceptions.AlreadySubscribedException("This connection is already subscribed for such event.")
     
     session['subscriptions'][key] = subscription
                 
     cls.__subscriptions.setdefault(subscription.event, weakref.WeakKeyDictionary())
     cls.__subscriptions[subscription.event][subscription] = None
     
     if hasattr(subscription, 'after_subscribe'):
         if connection.on_finish != None:
             # If subscription is processed during the request, wait to
             # finish and then process the callback
             connection.on_finish.addCallback(subscription.after_subscribe)
         else:
             # If subscription is NOT processed during the request (any real use case?),
             # process callback instantly (better now than never).
             subscription.after_subscribe(True)
     
     # List of 2-tuples is prepared for future multi-subscriptions
     return ((subscription.event, key, subscription),)
Esempio n. 3
0
    def subscribe(cls, connection, subscription):
        if connection is None:
            raise PubsubException("Subscriber not connected")

        key = subscription.get_key()
        session = ConnectionRegistry.get_session(connection)

        if session is None:
            raise PubsubException("No session found")

        subscription.connection_ref = weakref.ref(connection)
        session.setdefault("subscriptions", {})

        if key in session["subscriptions"]:
            raise AlreadySubscribed("This connection is already subscribed")

        session["subscriptions"][key] = subscription

        cls.__subscriptions.setdefault(subscription.event,
                                       weakref.WeakKeyDictionary())
        cls.__subscriptions[subscription.event][subscription] = None

        if hasattr(subscription, "after_subscribe"):
            if connection.on_finish is not None:
                # If subscription is processed during the request, wait to finish
                # and then process the callback
                connection.on_finish.addCallback(subscription.after_subscribe)
            else:
                # If subscription is not processed during the request, process callback
                # instantly
                subscription.after_subscribe(True)

        return ((subscription.event, key), )
Esempio n. 4
0
    def get_subscription(cls, connection, event, key=None):
        '''Return subscription object for given connection and event'''
        session = ConnectionRegistry.get_session(connection)
        if session == None:
            raise custom_exceptions.PubsubException("No session found")

        if key == None:    
            sub = [ sub for sub in session.get('subscriptions', {}).values() if sub.event == event ]
            try:
                return sub[0]
            except IndexError:
                raise custom_exceptions.PubsubException("Not subscribed for event %s" % event)

        else:
            raise Exception("Searching subscriptions by key is not implemented yet")
Esempio n. 5
0
    def get_subscription(cls, connection, event, key=None):
        """Return subscription object for given connection and event"""
        session = ConnectionRegistry.get_session(connection)

        if session is None:
            raise PubsubException("No session found")

        if key is None:
            sub = [
                sub for sub in session.get("subscriptions", {}).values()
                if sub.event == event
            ]

            try:
                return sub[0]
            except IndexError:
                raise PubsubException(f"Not subscribed for event {event}")
Esempio n. 6
0
    def unsubscribe(cls, connection, subscription=None, key=None):
        if connection == None:
            raise custom_exceptions.PubsubException("Subscriber not connected")
        
        session = ConnectionRegistry.get_session(connection)
        if session == None:
            raise custom_exceptions.PubsubException("No session found")
        
        if subscription:
            key = subscription.get_key()

        try:
            # Subscription don't need to be removed from cls.__subscriptions,
            # because it uses weak reference there.
            del session['subscriptions'][key]
        except KeyError:
            print "Warning: Cannot remove subscription from connection session"
            return False
            
        return True
Esempio n. 7
0
    def get_subscription(cls, connection, event, key=None):
        '''Return subscription object for given connection and event'''
        session = ConnectionRegistry.get_session(connection)
        if session == None:
            raise custom_exceptions.PubsubException("No session found")

        if key == None:
            sub = [
                sub for sub in session.get('subscriptions', {}).values()
                if sub.event == event
            ]
            try:
                return sub[0]
            except IndexError:
                raise custom_exceptions.PubsubException(
                    "Not subscribed for event %s" % event)

        else:
            raise Exception(
                "Searching subscriptions by key is not implemented yet")
Esempio n. 8
0
    def unsubscribe(cls, connection, subscription=None, key=None):
        if connection == None:
            raise custom_exceptions.PubsubException("Subscriber not connected")

        session = ConnectionRegistry.get_session(connection)
        if session == None:
            raise custom_exceptions.PubsubException("No session found")

        if subscription:
            key = subscription.get_key()

        try:
            # Subscription don't need to be removed from cls.__subscriptions,
            # because it uses weak reference there.
            del session['subscriptions'][key]
        except KeyError:
            print "Warning: Cannot remove subscription from connection session"
            return False

        return True
Esempio n. 9
0
    def unsubscribe(cls, connection, subscription=None, key=None):
        if connection is None:
            raise PubsubException("Subscriber not connected")

        session = ConnectionRegistry.get_session(connection)
        if session is None:
            raise PubsubException("No session found")

        if subscription:
            key = subscription.get_key()

        try:
            # Subscription do not need to be remoived from cls.__subscriptions,
            # because it uses weak reference
            del session["subscriptions"][key]
        except KeyError:
            logger.warning(
                "Cannot remove subscriptions from connection session")
            return False

        return True