in mqtt-common/src/main/java/org/apache/rocketmq/mqtt/common/model/Trie.java [170:206]
private Set<String> findValuePath(TrieNode<K, V> currentNode, String[] topicArray, int level, int maxLevel,
StringBuilder builder, boolean isNumberSign) {
Set<String> result = new HashSet<>();
// match end of path
boolean isPathEnd = (level == maxLevel || isNumberSign) && !currentNode.valueSet.isEmpty() && builder.length() > 0;
if (isPathEnd) {
result.add(TopicUtils.normalizeTopic(builder.toString().substring(0, builder.length() - 1)));
}
// match the '#'
TrieNode numberMatch = currentNode.children.get(Constants.NUMBER_SIGN);
if (numberMatch != null) {
int start = builder.length();
builder.append(Constants.NUMBER_SIGN).append(Constants.MQTT_TOPIC_DELIMITER);
result.addAll(findValuePath(numberMatch, topicArray, level + 1, maxLevel, builder, true));
builder.delete(start, builder.length());
}
// match the mqtt-topic path
if (level < maxLevel && !currentNode.children.isEmpty()) {
// match the precise
TrieNode trieNode = currentNode.children.get(topicArray[level]);
if (trieNode != null) {
int start = builder.length();
builder.append(topicArray[level]).append(Constants.MQTT_TOPIC_DELIMITER);
result.addAll(findValuePath(trieNode, topicArray, level + 1, maxLevel, builder, false));
builder.delete(start, builder.length());
}
// match the '+'
TrieNode plusMatch = currentNode.children.get(Constants.PLUS_SIGN);
if (plusMatch != null) {
int start = builder.length();
builder.append(Constants.PLUS_SIGN).append(Constants.MQTT_TOPIC_DELIMITER);
result.addAll(findValuePath(plusMatch, topicArray, level + 1, maxLevel, builder, false));
builder.delete(start, builder.length());
}
}
return result;
}