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)) {