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)
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)