Skip to content

Commit 1135b83

Browse files
author
Ranjan Dasgupta
authored
Merge pull request #753 from rdasgupt/fix_718
Fix for topic match issue #718
2 parents 950f005 + 7a13c88 commit 1135b83

2 files changed

Lines changed: 26 additions & 8 deletions

File tree

  • org.eclipse.paho.client.mqttv3.test/src/test/java/org/eclipse/paho/client/mqttv3/test
  • org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3

org.eclipse.paho.client.mqttv3.test/src/test/java/org/eclipse/paho/client/mqttv3/test/MqttTopicTest.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,18 @@ public void testValidTopicFilterWildcards() throws Exception {
6060
public void testMatchedTopicFilterWildcards() throws Exception {
6161
String methodName = Utility.getMethodName();
6262
LoggingUtilities.banner(log, cclass, methodName);
63-
String[][] matchingTopics = new String[][] { { "sport/tennis/player1/#", "sport/tennis/player1" },
64-
{ "sport/tennis/player1/#", "sport/tennis/player1/ranking" },
65-
{ "sport/tennis/player1/#", "sport/tennis/player1/score/wimbledon" }, { "sport/#", "sport" },
66-
{ "#", "sport/tennis/player1" } };
63+
String[][] matchingTopics = new String[][] {
64+
{ "+/+", "sport/hockey" },
65+
{ "/+", "/sport" },
66+
{ "sport/tennis/player1/#", "sport/tennis/player1" },
67+
{ "sport/tennis/player1/#", "sport/tennis/player1/ranking" },
68+
{ "sport/tennis/player1/#", "sport/tennis/player1/score/wimbledon" },
69+
{ "sport/#", "sport" },
70+
{ "#", "sport/tennis/player1" },
71+
{ "sport/tennis/player1/#", "sport/tennis/player1//wimbledon" },
72+
{ "sport/+/player1/#", "sport/tennis/player1/wimbledon" },
73+
{ "sport/+/player1/#", "sport/soccer/player1/UEFA" }
74+
};
6775

6876
for (String[] pair : matchingTopics) {
6977
Assert.assertTrue(pair[0] + " should match " + pair[1], MqttTopic.isMatched(pair[0], pair[1]));
@@ -74,8 +82,15 @@ public void testMatchedTopicFilterWildcards() throws Exception {
7482
public void testNonMatchedTopicFilterWildcards() throws Exception {
7583
String methodName = Utility.getMethodName();
7684
LoggingUtilities.banner(log, cclass, methodName);
77-
String[][] matchingTopics = new String[][] { { "sport/tennis/player1/#", "sport/tennis/player2" },
78-
{ "sport1/#", "sport2" }, { "sport/tennis1/player/#", "sport/tennis2/player" } };
85+
String[][] matchingTopics = new String[][] {
86+
{ "+/+", "/sport" },
87+
{ "+/+", "a/b/c" },
88+
{ "/sport/+", "/sport/" },
89+
{ "sport/tennis/player1/#", "sport/tennis/player2" },
90+
{ "sport1/#", "sport2" },
91+
{ "sport/tennis1/player/#", "sport/tennis2/player" },
92+
{ "sport//tennis/player1/#", "sport/tennis/player1//wimbledon" }
93+
};
7994

8095
for (String[] pair : matchingTopics) {
8196
Assert.assertFalse(pair[0] + " should NOT match " + pair[1], MqttTopic.isMatched(pair[0], pair[1]));

org.eclipse.paho.client.mqttv3/src/main/java/org/eclipse/paho/client/mqttv3/MqttTopic.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@ public static boolean isMatched(String topicFilter, String topicName) throws Ill
275275
}
276276

277277
while (filterPos < filterLen && topicPos < topicLen) {
278+
if (topicFilter.charAt(filterPos) == '#')
279+
topicPos = topicLen - 1; // skip until end of string
280+
278281
if (topicName.charAt(topicPos) == '/' && topicFilter.charAt(filterPos) != '/')
279282

280283
break;
@@ -285,8 +288,8 @@ public static boolean isMatched(String topicFilter, String topicName) throws Ill
285288
int nextpos = topicPos + 1;
286289
while (nextpos < topicLen && topicName.charAt(nextpos) != '/')
287290
nextpos = ++topicPos + 1;
288-
} else if (topicFilter.charAt(filterPos) == '#')
289-
topicPos = topicLen - 1; // skip until end of string
291+
}
292+
290293
filterPos++;
291294
topicPos++;
292295
}

0 commit comments

Comments
 (0)