added # filter topic handling

This commit is contained in:
ShvaykaD 2020-11-11 16:22:57 +02:00
parent 74d4f84a7d
commit 4babb07fd6
2 changed files with 19 additions and 5 deletions

View File

@ -34,10 +34,15 @@ public class MqttTopicFilterFactory {
}
return filters.computeIfAbsent(topicFilter, filter -> {
if (filter.contains("+") || filter.contains("#")) {
String regex = filter
String regex;
if (filter.equals("#")) {
regex = filter.replace("#", "^(?!/).+");
} else {
regex = filter
.replace("\\", "\\\\")
.replace("+", "[^/]+")
.replace("/#", "($|/.*)");
}
log.debug("Converting [{}] to [{}]", filter, regex);
return new RegexTopicFilter(regex);
} else {

View File

@ -20,7 +20,6 @@ import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import javax.script.ScriptException;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@ -32,6 +31,9 @@ public class MqttTopicFilterFactoryTest {
private static String TEST_STR_2 = "Sensor/Temperature";
private static String TEST_STR_3 = "Sensor/Temperature2/House/48";
private static String TEST_STR_4 = String.format("%s%n%s", "/Sensor/Temperature", "/House/48");
private static String TEST_STR_5 = "/" + TEST_STR_1;
@Test
public void metadataCanBeUpdated() throws ScriptException {
MqttTopicFilter filter = MqttTopicFilterFactory.toFilter("Sensor/Temperature/House/+");
@ -51,6 +53,13 @@ public class MqttTopicFilterFactoryTest {
assertTrue(filter.filter(TEST_STR_1));
assertTrue(filter.filter(TEST_STR_2));
assertFalse(filter.filter(TEST_STR_3));
filter = MqttTopicFilterFactory.toFilter("#");
assertTrue(filter.filter(TEST_STR_1));
assertTrue(filter.filter(TEST_STR_2));
assertTrue(filter.filter(TEST_STR_3));
assertFalse(filter.filter(TEST_STR_4));
assertFalse(filter.filter(TEST_STR_5));
}
}