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);
}