in mqtt-common/src/main/java/org/apache/rocketmq/mqtt/common/model/Trie.java [268:302]
private void _getAllPath(TrieNode<K, V> currentNode, String[] topicArray, int level, int maxLevel, boolean findAll, Set<String> result, String path) {
if (level >= maxLevel && !findAll) {
if (currentNode.end) {
result.add(path);
}
return;
}
if (findAll && currentNode.end) {
result.add(path);
}
if (currentNode.end && level + 1 < maxLevel && topicArray[level + 1].equals("#")) {
result.add(path);
}
if (findAll) { // match the '#'
for (String key : currentNode.children.keySet()) {
_getAllPath(currentNode.children.get(key), topicArray, level + 1, maxLevel, true, result, path + key + Constants.MQTT_TOPIC_DELIMITER);
}
return;
}
if (topicArray[level].equals("+")) { // match the '+'
for (String key : currentNode.children.keySet()) {
_getAllPath(currentNode.children.get(key), topicArray, level + 1, maxLevel, false, result, path + key + Constants.MQTT_TOPIC_DELIMITER);
}
} else if (topicArray[level].equals("#")) { // match the '#'
for (String key : currentNode.children.keySet()) {
_getAllPath(currentNode.children.get(key), topicArray, level + 1, maxLevel, true, result, path + key + Constants.MQTT_TOPIC_DELIMITER);
}
} else {
if (currentNode.children.get(topicArray[level]) != null) {
String key = topicArray[level];
_getAllPath(currentNode.children.get(topicArray[level]), topicArray, level + 1, maxLevel, false, result, path + key + Constants.MQTT_TOPIC_DELIMITER);
}
}
}