/* ================================================================== * 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.springframework.beans.factory.annotation.Autowired; 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.entity.permission.resources.ApplicationResources; import com.jinhe.tss.um.entity.permission.supplied.ApplicationPermissionsFull; import com.jinhe.tss.um.permission.PermissionHelper; import com.jinhe.tss.um.permission.PermissionService; import com.jinhe.tss.um.permission.dispaly.ResourceTreeNode; import com.jinhe.tss.um.service.IApplicationService; public class ApplicationService implements IApplicationService{ @Autowired private IApplicationDao applicationDao; @Autowired private IResourceTypeDao resourceTypeDao; @Autowired private PermissionService permissionService; public Object[] findApplicationAndResourceType() { // 应用系统列表 List<?> apps = getApplications(); if( apps == null || apps.size() == 0 ) { return new Object[]{apps, new ArrayList<Object>(), new ArrayList<Object>()}; } // 资源类型列表 List<String> applicationIds = new ArrayList<String>(); for(Object obj : apps){ applicationIds.add(((Application) obj).getApplicationId()); } String hql = "from ResourceType o where o.applicationId in (:applicationIds) order by o.seqNo"; List<?> resourceTypes = resourceTypeDao.getEntities(hql, new Object[]{"applicationIds"}, new Object[]{applicationIds}); if(resourceTypes == null || resourceTypes.size() == 0) { return new Object[]{apps, new ArrayList<Object>(), new ArrayList<Object>()}; } // 权限选项列表 List<String> resourceTypeIds = new ArrayList<String>(); for(Object obj : resourceTypes){ resourceTypeIds.add(((ResourceType) obj).getResourceTypeId()); } hql = "from Operation o where o.resourceTypeId in (:resourceTypeIds) order by o.seqNo"; List<?> operations = resourceTypeDao.getEntities(hql, new Object[]{"resourceTypeIds"}, new Object[]{resourceTypeIds}); return new Object[]{apps, resourceTypes, operations}; } public Application getApplication(String applicationId){ return applicationDao.getApplication(applicationId); } public Application getApplicationById(Long id) { return applicationDao.getEntity(id); } public ResourceType getResourceTypeById(Long id) { return resourceTypeDao.getEntity(id); } public ResourceTypeRoot findResourceTypeRoot(String applicationId, String resourceTypeId){ return resourceTypeDao.getResourceTypeRoot(applicationId, resourceTypeId); } public Operation getOperationById(Long id) { return (Operation) resourceTypeDao.getEntity(Operation.class, id); } public void removeApplication(Long id) { Application application = applicationDao.getEntity(id); applicationDao.clearDirtyData(application.getApplicationId()); } public void removeResourceType(Long id) { ResourceType resourceType = resourceTypeDao.getEntity(id); resourceTypeDao.delete(resourceType); // 删除Operation表 List<?> operationList = resourceTypeDao.getEntities("from Operation o where o.resourceTypeId = ?", resourceType.getResourceTypeId()); for(Object obj : operationList) { removeOperation(((Operation)obj).getId()); } } public void removeOperation(Long id) { Operation operation = getOperationById(id); resourceTypeDao.delete( operation ); // 删除权限选项, 连同删除RoleResourceOperation表中相关数据 ResourceType resourceType = resourceTypeDao.getResourceType(operation.getApplicationId(), operation.getResourceTypeId()); String suppliedTable = resourceType.getSuppliedTable(); String unSuppliedTable = resourceType.getUnSuppliedTable(); resourceTypeDao.deleteAll(resourceTypeDao.getEntities("from " + suppliedTable + " o where o.operationId = ?", operation.getOperationId())); resourceTypeDao.deleteAll(resourceTypeDao.getEntities("from " + unSuppliedTable + " o where o.operationId = ?", operation.getOperationId())); } public List<ResourceTreeNode> findResoucrcesByResourceType(String resourceTypeId, String applicationId) { String resourceTable = resourceTypeDao.getResourceTable(applicationId, resourceTypeId); String hql = "select distinct o.id, o.parentId, o.name, o.decode from " + resourceTable + " o order by o.decode"; List<?> resourcesTree = resourceTypeDao.getEntities(hql); return ResourceTreeNode.genResourceTreeNodeList(resourcesTree); } public void saveApplication(Application application) { if(null == application.getId()){ // 新建 Integer nextSeqNo = applicationDao.getNextSeqNo(ApplicationResources.class.getName(), application.getParentId()); application.setSeqNo(nextSeqNo); applicationDao.create(application); } else { applicationDao.update(application); } } public Object createResourceType(ResourceType resourceType){ resourceTypeDao.create(resourceType); // 保存一个应用系统中一种类型的根节点 ResourceTypeRoot resourceTypeRoot = new ResourceTypeRoot(); resourceTypeRoot.setApplicationId(resourceType.getApplicationId()); resourceTypeRoot.setResourceTypeId(resourceType.getResourceTypeId()); resourceTypeRoot.setRootId(resourceType.getRootId()); resourceTypeDao.createObject(resourceTypeRoot); return resourceType; } public Object updateResourceType(ResourceType resourceType){ String applicationId = resourceType.getApplicationId(); String resourceTypeId = resourceType.getResourceTypeId(); ResourceTypeRoot resourceTypeRoot = resourceTypeDao.getResourceTypeRoot(applicationId, resourceTypeId); if(null != resourceTypeRoot){ resourceTypeRoot.setRootId(resourceType.getRootId()); } resourceTypeDao.update(resourceType); return resourceType; } public Operation saveOperation(Operation operation){ resourceTypeDao.createObject(operation); String applicationId = operation.getApplicationId(); 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 = PermissionHelper.getPermissionService(applicationId, permissionService); // 新建的权限选项要将该权限选项赋予管理员角色(id==-1) permissionService.saveRoleResourceOperation(UMConstants.ADMIN_ROLE_ID, resourceTypeRoot.getRootId(), operation.getOperationId(), UMConstants.PERMIT_SUB_TREE, unSuppliedTable, suppliedTable, resourceTable); } return operation; } public void updateOperation(Operation operation) { resourceTypeDao.update(operation); } public List<?> getOperationsByResourceId(Long appId){ String suppliedTable = ApplicationPermissionsFull.class.getName(); return PermissionHelper.getInstance().getOperationsByResource(appId, suppliedTable, ApplicationResources.class); } public void sortApplication(Long appId, Long toAppId, int direction, Long userId){ applicationDao.sort(appId, toAppId, direction); } public List<?> getApplications() { return applicationDao.getEntities("from Application o order by o.decode"); } }