From 1bbb94e533d60b11687316eec2413be2d385ed5b Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 02 Dec 2021 16:11:03 +0800
Subject: [PATCH] fix

---
 zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java |  136 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 131 insertions(+), 5 deletions(-)

diff --git a/zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java b/zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java
index 00abddd..da24809 100644
--- a/zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java
+++ b/zq-erp/src/main/java/com/matrix/core/enums/EnumsManager.java
@@ -1,26 +1,152 @@
 package com.matrix.core.enums;
 
+import com.matrix.core.tools.LogUtil;
 import com.matrix.system.hive.hievEnum.SmsPlatformEnum;
 import com.matrix.system.hive.hievEnum.SmsTypeEnum;
+import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 /**
  * TODO 这里后期改成自动扫描包下面的特定注解,而不是硬编码注册
  */
 public class EnumsManager {
+    private static final List<String> CLASS_NAME = new ArrayList<>();
+    private static ClassLoader classLoader;
+    private static final String SUFFIX = ".class";
 
     static Map<String,List<EnumsShowVo>> showAbleMap =new HashMap<>();
 
     static {
-        showAbleMap.put(SmsPlatformEnum.values()[0].getEnumCode(),SmsPlatformEnum.values()[0].getEnumsShowVos());
-        showAbleMap.put(SmsTypeEnum.values()[0].getEnumCode(),SmsTypeEnum.values()[0].getEnumsShowVos());
+//        showAbleMap.put(SmsPlatformEnum.values()[0].getEnumCode(),SmsPlatformEnum.values()[0].getEnumsShowVos());
+//        showAbleMap.put(SmsTypeEnum.values()[0].getEnumCode(),SmsTypeEnum.values()[0].getEnumsShowVos());
+
+        initEnum("com.matrix");
     }
 
     public static List<EnumsShowVo> getShowEnum(String emumCode){
         return showAbleMap.get(emumCode);
     }
 
+
+    private static void initEnum(String... packages) {
+        classLoader = Thread.currentThread().getContextClassLoader();
+
+        for (String basePackage : packages) {
+            Enumeration<URL> resources = null;
+            try {
+                resources = classLoader.getResources(basePackage.replaceAll("\\.", "/"));
+            } catch (IOException e) {
+                return;
+            }
+
+            // 扫描当前工程和jar包
+            while (resources.hasMoreElements()) {
+                URL url = resources.nextElement();
+                if ("file".equals(url.getProtocol())) {
+                    doFileScan(url.getPath());
+                } else if ("jar".equals(url.getProtocol())) {
+                    doJarScan(basePackage, url);
+                }
+            }
+        }
+
+        // 初始化枚举数据
+        enumValue();
+    }
+
+    /**
+     * 扫描当前工程对应包下的所有类
+     *
+     * @param path
+     */
+    private static void doFileScan(String path) {
+        String rootPath = classLoader.getResource("").getPath();
+        File pathFile = new File(path);
+
+        File[] files = pathFile.listFiles();
+        if (files == null || files.length == 0) {
+            return;
+        }
+
+        for (File file : files) {
+            if (file.isDirectory()) {
+                String nextPath = path + "/" + file.getName();
+                doFileScan(nextPath);
+            } else if (file.getName().endsWith(SUFFIX)) {
+                if (!path.contains(rootPath)) {
+                    return;
+                }
+                String subStr = path.substring(rootPath.length());
+                String className = (subStr + "/" + file.getName().replaceAll(SUFFIX, "")).replaceAll("/", "\\.");
+                CLASS_NAME.add(className);
+            }
+        }
+    }
+
+    /**
+     * 扫描jar包下对应包下所有类
+     *
+     * @param basePackage
+     * @param baseURL
+     */
+    public static void doJarScan(String basePackage, URL baseURL) {
+        basePackage = basePackage.replaceAll("\\.", "/");
+        JarFile jarFile;
+        try {
+            URLConnection urlConnection = baseURL.openConnection();
+            JarURLConnection jarUrl = (JarURLConnection) urlConnection;
+            jarFile = jarUrl.getJarFile();
+        } catch (IOException e) {
+            throw new RuntimeException("未找到资源");
+        }
+
+        Enumeration<JarEntry> entries = jarFile.entries();
+        while(entries.hasMoreElements()) {
+            JarEntry entry = entries.nextElement();
+
+            String name = entry.getName();
+            if (name.startsWith(basePackage)) {
+                if (name.endsWith(SUFFIX)) {
+                    String className = name.replaceAll(SUFFIX, "").replaceAll("/", "\\.");
+                    CLASS_NAME.add(className);
+                }
+            }
+        }
+    }
+
+    public static void enumValue() {
+        for (String className : CLASS_NAME) {
+            Class<?> clazz = null;
+            try {
+                clazz = classLoader.loadClass(className);
+            } catch (ClassNotFoundException e) {
+                continue;
+            }
+
+            // 判断类是否为枚举类型
+            if (!clazz.isEnum()){
+                continue;
+            }
+
+            // 判断ApiShowAble是否为类的父类
+            if (!ApiShowAble.class.isAssignableFrom(clazz)) {
+                continue;
+            }
+
+            Object[] constants = clazz.getEnumConstants();
+            ApiShowAble apiShowAble = (ApiShowAble) constants[0];
+
+            showAbleMap.put(apiShowAble.getEnumCode(), apiShowAble.getEnumsShowVos());
+        }
+    }
+
 }

--
Gitblit v1.9.1