From 2259c115c4d3b02e94dea1448da1631111ac69d1 Mon Sep 17 00:00:00 2001 From: andrea Date: Wed, 28 Aug 2013 18:14:09 +0200 Subject: [PATCH] Introduced BFS utility method to be used to do a deep clean in subscriptions tree, and to implement an utility tree dump method --- .../subscriptions/SubscriptionsStore.java | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java index 6afaab18..c1d9fa3a 100644 --- a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java +++ b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/subscriptions/SubscriptionsStore.java @@ -16,6 +16,43 @@ import org.slf4j.LoggerFactory; * @author andrea */ public class SubscriptionsStore { + + public static interface IVisitor { + void visit(TreeNode node); + + T getResult(); + } + + private class DumpTreeVisitor implements IVisitor { + + String s = ""; + + public void visit(TreeNode node) { + String subScriptionsStr = ""; + for (Subscription sub : node.m_subscriptions) { + subScriptionsStr += sub.toString(); + } + s += node.getToken() == null ? "" : node.getToken().toString(); + s += subScriptionsStr + "\n"; + } + + public String getResult() { + return s; + } + } + + private class SubscriptionTreeCollector implements IVisitor> { + + private List m_allSubscriptions = new ArrayList(); + + public void visit(TreeNode node) { + m_allSubscriptions.addAll(node.subscriptions()); + } + + public List getResult() { + return m_allSubscriptions; + } + } private TreeNode subscriptions = new TreeNode(null); private static final Logger LOG = LoggerFactory.getLogger(SubscriptionsStore.class); @@ -99,6 +136,19 @@ public class SubscriptionsStore { matchNode.subscriptions().remove(toBeRemoved); } } + + /** + * TODO implement testing + */ + public void clearAllSubscriptions() { + SubscriptionTreeCollector subsCollector = new SubscriptionTreeCollector(); + bfsVisit(subscriptions, subsCollector); + + List allSubscriptions = subsCollector.getResult(); + for (Subscription subscription : allSubscriptions) { + removeSubscription(subscription.getTopic(), subscription.getClientId()); + } + } /** * Visit the topics tree to remove matching subscriptions with clientID @@ -119,6 +169,11 @@ public class SubscriptionsStore { subscriptions.activate(clientID); } + /** + * Given a topic string return the clients subscriptions that matches it. + * Topic string can't contain character # and + because they are reserved to + * listeners subscriptions, and not topic publishing. + */ public List matches(String topic) { List tokens = new ArrayList(); try { @@ -141,7 +196,23 @@ public class SubscriptionsStore { public int size() { return subscriptions.size(); } - + + public String dumpTree() { + DumpTreeVisitor visitor = new DumpTreeVisitor(); + bfsVisit(subscriptions, visitor); + return visitor.getResult(); + } + + private void bfsVisit(TreeNode node, IVisitor visitor) { + if (node == null) { + return; + } + visitor.visit(node); + for (TreeNode child : node.m_children) { + bfsVisit(child, visitor); + } + } + /** * Verify if the 2 topics matching respecting the rules of MQTT Appendix A */