class CompositeNode(ConfigurableNode): implements(ICompositeNode) STARTCHILDFAILURE = '"%s" failed to start child "%s".' STOPCHILDFAILURE = '"%s" failed to stop child "%s".' PRUNECHILDFAILURE = '"%s" failed to stop child "%s".' def __init__(self, *args, **kw): self.__children = Dictionary() self.__nameorder = [] super(CompositeNode, self).__init__(*args, **kw) def __get_children(self): return self.__children.copy() children = property(__get_children) def children_nodes(self): return map(self.__children.get, self.__nameorder) def children_names(self): return self.__nameorder[:] def create_child(self, factory, name): if self.has_child(name): raise ValueError('Child named "%s" exists.' % name) child = factor(self.nodespace) child.configure({'name': name, 'parent': self}) return self.get_child(name) def add_child(self,node): if not IConfigurableNode.providedBy(node): raise TypeError('node is not IConfigurableNode') child = self.__children.setdefault(node.name, node) if child is not node: raise ValueError('Child "%s" already exists.' % node.name) self.__nameorder.append(node.name) childurl = path.join(self.url, child.name) self.nodespace.add_node(child, childurl) return childurl def rename_child(self, child, oldname): if self.get_child(oldname) is not child: raise ValueError('Child with name %s it not same' % oldname) index = self.get_index(oldname) nodeurl = self.add_child(child) self.remove_child(child, oldname) # Preserve the child's position. self.__nameorder.remove(child.name) self.__nameorder.insert(index, child.name) return nodeurl def remove_child(self, node, name = None): if name is None: name = node.name self.__nameorder.remove(name) self.__children.pop(name) nodeurl = path.join(self.url, name) self.nodespace.remove_node(node, nodeurl) def prune(self): for child in self.children_nodes(): try: child.prune() except: try: message = self.PRUNECHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return super(CompositeNode, self).prune() def prune_child(self, node): self.get_child(node).prune() def start(self): result = super(CompositeNode, self).start() for child in self.children_nodes(): try: child.start() except: try: message = self.STARTCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return result def stop(self): for child in self.children_nodes(): try: child.stop() except: try: message = self.STOPCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return super(CompositeNode, self).stop() def has_child(self, child): return self.__children.has_key(child) or (child in self.children_nodes()) def get_index(self, child): if not isinstance(child, str): child = child.name return self.__nameorder.index(child) def get_child(self, child): if not isinstance(child, str): child = child.name c = self.__children if c.has_key(child): return c[child] raise ENoSuchName(child) def descendants_nodes(self): nodes = self.children_nodes() count = len(nodes) for child in nodes[0:count]: if IParentNode.providedBy(child): nodes.extend(child.descendants_nodes()) return nodes def descendants_names(self): nodes = self.descendants_nodes() return [node.name for node in nodes]
class CompositeNode(ConfigurableNode): implements(ICompositeNode) STARTCHILDFAILURE = '"%s" failed to start child "%s".' STOPCHILDFAILURE = '"%s" failed to stop child "%s".' PRUNECHILDFAILURE = '"%s" failed to stop child "%s".' def __init__(self, *args, **kw): self.__children = Dictionary() self.__nameorder = [] super(CompositeNode, self).__init__(*args, **kw) def __get_children(self): return self.__children.copy() children = property(__get_children) def children_nodes(self): return map(self.__children.get, self.__nameorder) def children_names(self): return self.__nameorder[:] def create_child(self, factory, name): if self.has_child(name): raise ValueError('Child named "%s" exists.' % name) child = factor(self.nodespace) child.configure({'name': name, 'parent': self}) return self.get_child(name) def add_child(self, node): if not IConfigurableNode.providedBy(node): raise TypeError('node is not IConfigurableNode') child = self.__children.setdefault(node.name, node) if child is not node: raise ValueError('Child "%s" already exists.' % node.name) self.__nameorder.append(node.name) childurl = path.join(self.url, child.name) self.nodespace.add_node(child, childurl) return childurl def rename_child(self, child, oldname): if self.get_child(oldname) is not child: raise ValueError('Child with name %s it not same' % oldname) index = self.get_index(oldname) nodeurl = self.add_child(child) self.remove_child(child, oldname) # Preserve the child's position. self.__nameorder.remove(child.name) self.__nameorder.insert(index, child.name) return nodeurl def remove_child(self, node, name=None): if name is None: name = node.name self.__nameorder.remove(name) self.__children.pop(name) nodeurl = path.join(self.url, name) self.nodespace.remove_node(node, nodeurl) def prune(self): for child in self.children_nodes(): try: child.prune() except: try: message = self.PRUNECHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return super(CompositeNode, self).prune() def prune_child(self, node): self.get_child(node).prune() def start(self): result = super(CompositeNode, self).start() for child in self.children_nodes(): try: child.start() except: try: message = self.STARTCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return result def stop(self): for child in self.children_nodes(): try: child.stop() except: try: message = self.STOPCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return super(CompositeNode, self).stop() def has_child(self, child): return self.__children.has_key(child) or (child in self.children_nodes()) def get_index(self, child): if not isinstance(child, str): child = child.name return self.__nameorder.index(child) def get_child(self, child): if not isinstance(child, str): child = child.name c = self.__children if c.has_key(child): return c[child] raise ENoSuchName(child) def descendants_nodes(self): nodes = self.children_nodes() count = len(nodes) for child in nodes[0:count]: if IParentNode.providedBy(child): nodes.extend(child.descendants_nodes()) return nodes def descendants_names(self): nodes = self.descendants_nodes() return [node.name for node in nodes]