public <T> void remove(final String path, final T source, final TrieCacheTypeEnum cacheType) {
        if (StringUtils.isBlank(path)) {
            return;
        }
        String strippedPath = StringUtils.strip(path, "/");
        String[] pathParts = StringUtils.split(strippedPath, "/");
        ShenyuTrieNode currentNode;
        if (TrieCacheTypeEnum.RULE.equals(cacheType)) {
            RuleData ruleData = (RuleData) source;
            currentNode = this.getNode(path, ruleData.getSelectorId());
            Optional.ofNullable(currentNode).ifPresent(node -> {
                List<?> dataList = Optional.ofNullable(node.getPathCache()).map(cache -> cache.get(ruleData.getSelectorId())).orElse(Collections.emptyList());
                if (CollectionUtils.isNotEmpty(dataList)) {
                    removeRuleData(currentNode, pathParts, ruleData, dataList);
                }
            });
        } else {
            SelectorData selectorData = (SelectorData) source;
            currentNode = this.getNode(path, selectorData.getPluginName());
            Optional.ofNullable(currentNode).ifPresent(node -> {
                List<?> dataList = Optional.ofNullable(node.getPathCache()).map(cache -> cache.get(selectorData.getPluginName())).orElse(Collections.emptyList());
                if (CollectionUtils.isNotEmpty(dataList)) {
                    removeSelectorData(currentNode, pathParts, selectorData, dataList);
                }
            });
        }
    }
remove trie node.
<p> query node of the current path, if the node exists and the node exist the value of pathCache,
delete a rule with the same ruleId from pathCache or delete a selector by pluginName.</p>
<p> if current source data list is empty, children and pathVariablesSet is null,remove concurrent node from parent node.</p>

@param path path
@param source source data
@param cacheType cache type
@param <T> selector data or rule data
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/trie/ShenyuTrie.java