DefaultGroupServiceProvider.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package org.ssssssss.magicapi.provider.impl;
  2. import org.ssssssss.magicapi.adapter.Resource;
  3. import org.ssssssss.magicapi.model.Group;
  4. import org.ssssssss.magicapi.model.TreeNode;
  5. import org.ssssssss.magicapi.provider.GroupServiceProvider;
  6. import org.ssssssss.magicapi.utils.JsonUtils;
  7. import org.ssssssss.magicapi.utils.PathUtils;
  8. import java.util.*;
  9. import java.util.stream.Collectors;
  10. public class DefaultGroupServiceProvider implements GroupServiceProvider {
  11. private Map<String, Group> cacheApiTree = new HashMap<>();
  12. private Map<String, Group> cacheFunctionTree = new HashMap<>();
  13. private final Map<String, Resource> mappings = new HashMap<>();
  14. private final Resource workspace;
  15. private String metabase = "group.json";
  16. public DefaultGroupServiceProvider(Resource workspace) {
  17. this.workspace = workspace;
  18. }
  19. @Override
  20. public boolean insert(Group group) {
  21. group.setId(UUID.randomUUID().toString().replace("-", ""));
  22. Resource directory = this.getGroupResource(group.getParentId());
  23. directory = directory == null ? this.getGroupResource(group.getType(),group.getName()) : directory.getResource(group.getName());
  24. if (!directory.exists() && directory.mkdir()) {
  25. Resource resource = directory.getResource(metabase);
  26. if (resource.write(JsonUtils.toJsonString(group))) {
  27. mappings.put(group.getId(), resource);
  28. return true;
  29. }
  30. }
  31. return false;
  32. }
  33. private Resource getGroupResource(String type, String name) {
  34. return this.workspace.getResource("1".equals(type) ? "api" : "function").getResource(name);
  35. }
  36. @Override
  37. public boolean update(Group group) {
  38. Resource oldResource = this.getGroupResource(group.getId());
  39. Resource newResource = this.getGroupResource(group.getParentId());
  40. newResource = newResource == null ? getGroupResource(group.getType(),group.getName()) : newResource.getResource(group.getName());
  41. // 重命名或移动目录
  42. if(oldResource.renameTo(newResource)){
  43. Resource target = newResource.getResource(metabase);
  44. if (target.write(JsonUtils.toJsonString(group))) {
  45. mappings.put(group.getId(), target);
  46. return true;
  47. }
  48. }
  49. return false;
  50. }
  51. @Override
  52. public boolean delete(String groupId) {
  53. mappings.remove(groupId);
  54. return true;
  55. }
  56. @Override
  57. public boolean containsApiGroup(String groupId) {
  58. return "0".equals(groupId) || cacheApiTree.containsKey(groupId);
  59. }
  60. @Override
  61. public TreeNode<Group> apiGroupTree() {
  62. List<Group> groups = groupList("1");
  63. cacheApiTree = groups.stream().collect(Collectors.toMap(Group::getId, value -> value));
  64. return convertToTree(groups);
  65. }
  66. @Override
  67. public TreeNode<Group> functionGroupTree() {
  68. List<Group> groups = groupList("2");
  69. cacheFunctionTree = groups.stream().collect(Collectors.toMap(Group::getId, value -> value));
  70. return convertToTree(groups);
  71. }
  72. @Override
  73. public List<Group> groupList(String type) {
  74. Resource resource = this.workspace.getResource("1".equals(type) ? "api" : "function");
  75. return resource.dirs().stream().map(it -> it.getResource(metabase)).filter(Resource::exists)
  76. .map(it -> {
  77. Group group = JsonUtils.readValue(it.read(), Group.class);
  78. mappings.put(group.getId(), it);
  79. return group;
  80. })
  81. .collect(Collectors.toList());
  82. }
  83. @Override
  84. public String getFullPath(String groupId) {
  85. StringBuilder path = new StringBuilder();
  86. Group group;
  87. while ((group = cacheFunctionTree.getOrDefault(groupId, cacheApiTree.get(groupId))) != null) {
  88. path.insert(0, '/' + Objects.toString(group.getPath(), ""));
  89. groupId = group.getParentId();
  90. }
  91. // 需要找到根节点,否则说明中间被删除了
  92. if (!"0".equals(groupId)) {
  93. return null;
  94. }
  95. return PathUtils.replaceSlash(path.toString());
  96. }
  97. @Override
  98. public String getFullName(String groupId) {
  99. if (groupId == null || "0".equals(groupId)) {
  100. return "";
  101. }
  102. StringBuilder name = new StringBuilder();
  103. Group group;
  104. while ((group = cacheFunctionTree.getOrDefault(groupId, cacheApiTree.get(groupId))) != null) {
  105. name.insert(0, '/' + group.getName());
  106. groupId = group.getParentId();
  107. }
  108. // 需要找到根节点,否则说明中间被删除了
  109. if (!"0".equals(groupId)) {
  110. return null;
  111. }
  112. return name.substring(1);
  113. }
  114. @Override
  115. public Resource getGroupResource(String groupId) {
  116. if (groupId == null || "0".equals(groupId)) {
  117. return null;
  118. }
  119. return mappings.get(groupId).parent();
  120. }
  121. private TreeNode<Group> convertToTree(List<Group> groups) {
  122. TreeNode<Group> root = new TreeNode<>();
  123. root.setNode(new Group("0", "root"));
  124. convertToTree(groups, root);
  125. return root;
  126. }
  127. private void convertToTree(List<Group> remains, TreeNode<Group> current) {
  128. Group temp;
  129. List<TreeNode<Group>> childNodes = new LinkedList<>();
  130. Iterator<Group> iterator = remains.iterator();
  131. while (iterator.hasNext()) {
  132. temp = iterator.next();
  133. if (current.getNode().getId().equals(temp.getParentId())) {
  134. childNodes.add(new TreeNode<>(temp));
  135. iterator.remove();
  136. }
  137. }
  138. current.setChildren(childNodes);
  139. childNodes.forEach(it -> convertToTree(remains, it));
  140. }
  141. }