plugins = webHandler.getPlugins();
+ plugins.stream().forEach(plugin -> LOG.info("plugin name : {}, plugin order : {}", plugin.toString(), plugin.getOrder()));
return Flux.just(plugins.stream().collect(Collectors.toMap(ShenyuPlugin::toString, ShenyuPlugin::getOrder)));
}
diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java
index 461234a6d711..4ad49a5bf39b 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java
@@ -20,12 +20,18 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.config.ShenyuConfig;
+import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.dto.PluginData;
import org.apache.shenyu.common.enums.PluginHandlerEventEnum;
+import org.apache.shenyu.common.isolation.ReverseClassLoader;
import org.apache.shenyu.plugin.api.ShenyuPlugin;
import org.apache.shenyu.plugin.api.ShenyuPluginChain;
+import org.apache.shenyu.plugin.api.utils.SpringBeanUtils;
import org.apache.shenyu.plugin.base.cache.BaseDataCache;
import org.apache.shenyu.plugin.base.cache.PluginHandlerEvent;
+import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
+import org.apache.shenyu.plugin.isolation.ExtendDataBase;
+import org.apache.shenyu.web.loader.ShenyuLoaderResult;
import org.apache.shenyu.web.loader.ShenyuLoaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,7 +43,11 @@
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;
+import java.io.File;
+import java.net.URL;
+import java.nio.file.Files;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -52,6 +62,8 @@ public final class ShenyuWebHandler implements WebHandler, ApplicationListener sortPlugins(final List list) {
*/
private synchronized void onPluginEnabled(final PluginData pluginData) {
LOG.info("shenyu use plugin:[{}]", pluginData.getName());
+ // load plugin from the specified path
+ loadPluginByURL(pluginData);
+
if (StringUtils.isNoneBlank(pluginData.getPluginJar())) {
LOG.info("shenyu start load plugin [{}] from upload plugin jar", pluginData.getName());
shenyuLoaderService.loadExtOrUploadPlugins(pluginData);
@@ -224,6 +239,57 @@ private synchronized void onPluginEnabled(final PluginData pluginData) {
this.plugins = sortPlugins(newPluginList);
}
+ private void loadPluginByURL(final PluginData pluginData) {
+ String pluginName = pluginData.getName();
+ final Object pluginBean = SpringBeanUtils.getInstance().getBeanByClassName(pluginName + "Plugin");
+ if (Objects.nonNull(pluginBean) && pluginBean instanceof ShenyuPlugin) {
+ this.putExtPlugins(Collections.singletonList((ShenyuPlugin) pluginBean));
+ return;
+ }
+ try {
+ // load plugin
+ String pluginJarDir = String.format(PLUGIN_PATH, pluginName);
+ final File pluginJarFiles = new File(pluginJarDir);
+ if (pluginJarFiles.mkdirs()) {
+ return;
+ }
+ File[] jars = pluginJarFiles.listFiles((dir1, name) -> name.endsWith(".jar"));
+ if (Objects.isNull(jars) || jars.length == 0) {
+ return;
+ }
+
+ URL[] classPath = new URL[jars.length + 1];
+ classPath[0] = pluginJarFiles.toURI().toURL();
+ List pluginJarFileList = new ArrayList<>(2);
+ for (int i = 1; i < classPath.length; i++) {
+ final File jarFile = jars[i - 1];
+ classPath[i] = jarFile.toURI().toURL();
+ if (jarFile.getName().contains(Constants.SHENYU) && jarFile.getName().contains(Constants.PLUGIN)) {
+ pluginJarFileList.add(jarFile);
+ }
+ }
+ final ReverseClassLoader urlClassLoader = new ReverseClassLoader(classPath, this.getClass().getClassLoader());
+ if (!CollectionUtils.isEmpty(pluginJarFileList)) {
+ pluginJarFileList.stream().sorted(Comparator.reverseOrder()).forEach(pluginJarFile -> {
+ try {
+ final List shenyuLoaderResults = shenyuLoaderService.loadJarPlugins(Files.newInputStream(pluginJarFile.toPath()), urlClassLoader);
+ List handlers = shenyuLoaderResults.stream().map(ShenyuLoaderResult::getExtendDataBase).filter(Objects::nonNull).collect(Collectors.toList());
+ handlers.forEach(extendDataBase -> {
+ if (extendDataBase instanceof PluginDataHandler) {
+ ((PluginDataHandler) extendDataBase).handlerPlugin(pluginData);
+ }
+ });
+ } catch (Exception e) {
+ LOG.error("load {} plugin classloader failed. ex ", pluginJarFile.getAbsolutePath(), e);
+ }
+ });
+ }
+ LOG.info("load {} plugin success, path: {}", pluginName, pluginJarDir);
+ } catch (Throwable e) {
+ LOG.error("load {} plugin classloader failed. ex ", pluginName, e);
+ }
+ }
+
/**
* handle removed or disabled plugin.
*
@@ -233,6 +299,7 @@ private synchronized void onPluginRemoved(final PluginData pluginData) {
// copy a new plugin list.
List newPluginList = new ArrayList<>(this.plugins);
newPluginList.removeIf(plugin -> plugin.named().equals(pluginData.getName()));
+
this.plugins = newPluginList;
}
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 b8821d6a04f5..10c3aea1b6e2 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
@@ -17,11 +17,15 @@
package org.apache.shenyu.web.loader;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.exception.ShenyuException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
@@ -33,6 +37,8 @@
*/
public class PluginJarParser {
+ private static final Logger LOG = LoggerFactory.getLogger(PluginJarParser.class);
+
/**
* parseJar.
*
@@ -40,13 +46,23 @@ public class PluginJarParser {
* @return PluginJar
*/
public static PluginJar parseJar(final byte[] jarBytes) {
+ return parseJar(new ByteArrayInputStream(jarBytes));
+ }
+
+ /**
+ * parseJar.
+ *
+ * @param parseJarInputStream parseJarInputStream
+ * @return PluginJar
+ */
+ public static PluginJar parseJar(final InputStream parseJarInputStream) {
PluginJar pluginJar = new PluginJar();
- try (JarInputStream jarInputStream = new JarInputStream(new ByteArrayInputStream(jarBytes))) {
+ try (JarInputStream jarInputStream = new JarInputStream(parseJarInputStream)) {
JarEntry jarEntry;
while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
String entryName = jarEntry.getName();
- // get jar version
- if (jarEntry.getName().endsWith("pom.properties")) {
+ // Set jar version. The jar file may contain more than one pom.properties, take only the first one.
+ if (pluginJar.isEmpty() && jarEntry.getName().endsWith("pom.properties")) {
try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
int data;
while ((data = jarInputStream.read()) != -1) {
@@ -70,7 +86,7 @@ public static PluginJar parseJar(final byte[] jarBytes) {
}
}
} catch (IOException e) {
- throw new ShenyuException("load jar classes find error");
+ throw new ShenyuException("load jar classes find error, exception:{}", e);
}
return pluginJar;
}
@@ -221,6 +237,17 @@ public Map getResourceMap() {
public void setResourceMap(final Map resourceMap) {
this.resourceMap = resourceMap;
}
+
+ /**
+ * jar isEmpty.
+ *
+ * @return boolean
+ */
+ public boolean isEmpty() {
+ return StringUtils.isEmpty(groupId)
+ && StringUtils.isEmpty(artifactId)
+ && StringUtils.isEmpty(version);
+ }
}
}
diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuExtPathPluginJarLoader.java b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuExtPathPluginJarLoader.java
index fce41f97d674..376cdd8ad741 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuExtPathPluginJarLoader.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuExtPathPluginJarLoader.java
@@ -19,6 +19,7 @@
import com.google.common.collect.Sets;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@@ -55,7 +56,7 @@ public static synchronized List loadExtendPlugins(fin
continue;
}
byte[] pluginBytes = Files.readAllBytes(Paths.get(absolutePath));
- PluginJarParser.PluginJar uploadPluginJar = PluginJarParser.parseJar(pluginBytes);
+ PluginJarParser.PluginJar uploadPluginJar = PluginJarParser.parseJar(new ByteArrayInputStream(pluginBytes));
uploadPluginJar.setAbsolutePath(absolutePath);
uploadPluginJars.add(uploadPluginJar);
}
diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderResult.java b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderResult.java
index 3cd2960c3e87..fe7a5b5778e8 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderResult.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderResult.java
@@ -17,18 +17,38 @@
package org.apache.shenyu.web.loader;
+import org.apache.shenyu.plugin.isolation.ExtendDataBase;
import org.apache.shenyu.plugin.api.ShenyuPlugin;
-import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
/**
* The type of ShenYu Loader result.
*/
public class ShenyuLoaderResult {
+
+ private String className;
private ShenyuPlugin shenyuPlugin;
- private PluginDataHandler pluginDataHandler;
-
+ private ExtendDataBase extendDataBase;
+
+ /**
+ * getClassName.
+ *
+ * @return {@link String}
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /**
+ * setClassName.
+ *
+ * @param className className
+ */
+ public void setClassName(final String className) {
+ this.className = className;
+ }
+
/**
* Gets shenyu plugin.
*
@@ -46,22 +66,22 @@ public ShenyuPlugin getShenyuPlugin() {
public void setShenyuPlugin(final ShenyuPlugin shenyuPlugin) {
this.shenyuPlugin = shenyuPlugin;
}
-
+
/**
- * Gets plugin data handler.
+ * extendDataBase.
*
- * @return the plugin data handler
+ * @return ExtendDataBase
*/
- public PluginDataHandler getPluginDataHandler() {
- return pluginDataHandler;
+ public ExtendDataBase getExtendDataBase() {
+ return extendDataBase;
}
-
+
/**
- * Sets plugin data handler.
+ * set extendDataBase.
*
- * @param pluginDataHandler the plugin data handler
+ * @param extendDataBase extendDataBase
*/
- public void setPluginDataHandler(final PluginDataHandler pluginDataHandler) {
- this.pluginDataHandler = pluginDataHandler;
+ public void setExtendDataBase(final ExtendDataBase extendDataBase) {
+ this.extendDataBase = extendDataBase;
}
}
diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderService.java b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderService.java
index 1324d3259bda..cdf1ab5f8d9c 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderService.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuLoaderService.java
@@ -22,17 +22,20 @@
import org.apache.shenyu.common.config.ShenyuConfig;
import org.apache.shenyu.common.config.ShenyuConfig.ExtPlugin;
import org.apache.shenyu.common.dto.PluginData;
+import org.apache.shenyu.plugin.isolation.ExtendDataBase;
import org.apache.shenyu.plugin.api.ShenyuPlugin;
-import org.apache.shenyu.plugin.base.cache.CommonPluginDataSubscriber;
-import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
+import org.apache.shenyu.plugin.isolation.ExtendDataHandler;
import org.apache.shenyu.web.handler.ShenyuWebHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Base64;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -46,20 +49,20 @@ public class ShenyuLoaderService {
private final ShenyuWebHandler webHandler;
- private final CommonPluginDataSubscriber subscriber;
-
private final ShenyuConfig shenyuConfig;
+ private final List> extendDataHandlers;
+
/**
* Instantiates a new Shenyu loader service.
*
- * @param webHandler the web handler
- * @param subscriber the subscriber
- * @param shenyuConfig the shenyu config
+ * @param webHandler the web handler
+ * @param shenyuConfig the shenyu config
+ * @param extendDataHandlers addDataHandlers
*/
- public ShenyuLoaderService(final ShenyuWebHandler webHandler, final CommonPluginDataSubscriber subscriber, final ShenyuConfig shenyuConfig) {
- this.subscriber = subscriber;
+ public ShenyuLoaderService(final ShenyuWebHandler webHandler, final ShenyuConfig shenyuConfig, final List> extendDataHandlers) {
this.webHandler = webHandler;
+ this.extendDataHandlers = extendDataHandlers;
this.shenyuConfig = shenyuConfig;
ExtPlugin config = shenyuConfig.getExtPlugin();
if (config.getEnabled()) {
@@ -82,13 +85,13 @@ public void loadExtOrUploadPlugins(final PluginData uploadedJarResource) {
for (PluginJarParser.PluginJar extPath : uploadPluginJars) {
LOG.info("shenyu extPlugin find new {} to load", extPath.getAbsolutePath());
ShenyuPluginClassLoader extPathClassLoader = singleton.createPluginClassLoader(extPath);
- plugins.addAll(extPathClassLoader.loadUploadedJarPlugins());
+ plugins.addAll(extPathClassLoader.loadUploadedJarPlugins(this.getClass().getClassLoader()));
}
} else {
PluginJarParser.PluginJar pluginJar = PluginJarParser.parseJar(Base64.getDecoder().decode(uploadedJarResource.getPluginJar()));
LOG.info("shenyu upload plugin jar find new {} to load", pluginJar.getJarKey());
ShenyuPluginClassLoader uploadPluginClassLoader = singleton.createPluginClassLoader(pluginJar);
- plugins.addAll(uploadPluginClassLoader.loadUploadedJarPlugins());
+ plugins.addAll(uploadPluginClassLoader.loadUploadedJarPlugins(this.getClass().getClassLoader()));
}
loaderPlugins(plugins);
} catch (Exception e) {
@@ -96,19 +99,53 @@ public void loadExtOrUploadPlugins(final PluginData uploadedJarResource) {
}
}
+ /**
+ * loadJarPlugins.
+ *
+ * @param parseJarInputStream parseJarInputStream
+ * @param classLoader classLoader
+ * @return a list of ShenyuLoaderResult
+ */
+ public List loadJarPlugins(final InputStream parseJarInputStream, final ClassLoader classLoader) {
+ try {
+ ShenyuPluginClassloaderHolder singleton = ShenyuPluginClassloaderHolder.getSingleton();
+ PluginJarParser.PluginJar pluginJar = PluginJarParser.parseJar(parseJarInputStream);
+ ShenyuPluginClassLoader shenyuPluginClassLoader = singleton.createPluginClassLoader(pluginJar);
+ List uploadPlugins = shenyuPluginClassLoader.loadUploadedJarPlugins(classLoader);
+ loaderPlugins(uploadPlugins);
+ return uploadPlugins;
+ } catch (Exception e) {
+ LOG.error("Shenyu upload plugins load has error ", e);
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * removeJarPlugins.
+ *
+ * @param parseJarInputStream parseJarInputStream
+ */
+ public void removeJarPlugins(final InputStream parseJarInputStream) {
+ ShenyuPluginClassloaderHolder singleton = ShenyuPluginClassloaderHolder.getSingleton();
+ PluginJarParser.PluginJar pluginJar = PluginJarParser.parseJar(parseJarInputStream);
+ String jarKey = Optional.ofNullable(pluginJar.getAbsolutePath()).orElse(pluginJar.getJarKey());
+ singleton.removePluginClassLoader(jarKey);
+ }
+
/**
* loaderPlugins.
*
* @param results results
*/
- private void loaderPlugins(final List results) {
+ public void loaderPlugins(final List results) {
if (CollectionUtils.isEmpty(results)) {
return;
}
List shenyuExtendPlugins = results.stream().map(ShenyuLoaderResult::getShenyuPlugin).filter(Objects::nonNull).collect(Collectors.toList());
webHandler.putExtPlugins(shenyuExtendPlugins);
- List handlers = results.stream().map(ShenyuLoaderResult::getPluginDataHandler).filter(Objects::nonNull).collect(Collectors.toList());
- subscriber.putExtendPluginDataHandler(handlers);
+ List handlers = results.stream().map(ShenyuLoaderResult::getExtendDataBase)
+ .filter(Objects::nonNull).collect(Collectors.toList());
+ extendDataHandlers.forEach(addDataHandlers1 -> addDataHandlers1.putExtendDataHandler(handlers));
}
}
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 b1be735e60e9..03047f9ac817 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
@@ -18,12 +18,16 @@
package org.apache.shenyu.web.loader;
import org.apache.shenyu.plugin.api.ShenyuPlugin;
+import org.apache.shenyu.plugin.api.context.ShenyuContextDecorator;
import org.apache.shenyu.plugin.api.utils.SpringBeanUtils;
+import org.apache.shenyu.plugin.base.handler.MetaDataHandler;
import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
+import org.apache.shenyu.plugin.isolation.ExtendDataBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.GenericBeanDefinition;
+import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@@ -31,12 +35,12 @@
import java.io.Closeable;
import java.io.InputStream;
import java.lang.annotation.Annotation;
-import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@@ -58,6 +62,9 @@ public final class ShenyuPluginClassLoader extends ClassLoader implements Closea
private final PluginJarParser.PluginJar pluginJar;
+ private final List> shenyuClasses = Arrays.asList(ShenyuPlugin.class, PluginDataHandler.class,
+ MetaDataHandler.class, ShenyuContextDecorator.class);
+
public ShenyuPluginClassLoader(final PluginJarParser.PluginJar pluginJar) {
super(ShenyuPluginClassLoader.class.getClassLoader());
this.pluginJar = pluginJar;
@@ -80,15 +87,16 @@ private boolean checkExistence(final String className) {
/**
* loadUploadedJarResourcesList.
*
- * @return the list
+ * @param classLoader classLoader.
+ * @return the list.
*/
- public List loadUploadedJarPlugins() {
+ public List loadUploadedJarPlugins(final ClassLoader classLoader) {
List results = new ArrayList<>();
Set names = pluginJar.getClazzMap().keySet();
names.forEach(className -> {
Object instance;
try {
- instance = getOrCreateSpringBean(className);
+ instance = getOrCreateSpringBean(className, classLoader);
if (Objects.nonNull(instance)) {
results.add(buildResult(instance));
LOG.info("The class successfully loaded into a upload-Jar-plugin {} is registered as a spring bean", className);
@@ -146,7 +154,7 @@ public void close() {
}
}
- private T getOrCreateSpringBean(final String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+ private T getOrCreateSpringBean(final String className, final ClassLoader classLoader) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (SpringBeanUtils.getInstance().existBean(className)) {
T inst = SpringBeanUtils.getInstance().getBeanByClassName(className);
// if the class is loaded by other classloader, then reload it
@@ -157,23 +165,22 @@ private T getOrCreateSpringBean(final String className) throws ClassNotFound
lock.lock();
try {
T inst = SpringBeanUtils.getInstance().getBeanByClassName(className);
- if (Objects.isNull(inst) || isLoadedByOtherClassLoader(inst)) {
- Class> clazz = Class.forName(className, false, this);
+ if (Objects.isNull(inst)) {
+ Class> clazz = Class.forName(className, false, classLoader);
//Exclude ShenyuPlugin subclass and PluginDataHandler subclass
// without adding @Component @Service annotation
- boolean next = ShenyuPlugin.class.isAssignableFrom(clazz)
- || PluginDataHandler.class.isAssignableFrom(clazz);
+ boolean next = shenyuClasses.stream().anyMatch(shenyuClass -> shenyuClass.isAssignableFrom(clazz));
+ Annotation[] annotations = clazz.getAnnotations();
if (!next) {
- Annotation[] annotations = clazz.getAnnotations();
- next = Arrays.stream(annotations).anyMatch(e -> e.annotationType().equals(Component.class)
- || e.annotationType().equals(Service.class));
+ next = (Arrays.stream(annotations).anyMatch(e -> e.annotationType().equals(Component.class)
+ || e.annotationType().equals(Service.class) || e.annotationType().equals(Configuration.class))) && !clazz.isInterface();
}
if (next) {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(className);
beanDefinition.setAutowireCandidate(true);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
- String beanName = SpringBeanUtils.getInstance().registerBean(beanDefinition, this);
+ String beanName = SpringBeanUtils.getInstance().registerBean(beanDefinition, classLoader);
inst = SpringBeanUtils.getInstance().getBeanByClassName(beanName);
}
}
@@ -191,15 +198,15 @@ private T getOrCreateSpringBean(final String className) throws ClassNotFound
* @return boolean
*/
private boolean isLoadedByOtherClassLoader(final T inst) {
- return !inst.getClass().getClassLoader().equals(this);
+ return !Objects.equals(inst.getClass().getClassLoader(), this);
}
- private ShenyuLoaderResult buildResult(final Object instance) {
+ private ShenyuLoaderResult buildResult(final T instance) {
ShenyuLoaderResult result = new ShenyuLoaderResult();
if (instance instanceof ShenyuPlugin) {
result.setShenyuPlugin((ShenyuPlugin) instance);
- } else if (instance instanceof PluginDataHandler) {
- result.setPluginDataHandler((PluginDataHandler) instance);
+ } else if (instance instanceof ExtendDataBase) {
+ result.setExtendDataBase((ExtendDataBase) instance);
}
return result;
}
diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginLoader.java b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginLoader.java
index c46e02c559ae..c59de014cf0d 100644
--- a/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginLoader.java
+++ b/shenyu-web/src/main/java/org/apache/shenyu/web/loader/ShenyuPluginLoader.java
@@ -20,6 +20,7 @@
import com.google.common.collect.Lists;
import com.google.common.io.ByteStreams;
import org.apache.shenyu.common.exception.ShenyuException;
+import org.apache.shenyu.plugin.isolation.ExtendDataBase;
import org.apache.shenyu.plugin.api.ShenyuPlugin;
import org.apache.shenyu.plugin.api.utils.SpringBeanUtils;
import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
@@ -361,8 +362,8 @@ private ShenyuLoaderResult buildResult(final Object instance) {
ShenyuLoaderResult result = new ShenyuLoaderResult();
if (instance instanceof ShenyuPlugin) {
result.setShenyuPlugin((ShenyuPlugin) instance);
- } else if (instance instanceof PluginDataHandler) {
- result.setPluginDataHandler((PluginDataHandler) instance);
+ } else if (instance instanceof ExtendDataBase) {
+ result.setExtendDataBase((ExtendDataBase) instance);
}
return result;
}
diff --git a/shenyu-web/src/test/java/org/apache/shenyu/web/handler/ShenyuWebHandlerTest.java b/shenyu-web/src/test/java/org/apache/shenyu/web/handler/ShenyuWebHandlerTest.java
index bc720c905f16..2a1a0f24b8de 100644
--- a/shenyu-web/src/test/java/org/apache/shenyu/web/handler/ShenyuWebHandlerTest.java
+++ b/shenyu-web/src/test/java/org/apache/shenyu/web/handler/ShenyuWebHandlerTest.java
@@ -24,6 +24,7 @@
import org.apache.shenyu.plugin.api.ShenyuPlugin;
import org.apache.shenyu.plugin.api.ShenyuPluginChain;
import org.apache.shenyu.plugin.api.context.ShenyuContext;
+import org.apache.shenyu.plugin.api.utils.SpringBeanUtils;
import org.apache.shenyu.plugin.base.cache.BaseDataCache;
import org.apache.shenyu.plugin.base.cache.PluginHandlerEvent;
import org.apache.shenyu.web.loader.ShenyuLoaderService;
@@ -32,6 +33,7 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.web.server.MockServerWebExchange;
import org.springframework.test.util.ReflectionTestUtils;
@@ -73,6 +75,7 @@ public void setUp() {
listPlugins.add(plugin2);
shenyuLoaderService = mock(ShenyuLoaderService.class);
shenyuWebHandler = new ShenyuWebHandler(listPlugins, shenyuLoaderService, new ShenyuConfig());
+ SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
}
@Test
diff --git a/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderResultTest.java b/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderResultTest.java
index 8c7fd53c929f..1b215bed297c 100644
--- a/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderResultTest.java
+++ b/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderResultTest.java
@@ -35,8 +35,6 @@ public class ShenyuLoaderResultTest {
public void shenyuLoaderResultTest() {
ShenyuLoaderResult shenyuLoaderResult = new ShenyuLoaderResult();
shenyuLoaderResult.setShenyuPlugin(null);
- shenyuLoaderResult.setPluginDataHandler(null);
Assert.assertNull(shenyuLoaderResult.getShenyuPlugin());
- Assert.assertNull(shenyuLoaderResult.getPluginDataHandler());
}
}
diff --git a/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderServiceTest.java b/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderServiceTest.java
index 9bc6d5071f34..9375a7a4b9c1 100644
--- a/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderServiceTest.java
+++ b/shenyu-web/src/test/java/org/apache/shenyu/web/loader/ShenyuLoaderServiceTest.java
@@ -44,9 +44,9 @@
import java.util.zip.ZipEntry;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
/**
* Test for ShenyuLoaderServiceTest.
@@ -93,10 +93,11 @@ public void loaderExtPluginsTest() throws NoSuchMethodException, InvocationTarge
extPlugin.setEnabled(false);
final ShenyuConfig shenyuConfig = new ShenyuConfig();
shenyuConfig.setExtPlugin(extPlugin);
- new ShenyuLoaderService(shenyuWebHandler, commonPluginDataSubscriber, shenyuConfig);
+ new ShenyuLoaderService(shenyuWebHandler, shenyuConfig, null);
extPlugin.setEnabled(true);
extPlugin.setPath(path.toString());
- ShenyuLoaderService shenyuLoaderService = new ShenyuLoaderService(shenyuWebHandler, commonPluginDataSubscriber, shenyuConfig);
+
+ ShenyuLoaderService shenyuLoaderService = new ShenyuLoaderService(shenyuWebHandler, shenyuConfig, null);
final Method loaderExtPlugins = ShenyuLoaderService.class.getDeclaredMethod("loadExtOrUploadPlugins", PluginData.class);
loaderExtPlugins.setAccessible(true);
loaderExtPlugins.invoke(shenyuLoaderService, mock(PluginData.class));