Esempio n. 1
0
    def propagate(self, event):
        """
        Re-emit state change for the derived properties as Derived*Event's.

        TODO: We should fetch the old and new state of the namespace item in
        stead of the old and new values of the item that changed.

        If multiplicity is [0..1]:
          send DerivedSetEvent if len(union) < 2
        if multiplicity is [*]:
          send DerivedAddEvent and DerivedDeleteEvent
            if value not in derived union and
        """
        if event.property in self.subsets:
            # Make sure unions are created again
            self.version += 1

            if not IAssociationChangeEvent.providedBy(event):
                return

            # mimic the events for Set/Add/Delete
            if self.upper == 1:
                # This is a [0..1] event
                # TODO: This is an error: [0..*] associations may be used for updating [0..1] associations
                assert IAssociationSetEvent.providedBy(event)
                old_value, new_value = event.old_value, event.new_value
                self.handle(
                    DerivedSetEvent(event.element, self, old_value, new_value))
            else:
                if IAssociationSetEvent.providedBy(event):
                    old_value, new_value = event.old_value, event.new_value
                    # Do a filter? Change to
                    self.handle(
                        DerivedDeleteEvent(event.element, self, old_value))
                    self.handle(DerivedAddEvent(event.element, self,
                                                new_value))

                elif IAssociationAddEvent.providedBy(event):
                    new_value = event.new_value
                    self.handle(DerivedAddEvent(event.element, self,
                                                new_value))

                elif IAssociationDeleteEvent.providedBy(event):
                    old_value = event.old_value
                    self.handle(
                        DerivedDeleteEvent(event.element, self, old_value))

                elif IAssociationChangeEvent.providedBy(event):
                    self.handle(DerivedChangeEvent(event.element, self))
                else:
                    log.error("Don"
                              "t know how to handle event " + str(event) +
                              " for derived union")
Esempio n. 2
0
 def propagate(self, event):
     if event.property is self.original and isinstance(
             event.element, self.decl_class):
         # mimic the events for Set/Add/Delete
         if IAssociationSetEvent.providedBy(event):
             self.handle(
                 RedefineSetEvent(event.element, self, event.old_value,
                                  event.new_value))
         elif IAssociationAddEvent.providedBy(event):
             self.handle(
                 RedefineAddEvent(event.element, self, event.new_value))
         elif IAssociationDeleteEvent.providedBy(event):
             self.handle(
                 RedefineDeleteEvent(event.element, self, event.old_value))
         else:
             log.error("Don"
                       "t know how to handle event " + str(event) +
                       " for redefined association")
Esempio n. 3
0
    def on_element_change_event(self, event):

        # self.logger.info('Handling IElementChangeEvent')
        # self.logger.debug('Element is %s' % event.element)
        # self.logger.debug('Property is %s' % event.property)

        handlers = self._handlers.get((event.element, event.property))
        if handlers:
            # log.debug('')
            # log.debug('Element change for %s %s [%s]' % (str(type(event)), event.element, event.property))
            # if hasattr(event, 'old_value'):
            #    log.debug('    old value: %s' % (event.old_value))
            # if hasattr(event, 'new_value'):
            #    log.debug('    new value: %s' % (event.new_value))
            for handler in six.iterkeys(handlers):
                try:
                    handler(event)
                except Exception as e:
                    self.logger.error(
                        "Problem executing handler {0}, {1}".format(
                            handler, e))

            # Handle add/removal of handlers based on the kind of event
            # Filter out handlers that have no remaining properties
            if IAssociationSetEvent.providedBy(event):
                for handler, remainders in six.iteritems(handlers):
                    if remainders and event.old_value:
                        for remainder in remainders:
                            self._remove_handlers(event.old_value,
                                                  remainder[0], handler)
                    if remainders and event.new_value:
                        for remainder in remainders:
                            self._add_handlers(event.new_value, remainder,
                                               handler)
            elif IAssociationAddEvent.providedBy(event):
                for handler, remainders in six.iteritems(handlers):
                    for remainder in remainders:
                        self._add_handlers(event.new_value, remainder, handler)
            elif IAssociationDeleteEvent.providedBy(event):
                for handler, remainders in six.iteritems(handlers):
                    for remainder in remainders:
                        self._remove_handlers(event.old_value, remainder[0],
                                              handler)
Esempio n. 4
0
 def on_element_change_event(self, event):
     
     #self.logger.info('Handling IElementChangeEvent')
     #self.logger.debug('Element is %s' % event.element)
     #self.logger.debug('Property is %s' % event.property)
     
     handlers = self._handlers.get((event.element, event.property))
     if handlers:
         #log.debug('')
         #log.debug('Element change for %s %s [%s]' % (str(type(event)), event.element, event.property))
         #if hasattr(event, 'old_value'):
         #    log.debug('    old value: %s' % (event.old_value))
         #if hasattr(event, 'new_value'):
         #    log.debug('    new value: %s' % (event.new_value))
         for handler in handlers.iterkeys():
             try:
                 handler(event)
             except Exception, e:
                 self.logger.error('Problem executing handler %s' % handler, e)
     
         # Handle add/removal of handlers based on the kind of event
         # Filter out handlers that have no remaining properties
         if IAssociationSetEvent.providedBy(event):
             for handler, remainders in handlers.iteritems():
                 if remainders and event.old_value:
                     for remainder in remainders:
                         self._remove_handlers(event.old_value, remainder[0], handler)
                 if remainders and event.new_value:
                     for remainder in remainders:
                         self._add_handlers(event.new_value, remainder, handler)
         elif IAssociationAddEvent.providedBy(event):
             for handler, remainders in handlers.iteritems():
                 for remainder in remainders:
                     self._add_handlers(event.new_value, remainder, handler)
         elif IAssociationDeleteEvent.providedBy(event):
             for handler, remainders in handlers.iteritems():
                 for remainder in remainders:
                     self._remove_handlers(event.old_value, remainder[0], handler)
Esempio n. 5
0
    def propagate(self, event):
        """
        Re-emit state change for the derived union (as Derived*Event's).

        TODO: We should fetch the old and new state of the namespace item in
        stead of the old and new values of the item that changed.

        If multiplicity is [0..1]:
          send DerivedSetEvent if len(union) < 2
        if multiplicity is [*]:
          send DerivedAddEvent and DerivedDeleteEvent
            if value not in derived union and
        """
        if event.property in self.subsets:
            # Make sure unions are created again
            self.version += 1

            if not IAssociationChangeEvent.providedBy(event):
                return

            values = self._union(event.element, exclude=event.property)

            if self.upper == 1:
                assert IAssociationSetEvent.providedBy(event)
                old_value, new_value = event.old_value, event.new_value
                # This is a [0..1] event
                if self.single:
                    # Only one subset element, so pass the values on
                    self.handle(
                        DerivedSetEvent(event.element, self, old_value,
                                        new_value))
                else:
                    new_values = set(values)
                    if new_value:
                        new_values.add(new_value)
                    if len(new_values) > 1:
                        # In an in-between state. Do not emit notifications
                        return
                    if values:
                        new_value = next(iter(values))
                    self.handle(
                        DerivedSetEvent(event.element, self, old_value,
                                        new_value))
            else:
                if IAssociationSetEvent.providedBy(event):
                    old_value, new_value = event.old_value, event.new_value
                    if old_value and old_value not in values:
                        self.handle(
                            DerivedDeleteEvent(event.element, self, old_value))
                    if new_value and new_value not in values:
                        self.handle(
                            DerivedAddEvent(event.element, self, new_value))

                elif IAssociationAddEvent.providedBy(event):
                    new_value = event.new_value
                    if new_value not in values:
                        self.handle(
                            DerivedAddEvent(event.element, self, new_value))

                elif IAssociationDeleteEvent.providedBy(event):
                    old_value = event.old_value
                    if old_value not in values:
                        self.handle(
                            DerivedDeleteEvent(event.element, self, old_value))

                elif IAssociationChangeEvent.providedBy(event):
                    self.handle(DerivedChangeEvent(event.element, self))
                else:
                    log.error("Don"
                              "t know how to handle event " + str(event) +
                              " for derived union")