zhou-hao 7 gadi atpakaļ
vecāks
revīzija
5950904e76

+ 29 - 19
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/java/org/hswebframework/web/authorization/starter/AutoSyncPermission.java

@@ -47,63 +47,67 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
 
         Map<String, List<AuthorizeDefinition>> grouping = new HashMap<>();
 
-
+        //以permissionId分组
         for (AuthorizeDefinition definition : definitions) {
             for (String permissionId : definition.getPermissions()) {
                 grouping.computeIfAbsent(permissionId, id -> new ArrayList<>())
                         .add(definition);
             }
         }
-        Map<String, PermissionEntity> permissionEntityMap = new HashMap<>();
 
-        for (Map.Entry<String, List<AuthorizeDefinition>> permissionEntiry : grouping.entrySet()) {
-            String permissionId = permissionEntiry.getKey();
-            List<AuthorizeDefinition> allPermission = permissionEntiry.getValue();
-            if (allPermission.isEmpty()) {
+        //创建权限实体
+        Map<String, PermissionEntity> waitToSyncPermissions = new HashMap<>();
+        for (Map.Entry<String, List<AuthorizeDefinition>> permissionDefinition : grouping.entrySet()) {
+            String permissionId = permissionDefinition.getKey();
+            //一个权限的全部定义(一个permission多个action)
+            List<AuthorizeDefinition> allDefinition = permissionDefinition.getValue();
+            if (allDefinition.isEmpty()) {
                 return;
             }
-            AuthorizeDefinition tmp = allPermission.get(0);
-
-            List<String> descs = allPermission.stream()
+            AuthorizeDefinition tmp = allDefinition.get(0);
+            //action描述
+            List<String> actionDescription = allDefinition.stream()
                     .map(AuthorizeDefinition::getActionDescription)
                     .flatMap(Stream::of)
                     .collect(Collectors.toList());
-
-            List<String> actions = allPermission
+            //action
+            List<String> actions = allDefinition
                     .stream()
                     .map(AuthorizeDefinition::getActions)
                     .flatMap(Collection::stream)
                     .collect(Collectors.toList());
 
+            //创建action实体
             Set<ActionEntity> actionEntities = new HashSet<>(actions.size());
             if (!actions.isEmpty()) {
                 for (int i = 0; i < actions.size(); i++) {
                     String action = actions.get(i);
-                    String desc = descs.size() > i ? descs.get(i) : actionDescMapping.getOrDefault(actions.get(i), action);
+                    String desc = actionDescription.size() > i ? actionDescription.get(i) : actionDescMapping.getOrDefault(actions.get(i), action);
                     ActionEntity actionEntity = new ActionEntity();
                     actionEntity.setAction(action);
                     actionEntity.setDescribe(desc);
                     actionEntities.add(actionEntity);
                 }
             }
+            //创建permission
             PermissionEntity entity = entityFactory.newInstance(PermissionEntity.class);
             entity.setId(permissionId);
             entity.setName(tmp.getPermissionDescription().length > 0 ? tmp.getPermissionDescription()[0] : permissionId);
             entity.setActions(new ArrayList<>(actionEntities));
             entity.setType("default");
             entity.setStatus(DataStatus.STATUS_ENABLED);
-
-            permissionEntityMap.putIfAbsent(entity.getId(), entity);
+            waitToSyncPermissions.putIfAbsent(entity.getId(), entity);
         }
 
-        Map<String, PermissionEntity> old = permissionService
-                .selectByPk(new ArrayList<>(permissionEntityMap.keySet()))
+        //查询出全部旧的权限数据并载入缓存
+        Map<String, PermissionEntity> oldCache = permissionService
+                .select()
                 .stream()
                 .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
 
-        permissionEntityMap.forEach((permissionId, permission) -> {
+        waitToSyncPermissions.forEach((permissionId, permission) -> {
             log.info("try sync permission[{}].{}", permissionId, permission.getActions());
-            PermissionEntity oldPermission = old.get(permissionId);
+            PermissionEntity oldPermission = oldCache.get(permissionId);
             if (oldPermission == null) {
                 permissionService.insert(permission);
             } else {
@@ -115,6 +119,7 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
                         .stream().collect(Collectors.toMap(ActionEntity::getAction, Function.identity()));
                 boolean permissionChanged = false;
                 for (ActionEntity actionEntity : permission.getActions()) {
+                    //添加新的action到旧的action
                     if (actionCache.get(actionEntity.getAction()) == null) {
                         oldAction.add(actionEntity);
                         permissionChanged = true;
@@ -122,12 +127,17 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
                 }
                 if (permissionChanged) {
                     oldPermission.setActions(oldAction);
-
                     permissionService.updateByPk(oldPermission.getId(), oldPermission);
                 }
+
+                actionCache.clear();
             }
 
         });
 
+        oldCache.clear();
+        waitToSyncPermissions.clear();
+        definitions.clear();
+        grouping.clear();
     }
 }