2010-06-29 46 views
0

我有以下结构:配置继承机制

 
config 
    |-- groups 
    |-- rootgroup 
    |-- group1 (includes rootgroup) 
    |-- group2 (includes group1) 
    |-- group3 (includes rootgroup) 
    |-- users 
    |-- Fred (includes group3 and group2) 

为弗雷德所以继承树的样子:

 
    _Fred_ 
    v  v 
group2 group3 
    v  v 
group1 v 
    v /
rootgroup 

我需要一个算法打印的线性配置读为了在底部开始(例如,它将是rootgroup - group1 - group2 - group3; group1覆盖rootgroup,group2覆盖group1等),并找到递归链接(例如,如果rootgroup包含group 2),而且它必须找到递归循环(... - > group2 - > group1 - >) rootgroup - > group2 - > ...)。

最好的语言是python,但任何都可以。

谢谢。

+0

你如何存储的关系呢?现在它是一个带有obj-per-line和列表深度的文本,表示“关系的子女”,或者你有一些基于类/对象的关系存储? 您现在呈现源结构(| - group1(包括rootgroup))的方式不利于解析。 – ddotsenko 2010-06-29 16:34:05

+0

对不起,目前它是一个文件结构。每个组都是一个目录,其中包含每行列出一个当前组依赖项的文件。 – RedRampage 2010-06-29 18:40:23

回答

0

阅读关于向无环图(DAG)后,好吧,我想出了以下解决方案:

def getNodeDepsTree(self, node, back_path=None): 
    """Return whole dependency tree for given node""" 
    # List of current node dependencies 
    node_deps = [] 

    if not back_path: 
     back_path = [] 

    # Push current node into return path list 
    back_path.append(node) 

    # Get current node dependencies list 
    deps = getNodeDeps(node) 

    for dep in deps: 
     # If dependency persist in list of visited nodes - it's a recursion 
     if dep in back_path: 
      pos = back_path.index(dep) 
      self.log.error("Recursive link detected. '" + node 
        + "', contains a recursive link to '" + dep 
        + "'. Removing dependency. Recursive loop is:\n\t" 
        + '\n\t'.join(back_path[pos:])) 
      continue 
     # Recursively call self for child nodes 
     node_deps.extend(self.getNodeDepsTree(dep, back_path)) 

    # Finally add current node as dependency 
    node_deps.append(node) 

    # Remove current node from list of visited nodes and return 
    back_path.pop() 

    return node_deps