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

likeguo 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 2eb51c4bb [ISSUE 3822] When onDeleted, ruleId has been deleted, so 
change to getPluginNameBySelectorId to get pluginName. (#3825)
2eb51c4bb is described below

commit 2eb51c4bb10c7c146ac1a4d5f9862ef09ac5fda3
Author: yunlongn <[email protected]>
AuthorDate: Tue Aug 9 23:12:24 2022 +0800

    [ISSUE 3822] When onDeleted, ruleId has been deleted, so change to 
getPluginNameBySelectorId to get pluginName. (#3825)
    
    * [type:bug] onDeleted needs to use ruleId for query, so it needs to be 
moved before deleteByIds.
    
    * [type:bug] ruleId has been deleted, so change to 
getPluginNameBySelectorId to get pluginName.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] LocalPluginController#deleteRule causes removeCacheData NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
    
    * [type:BUG] fix delete selector, onDeleted NPE.
---
 .../org/apache/shenyu/admin/mapper/RuleMapper.java |  6 ++---
 .../event/selector/BatchSelectorDeletedEvent.java  | 22 ++++++++++++++-
 .../shenyu/admin/service/impl/RuleServiceImpl.java |  2 +-
 .../admin/service/publish/RuleEventPublisher.java  | 31 ++++++++++++++++++----
 .../src/main/resources/mappers/rule-sqlmap.xml     |  9 +++----
 .../web/controller/LocalPluginController.java      |  6 +++--
 6 files changed, 59 insertions(+), 17 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RuleMapper.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RuleMapper.java
index 2262fd0d5..c6322561e 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RuleMapper.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RuleMapper.java
@@ -164,12 +164,12 @@ public interface RuleMapper extends ExistProvider {
     List<RuleVO> selectByCondition(@Param("condition") RuleQueryCondition 
condition);
     
     /**
-     * get plugin name by ruleId.
+     * get plugin name by selectorId.
      *
-     * @param ruleId ruleId
+     * @param selectorId selectorId
      * @return plugin name
      */
-    String getPluginNameByRuleId(@Param("ruleId") String ruleId);
+    String getPluginNameBySelectorId(@Param("selectorId") String selectorId);
     
     /**
      * select by rule ids.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/event/selector/BatchSelectorDeletedEvent.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/event/selector/BatchSelectorDeletedEvent.java
index 1d4c88ded..a361dc0ec 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/event/selector/BatchSelectorDeletedEvent.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/event/selector/BatchSelectorDeletedEvent.java
@@ -27,6 +27,8 @@ import org.apache.shenyu.admin.utils.ListUtil;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -37,7 +39,11 @@ public class BatchSelectorDeletedEvent extends 
BatchChangedEvent {
     private final List<String> deletedIds;
     
     private final List<PluginDO> plugins;
-    
+
+    private final Map<String, PluginDO> pluginMap;
+
+    private final Map<String, SelectorDO> selectorDataMap;
+
     /**
      * Create a new {@code BatchChangedEvent}.operator is unknown.
      *
@@ -49,6 +55,9 @@ public class BatchSelectorDeletedEvent extends 
BatchChangedEvent {
         super(source, null, EventTypeEnum.SELECTOR_DELETE, operator);
         this.deletedIds = ListUtil.map(source, BaseDO::getId);
         this.plugins = plugins;
+
+        this.pluginMap = ListUtil.toMap(plugins, PluginDO::getId);
+        this.selectorDataMap = ListUtil.toMap(source, SelectorDO::getId);
     }
     
     @Override
@@ -71,6 +80,17 @@ public class BatchSelectorDeletedEvent extends 
BatchChangedEvent {
                 .map(SelectorDO.class::cast)
                 .collect(Collectors.toList());
     }
+
+    /**
+     * find plugin by selector id.
+     *
+     * @param selectorId  selectorId
+     * @return PluginDO
+     */
+    public PluginDO findPluginBySelectorId(final String selectorId) {
+        return Optional.ofNullable(selectorDataMap.get(selectorId))
+                .flatMap(selectorDO -> 
Optional.ofNullable(pluginMap.get(selectorDO.getPluginId()))).orElse(null);
+    }
     
     /**
      * get plugins.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
index 2e4d79bc1..2f9a8d9ea 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
@@ -229,7 +229,7 @@ public class RuleServiceImpl implements RuleService {
             final int deleteCount = ruleMapper.deleteByIds(ruleIds);
             ruleConditionMapper.deleteByRuleIds(ruleIds);
             if (deleteCount > 0) {
-                ruleEventPublisher.onDeleted(ruleDOList);
+                ruleEventPublisher.onDeleted(ruleDOList, event);
             }
         }
     }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/publish/RuleEventPublisher.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/publish/RuleEventPublisher.java
index b8cf852cc..d163780dc 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/publish/RuleEventPublisher.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/publish/RuleEventPublisher.java
@@ -18,18 +18,21 @@
 package org.apache.shenyu.admin.service.publish;
 
 import org.apache.shenyu.admin.listener.DataChangedEvent;
+import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.mapper.RuleConditionMapper;
 import org.apache.shenyu.admin.mapper.RuleMapper;
 import org.apache.shenyu.admin.model.dto.RuleConditionDTO;
 import org.apache.shenyu.admin.model.entity.BaseDO;
 import org.apache.shenyu.admin.model.entity.RuleConditionDO;
 import org.apache.shenyu.admin.model.entity.RuleDO;
+import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.enums.EventTypeEnum;
 import org.apache.shenyu.admin.model.event.AdminDataModelChangedEvent;
 import org.apache.shenyu.admin.model.event.rule.BatchRuleDeletedEvent;
 import org.apache.shenyu.admin.model.event.rule.RuleChangedEvent;
 import org.apache.shenyu.admin.model.event.rule.RuleCreatedEvent;
 import org.apache.shenyu.admin.model.event.rule.RuleUpdatedEvent;
+import org.apache.shenyu.admin.model.event.selector.BatchSelectorDeletedEvent;
 import org.apache.shenyu.admin.transfer.ConditionTransfer;
 import org.apache.shenyu.admin.utils.SessionUtil;
 import org.apache.shenyu.common.dto.RuleData;
@@ -38,10 +41,11 @@ import org.apache.shenyu.common.enums.DataEventTypeEnum;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Component;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
+import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
+import java.util.Collections;
 import java.util.stream.Collectors;
 
 import static org.apache.shenyu.admin.utils.ListUtil.groupBy;
@@ -61,6 +65,7 @@ public class RuleEventPublisher implements 
AdminDataModelChangedEventPublisher<R
     
     public RuleEventPublisher(final ApplicationEventPublisher publisher,
                               final RuleConditionMapper ruleConditionMapper,
+                              final PluginMapper pluginMapper,
                               final RuleMapper ruleMapper) {
         this.publisher = publisher;
         this.ruleConditionMapper = ruleConditionMapper;
@@ -131,11 +136,27 @@ public class RuleEventPublisher implements 
AdminDataModelChangedEventPublisher<R
         publish(new BatchRuleDeletedEvent(rules, SessionUtil.visitorName(), 
null));
         final List<RuleConditionDO> condition = 
ruleConditionMapper.selectByRuleIdSet(rules.stream().map(BaseDO::getId).collect(Collectors.toSet()));
         final Map<String, List<RuleConditionDO>> conditionsRuleGroup = 
groupBy(condition, RuleConditionDO::getRuleId);
-        final List<RuleData> ruleData = map(rules, r -> RuleDO.transFrom(r, 
ruleMapper.getPluginNameByRuleId(r.getId()),
+        final List<RuleData> ruleData = map(rules, r -> RuleDO.transFrom(r, 
ruleMapper.getPluginNameBySelectorId(r.getSelectorId()),
                 map(conditionsRuleGroup.get(r.getId()), 
ConditionTransfer.INSTANCE::mapToRuleDO)));
         publisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, 
DataEventTypeEnum.DELETE, ruleData));
     }
-    
+
+    /**
+     * rule delete.
+     *
+     * @param rules data
+     * @param event BatchSelectorDeletedEvent
+     */
+    public void onDeleted(final List<RuleDO> rules, final 
BatchSelectorDeletedEvent event) {
+        publish(new BatchRuleDeletedEvent(rules, SessionUtil.visitorName(), 
null));
+        final List<RuleConditionDO> condition = 
ruleConditionMapper.selectByRuleIdSet(rules.stream().map(BaseDO::getId).collect(Collectors.toSet()));
+        final Map<String, List<RuleConditionDO>> conditionsRuleGroup = 
groupBy(condition, RuleConditionDO::getRuleId);
+        final List<RuleData> ruleData = map(rules, r -> RuleDO.transFrom(r,
+                
Optional.ofNullable(event.findPluginBySelectorId(r.getSelectorId())).map(PluginDO::getName).orElse(null),
+                map(conditionsRuleGroup.get(r.getId()), 
ConditionTransfer.INSTANCE::mapToRuleDO)));
+        publisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, 
DataEventTypeEnum.DELETE, ruleData));
+    }
+
     /**
      * register.
      *
@@ -159,7 +180,7 @@ public class RuleEventPublisher implements 
AdminDataModelChangedEventPublisher<R
     private void publishEvent(final RuleDO ruleDO, final 
List<RuleConditionDTO> condition) {
         // publish change event.
         final RuleData rule = RuleDO.transFrom(ruleDO,
-                ruleMapper.getPluginNameByRuleId(ruleDO.getId()),
+                ruleMapper.getPluginNameBySelectorId(ruleDO.getSelectorId()),
                 map(condition, ConditionTransfer.INSTANCE::mapToRuleDTO));
         publisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, 
DataEventTypeEnum.UPDATE, Collections.singletonList(rule)));
     }
diff --git a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
index 25ced3f8a..496cf011a 100644
--- a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
@@ -163,13 +163,12 @@
         </where>
     </select>
 
-    <select id="getPluginNameByRuleId" resultType="java.lang.String">
+    <select id="getPluginNameBySelectorId" resultType="java.lang.String">
         select p.name
         from plugin p
-                 inner join selector s on p.id = s.plugin_id
-                 inner join rule r on s.id = r.selector_id
-        where r.id = #{ruleId}
-        limit 1
+        inner join selector s on p.id = s.plugin_id
+        where s.id = #{selectorId}
+        limit 1;
     </select>
     <select id="selectByIds" 
resultType="org.apache.shenyu.admin.model.entity.RuleDO">
         select *
diff --git 
a/shenyu-web/src/main/java/org/apache/shenyu/web/controller/LocalPluginController.java
 
b/shenyu-web/src/main/java/org/apache/shenyu/web/controller/LocalPluginController.java
index 61a153e96..d88d7feff 100644
--- 
a/shenyu-web/src/main/java/org/apache/shenyu/web/controller/LocalPluginController.java
+++ 
b/shenyu-web/src/main/java/org/apache/shenyu/web/controller/LocalPluginController.java
@@ -284,12 +284,14 @@ public class LocalPluginController {
      *
      * @param selectorId the selector id
      * @param id the id
+     * @param pluginName the pluginName
      * @return the mono
      */
     @GetMapping("/plugin/rule/delete")
     public Mono<String> deleteRule(@RequestParam("selectorId") final String 
selectorId,
-                                       @RequestParam("id") final String id) {
-        RuleData ruleData = 
RuleData.builder().selectorId(selectorId).id(id).build();
+                                   @RequestParam("id") final String id,
+                                   @RequestParam("pluginName") final String 
pluginName) {
+        RuleData ruleData = 
RuleData.builder().selectorId(selectorId).id(id).pluginName(pluginName).build();
         subscriber.unRuleSubscribe(ruleData);
         return Mono.just(Constants.SUCCESS);
     }

Reply via email to