package org.hepx.tasksys.service; import org.hepx.tasksys.mapper.ResourceMapper; import org.hepx.tasksys.entity.Resource; import org.apache.shiro.authz.permission.WildcardPermission; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @Service @Transactional public class ResourceServiceImpl implements ResourceService { @Autowired private ResourceMapper resourceMapper; @Override public Resource createResource(Resource resource) { resourceMapper.createResource(resource); return resource; } @Override public Resource updateResource(Resource resource) { resourceMapper.updateResource(resource); return resource; } @Override public void deleteResource(Long resourceId) { resourceMapper.deleteResource(resourceId); } @Override public Resource findOne(Long resourceId) { return resourceMapper.findOne(resourceId); } @Override public List<Resource> findAll() { return resourceMapper.findAll(); } @Override public Set<String> findPermissions(Set<Long> resourceIds) { Set<String> permissions = new HashSet<String>(); for (Long resourceId : resourceIds) { Resource resource = findOne(resourceId); if (resource != null && !StringUtils.isEmpty(resource.getPermission())) { permissions.add(resource.getPermission()); } } return permissions; } @Override public List<Resource> findMenus(Set<String> permissions) { List<Resource> allResources = findAll(); List<Resource> menus = new ArrayList<Resource>(); for (Resource resource : allResources) { if (resource.isRootNode()) { continue; } if (resource.getType() != Resource.ResourceType.menu) { continue; } if (!hasPermission(permissions, resource)) { continue; } menus.add(resource); } return menus; } private boolean hasPermission(Set<String> permissions, Resource resource) { if (StringUtils.isEmpty(resource.getPermission())) { return true; } for (String permission : permissions) { WildcardPermission p1 = new WildcardPermission(permission); WildcardPermission p2 = new WildcardPermission(resource.getPermission()); if (p1.implies(p2) || p2.implies(p1)) { return true; } } return false; } }