Fixed issue #38, autoboxing of a nullable Integer given a default to 0 assignment

This commit is contained in:
andrea
2015-06-20 12:17:50 +02:00
parent d20940f110
commit 92a76c9de1
7 changed files with 74 additions and 13 deletions
@@ -77,7 +77,7 @@ public interface IMessagesStore {
*/
List<PublishEvent> listMessagesInSession(String clientID);
void removeMessageInSession(String clientID, int packetID);
void removeMessageInSession(String clientID, Integer packetID);
void dropMessagesInSession(String clientID);
@@ -102,10 +102,14 @@ public class MemoryStorageService implements IMessagesStore, ISessionsStore {
}
@Override
public void removeMessageInSession(String clientID, int messageID) {
public void removeMessageInSession(String clientID, Integer messageID) {
List<PublishEvent> events = m_persistentMessageStore.get(clientID);
PublishEvent toRemoveEvt = null;
for (PublishEvent evt : events) {
if (evt.getMessageID() == null && messageID == null) {
//was a qos0 message (no ID)
toRemoveEvt = evt;
}
if (evt.getMessageID() == messageID) {
toRemoveEvt = evt;
}
@@ -208,16 +208,16 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
if (msg.isPasswordFlag()) {
pwd = msg.getPassword();
} else if (!this.allowAnonymous) {
failedCredetials(session);
failedCredentials(session);
return;
}
if (!m_authenticator.checkValid(msg.getUsername(), pwd)) {
failedCredetials(session);
failedCredentials(session);
return;
}
session.setAttribute(NettyChannel.ATTR_KEY_USERNAME, msg.getUsername());
} else if (!this.allowAnonymous) {
failedCredetials(session);
failedCredentials(session);
return;
}
@@ -246,7 +246,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
}
}
private void failedCredetials(ServerChannel session) {
private void failedCredentials(ServerChannel session) {
ConnAckMessage okResp = new ConnAckMessage();
okResp.setReturnCode(ConnAckMessage.BAD_USERNAME_OR_PASSWORD);
session.write(okResp);
@@ -311,7 +311,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
if (qos == AbstractMessage.QOSType.MOST_ONE) { //QoS0
forward2Subscribers(topic, qos, message, retain, messageID);
} else if (qos == AbstractMessage.QOSType.LEAST_ONE) {
} else if (qos == AbstractMessage.QOSType.LEAST_ONE) { //QoS1
PublishEvent inFlightEvt = new PublishEvent(topic, qos, message, retain,
clientID, messageID);
//TODO use a message store for TO PUBLISH MESSAGES it has nothing to do with inFlight!!
@@ -321,7 +321,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
//NB the PUB_ACK could be sent also after the addInFlight
sendPubAck(new PubAckEvent(messageID, clientID));
LOG.debug("replying with PubAck to MSG ID {}", messageID);
} else if (qos == AbstractMessage.QOSType.EXACTLY_ONCE) {
} else if (qos == AbstractMessage.QOSType.EXACTLY_ONCE) { //QoS2
String publishKey = String.format("%s%d", clientID, messageID);
//store the message in temp store
PublishEvent qos2Persistent = new PublishEvent(topic, qos, message, retain,
@@ -31,7 +31,7 @@ public class PublishEvent extends MessagingEvent {
boolean m_retain;
String m_clientID;
//Optional attribute, available only fo QoS 1 and 2
int m_msgID;
Integer m_msgID;
public PublishEvent(String topic, QOSType qos, ByteBuffer message, boolean retain,
String clientID, Integer msgID) {
@@ -65,7 +65,7 @@ public class PublishEvent extends MessagingEvent {
return m_clientID;
}
public int getMessageID() {
public Integer getMessageID() {
return m_msgID;
}
@@ -32,7 +32,7 @@ public class StoredPublishEvent implements Serializable {
boolean m_retain;
String m_clientID;
//Optional attribute, available only fo QoS 1 and 2
int m_msgID;
Integer m_msgID;
public StoredPublishEvent(PublishEvent wrapped) {
m_topic = wrapped.getTopic();
@@ -67,7 +67,7 @@ public class StoredPublishEvent implements Serializable {
return m_clientID;
}
public int getMessageID() {
public Integer getMessageID() {
return m_msgID;
}
}
@@ -157,13 +157,17 @@ public class MapDBPersistentStore implements IMessagesStore, ISessionsStore {
}
@Override
public void removeMessageInSession(String clientID, int messageID) {
public void removeMessageInSession(String clientID, Integer messageID) {
List<StoredPublishEvent> events = m_persistentMessageStore.get(clientID);
if (events == null) {
return;
}
StoredPublishEvent toRemoveEvt = null;
for (StoredPublishEvent evt : events) {
if (evt.getMessageID() == null && messageID == null) {
//was a qos0 message (no ID)
toRemoveEvt = evt;
}
if (evt.getMessageID() == messageID) {
toRemoveEvt = evt;
}
@@ -0,0 +1,53 @@
@Grab(group='org.fusesource.mqtt-client', module='mqtt-client', version='1.10')
import org.fusesource.mqtt.client.BlockingConnection
import org.fusesource.mqtt.client.MQTT
import org.fusesource.mqtt.client.Message
import org.fusesource.mqtt.client.QoS
import org.fusesource.mqtt.client.Topic
String host = args.size() == 1 ? args[0] : "localhost"
MQTT mqttSub = new MQTT()
mqttSub.setHost(host, 1883)
mqttSub.setClientId("Subscriber(A)")
mqttSub.cleanSession = false
//AT_MOST_ONCE,
//AT_LEAST_ONCE,
//EXACTLY_ONCE
BlockingConnection clientSub = mqttSub.blockingConnection()
clientSub.connect()
println "Sub connected"
Topic[] topics = [new Topic("/sys/abc", QoS.AT_MOST_ONCE)]
byte[] qoses = clientSub.subscribe(topics)
println "Sub subscribed"
clientSub.disconnect()
clientSub.kill()
println "Sub disconnected"
MQTT mqttPub = new MQTT()
mqttPub.setHost(host, 1883)
mqttPub.setClientId("Publisher(B)")
mqttPub.cleanSession = false
BlockingConnection clientPub = mqttPub.blockingConnection()
clientPub.connect()
println "Pub connected"
clientPub.publish("/sys/abc", "A message published".bytes, QoS.EXACTLY_ONCE, false)
println "Pub published"
println "Sub reconnects"
mqttSub = new MQTT()
mqttSub.setHost(host, 1883)
mqttSub.setClientId("Subscriber(A)")
mqttSub.cleanSession = false
clientSub = mqttSub.blockingConnection()
clientSub.connect()
println "Sub connected..and try to receive the message"
Message msg = clientSub.receive()
println "Sub received message \n\t Topic: ${msg.topic}, payload: ${new String(msg.payload)}"
msg.ack()
clientSub.disconnect() //or kill
clientPub.disconnect()
println "Finished!!\n\n"