This is an automated email from the ASF dual-hosted git repository.

hefengen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new b1f0badbb2 [type:fix] fix plugin can not load resource path file 
(#5372)
b1f0badbb2 is described below

commit b1f0badbb2c104783faa85f6d939123f332842b6
Author: Misaya295 <[email protected]>
AuthorDate: Thu Dec 21 22:07:39 2023 +0800

    [type:fix] fix plugin can not load resource path file (#5372)
    
    * refactor plugin loader
    
    * refactor load plugin
    
    * fix style
    
    * refactor code
    
    * refactor code
    
    * fix ci
    
    * fix resource file can not load
    
    * fix empty InputStream
    
    * change PluginJar hashmap to ConcurrentHashMap
    
    * fix style
    
    ---------
    
    Co-authored-by: chenwk <[email protected]>
---
 .../apache/shenyu/web/loader/PluginJarParser.java  | 52 +++++++++++++++++-----
 .../shenyu/web/loader/ShenyuPluginClassLoader.java | 18 ++++++++
 2 files changed, 59 insertions(+), 11 deletions(-)

diff --git 
a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/PluginJarParser.java 
b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/PluginJarParser.java
index a428aa5cbd..b8821d6a04 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/PluginJarParser.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/PluginJarParser.java
@@ -22,9 +22,9 @@ import org.apache.shenyu.common.exception.ShenyuException;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
@@ -64,15 +64,9 @@ public class PluginJarParser {
                 }
                 if (!jarEntry.isDirectory() && entryName.endsWith(".class") && 
!entryName.contains("$")) {
                     String className = jarEntry.getName().substring(0, 
entryName.length() - 6).replaceAll("/", ".");
-                    try (ByteArrayOutputStream buffer = new 
ByteArrayOutputStream()) {
-                        int data;
-                        while ((data = jarInputStream.read()) != -1) {
-                            buffer.write(data);
-                        }
-                        buffer.flush();
-                        byte[] classByteArray = buffer.toByteArray();
-                        pluginJar.clazzMap.put(className, classByteArray);
-                    }
+                    pluginJar.clazzMap.put(className, 
getClassByteArray(jarInputStream));
+                } else {
+                    pluginJar.resourceMap.put(jarEntry.getName(), 
getClassByteArray(jarInputStream));
                 }
             }
         } catch (IOException e) {
@@ -81,6 +75,24 @@ public class PluginJarParser {
         return pluginJar;
     }
 
+    /**
+     * getClassByteArray.
+     * @param jarInputStream jarInputStream
+     * @return class byte[]
+     */
+    private static byte[] getClassByteArray(final JarInputStream 
jarInputStream) {
+        try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
+            int data;
+            while ((data = jarInputStream.read()) != -1) {
+                buffer.write(data);
+            }
+            buffer.flush();
+            return buffer.toByteArray();
+        } catch (IOException e) {
+            throw new ShenyuException("load jar classes find error");
+        }
+    }
+
     public static class PluginJar {
 
         private String absolutePath;
@@ -91,7 +103,9 @@ public class PluginJarParser {
 
         private String version;
 
-        private Map<String, byte[]> clazzMap = new HashMap<>();
+        private Map<String, byte[]> clazzMap = new ConcurrentHashMap<>();
+
+        private Map<String, byte[]> resourceMap = new ConcurrentHashMap<>();
 
         /**
          * getAbsolutePath.
@@ -191,6 +205,22 @@ public class PluginJarParser {
         public String getJarKey() {
             return String.format("%s:%s", groupId, artifactId);
         }
+
+        /**
+         * getResourceMap.
+         * @return resource byte
+         */
+        public Map<String, byte[]> getResourceMap() {
+            return resourceMap;
+        }
+
+        /**
+         * setResourceMap.
+         * @param resourceMap resourceMap.
+         */
+        public void setResourceMap(final Map<String, byte[]> resourceMap) {
+            this.resourceMap = resourceMap;
+        }
     }
 
 }
diff --git 
a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginClassLoader.java
 
b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginClassLoader.java
index 8312d53466..fdf0830c59 100644
--- 
a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginClassLoader.java
+++ 
b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginClassLoader.java
@@ -27,7 +27,9 @@ import 
org.springframework.beans.factory.support.GenericBeanDefinition;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
+import java.io.ByteArrayInputStream;
 import java.io.Closeable;
+import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.util.List;
 import java.util.ArrayList;
@@ -52,6 +54,8 @@ public final class ShenyuPluginClassLoader extends 
ClassLoader implements Closea
 
     private final Map<String, Class<?>> classCache = new ConcurrentHashMap<>();
 
+    private final Map<String, byte[]> resourceCache = new 
ConcurrentHashMap<>();
+
     private final PluginJarParser.PluginJar pluginJar;
 
     public ShenyuPluginClassLoader(final PluginJarParser.PluginJar pluginJar) {
@@ -96,6 +100,20 @@ public final class ShenyuPluginClassLoader extends 
ClassLoader implements Closea
         return results;
     }
 
+    @Override
+    public InputStream getResourceAsStream(final String name) {
+        byte[] cacheByte = resourceCache.get(name);
+        if (cacheByte != null) {
+            return new ByteArrayInputStream(cacheByte);
+        }
+        byte[] bytes = pluginJar.getResourceMap().get(name);
+        if (bytes != null) {
+            resourceCache.put(name, bytes);
+            return new ByteArrayInputStream(bytes);
+        }
+        return super.getResourceAsStream(name);
+    }
+
     @Override
     protected Class<?> findClass(final String name) throws 
ClassNotFoundException {
         if (ability(name)) {

Reply via email to