From bf1db7b207bf9717944bafc475742cf608877f27 Mon Sep 17 00:00:00 2001 From: andsel Date: Fri, 3 Aug 2012 17:34:16 +0200 Subject: [PATCH] Fixed tokenization to handle multi-level sign --- .../spi/impl/SubscriptionsStore.java | 12 +++++++++-- .../spi/impl/SubscriptionsStoreTest.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) 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 1d33e9fc..02a30768 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 @@ -85,10 +85,18 @@ public class SubscriptionsStore { String s = splitted[i]; if (s.isEmpty()) { if (i != 0){ - throw new ParseException("Bad format of topic, expetec toppic name between separators", i); + throw new ParseException("Bad format of topic, expetec topic name between separators", i); } res.add(Token.EMPTY); - } else { + } else if (s.equals("#")) { + //check that multi is the last symbol + if (i != splitted.length - 1 ) { + throw new ParseException("Bad format of topic, the multi symbol (#) has to be the last one after a separator", i); + } + res.add(Token.MULTI); + } 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 a4bd06b9..430abfbf 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 @@ -39,6 +39,26 @@ public class SubscriptionsStoreTest { store.splitTopic("/finance//stock/ibm"); } + @Test + public void testSplitTopicMultiValid() throws ParseException { + List tokens = store.splitTopic("finance/stock/#"); + assertEqualsSeq(asArray("finance", "stock", Token.MULTI), tokens); + + tokens = store.splitTopic("#"); + assertEqualsSeq(asArray(Token.MULTI), tokens); + } + + + @Test(expected = ParseException.class) + public void testSplitTopicMultiInTheMiddleNotValid() throws ParseException { + store.splitTopic("finance/#/closingprice"); + } + + @Test(expected = ParseException.class) + public void testSplitTopicMultiNotAferSeparatorNotValid() 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++) {