From e6756b3c06c67bcd164c23d81cb3e3b8fe1737f2 Mon Sep 17 00:00:00 2001 From: andsel Date: Fri, 3 Aug 2012 16:16:41 +0200 Subject: [PATCH 1/2] Extracted a store for subscriptions --- .../messaging/spi/impl/SimpleMessaging.java | 14 ++++---------- .../spi/impl/SimpleMessagingTest.java | 19 ++++--------------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java index 684d5b73..ff988b01 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java @@ -16,7 +16,7 @@ public class SimpleMessaging implements IMessaging { //TODO is poorly performace on concurrent load, use at least ReadWriteLock private ReadWriteLock rwLock = new ReentrantReadWriteLock(); - private List subscriptions = new ArrayList(); + private SubscriptionsStore subscriptions = new SubscriptionsStore(); private INotifier m_notifier; @@ -31,10 +31,8 @@ public class SimpleMessaging implements IMessaging { rwLock.readLock().lock(); try { - for (Subscription sub : subscriptions) { - if (sub.match(topic)) { - m_notifier.notify(sub.clientId, topic, defQos, message); - } + for (Subscription sub : subscriptions.matches(topic)) { + m_notifier.notify(sub.clientId, topic, defQos, message); } } finally { rwLock.readLock().unlock(); @@ -44,15 +42,11 @@ public class SimpleMessaging implements IMessaging { public void subscribe(String clientId, String topic, QOSType qos) { Subscription newSubscription = new Subscription(clientId, topic, qos); rwLock.writeLock().lock(); - if (subscriptions.contains(newSubscription)) { - rwLock.writeLock().unlock(); - return; - } subscriptions.add(newSubscription); rwLock.writeLock().unlock(); } - protected List getSubscriptions() { + protected SubscriptionsStore getSubscriptions() { return subscriptions; } } diff --git a/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessagingTest.java b/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessagingTest.java index 016a86c3..93a5ab98 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessagingTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessagingTest.java @@ -1,12 +1,11 @@ package org.dna.mqtt.moquette.messaging.spi.impl; -import org.junit.Before; -import org.mockito.ArgumentCaptor; -import java.util.List; import org.dna.mqtt.moquette.messaging.spi.INotifier; import org.dna.mqtt.moquette.proto.messages.AbstractMessage.QOSType; -import org.junit.Test; import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; import static org.mockito.Mockito.*; /** @@ -43,17 +42,7 @@ public class SimpleMessagingTest { //Verify Subscription subscription = new Subscription(FAKE_CLIENT_ID, FAKE_TOPIC, QOSType.MOST_ONE); - assertEquals(1, countMatchingSubscriptions(messaging.getSubscriptions(), subscription)); - } - - private int countMatchingSubscriptions(List l, Subscription matchingSub) { - int count = 0; - for (Subscription s : l) { - if (s.equals(matchingSub)) { - count++; - } - } - return count; + assertEquals(1, messaging.getSubscriptions().size()); } @Test From 8ded145b960a04f4bca5a234014e85f7014e563f Mon Sep 17 00:00:00 2001 From: andsel Date: Fri, 3 Aug 2012 16:22:25 +0200 Subject: [PATCH 2/2] Missed in prev commit --- .../spi/impl/SubscriptionsStore.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java 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 new file mode 100644 index 00000000..2f41b89f --- /dev/null +++ b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SubscriptionsStore.java @@ -0,0 +1,39 @@ +package org.dna.mqtt.moquette.messaging.spi.impl; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a tree of published topics + * + * @author andrea + */ +public class SubscriptionsStore { + + private List subscriptions = new ArrayList(); + + public void add(Subscription newSubscription) { + if (subscriptions.contains(newSubscription)) { + return; + } + subscriptions.add(newSubscription); + } + + public List matches(String topic) { + List m = new ArrayList(); + for (Subscription sub : subscriptions) { + if (sub.match(topic)) { + m.add(sub); + } + } + return m; + } + + public boolean contains(Subscription sub) { + return subscriptions.contains(sub); + } + + public int size() { + return subscriptions.size(); + } +}