Exemplo n.º 1
0
    def __init__(self, *args, **kwargs):
        self.schema = kwargs["schema"]
        del kwargs["schema"]
        super(Registry, self).__init__(*args, **kwargs)

        self.member_data_paths = list()
        self.cached_publications = list()
        self.keys = dict()
        self.registrations = dict()

        self.member_data = MemberData(self.schema, self.registrations, self.member_data_paths)
Exemplo n.º 2
0
class Registry(Tasklet):
    '''
    Base class for DTS tasklets wanting to use the annotation scheme and member data wrappers.
    '''

    def __init__(self, *args, **kwargs):
        self.schema = kwargs["schema"]
        del kwargs["schema"]
        super(Registry, self).__init__(*args, **kwargs)

        self.member_data_paths = list()
        self.cached_publications = list()
        self.keys = dict()
        self.registrations = dict()

        self.member_data = MemberData(self.schema, self.registrations, self.member_data_paths)

    @property
    def data(self):
        '''
        Returns the reference to the member data wrapper
        '''
        self.member_data.reset()
        return self.member_data

    def register(self):
        '''
        This method registers the anotated callbacks with DTS, it must be called during the init phase.
        '''

        subscriptions = list()
        publications = list()
        group_pre_commit = None
        group_commit = None
        group_abort = None

        self.callbacks = dict()

        for attribute in dir(self):

            handle = getattr(self, attribute)

            if hasattr(handle, "_group_wide"):
                if hasattr(handle, "_publish"):
                    publications.append(handle)
                    self.callbacks[handle._path] = handle
                elif hasattr(handle, "_subscribe"):
                    subscriptions.append(handle)
                    self.callbacks[handle._path] = handle
                elif hasattr(handle, "_pre_commit"):
                    group_pre_commit = handle
                elif hasattr(handle, "_abort"):
                    group_abort = handle
                elif hasattr(handle, "_commit"):
                    group_commit = handle
                else:
                    assert False, "expected annotation on %s" % attribute
            elif hasattr(handle, "_cached_member_data"):
                self.cached_publications += handle()

        handlers = Group.Handler()
        
        with self._dts.group_create(handler=handlers) as group:

            # subscriptions
            for sub in subscriptions:
                handler = DTS.RegistrationHandler(
                    on_prepare=sub,
                    on_precommit=group_pre_commit,
                    on_abort=group_abort,
                    on_commit=group_commit)
                reg_handle = group.register(
                    xpath=sub._path,
                    flags=RwDts.Flag.SUBSCRIBER,
                    handler=handler)
                self.registrations[sub._path] = reg_handle

            # non-member data
            for pub in publications:
                handler = DTS.RegistrationHandler(
                    on_prepare=pub,
                    on_precommit=group_pre_commit,
                    on_abort=group_abort,
                    on_commit=group_commit)
                reg_handle = group.register(
                    xpath=sub._path,
                    flags=RwDts.Flag.PUBLISHER|RwDts.Flag.CACHE,
                    handler=handler)
                self.registrations[pub._path] = reg_handle

            # member data
            for reg_key in self.cached_publications:
                handler = DTS.RegistrationHandler()
                reg_handle = group.register(
                    xpath=reg_key._path,
                    flags=RwDts.Flag.PUBLISHER|RwDts.Flag.CACHE|RwDts.Flag.NO_PREP_READ,
                    handler=handler)
                self.registrations[reg_key._path] = reg_handle
                self.member_data_paths.append(reg_key._path)