package com.sogou.qadev.service.cynthia.bean.impl; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.w3c.dom.Document; import org.w3c.dom.Node; import bsh.This; import com.sogou.qadev.service.cynthia.bean.Action; import com.sogou.qadev.service.cynthia.bean.ActionRole; import com.sogou.qadev.service.cynthia.bean.Flow; import com.sogou.qadev.service.cynthia.bean.Right; import com.sogou.qadev.service.cynthia.bean.Role; import com.sogou.qadev.service.cynthia.bean.Stat; import com.sogou.qadev.service.cynthia.bean.UUID; import com.sogou.qadev.service.cynthia.bean.UserInfo; import com.sogou.qadev.service.cynthia.factory.DataAccessFactory; import com.sogou.qadev.service.cynthia.service.ConfigManager; import com.sogou.qadev.service.cynthia.service.DataAccessSession; import com.sogou.qadev.service.cynthia.service.ProjectInvolveManager; import com.sogou.qadev.service.cynthia.util.ArrayUtil; import com.sogou.qadev.service.cynthia.util.CynthiaUtil; import com.sogou.qadev.service.cynthia.util.XMLUtil; /** * @description:flow * @author:liming * @mail:liming@sogou-inc.com * @date:2014-5-6 下午2:15:06 * @version:v1.0 */ public class FlowImpl implements Flow{ private static final long serialVersionUID = -1L; private Map<UUID, Action> actionMap = new HashMap<UUID, Action>(); private Set<ActionRole> actionRoleSet = new HashSet<ActionRole>(); /** * flow createuser */ private String createUser = ""; /** * flow id */ private UUID id = null; private boolean isProFlow = false; //是否项目管理相关流程 /** * flow name */ private String name = null; private Set<Right> rightSet = new HashSet<Right>(); private Map<UUID, Role> roleMap = new HashMap<UUID, Role>(); private Map<UUID, Stat> statMap = new HashMap<UUID, Stat>(); /** * * <h1> Title:</h1> * <p> Description:init flow from root</p> * @date:2014-5-6 * @param root * @param createUser */ public FlowImpl(org.w3c.dom.Node root,String createUser){ this.createUser = createUser; DataAccessFactory daf = DataAccessFactory.getInstance(); Node flowNode = XMLUtil.getSingleNode(root, "flow"); this.id = daf.createUUID(XMLUtil.getSingleNodeTextContent(flowNode, "id")); this.name = XMLUtil.getSingleNodeTextContent(flowNode, "name"); this.isProFlow = Boolean.parseBoolean(XMLUtil.getSingleNodeTextContent(flowNode, "isProFlow")); List<org.w3c.dom.Node> statNodeList = XMLUtil.getNodes(flowNode, "stats/stat"); for(org.w3c.dom.Node statNode : statNodeList){ UUID statId = daf.createUUID(XMLUtil.getSingleNodeTextContent(statNode, "id")); String statName = XMLUtil.getSingleNodeTextContent(statNode, "name"); StatImpl statImpl = new StatImpl(statId, this.id); statImpl.setName(statName); this.statMap.put(statId, statImpl); } List<org.w3c.dom.Node> actionNodeList = XMLUtil.getNodes(flowNode, "actions/action"); for(org.w3c.dom.Node actionNode : actionNodeList){ UUID actionId = daf.createUUID(XMLUtil.getSingleNodeTextContent(actionNode, "id")); String actionName = XMLUtil.getSingleNodeTextContent(actionNode, "name"); String assignToMore = XMLUtil.getSingleNodeTextContent(actionNode, "assignToMore"); UUID beginStatId = daf.createUUID(XMLUtil.getSingleNodeTextContent(actionNode, "startStatId")); UUID endStatId = daf.createUUID(XMLUtil.getSingleNodeTextContent(actionNode, "endStatId")); ActionImpl actionImpl = new ActionImpl(actionId, this.id); actionImpl.setName(actionName); actionImpl.setBeginStatId(beginStatId); actionImpl.setEndStatId(endStatId); actionImpl.setAssignToMore(CynthiaUtil.isNull(assignToMore) ? false : assignToMore.equals("true")); this.actionMap.put(actionId, actionImpl); } List<org.w3c.dom.Node> roleNodeList = XMLUtil.getNodes(flowNode, "roles/role"); for(org.w3c.dom.Node roleNode : roleNodeList){ UUID roleId = daf.createUUID(XMLUtil.getSingleNodeTextContent(roleNode, "id")); String roleName = XMLUtil.getSingleNodeTextContent(roleNode, "name"); RoleImpl roleImpl = new RoleImpl(roleId, this.id); roleImpl.setName(roleName); this.roleMap.put(roleId, roleImpl); } List<org.w3c.dom.Node> actionRoleNodeList = XMLUtil.getNodes(flowNode, "actionRoles/actionRole"); for(org.w3c.dom.Node actionRoleNode : actionRoleNodeList){ UUID actionId = daf.createUUID(XMLUtil.getSingleNodeTextContent(actionRoleNode, "actionId")); UUID roleId = daf.createUUID(XMLUtil.getSingleNodeTextContent(actionRoleNode, "roleId")); this.actionRoleSet.add(new ActionRole(actionId, roleId)); } List<org.w3c.dom.Node> rightNodeList = XMLUtil.getNodes(flowNode, "rights/right"); for(org.w3c.dom.Node rightNode : rightNodeList){ String username = XMLUtil.getSingleNodeTextContent(rightNode, "username"); String nickname = CynthiaUtil.getUserAlias(username); UUID roleId = daf.createUUID(XMLUtil.getSingleNodeTextContent(rightNode, "roleId")); UUID templateId = daf.createUUID(XMLUtil.getSingleNodeTextContent(rightNode, "templateId")); if (templateId == null) { continue; } this.rightSet.add(new Right(username, templateId, roleId,nickname)); } } public FlowImpl(UUID id){ this.id = id; } /** * (non-Javadoc) * <p> Title:addAction</p> * <p> Description:TODO</p> * @param beginStatId * @param endStatId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#addAction(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public Action addAction(UUID beginStatId, UUID endStatId){ UUID actionId = DataAccessFactory.getInstance().newUUID("ACTI"); ActionImpl action = new ActionImpl(actionId, this.id); action.setBeginStatId(beginStatId); action.setEndStatId(endStatId); this.actionMap.put(actionId, action); return action; } /** * (non-Javadoc) * <p> Title:addActionRole</p> * <p> Description:TODO</p> * @param actionId * @param roleId * @see com.sogou.qadev.service.cynthia.bean.Flow#addActionRole(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public void addActionRole(UUID actionId, UUID roleId){ this.actionRoleSet.add(new ActionRole(actionId, roleId)); } /** * (non-Javadoc) * <p> Title:addRight</p> * <p> Description:TODO</p> * @param right * @see com.sogou.qadev.service.cynthia.bean.Flow#addRight(com.sogou.qadev.service.cynthia.bean.Right) */ public void addRight(Right right){ this.rightSet.add(right); } /** * (non-Javadoc) * <p> Title:addRight</p> * <p> Description:TODO</p> * @param username * @param templateId * @param roleId * @see com.sogou.qadev.service.cynthia.bean.Flow#addRight(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public void addRight(String username, UUID templateId, UUID roleId){ String nickname = CynthiaUtil.getUserAlias(username); this.rightSet.add(new Right(username, templateId, roleId,nickname)); } /** * (non-Javadoc) * <p> Title:addRole</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#addRole() */ public Role addRole(){ UUID roleId = DataAccessFactory.getInstance().newUUID("ROLE"); RoleImpl role = new RoleImpl(roleId, this.id); this.roleMap.put(roleId, role); return role; } /** * (non-Javadoc) * <p> Title:addStat</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#addStat() */ public Stat addStat(){ UUID statId = DataAccessFactory.getInstance().newUUID("STAT"); StatImpl statImpl = new StatImpl(statId, this.id); this.statMap.put(statId, statImpl); return statImpl; } /** * (non-Javadoc) * <p> Title:authenticate</p> * <p> Description:TODO</p> * @param username * @param templateId * @param actionId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#authenticate(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean authenticate(String username, UUID templateId, UUID actionId){ if (username.indexOf(",") != -1) { username = username.split(",")[0]; } Action[] actionArray = this.queryUserNodeBeginActions(username, templateId); for(Action action : actionArray){ if(action.getId().equals(actionId)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:authenticate</p> * <p> Description:TODO</p> * @param username * @param templateId * @param statId * @param actionId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#authenticate(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean authenticate(String username, UUID templateId, UUID statId, UUID actionId){ if (username.indexOf(",") != -1) { username = username.split(",")[0]; } Action[] actionArray = this.queryUserNodeStatActions(username, templateId, statId); for(Action action : actionArray){ if(action.getId().equals(actionId)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:clone</p> * <p> Description:flow clone</p> * @return * @see java.lang.Object#clone() */ public Flow clone(){ FlowImpl flowImpl = new FlowImpl(this.id); flowImpl.name = this.name; flowImpl.isProFlow = this.isProFlow; flowImpl.createUser = this.createUser; for(UUID statId : this.statMap.keySet()){ flowImpl.statMap.put(statId, this.statMap.get(statId).clone()); } for(UUID actionId : this.actionMap.keySet()){ flowImpl.actionMap.put(actionId, this.actionMap.get(actionId).clone()); } for(UUID roleId : this.roleMap.keySet()){ flowImpl.roleMap.put(roleId, this.roleMap.get(roleId).clone()); } for(Right right : this.rightSet){ flowImpl.rightSet.add(right); } for(ActionRole actionRole : this.actionRoleSet){ flowImpl.actionRoleSet.add(actionRole); } return flowImpl; } /** * (non-Javadoc) * <p> Title:equals</p> * <p> Description:TODO</p> * @param obj * @return * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj){ return this.id.equals(((FlowImpl)obj).id); } /** * (non-Javadoc) * <p> Title:getAction</p> * <p> Description:TODO</p> * @param actionName * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getAction(java.lang.String) */ public Action getAction(String actionName){ for(Action action : this.actionMap.values()){ if(action.getName().equals(actionName)){ return action; } } return null; } /** * (non-Javadoc) * <p> Title:getAction</p> * <p> Description:TODO</p> * @param actionId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getAction(com.sogou.qadev.service.cynthia.bean.UUID) */ public Action getAction(UUID actionId){ return this.actionMap.get(actionId); } /** * (non-Javadoc) * <p> Title:getActionMap</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getActionMap() */ public Map<UUID, Action> getActionMap() { return this.actionMap; } /** * (non-Javadoc) * <p> Title:getActionRoleSet</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getActionRoleSet() */ public Set<ActionRole> getActionRoleSet() { return this.actionRoleSet; } /** * (non-Javadoc) * <p> Title:getActions</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getActions() */ public Action[] getActions(){ return this.actionMap.values().toArray(new Action[this.actionMap.size()]); } /** * (non-Javadoc) * <p> Title:getBeginStats</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getBeginStats() */ public Stat[] getBeginStats(){ HashSet<Stat> statSet = new HashSet<Stat>(); for(Action action : this.actionMap.values()){ if(action.getBeginStatId() != null){ continue; } Stat endStat = this.statMap.get(action.getEndStatId()); if(endStat != null){ statSet.add(endStat); } } return statSet.toArray(new Stat[statSet.size()]); } @Override public String getCreateUser() { return this.createUser; } /** * (non-Javadoc) * <p> Title:getEndActions</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getEndActions() */ public Action[] getEndActions(){ Stat[] endStats = getEndStats(); HashSet<Action> actionSet = new HashSet<Action>(); for(Stat stat : endStats){ for(Action action : this.actionMap.values()){ if(action.getEndStatId()!=null&&action.getEndStatId().equals(stat.getId())) actionSet.add(action); } } return actionSet.toArray(new Action[actionSet.size()]); } /** * (non-Javadoc) * <p> Title:getEndStats</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getEndStats() */ public Stat[] getEndStats(){ HashSet<Stat> statSet = new HashSet<Stat>(); for(Stat stat : this.statMap.values()){ boolean isEnd = true; for(Action action : this.actionMap.values()){ if(action.getBeginStatId() != null && action.getBeginStatId().equals(stat.getId())){ isEnd = false; break; } } if(isEnd){ statSet.add(stat); } } return statSet.toArray(new Stat[statSet.size()]); } @Override public UUID getId(){ return this.id; } @Override public String getName(){ return this.name; } @Override public Set<Right> getRightSet() { return this.rightSet; } /** * (non-Javadoc) * <p> Title:getRole</p> * <p> Description:TODO</p> * @param roleName * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getRole(java.lang.String) */ public Role getRole(String roleName){ for(Role role : this.roleMap.values()){ if(role.getName().equals(roleName)){ return role; } } return null; } /** * (non-Javadoc) * <p> Title:getRole</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getRole(com.sogou.qadev.service.cynthia.bean.UUID) */ public Role getRole(UUID roleId){ return this.roleMap.get(roleId); } @Override public Map<UUID, Role> getRoleMap() { return this.roleMap; } /** * (non-Javadoc) * <p> Title:getRoles</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getRoles() */ public Role[] getRoles(){ if (ConfigManager.getProjectInvolved() && this.isProFlow) { return ProjectInvolveManager.getInstance().getAllRole(this.createUser).toArray(new Role[0]); }else { return this.roleMap.values().toArray(new Role[this.roleMap.size()]); } } /** * (non-Javadoc) * <p> Title:getStartActions</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getStartActions() */ public Set<Action> getStartActions(){ HashSet<Action> actionSet = new HashSet<Action>(); for(Action action : this.actionMap.values()){ if(action.getBeginStatId()==null) actionSet.add(action); } return actionSet; } /** * (non-Javadoc) * <p> Title:getStat</p> * <p> Description:TODO</p> * @param statName * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getStat(java.lang.String) */ public Stat getStat(String statName){ for(Stat stat : this.statMap.values()){ if(stat.getName().equals(statName)){ return stat; } } return null; } public Stat getStat(UUID statId){ return this.statMap.get(statId); } @Override public Map<UUID, Stat> getStatMap() { return this.statMap; } /** * (non-Javadoc) * <p> Title:getStats</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#getStats() */ public Stat[] getStats(){ return this.statMap.values().toArray(new Stat[this.statMap.size()]); } /** * (non-Javadoc) * <p> Title:hasActionRole</p> * <p> Description:TODO</p> * @param actionId * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#hasActionRole(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean hasActionRole(UUID actionId, UUID roleId){ return this.actionRoleSet.contains(new ActionRole(actionId, roleId)); } public int hashCode(){ return this.id.hashCode(); } /** * (non-Javadoc) * <p> Title:hasRight</p> * <p> Description:TODO</p> * @param username * @param templateId * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#hasRight(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean hasRight(String username, UUID templateId, UUID roleId){ if (this.isProFlow) { return ProjectInvolveManager.getInstance().isUserInRole(username, roleId); }else { String nickname = CynthiaUtil.getUserAlias(username); if (username.indexOf(",") != -1) { username = username.split(",")[0]; } return this.rightSet.contains(new Right(username, templateId, roleId,nickname)); } } /** * (non-Javadoc) * <p> Title:isActionEveryoneRole</p> * <p> Description:TODO</p> * @param actionId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isActionEveryoneRole(com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean isActionEveryoneRole(UUID actionId){ for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.actionId.equals(actionId) && actionRole.roleId.equals(Role.everyoneUUID)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:isDeleteActionAllow</p> * <p> Description:TODO</p> * @param user * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isDeleteActionAllow(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID) */ @Override public boolean isDeleteActionAllow(String user, UUID templateId) { if(isActionEveryoneRole(Action.deleteUUID)) return true; Role[] roleArray = queryUserNodeRoles(user, templateId); if(roleArray != null) { for(Role role : roleArray) { if(isRoleDeleteAction(role.getId())) return true; } } return false; } /** * (non-Javadoc) * <p> Title:isEditActionAllow</p> * <p> Description:TODO</p> * @param user * @param templateId * @param assignUser * @param actionUser * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isEditActionAllow(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, java.lang.String, java.lang.String) */ public boolean isEditActionAllow(String user, UUID templateId, String assignUser, String actionUser) { if(isActionEveryoneRole(Action.editUUID)) return true; Role[] roleArray = queryUserNodeRoles(user, templateId); if(roleArray != null) { for(Role role : roleArray) { if(isRoleEditAction(role.getId())) return true; } } Set<UUID> roleIdSet = new HashSet<UUID>(); if(roleArray != null) { for(Role role : roleArray) roleIdSet.add(role.getId()); } return false; } public boolean isProFlow() { return isProFlow; } /** * (non-Javadoc) * <p> Title:isReadActionAllow</p> * <p> Description:TODO</p> * @param user * @param templateId * @param assignUser * @param logUserArray * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isReadActionAllow(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, java.lang.String, java.lang.String[]) */ public boolean isReadActionAllow(String user, UUID templateId, String assignUser, String[] logUserArray) { if(isActionEveryoneRole(Action.readUUID)) return true; Role[] roleArray = queryUserNodeRoles(user, templateId); if(roleArray != null) { for(Role role : roleArray) { if(isRoleReadAction(role.getId())) return true; } } Set<UUID> roleIdSet = new HashSet<UUID>(); if(roleArray != null) { for(Role role : roleArray) roleIdSet.add(role.getId()); } if(assignUser != null) { Role[] assignUserRoleArray = queryUserNodeRoles(assignUser, templateId); if(assignUserRoleArray != null) { for(Role assignUserRole : assignUserRoleArray) { if(roleIdSet.contains(assignUserRole.getId())) return true; } } } for(String logUser : logUserArray) { Role[] logUserRoleArray = queryUserNodeRoles(logUser, templateId); if(logUserRoleArray != null) { for(Role logUserRole : logUserRoleArray) { if(roleIdSet.contains(logUserRole.getId())) return true; } } } return false; } /** * (non-Javadoc) * <p> Title:isRoleDeleteAction</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isRoleDeleteAction(com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean isRoleDeleteAction(UUID roleId) { for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.roleId.equals(roleId) && actionRole.actionId.equals(Action.deleteUUID)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:isRoleEditAction</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isRoleEditAction(com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean isRoleEditAction(UUID roleId){ for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.roleId.equals(roleId) && actionRole.actionId.equals(Action.editUUID)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:isRoleReadAction</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#isRoleReadAction(com.sogou.qadev.service.cynthia.bean.UUID) */ public boolean isRoleReadAction(UUID roleId){ for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.roleId.equals(roleId) && actionRole.actionId.equals(Action.readUUID)){ return true; } } return false; } /** * (non-Javadoc) * <p> Title:queryActionRoles</p> * <p> Description:TODO</p> * @param actionId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryActionRoles(com.sogou.qadev.service.cynthia.bean.UUID) */ public Role[] queryActionRoles(UUID actionId){ if (this.isProFlow) { return ProjectInvolveManager.getInstance().queryActionRoles(this.createUser, this, actionId); }else { Set<Role> roleSet = new HashSet<Role>(); for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.actionId.equals(actionId)){ Role role = this.roleMap.get(actionRole.roleId); if(role != null){ roleSet.add(role); } } } return roleSet.toArray(new Role[roleSet.size()]); } } @Override public Set<Action> queryActionsByStartStatId(UUID statId){ Set<Action> allActions = new HashSet<Action>(); for (Action action : this.getActions()) { if (action.getBeginStatId() != null && action.getBeginStatId().equals(statId)) { allActions.add(action); } } return allActions; } @Override public Set<Action> queryActionsByEndStatId(UUID statId){ Set<Action> allActions = new HashSet<Action>(); for (Action action : this.getActions()) { if (action.getEndStatId() != null && action.getEndStatId().equals(statId)) { allActions.add(action); } } return allActions; } @Override public String queryNextActionRoleIdsByActionId(UUID actionId){ Action action = getAction(actionId); if (action == null) { return ""; } Set<String> allRoleSet = new HashSet<String>(); Set<Action> allActions = queryActionsByStartStatId(action.getEndStatId()); for (Action action2 : allActions) { for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.actionId.equals(action2.getId())){ allRoleSet.add(actionRole.getRoleId().getValue()); } } } return ArrayUtil.strArray2String(allRoleSet.toArray(new String[0])); } @Override public String queryNextActionRoleIdsByStatId(UUID statId){ Set<String> allRoleSet = new HashSet<String>(); Set<Action> allActions = queryActionsByStartStatId(statId); for (Action action : allActions) { for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.actionId.equals(action.getId())){ allRoleSet.add(actionRole.getRoleId().getValue()); } } } return ArrayUtil.strArray2String(allRoleSet.toArray(new String[0])); } @Override public String queryActionRoleIds(UUID actionId){ StringBuffer roleIds = new StringBuffer(); for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.actionId.equals(actionId)){ roleIds.append(roleIds.length() > 0 ? "," : "").append(actionRole.getRoleId().getValue()); } } return roleIds.toString(); } /** * (non-Javadoc) * <p> Title:queryAllQuitUserInfo</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryAllQuitUserInfo(com.sogou.qadev.service.cynthia.bean.UUID) */ @Override public List<UserInfo> queryAllQuitUserInfo(UUID roleId) { Set<String> allRoleUser = queryAllUserByRole(roleId); DataAccessSession das = DataAccessFactory.getInstance().getSysDas(); return das.queryAllUserInfo(allRoleUser.toArray(new String[0]),true); } /** * (non-Javadoc) * <p> Title:queryAllUser</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryAllUser() */ public Set<String> queryAllUser(){ Set<String> allUser = new HashSet<String>(); for (Right right : this.rightSet) { allUser.add(right.getUsername()); } return allUser; } /** * (non-Javadoc) * <p> Title:queryAllUserByRole</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryAllUserByRole(com.sogou.qadev.service.cynthia.bean.UUID) */ public Set<String> queryAllUserByRole(UUID roleId){ Set<String> allUser = new HashSet<String>(); for (Right right : this.rightSet) { if (right.roleId.equals(roleId)) { allUser.add(right.getUsername()); } } return allUser; } /** * (non-Javadoc) * <p> Title:queryAllUserInfo</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryAllUserInfo() */ @Override public List<UserInfo> queryAllUserInfo() { Set<String> allRoleUser = queryAllUser(); DataAccessSession das = DataAccessFactory.getInstance().getSysDas(); return das.queryAllUserInfo(allRoleUser.toArray(new String[0]),false); } /** * (non-Javadoc) * <p> Title:queryAllUserInfo</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryAllUserInfo(com.sogou.qadev.service.cynthia.bean.UUID) */ @Override public List<UserInfo> queryAllUserInfo(UUID roleId) { Set<String> allRoleUser = queryAllUserByRole(roleId); DataAccessSession das = DataAccessFactory.getInstance().getSysDas(); return das.queryAllUserInfo(allRoleUser.toArray(new String[0]),false); } /** * (non-Javadoc) * <p> Title:queryBeginActions</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryBeginActions() */ public Action[] queryBeginActions(){ Set<Action> actionSet = new LinkedHashSet<Action>(); for(Action action : this.actionMap.values()){ if(action.getBeginStatId() == null){ actionSet.add(action); } } return actionSet.toArray(new Action[actionSet.size()]); } public boolean isEndAction(UUID actionId){ for (Action action : this.getEndActions()) { if (action != null && action.getId().equals(actionId)) { return true; } } return false; } /** * (non-Javadoc) * <p> Title:queryEditActionRoles</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryEditActionRoles() */ public Role[] queryEditActionRoles() { if (this.isProFlow) { return ProjectInvolveManager.getInstance().getAllRole(this.createUser).toArray(new Role[0]); }else { if(this.actionRoleSet == null) return new Role[0]; Set<Role> roleSet = new LinkedHashSet<Role>(); for(ActionRole actionRole : this.actionRoleSet) { if(!actionRole.actionId.equals(Action.editUUID)) continue; Role role = this.roleMap.get(actionRole.roleId); if(role != null) roleSet.add(role); } return roleSet.toArray(new Role[0]); } } /** * (non-Javadoc) * <p> Title:queryEveryoneRoleActions</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryEveryoneRoleActions() */ public Action[] queryEveryoneRoleActions() { if(this.actionRoleSet == null) return new Action[0]; Set<Action> actionSet = new LinkedHashSet<Action>(); for(ActionRole actionRole : this.actionRoleSet) { if(!actionRole.roleId.equals(Role.everyoneUUID)) continue; Action action = this.actionMap.get(actionRole.actionId); if(action != null) actionSet.add(action); } return actionSet.toArray(new Action[0]); } /** * (non-Javadoc) * <p> Title:queryNodeRoles</p> * <p> Description:TODO</p> * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryNodeRoles(com.sogou.qadev.service.cynthia.bean.UUID) */ public Role[] queryNodeRoles(UUID templateId) { Map<UUID, Role> roleMap = new LinkedHashMap<UUID, Role>(); for(Right right: this.rightSet) { if(right.templateId.equals(templateId)) { Role role = this.roleMap.get(right.roleId); if(role != null) roleMap.put(role.getId(), role); } } return roleMap.values().toArray(new Role[0]); } /** * (non-Javadoc) * <p> Title:queryNodeRoleUsers</p> * <p> Description:TODO</p> * @param templateId * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryNodeRoleUsers(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public String[] queryNodeRoleUsers(UUID templateId, UUID roleId) { HashSet<String> userSet = new HashSet<String>(); for (Right right : this.rightSet) { if(right.templateId.equals(templateId) && right.roleId.equals(roleId)) userSet.add(right.username); } return userSet.toArray(new String[0]); } /** * (non-Javadoc) * <p> Title:queryNodeStatAssignUsers</p> * <p> Description:TODO</p> * @param templateId * @param statId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryNodeStatAssignUsers(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public String[] queryNodeStatAssignUsers(UUID templateId, UUID statId){ Set<UUID> roleIdSet = new HashSet<UUID>(); Action[] actionArray = this.queryStatActions(statId); for(Action action : actionArray){ Role[] roleArray = this.queryActionRoles(action.getId()); for(Role role : roleArray){ roleIdSet.add(role.getId()); } } Set<String> userSet = new HashSet<String>(); for(Right right : this.rightSet){ if(right.templateId.equals(templateId) && roleIdSet.contains(right.roleId)){ userSet.add(right.username); } } String[] allUser = userSet.toArray(new String[userSet.size()]); Arrays.sort(allUser); return allUser; } /** * (non-Javadoc) * <p> Title:queryNodeUserRight</p> * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryNodeUserRight(com.sogou.qadev.service.cynthia.bean.UUID) */ public Right[] queryNodeUserRight(UUID templateId){ HashSet<Right> userSet = new HashSet<Right>(); for (Right right : this.rightSet) { if(right.templateId.equals(templateId)) userSet.add(right); } Right[] userRights = userSet.toArray(new Right[userSet.size()]); Arrays.sort(userRights); return userRights; } /** * (non-Javadoc) * <p> Title:queryNodeUsers</p> * <p> Description:TODO</p> * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryNodeUsers(com.sogou.qadev.service.cynthia.bean.UUID) */ public String[] queryNodeUsers(UUID templateId) { HashSet<String> userSet = new HashSet<String>(); for (Right right : this.rightSet) { if(right.templateId.equals(templateId)) userSet.add(right.username); } String[] userArray = userSet.toArray(new String[userSet.size()]); Arrays.sort(userArray); return userArray; } /** * (non-Javadoc) * <p> Title:queryReadActionRoles</p> * <p> Description:TODO</p> * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryReadActionRoles() */ public Role[] queryReadActionRoles() { if(this.actionRoleSet == null) return new Role[0]; Set<Role> roleSet = new LinkedHashSet<Role>(); for(ActionRole actionRole : this.actionRoleSet) { if(!actionRole.actionId.equals(Action.readUUID)) continue; Role role = this.roleMap.get(actionRole.roleId); if(role != null) roleSet.add(role); } return roleSet.toArray(new Role[0]); } /** * (non-Javadoc) * <p> Title:queryRightsByRole</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryRightsByRole(com.sogou.qadev.service.cynthia.bean.UUID) */ @Override public Set<Right> queryRightsByRole(UUID roleId) { Set<Right> allRightSet = new HashSet<Right>(); for (Right right : this.rightSet) { if (right.roleId.equals(roleId)) { allRightSet.add(right); } } return allRightSet; } @Override public Set<Right> queryRightsByRole(UUID roleId, UUID templateId) { Set<Right> allRightSet = new HashSet<Right>(); for (Right right : this.rightSet) { if (right.roleId.equals(roleId) && right.templateId.equals(templateId)) { allRightSet.add(right); } } return allRightSet; } /** * (non-Javadoc) * <p> Title:queryRoleActions</p> * <p> Description:TODO</p> * @param roleId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryRoleActions(com.sogou.qadev.service.cynthia.bean.UUID) */ public Action[] queryRoleActions(UUID roleId){ Set<Action> actionSet = new HashSet<Action>(); for(ActionRole actionRole : this.actionRoleSet){ if(actionRole.roleId.equals(roleId)){ Action action = this.actionMap.get(actionRole.actionId); if(action != null){ actionSet.add(action); } } } return actionSet.toArray(new Action[actionSet.size()]); } /** * (non-Javadoc) * <p> Title:queryStatActions</p> * <p> Description:TODO</p> * @param statId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryStatActions(com.sogou.qadev.service.cynthia.bean.UUID) */ public Action[] queryStatActions(UUID statId){ Set<Action> actionSet = new HashSet<Action>(); for(Action action : this.actionMap.values()){ if(action.getBeginStatId() != null && action.getBeginStatId().equals(statId)){ actionSet.add(action); } } return actionSet.toArray(new Action[actionSet.size()]); } /** * (non-Javadoc) * <p> Title:queryUserNodeBeginActions</p> * <p> Description:TODO</p> * @param username * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryUserNodeBeginActions(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID) */ public Action[] queryUserNodeBeginActions(String username, UUID templateId) { if(username == null || templateId == null) return new Action[0]; //TODO 根据角色来处理 if (isProFlow) { return this.getStartActions().toArray(new Action[0]); } Role[] roleArray = this.queryUserNodeRoles(username, templateId); if(roleArray == null) return new Action[0]; Map<UUID, Action> actionMap = new LinkedHashMap<UUID, Action>(); for(Role role : roleArray) { Action[] actionArray = this.queryRoleActions(role.getId()); if(actionArray == null) continue; for(Action action : actionArray) { if(action.getBeginStatId() == null) actionMap.put(action.getId(), action); } } Action[] beginActionArray = queryBeginActions(); for(int i = 0; beginActionArray != null && i < beginActionArray.length; i++) { if(isActionEveryoneRole(beginActionArray[i].getId())) //取消everyone控制 actionMap.put(beginActionArray[i].getId(), beginActionArray[i]); } return actionMap.values().toArray(new Action[0]); } /** * (non-Javadoc) * <p> Title:queryUserNodeRoles</p> * <p> Description:TODO</p> * @param user * @param templateId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryUserNodeRoles(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID) */ public Role[] queryUserNodeRoles(String user, UUID templateId) { if (this.isProFlow && ConfigManager.getProjectInvolved()) { return ProjectInvolveManager.getInstance().getAllRole(user).toArray(new Role[0]); }else { if (user.indexOf(",") != -1) { user = user.split(",")[0]; } Set<Role> roleSet = new LinkedHashSet<Role>(); for(Right right: this.rightSet) { if(right.username.equals(user) && right.templateId.equals(templateId)) { Role role = this.roleMap.get(right.roleId); if(role != null) roleSet.add(role); } } return roleSet.toArray(new Role[0]); } } /** * (non-Javadoc) * <p> Title:queryUserNodeStatActions</p> * <p> Description:TODO</p> * @param username * @param templateId * @param statId * @return * @see com.sogou.qadev.service.cynthia.bean.Flow#queryUserNodeStatActions(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public Action[] queryUserNodeStatActions(String username, UUID templateId, UUID statId){ if (username.indexOf(",") != -1) { username = username.split(",")[0]; } Set<Action> actionSet = new HashSet<Action>(); Role[] roleArray = this.queryUserNodeRoles(username, templateId); for(Role role : roleArray){ Action[] actionArray = this.queryRoleActions(role.getId()); for(Action action : actionArray){ if(action.getBeginStatId() != null && action.getBeginStatId().equals(statId)){ actionSet.add(action); } } } Action[] statActionArray = this.queryStatActions(statId); for(Action action : statActionArray){ if(this.isActionEveryoneRole(action.getId())){ actionSet.add(action); } } return actionSet.toArray(new Action[actionSet.size()]); } /** * (non-Javadoc) * <p> Title:removeAction</p> * <p> Description:TODO</p> * @param actionId * @see com.sogou.qadev.service.cynthia.bean.Flow#removeAction(com.sogou.qadev.service.cynthia.bean.UUID) */ public void removeAction(UUID actionId){ this.actionMap.remove(actionId); } /** * (non-Javadoc) * <p> Title:removeActionRole</p> * <p> Description:TODO</p> * @param actionId * @param roleId * @see com.sogou.qadev.service.cynthia.bean.Flow#removeActionRole(com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public void removeActionRole(UUID actionId, UUID roleId){ this.actionRoleSet.remove(new ActionRole(actionId, roleId)); } /** * (non-Javadoc) * <p> Title:removeRight</p> * <p> Description:TODO</p> * @param username * @see com.sogou.qadev.service.cynthia.bean.Flow#removeRight(java.lang.String) */ public void removeRight(String username) { Iterator it=this.rightSet.iterator(); while(it.hasNext()) { Right rt = (Right)it.next(); if(rt.username.equals(username)){ it.remove(); } } } /** * (non-Javadoc) * <p> Title:removeRight</p> * <p> Description:TODO</p> * @param username * @param templateId * @param roleId * @see com.sogou.qadev.service.cynthia.bean.Flow#removeRight(java.lang.String, com.sogou.qadev.service.cynthia.bean.UUID, com.sogou.qadev.service.cynthia.bean.UUID) */ public void removeRight(String username, UUID templateId, UUID roleId){ String nickname = CynthiaUtil.getUserAlias(username); this.rightSet.remove(new Right(username, templateId, roleId,nickname)); } /** * (non-Javadoc) * <p> Title:removeRole</p> * <p> Description:TODO</p> * @param roleId * @see com.sogou.qadev.service.cynthia.bean.Flow#removeRole(com.sogou.qadev.service.cynthia.bean.UUID) */ public void removeRole(UUID roleId){ this.roleMap.remove(roleId); } /** * (non-Javadoc) * <p> Title:removeStat</p> * <p> Description:TODO</p> * @param statId * @see com.sogou.qadev.service.cynthia.bean.Flow#removeStat(com.sogou.qadev.service.cynthia.bean.UUID) */ public void removeStat(UUID statId){ this.statMap.remove(statId); } @Override public void setActionMap(Map<UUID, Action> actionMap) { this.actionMap = actionMap; } @Override public void setActionRoleSet(Set<ActionRole> actionRoleSet) { this.actionRoleSet = actionRoleSet; } @Override public void setCreateUser(String userName) { this.createUser = userName; } @Override public void setName(String name){ this.name = name; } public void setProFlow(boolean isProFlow) { this.isProFlow = isProFlow; } @Override public void setRightSet(Set<Right> rightSet) { this.rightSet = rightSet; } @Override public void setRoleMap(Map<UUID, Role> roleMap) { this.roleMap = roleMap; } @Override public void setStatMap(Map<UUID, Stat> statMap) { this.statMap = statMap; } /** * (non-Javadoc) * <p> Title:toXMLDocument</p> * <p> Description:TODO</p> * @return * @throws Exception * @see com.sogou.qadev.service.cynthia.bean.BaseType#toXMLDocument() */ public Document toXMLDocument() throws Exception{ return XMLUtil.string2Document(toXMLString(), "UTF-8"); } /** * (non-Javadoc) * <p> Title:toXMLString</p> * <p> Description:TODO</p> * @return * @throws Exception * @see com.sogou.qadev.service.cynthia.bean.BaseType#toXMLString() */ public String toXMLString() throws Exception{ StringBuffer xmlb = new StringBuffer(); xmlb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xmlb.append("<flow>"); xmlb.append("<id>").append(this.id).append("</id>"); xmlb.append("<name>").append(XMLUtil.toSafeXMLString(this.name)).append("</name>"); xmlb.append("<isProFlow>").append(XMLUtil.toSafeXMLString(String.valueOf(this.isProFlow))).append("</isProFlow>"); if(this.statMap.size() == 0){ xmlb.append("<stats/>"); } else{ xmlb.append("<stats>"); for(Stat stat : this.statMap.values()){ xmlb.append("<stat>"); xmlb.append("<id>").append(stat.getId()).append("</id>"); xmlb.append("<name>").append(XMLUtil.toSafeXMLString(stat.getName())).append("</name>"); xmlb.append("</stat>"); } xmlb.append("</stats>"); } if(this.actionMap.size() == 0){ xmlb.append("<actions/>"); }else{ xmlb.append("<actions>"); for(Action action : this.actionMap.values()){ xmlb.append("<action>"); xmlb.append("<id>").append(action.getId()).append("</id>"); xmlb.append("<name>").append(XMLUtil.toSafeXMLString(action.getName())).append("</name>"); if(action.getBeginStatId() == null){ xmlb.append("<startStatId/>"); }else{ xmlb.append("<startStatId>").append(action.getBeginStatId()).append("</startStatId>"); } if(action.getEndStatId() == null){ xmlb.append("<endStatId/>"); }else{ xmlb.append("<endStatId>").append(action.getEndStatId()).append("</endStatId>"); } xmlb.append("<assignToMore>").append(action.getAssignToMore()).append("</assignToMore>"); xmlb.append("</action>"); } xmlb.append("</actions>"); } if(this.roleMap.size() == 0){ xmlb.append("<roles/>"); }else{ xmlb.append("<roles>"); for(Role role : this.roleMap.values()){ xmlb.append("<role>"); xmlb.append("<id>").append(role.getId()).append("</id>"); xmlb.append("<name>").append(XMLUtil.toSafeXMLString(role.getName())).append("</name>"); xmlb.append("</role>"); } xmlb.append("</roles>"); } if(this.actionRoleSet.size() == 0){ xmlb.append("<actionRoles/>"); }else{ xmlb.append("<actionRoles>"); for(ActionRole actionRole : this.actionRoleSet){ xmlb.append("<actionRole>"); xmlb.append("<actionId>").append(actionRole.actionId).append("</actionId>"); xmlb.append("<roleId>").append(actionRole.roleId).append("</roleId>"); xmlb.append("</actionRole>"); } xmlb.append("</actionRoles>"); } if(this.rightSet.size() == 0){ xmlb.append("<rights/>"); }else{ xmlb.append("<rights>"); for(Right right : this.rightSet){ xmlb.append("<right>"); xmlb.append("<username>").append(XMLUtil.toSafeXMLString(right.username)).append("</username>"); xmlb.append("<templateId>").append(right.templateId).append("</templateId>"); xmlb.append("<roleId>").append(right.roleId).append("</roleId>"); xmlb.append("</right>"); } xmlb.append("</rights>"); } xmlb.append("</flow>"); return xmlb.toString(); } }