class NodeSpace(object): implements(INodeSpace) def __init__(self, location = '', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw) def __get_node_tree(self): return Dictionary(self.__nodetree) nodetree = property(__get_node_tree) def __get_url(self): return self.__url url = property(__get_url) def __get_root(self): return self.as_node('/') root = property(__get_root) def as_node(self, path): if not isinstance(path, str) and hasattr(path, 'url'): path = path.url node = self.__nodetree.get(path) if not node: node = IConfigurableNode(_og_as_node(path)) return node def as_node_collection(self, paths): nodes = map(self.as_node, paths) return OrderedCollection(nodes) def as_internal_node(self, path): return self.as_node(path) def as_node_url(self, node): if isinstance(node, str) and self.__nodetree.has_key(node): return node else: return self.as_node(node).url def as_node_url_collection(self,nodes): urls = map(self.as_node_url, nodes) return OrderedCollection(urls) def create_node(self,factory): return factory(self) def add_node(self, node, url = None): if url is None: url = node.url assigned = self.__nodetree.setdefault(url, node) if assigned is not node: raise ValueError('URL "%s" already taken' % url) return url def remove_node(self, node, url = None): if url is None: url = self.as_node_url(node) elif self.as_node(url) is not node: raise ValueError('Node at %s is not node provided' % url) return self.__nodetree.pop(url)
class NodeSpace(object): implements(INodeSpace) def __init__(self, location='', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw) def __get_node_tree(self): return Dictionary(self.__nodetree) nodetree = property(__get_node_tree) def __get_url(self): return self.__url url = property(__get_url) def __get_root(self): return self.as_node('/') root = property(__get_root) def as_node(self, path): if not isinstance(path, str) and hasattr(path, 'url'): path = path.url node = self.__nodetree.get(path) if not node: node = IConfigurableNode(_og_as_node(path)) return node def as_node_collection(self, paths): nodes = map(self.as_node, paths) return OrderedCollection(nodes) def as_internal_node(self, path): return self.as_node(path) def as_node_url(self, node): if isinstance(node, str) and self.__nodetree.has_key(node): return node else: return self.as_node(node).url def as_node_url_collection(self, nodes): urls = map(self.as_node_url, nodes) return OrderedCollection(urls) def create_node(self, factory): return factory(self) def add_node(self, node, url=None): if url is None: url = node.url assigned = self.__nodetree.setdefault(url, node) if assigned is not node: raise ValueError('URL "%s" already taken' % url) return url def remove_node(self, node, url=None): if url is None: url = self.as_node_url(node) elif self.as_node(url) is not node: raise ValueError('Node at %s is not node provided' % url) return self.__nodetree.pop(url)
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]