diff --git a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java index 02a30768..fcf68e4c 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java @@ -96,7 +96,11 @@ public class SubscriptionsStore { res.add(Token.MULTI); } else if (s.contains("#")) { throw new ParseException("Bad format of topic, invalid subtopic name: " + s, i); - }else { + } else if (s.equals("+")) { + res.add(Token.SINGLE); + } else if (s.contains("+")) { + throw new ParseException("Bad format of topic, invalid subtopic name: " + s, i); + } else { res.add(new Token(s)); } } diff --git a/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStoreTest.java b/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStoreTest.java index 430abfbf..d06b2428 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStoreTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStoreTest.java @@ -59,6 +59,25 @@ public class SubscriptionsStoreTest { store.splitTopic("finance#"); } + + @Test + public void testSplitTopicSingleValid() throws ParseException { + List tokens = store.splitTopic("finance/stock/+"); + assertEqualsSeq(asArray("finance", "stock", Token.SINGLE), tokens); + + tokens = store.splitTopic("+"); + assertEqualsSeq(asArray(Token.SINGLE), tokens); + + tokens = store.splitTopic("finance/+/ibm"); + assertEqualsSeq(asArray("finance", Token.SINGLE, "ibm"), tokens); + } + + @Test(expected = ParseException.class) + public void testSplitTopicSingleNotAferSeparatorNotValid() throws ParseException { + store.splitTopic("finance+"); + } + + private static Token[] asArray(Object... l) { Token[] tokens = new Token[l.length]; for (int i = 0; i < l.length; i++) {