// Path: commons/src/main/java/com/dataagg/util/ITreeNode.java
// public interface ITreeNode<C extends ITreeNode<?>> extends Serializable {
// 	public static final Logger LOG = LoggerFactory.getLogger(ITreeNode.class);
// 
// 	public Long getId();
// 
// 	public void setId(Long id);
// 
// 	public Long getParentId();
// 
// 	public void setParentId(Long parentId);
// 
// 	public String getParentIds();
// 
// 	public void setParentIds(String parentIds);
// 
// 	public String getName();
// 
// 	public void setName(String name);
// 
// 	public String getCode();
// 
// 	public void setCode(String code);
// 
// 	public List<C> getItems();
// 
// 	public void setItems(List<C> items);
// 
// 	public default void addChild(C node) {
// 		List<C> items = getItems();
// 		if (items == null) {
// 			items = new ArrayList<>();
// 		}
// 		node.setParentId(getId());
// 		items.add(node);
// 		setItems(items);
// 	}
// 
// 	@SuppressWarnings("unchecked")
// 	public default ITreeNode<C> buildTree(List<ITreeNode<C>> nodes) {
// 		Map<Long, ITreeNode<C>> allNodes = new Hashtable<>();
// 		for (ITreeNode<C> node : nodes) {
// 			allNodes.put(node.getId(), node);
// 		}
// 
// 		ITreeNode<C> root = null;
// 		for (ITreeNode<C> node : nodes) {
// 			ITreeNode<C> parent = null;
// 			if (node.getParentId() != null) {
// 				parent = allNodes.get(node.getParentId());
// 				if (parent != null) {
// 					parent.addChild((C) node);
// 				} else {
// 					LOG.debug("不能找到根节点" + node.getId() + "--" + node.getParentId());
// 				}
// 			} else {
// 				if (root != null) {
// 					LOG.debug("重复的根节点" + root.getId() + "--" + node.getParentId());
// 				}
// 				root = node;
// 			}
// 		}
// 		return root;
// 	}
// }


import java.util.ArrayList;
import java.util.List;
import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.ColType;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Comment;
import org.nutz.dao.entity.annotation.Default;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Table;
import com.dataagg.util.ITreeNode;
import jodd.util.StringUtil;
	@Id
	@Comment("主键")
	private Long id;
	@Column
	@Comment("父级节点ID")
	@Default("0")
	private Long parentId;
	@Comment("所有父类ID,逗号拼接")
	@ColDefine(type = ColType.VARCHAR,width=2000,notNull=true)
	@Default(",0,")
	@Column("parent_ids")
	private String parentIds;
	@Column
	@Comment("path")
	private String code;
	@Column
	@Comment("名称")
	private String name;
	@Column
	@Comment("图标")
	private String icon = "message";
	@Column
	@Comment("类型")
	@ColDefine(type = ColType.VARCHAR, width = 10, notNull = true)
	@Default("1")
	private String menuType = "1";//1:菜单项; 10:一级子菜单; 20:二级子菜单
	@Column
	@Comment("排序")
	private int sort = 10;
	@Column
// Path: commons/src/main/java/com/dataagg/util/ITreeNode.java
// public interface ITreeNode<C extends ITreeNode<?>> extends Serializable {
// 	public static final Logger LOG = LoggerFactory.getLogger(ITreeNode.class);
// 
// 	public Long getId();
// 
// 	public void setId(Long id);
// 
// 	public Long getParentId();
// 
// 	public void setParentId(Long parentId);
// 
// 	public String getParentIds();
// 
// 	public void setParentIds(String parentIds);
// 
// 	public String getName();
// 
// 	public void setName(String name);
// 
// 	public String getCode();
// 
// 	public void setCode(String code);
// 
// 	public List<C> getItems();
// 
// 	public void setItems(List<C> items);
// 
// 	public default void addChild(C node) {
// 		List<C> items = getItems();
// 		if (items == null) {
// 			items = new ArrayList<>();
// 		}
// 		node.setParentId(getId());
// 		items.add(node);
// 		setItems(items);
// 	}
// 
// 	@SuppressWarnings("unchecked")
// 	public default ITreeNode<C> buildTree(List<ITreeNode<C>> nodes) {
// 		Map<Long, ITreeNode<C>> allNodes = new Hashtable<>();
// 		for (ITreeNode<C> node : nodes) {
// 			allNodes.put(node.getId(), node);
// 		}
// 
// 		ITreeNode<C> root = null;
// 		for (ITreeNode<C> node : nodes) {
// 			ITreeNode<C> parent = null;
// 			if (node.getParentId() != null) {
// 				parent = allNodes.get(node.getParentId());
// 				if (parent != null) {
// 					parent.addChild((C) node);
// 				} else {
// 					LOG.debug("不能找到根节点" + node.getId() + "--" + node.getParentId());
// 				}
// 			} else {
// 				if (root != null) {
// 					LOG.debug("重复的根节点" + root.getId() + "--" + node.getParentId());
// 				}
// 				root = node;
// 			}
// 		}
// 		return root;
// 	}
// }


// Path: commons/src/main/java/com/dataagg/commons/domain/EMenu.java
import java.util.ArrayList;
import java.util.List;
import org.nutz.dao.entity.annotation.ColDefine;
import org.nutz.dao.entity.annotation.ColType;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Comment;
import org.nutz.dao.entity.annotation.Default;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Table;
import com.dataagg.util.ITreeNode;
import jodd.util.StringUtil;

	@Id
	@Comment("主键")
	private Long id;
	@Column
	@Comment("父级节点ID")
	@Default("0")
	private Long parentId;
	@Comment("所有父类ID,逗号拼接")
	@ColDefine(type = ColType.VARCHAR,width=2000,notNull=true)
	@Default(",0,")
	@Column("parent_ids")
	private String parentIds;
	@Column
	@Comment("path")
	private String code;
	@Column
	@Comment("名称")
	private String name;
	@Column
	@Comment("图标")
	private String icon = "message";
	@Column
	@Comment("类型")
	@ColDefine(type = ColType.VARCHAR, width = 10, notNull = true)
	@Default("1")
	private String menuType = "1";//1:菜单项; 10:一级子菜单; 20:二级子菜单
	@Column
	@Comment("排序")
	private int sort = 10;
	@Column
	@Comment("标记")