/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.um.helper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jinhe.tss.core.util.EasyUtils;
import com.jinhe.tss.core.web.dispaly.tree.ITreeParser;
import com.jinhe.tss.core.web.dispaly.tree.TreeNode;
import com.jinhe.tss.um.entity.Application;
import com.jinhe.tss.um.entity.Group;
/**
* <p>
* 用户组,应用系统树型结构解析器
* </p>
*/
@SuppressWarnings("unchecked")
public class GroupTreeParser implements ITreeParser {
public TreeNode parse(Object data) {
Object[] objs = (Object[]) data;
List<Group> mainAndAssistantGroups = (List<Group>) objs[0];
TreeNode root = new TreeNode();
Map<Long, TreeNode> treeNodeMap = new HashMap<Long, TreeNode>();
// 解析主用户组和辅助用户组
if ( !EasyUtils.isNullOrEmpty(mainAndAssistantGroups) ) {
for (Group group : mainAndAssistantGroups) {
TreeNode item = new TreeNode(group);
treeNodeMap.put(group.getId(), item);
}
parserGroup(root, (List<Group>) mainAndAssistantGroups, treeNodeMap);
}
// 解析其它用户组,挂到所属的应用节点下面
parseOtherGroups2Tree(objs, 1, root, treeNodeMap);
return root;
}
protected void parseOtherGroups2Tree(Object[] data, int startIndex, TreeNode root, Map<Long, TreeNode> treeNodeMap) {
Group otherAppGroupRoot = (Group) data[startIndex++];
List<Group> otherGroups = (List<Group>) data[startIndex++];
List<Application> apps = (List<Application>) data[startIndex];
if ( otherAppGroupRoot == null ) return;
TreeNode otherGroupRoot = new TreeNode(otherAppGroupRoot);
root.addChild(otherGroupRoot);
if (apps == null || otherGroups == null) return;
for ( Application app : apps ) {
TreeNode appNode = new TreeNode(app);
otherGroupRoot.addChild(appNode);
List<Group> otherGroupsUnderApp = new ArrayList<Group>(); // 当前应用下的用户组列表
treeNodeMap.clear();
for (Group group : otherGroups) {
// 筛选出属于当前应用的所有用户组
if (app.getApplicationId().equals(group.getApplicationId())) {
otherGroupsUnderApp.add(group);
treeNodeMap.put(group.getId(), new TreeNode(group));
}
}
parserGroup(appNode, otherGroupsUnderApp, treeNodeMap);
}
}
/**
* 解析用户组节点, 挂靠到各自的父节点下
* @param root 应用的根节点
* @param groups
* @param treeNodeMap
*/
protected void parserGroup(TreeNode root, List<Group> groups, Map<Long, TreeNode> treeNodeMap) {
for ( Group group : groups ) {
TreeNode groupParent = (TreeNode) treeNodeMap.get(group.getParentId());
TreeNode treeNode = (TreeNode) treeNodeMap.get(group.getId());
if (groupParent == null) {
root.addChild(treeNode);
} else {
groupParent.addChild(treeNode);
}
}
}
}