package com.app.framework.core.support.view.tree;

import java.io.Serializable;
import java.util.*;

/**
 * TreeNode基类
 */
public class ExTreeNode implements Serializable {

    /**节点ID*/
    private String  id;
    /**父节点ID*/
    private String  parentId;
    /**节点名称*/
    private String  name;

    /**
     * 子节点集合
     */
    private List children;

    /**
     * 生成Tree
     * 	当构建节点的数据不在一张表时,ParentId和Id可能会一样,导致报错,此时需处理下
     * @param topResource	父节点
     * @param resources		所有的子节点
     */
    public <X extends ExTreeNode> X buildTree(X topResource,
                                             LinkedHashMap<String, X> resources) {
        Iterator<Map.Entry<String, X>> iter = resources.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<String, X> entry = iter.next();
            if (entry.getValue().getParentId() != null && entry.getValue().getParentId().equals(topResource.getId())) {
                topResource.addChild(entry.getValue());
            }
        }
        List<X> children = topResource.getChildren();
        if (children == null || children.size() < 1){
            return topResource;
        }
        for (X re : children) {
            buildTree(re, resources);
        }
        return topResource;
    }

    /**
     * 向子节点集合中添加节点
     * @param exTreeNode	节点
     */
    public <X extends ExTreeNode> void addChild(X exTreeNode) {
        if (null == children)
            children = new ArrayList<X>();
        children.add(exTreeNode);
    }

    /**
     * 获取节点ID
     */
    public String getId() {
        return id;
    }

    /**
     * 设置节点ID
     * @param id	节点ID
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取父节点ID
     */
    public String getParentId() {
        return parentId;
    }

    /**
     * 设置父节点ID
     * @param parentId	父节点ID
     */
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    /**
     * 获取节点名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置节点名称
     * @param name	节点名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取子节点集合
     */
    public <X> List<X> getChildren() {
        return children;
    }

    /**
     * 设置子节点集合
     * @param children	子节点集合
     */
    public <X extends ExTreeNode> void setChildren(List<X> children) {
        this.children = children;
    }
}
