/* ================================================================== * 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.service.impl; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.springframework.beans.factory.annotation.Autowired; import com.jinhe.tss.core.Config; import com.jinhe.tss.core.persistence.IEntity; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.EasyUtils; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.um.UMConstants; import com.jinhe.tss.um.dao.IApplicationDao; import com.jinhe.tss.um.dao.IResourceTypeDao; import com.jinhe.tss.um.entity.Application; import com.jinhe.tss.um.entity.Operation; import com.jinhe.tss.um.entity.ResourceType; import com.jinhe.tss.um.entity.ResourceTypeRoot; import com.jinhe.tss.um.permission.PermissionHelper; import com.jinhe.tss.um.permission.PermissionService; import com.jinhe.tss.um.service.IResourceRegisterService; public class ResourceRegisterService implements IResourceRegisterService{ @Autowired private IApplicationDao applicationDao; @Autowired private IResourceTypeDao resourceTypeDao; @Autowired private PermissionService permissionService; /** * 如果是UMS在进行初始化操作,则permissionService取applicationContext.xml里配置的UMS本地PermissionService * 否则,permissionService取各应用里配置的PermissionService,比如导入CMS资源配置文件时,则取CMS的PermissionService */ private boolean initial = false; public void setInitial(boolean initial) { this.initial = initial; } public void applicationRegisterByXML(Document doc, String applicationType) { List<ResourceType> resourceTypeList = new ArrayList<ResourceType>(); List<ResourceTypeRoot> resourceTypeRootList = new ArrayList<ResourceTypeRoot>(); List<Operation> operationList = new ArrayList<Operation>(); // 解析应用 Application application = new Application(); Element appNode = (Element) doc.selectSingleNode("/application"); BeanUtil.setDataToBean(application, XMLDocUtil.dataNode2Map(appNode)); String applicationId = application.getApplicationId(); // 解析资源类型 List<Element> nodeList = XMLDocUtil.selectNodes(appNode, "resourceType"); for (Element resourceTypeNode : nodeList) { ResourceType resourceType = new ResourceType(); BeanUtil.setDataToBean(resourceType, XMLDocUtil.dataNode2Map(resourceTypeNode)); resourceType.setApplicationId(applicationId); resourceTypeList.add(resourceType); // 解析资源操作选项 List<Element> operationNodeList = XMLDocUtil.selectNodes(resourceTypeNode, "operation"); for (Element operationNode : operationNodeList) { Operation operation = new Operation(); BeanUtil.setDataToBean(operation, XMLDocUtil.dataNode2Map(operationNode)); operation.setApplicationId(applicationId); operation.setResourceTypeId(resourceType.getResourceTypeId()); operationList.add(operation); } } // 解析资源类型根节点 nodeList = XMLDocUtil.selectNodes(appNode, "resourceTypeRoot"); for (Element resourceTypeRootNode : nodeList) { ResourceTypeRoot resourceTypeRootId = new ResourceTypeRoot(); BeanUtil.setDataToBean(resourceTypeRootId, XMLDocUtil.dataNode2Map(resourceTypeRootNode)); resourceTypeRootList.add(resourceTypeRootId); } if(!EasyUtils.isNullOrEmpty(applicationType)){ application.setApplicationType(applicationType); } /***************************** 仅仅把外部资源注册进来,不进行补全操作 *******************************/ // 根据应用删除上次因导入失败产生的脏数据 applicationDao.clearDirtyData(applicationId); for(IEntity resourceTypeRoot : resourceTypeRootList) { resourceTypeDao.createObject(resourceTypeRoot); // 初始化资源类型根节点 } for (ResourceType resourceType : resourceTypeList) { String resourceTypeId = resourceType.getResourceTypeId(); ResourceTypeRoot resourceTypeRoot = resourceTypeDao.getResourceTypeRoot(applicationId, resourceTypeId); if( resourceTypeRoot != null) { resourceType.setRootId(resourceTypeRoot.getRootId()); } resourceTypeDao.create(resourceType); // 初始化资源类型 } for (Operation operation : operationList) { resourceTypeDao.createObject(operation); // 初始化权限选项 } /***************************** 对外部已经注册的资源进行补全操作 ************************************/ if(!initial){ permissionService = PermissionHelper.getPermissionService(applicationId, permissionService); } // 初始化资源类型 for (ResourceType resourceType : resourceTypeList) { /* 保存资源类型,同时还要为该类型资源建立一个根节点,以资源类型名字作为根节点名字 */ String resourceTypeId = resourceType.getResourceTypeId(); String unSuppliedTable = resourceTypeDao.getUnSuppliedTable(applicationId, resourceTypeId); String suppliedTable = resourceTypeDao.getSuppliedTable(applicationId, resourceTypeId); String initPermission = Config.getAttribute("initPermission"); if(Config.TRUE.equalsIgnoreCase(initPermission)) { permissionService.clearPermissionData(unSuppliedTable); permissionService.clearPermissionData(suppliedTable); } } // 初始化权限选项 for (Operation operation : operationList) { /* 让管理员角色拥有新添加的权限选项,即:让管理员拥有对资源 根节点 有permissionState=2的权限 */ String resourceTypeId = operation.getResourceTypeId(); ResourceTypeRoot resourceTypeRoot = resourceTypeDao.getResourceTypeRoot(applicationId, resourceTypeId); if( resourceTypeRoot != null ) { String unSuppliedTable = resourceTypeDao.getUnSuppliedTable(applicationId, resourceTypeId); String suppliedTable = resourceTypeDao.getSuppliedTable(applicationId, resourceTypeId); String resourceTable = resourceTypeDao.getResourceTable(applicationId, resourceTypeId); permissionService.saveRoleResourceOperation(UMConstants.ADMIN_ROLE_ID, resourceTypeRoot.getRootId(), operation.getOperationId(), UMConstants.PERMIT_SUB_TREE, unSuppliedTable, suppliedTable, resourceTable); } } // 初始化平台应用系统,应用系统作为一类资源,需要做补全操作的,所以最后保存 application.setSeqNo(applicationDao.getNextSeqNo(new Long(UMConstants.PLATFORM_SYSTEM_APP))); applicationDao.create(application); } }