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

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


The following commit(s) were added to refs/heads/master by this push:
     new 47c7a72ed [ISSUE #3121] remove the disabled plugin from webhandler's 
plugins (#3339)
47c7a72ed is described below

commit 47c7a72ed920540db2b218f1a312427b9dc1c22c
Author: Codd <[email protected]>
AuthorDate: Fri Apr 29 13:23:58 2022 +0800

    [ISSUE #3121] remove the disabled plugin from webhandler's plugins (#3339)
    
    * [ISSUE #3121] remove the disabled plugin from webhandler's plugins
    
    * [ISSUE #3121] remove the disabled plugin from webhandler's plugins
    
    * [ISSUE #3121] remove the disabled plugin from webhandler's plugins
    
    * [ISSUE #3121] update CommonPluginDataSubscriberTest test case
    
    * [ISSUE #3121] update LocalPluginControllerTest test case
    
    * [ISSUE #3121] update LocalPluginControllerTest test case
    
    * [ISSUE #3121] modify ShenyuWebHandlerTest test cases
    
    * [ISSUE #3121] modify ShenyuWebHandlerTest test cases
    
    * [ISSUE #3121] enabled local dispatcher
    
    * [ISSUE #3121] disabled local dispatcher
    
    * [ISSUE #3121] modify ShenyuWebHandlerTest test cases and removed logic of 
plugin
    
    * [ISSUE #3121] modify checkStyle
    
    * [ISSUE #3121] modify removed logic of plugin
    
    * [ISSUE #3121] optimize ShenyuWebHandler remove plugin.
    
    * [ISSUE #3121] modify ShenyuWebHandlerTest test cases and removed logic of 
plugin
---
 .../common/enums/PluginHandlerEventEnums.java      |  30 ++++--
 .../base/cache/CommonPluginDataSubscriber.java     |  12 ++-
 ...ortPluginEvent.java => PluginHandlerEvent.java} |  17 +++-
 .../base/cache/CommonPluginDataSubscriberTest.java |  13 ++-
 .../shenyu/web/handler/ShenyuWebHandler.java       |  74 +++++++++++---
 .../web/controller/LocalPluginControllerTest.java  |  10 +-
 .../shenyu/web/handler/ShenyuWebHandlerTest.java   | 109 ++++++++++++++++++++-
 7 files changed, 233 insertions(+), 32 deletions(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
 
b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginHandlerEventEnums.java
similarity index 72%
copy from 
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
copy to 
shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginHandlerEventEnums.java
index fccfd5b7e..eb06b6a6e 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginHandlerEventEnums.java
@@ -15,16 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.shenyu.plugin.base.cache;
-
-import org.springframework.context.ApplicationEvent;
+package org.apache.shenyu.common.enums;
 
 /**
- * event of sort plugin.
+ * plugin handler event.
  */
-public class SortPluginEvent extends ApplicationEvent {
+public enum PluginHandlerEventEnums {
+
+    /**
+     * plugin enabled.
+     */
+    ENABLED,
+
+    /**
+     * plugin disabled.
+     */
+    DISABLED,
+
+    /**
+     * plugin deleted.
+     */
+    DELETE,
 
-    public SortPluginEvent(final Object source) {
-        super(source);
-    }
+    /**
+     * plugin sorted.
+     */
+    SORTED;
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
index 9ae2d12c9..f166c6933 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
@@ -22,6 +22,7 @@ import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
+import org.apache.shenyu.common.enums.PluginHandlerEventEnums;
 import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
 import org.apache.shenyu.sync.data.api.PluginDataSubscriber;
 import org.slf4j.Logger;
@@ -173,11 +174,17 @@ public class CommonPluginDataSubscriber implements 
PluginDataSubscriber {
     private <T> void updateCacheData(@NonNull final T data) {
         if (data instanceof PluginData) {
             PluginData pluginData = (PluginData) data;
-            PluginData oldPluginData = 
BaseDataCache.getInstance().obtainPluginData(pluginData.getName());
+            final PluginData oldPluginData = 
BaseDataCache.getInstance().obtainPluginData(pluginData.getName());
             BaseDataCache.getInstance().cachePluginData(pluginData);
             Optional.ofNullable(handlerMap.get(pluginData.getName()))
                     .ifPresent(handler -> handler.handlerPlugin(pluginData));
 
+            // update enabled plugins
+            PluginHandlerEventEnums state = 
Boolean.TRUE.equals(pluginData.getEnabled())
+                    ? PluginHandlerEventEnums.ENABLED : 
PluginHandlerEventEnums.DISABLED;
+            eventPublisher.publishEvent(new PluginHandlerEvent(state, 
pluginData));
+
+            // sorted plugin
             sortPluginIfOrderChange(oldPluginData, pluginData);
         } else if (data instanceof SelectorData) {
             SelectorData selectorData = (SelectorData) data;
@@ -206,7 +213,7 @@ public class CommonPluginDataSubscriber implements 
PluginDataSubscriber {
         }
         if (Objects.isNull(oldPluginData) || 
Objects.isNull(oldPluginData.getSort())
                 || (!Objects.equals(oldPluginData.getSort(), 
pluginData.getSort()))) {
-            eventPublisher.publishEvent(new SortPluginEvent(new Object()));
+            eventPublisher.publishEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.SORTED, pluginData));
         }
     }
 
@@ -222,6 +229,7 @@ public class CommonPluginDataSubscriber implements 
PluginDataSubscriber {
             BaseDataCache.getInstance().removePluginData(pluginData);
             Optional.ofNullable(handlerMap.get(pluginData.getName()))
                     .ifPresent(handler -> handler.removePlugin(pluginData));
+            eventPublisher.publishEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.DELETE, pluginData));
         } else if (data instanceof SelectorData) {
             SelectorData selectorData = (SelectorData) data;
             BaseDataCache.getInstance().removeSelectData(selectorData);
diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/PluginHandlerEvent.java
similarity index 61%
rename from 
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
rename to 
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/PluginHandlerEvent.java
index fccfd5b7e..d73e664b7 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/SortPluginEvent.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/PluginHandlerEvent.java
@@ -17,14 +17,27 @@
 
 package org.apache.shenyu.plugin.base.cache;
 
+import org.apache.shenyu.common.dto.PluginData;
+import org.apache.shenyu.common.enums.PluginHandlerEventEnums;
 import org.springframework.context.ApplicationEvent;
 
 /**
  * event of sort plugin.
  */
-public class SortPluginEvent extends ApplicationEvent {
+public class PluginHandlerEvent extends ApplicationEvent {
 
-    public SortPluginEvent(final Object source) {
+    private final PluginHandlerEventEnums pluginHandlerEventEnums;
+
+    public PluginHandlerEvent(final PluginHandlerEventEnums 
pluginHandlerEventEnums, final PluginData source) {
         super(source);
+        this.pluginHandlerEventEnums = pluginHandlerEventEnums;
+    }
+
+    /**
+     * get plugin handler.
+     * @return plugin handler event
+     */
+    public PluginHandlerEventEnums getPluginStateEnums() {
+        return pluginHandlerEventEnums;
     }
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
 
b/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
index cb3ea386a..c6b9c39e7 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
@@ -24,6 +24,12 @@ import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.plugin.base.handler.PluginDataHandler;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+import org.springframework.context.ApplicationEventPublisher;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,6 +41,8 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 /**
  * Test cases for CommonPluginDataSubscriber.
  */
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 public final class CommonPluginDataSubscriberTest {
 
     private final String mockName1 = "MOCK_NAME_1";
@@ -50,13 +58,16 @@ public final class CommonPluginDataSubscriberTest {
     private final String mockSelectorId2 = "MOCK_SELECTOR_ID_2";
 
     private CommonPluginDataSubscriber commonPluginDataSubscriber;
+
+    @Mock
+    private ApplicationEventPublisher eventPublisher;
     
     private BaseDataCache baseDataCache;
 
     @BeforeEach
     public void setup() {
         ArrayList<PluginDataHandler> pluginDataHandlerList = 
Lists.newArrayList();
-        commonPluginDataSubscriber = new 
CommonPluginDataSubscriber(pluginDataHandlerList);
+        commonPluginDataSubscriber = new 
CommonPluginDataSubscriber(pluginDataHandlerList, eventPublisher);
         baseDataCache = BaseDataCache.getInstance();
     }
 
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 772a646e6..efb413203 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,10 +20,11 @@ package org.apache.shenyu.web.handler;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.shenyu.common.config.ShenyuConfig;
 import org.apache.shenyu.common.dto.PluginData;
+import org.apache.shenyu.common.enums.PluginHandlerEventEnums;
 import org.apache.shenyu.plugin.api.ShenyuPlugin;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.base.cache.BaseDataCache;
-import org.apache.shenyu.plugin.base.cache.SortPluginEvent;
+import org.apache.shenyu.plugin.base.cache.PluginHandlerEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationListener;
@@ -40,19 +41,25 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 
 /**
  * This is web handler request starter.
  */
-public final class ShenyuWebHandler implements WebHandler, 
ApplicationListener<SortPluginEvent> {
+public final class ShenyuWebHandler implements WebHandler, 
ApplicationListener<PluginHandlerEvent> {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ShenyuWebHandler.class);
 
     /**
      * this filed can not set to be final, because we should copyOnWrite to 
update plugins.
      */
-    private List<ShenyuPlugin> plugins;
+    private final List<ShenyuPlugin> plugins;
+
+    /**
+     * source plugins, these plugins load from ShenyuPlugin, this filed can't 
change.
+     */
+    private final List<ShenyuPlugin> sourcePlugins;
 
     private final boolean scheduled;
 
@@ -65,7 +72,8 @@ public final class ShenyuWebHandler implements WebHandler, 
ApplicationListener<S
      * @param shenyuConfig plugins config
      */
     public ShenyuWebHandler(final List<ShenyuPlugin> plugins, final 
ShenyuConfig shenyuConfig) {
-        this.plugins = plugins;
+        this.sourcePlugins = new ArrayList<>(plugins);
+        this.plugins = new CopyOnWriteArrayList<>(plugins);
         ShenyuConfig.Scheduler config = shenyuConfig.getScheduler();
         this.scheduled = config.getEnabled();
         if (scheduled) {
@@ -101,40 +109,76 @@ public final class ShenyuWebHandler implements 
WebHandler, ApplicationListener<S
         if (CollectionUtils.isEmpty(extPlugins)) {
             return;
         }
-        List<ShenyuPlugin> shenyuPlugins = extPlugins.stream()
+        final List<ShenyuPlugin> shenyuPlugins = extPlugins.stream()
                 .filter(e -> plugins.stream().noneMatch(plugin -> 
plugin.named().equals(e.named())))
                 .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(shenyuPlugins)) {
             shenyuPlugins.forEach(plugin -> LOG.info("shenyu auto add extends 
plugins:{}", plugin.named()));
             shenyuPlugins.addAll(plugins);
-            this.plugins = sortPlugins(shenyuPlugins);
+            onSortedPlugins();
         }
     }
     
     /**
-     * listen sort plugin event and sort plugin.
+     * listen plugin handler event and handle plugin.
      *
      * @param event sort plugin event
      */
     @Override
-    public void onApplicationEvent(final SortPluginEvent event) {
-        // copy a new one, or there will be concurrency problems
-        this.plugins = sortPlugins(new ArrayList<>(plugins));
+    public void onApplicationEvent(final PluginHandlerEvent event) {
+        PluginHandlerEventEnums stateEnums = event.getPluginStateEnums();
+        PluginData pluginData = (PluginData) event.getSource();
+        switch (stateEnums) {
+            case ENABLED:
+                onPluginEnabled(pluginData);
+                break;
+            case DELETE:
+            case DISABLED:
+                // disable or removed plugin.
+                onPluginRemoved(pluginData);
+                break;
+            case SORTED:
+                // copy a new one, or there will be concurrency problems
+                onSortedPlugins();
+                break;
+            default:
+                throw new IllegalStateException("Unexpected value: " + 
event.getPluginStateEnums());
+        }
+        onSortedPlugins();
     }
 
     /**
      * sort plugins.
      *
-     * @param list list of plugin
      * @return sorted list
      */
-    private List<ShenyuPlugin> sortPlugins(final List<ShenyuPlugin> list) {
-        Map<String, Integer> pluginSortMap = 
list.stream().collect(Collectors.toMap(ShenyuPlugin::named, plugin -> {
+    private void onSortedPlugins() {
+        Map<String, Integer> pluginSortMap = 
this.plugins.stream().collect(Collectors.toMap(ShenyuPlugin::named, plugin -> {
             PluginData pluginData = 
BaseDataCache.getInstance().obtainPluginData(plugin.named());
             return 
Optional.ofNullable(pluginData).map(PluginData::getSort).orElse(plugin.getOrder());
         }));
-        list.sort(Comparator.comparingLong(plugin -> 
pluginSortMap.get(plugin.named())));
-        return list;
+        this.plugins.sort(Comparator.comparingLong(plugin -> 
pluginSortMap.get(plugin.named())));
+    }
+
+    /**
+     * handle enabled plugins.
+     * @param pluginData plugin data
+     * @return enabled plugins
+     */
+    private void onPluginEnabled(final PluginData pluginData) {
+        LOG.info("shenyu use plugin:[{}]", pluginData.getName());
+        final List<ShenyuPlugin> enabledPlugins = 
this.sourcePlugins.stream().filter(plugin -> 
plugin.named().equals(pluginData.getName())
+                && pluginData.getEnabled()).collect(Collectors.toList());
+        enabledPlugins.removeAll(this.plugins);
+        this.plugins.addAll(enabledPlugins);
+    }
+
+    /**
+     * handle removed or disabled plugin.
+     * @param pluginData plugin data
+     */
+    private void onPluginRemoved(final PluginData pluginData) {
+        this.plugins.removeIf(plugin -> 
plugin.named().equals(pluginData.getName()));
     }
 
     private static class DefaultShenyuPluginChain implements ShenyuPluginChain 
{
diff --git 
a/shenyu-web/src/test/java/org/apache/shenyu/web/controller/LocalPluginControllerTest.java
 
b/shenyu-web/src/test/java/org/apache/shenyu/web/controller/LocalPluginControllerTest.java
index 5945dc8a1..b98e71db4 100644
--- 
a/shenyu-web/src/test/java/org/apache/shenyu/web/controller/LocalPluginControllerTest.java
+++ 
b/shenyu-web/src/test/java/org/apache/shenyu/web/controller/LocalPluginControllerTest.java
@@ -39,7 +39,11 @@ import 
org.apache.shenyu.web.controller.LocalPluginController.SelectorRuleData;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockHttpServletResponse;
@@ -61,6 +65,7 @@ import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.
  * The type Plugin controller Test.
  */
 @ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 public final class LocalPluginControllerTest {
 
     private PluginDataSubscriber subscriber;
@@ -69,10 +74,13 @@ public final class LocalPluginControllerTest {
 
     private BaseDataCache baseDataCache;
 
+    @Mock
+    private ApplicationEventPublisher eventPublisher;
+
     @BeforeEach
     public void setup() {
         ArrayList<PluginDataHandler> pluginDataHandlerList = 
Lists.newArrayList();
-        subscriber = new CommonPluginDataSubscriber(pluginDataHandlerList);
+        subscriber = new CommonPluginDataSubscriber(pluginDataHandlerList, 
eventPublisher);
         mockMvc = MockMvcBuilders.standaloneSetup(new 
LocalPluginController(subscriber))
                 .build();
         baseDataCache = BaseDataCache.getInstance();
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 6d2d211ef..8bd4e63e6 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
@@ -19,12 +19,21 @@ package org.apache.shenyu.web.handler;
 
 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.PluginHandlerEventEnums;
 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.base.cache.BaseDataCache;
+import org.apache.shenyu.plugin.base.cache.PluginHandlerEvent;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
 import org.springframework.mock.web.server.MockServerWebExchange;
+import org.springframework.test.util.ReflectionTestUtils;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
@@ -32,23 +41,31 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.mockito.Mockito.mock;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
 
 /**
  * test for ShenyuWebHandler.
  *
  */
+@ExtendWith(MockitoExtension.class)
 public final class ShenyuWebHandlerTest {
 
+    @Mock
     private ShenyuWebHandler shenyuWebHandler;
     
     private final List<ShenyuPlugin> listPlugins = new ArrayList<>();
 
+    private final ShenyuPlugin plugin1 = new TestPlugin1();
+
+    private final ShenyuPlugin plugin2 = new TestPlugin2();
+
     @BeforeEach
     public void setUp() {
-        final ShenyuPlugin plugins = mock(ShenyuPlugin.class);
-        listPlugins.add(plugins);
+        listPlugins.add(plugin1);
+        listPlugins.add(plugin2);
         shenyuWebHandler = new ShenyuWebHandler(listPlugins, new 
ShenyuConfig());
     }
 
@@ -62,4 +79,90 @@ public final class ShenyuWebHandlerTest {
         Mono<Void> handle = shenyuWebHandler.handle(exchange);
         assertNotNull(handle);
     }
+
+    @Test
+    public void testOnApplicationEvent() {
+        PluginData pluginData1 = PluginData.builder().id("1")
+                .name("test-plugin1")
+                .enabled(true)
+                .config("config")
+                .role("test")
+                .sort(50)
+                .build();
+        PluginData pluginData2 = PluginData.builder().id("2")
+                .name("test-plugin2")
+                .enabled(false)
+                .config("config")
+                .role("test")
+                .sort(60)
+                .build();
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.ENABLED, pluginData1));
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.DISABLED, pluginData2));
+        List<ShenyuPlugin> plugins = (List<ShenyuPlugin>) 
ReflectionTestUtils.getField(shenyuWebHandler, "plugins");
+        assertNotNull(plugins);
+        assertTrue(plugins.contains(plugin1) && !plugins.contains(plugin2));
+
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.ENABLED, pluginData1));
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.DELETE, pluginData2));
+        List<ShenyuPlugin> pluginDelete = (List<ShenyuPlugin>) 
ReflectionTestUtils.getField(shenyuWebHandler, "plugins");
+        assertNotNull(pluginDelete);
+        assertTrue(pluginDelete.contains(plugin1) && 
!pluginDelete.contains(plugin2));
+
+        pluginData1.setSort(70);
+        pluginData2.setEnabled(true);
+        BaseDataCache.getInstance().cachePluginData(pluginData1);
+        BaseDataCache.getInstance().cachePluginData(pluginData2);
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.ENABLED, pluginData1));
+        shenyuWebHandler.onApplicationEvent(new 
PluginHandlerEvent(PluginHandlerEventEnums.ENABLED, pluginData2));
+        List<ShenyuPlugin> pluginDataSorted = (List<ShenyuPlugin>) 
ReflectionTestUtils.getField(shenyuWebHandler, "plugins");
+        assertNotNull(pluginDataSorted);
+        assertEquals(pluginDataSorted.get(0), plugin2);
+        assertEquals(pluginDataSorted.get(1), plugin1);
+    }
+
+    static class TestPlugin1 implements ShenyuPlugin {
+
+        @Override
+        public Mono<Void> execute(final ServerWebExchange exchange, final 
ShenyuPluginChain chain) {
+            return chain.execute(exchange);
+        }
+
+        @Override
+        public int getOrder() {
+            return 1;
+        }
+
+        @Override
+        public String named() {
+            return "test-plugin1";
+        }
+
+        @Override
+        public boolean skip(final ServerWebExchange exchange) {
+            return ShenyuPlugin.super.skip(exchange);
+        }
+    }
+
+    static class TestPlugin2 implements ShenyuPlugin {
+
+        @Override
+        public Mono<Void> execute(final ServerWebExchange exchange, final 
ShenyuPluginChain chain) {
+            return chain.execute(exchange);
+        }
+
+        @Override
+        public int getOrder() {
+            return 2;
+        }
+
+        @Override
+        public String named() {
+            return "test-plugin2";
+        }
+
+        @Override
+        public boolean skip(final ServerWebExchange exchange) {
+            return ShenyuPlugin.super.skip(exchange);
+        }
+    }
 }

Reply via email to