INT-2212 fixed NPE in AbstractKeyValueMessageStore

INT-2212 polished AbstractKeyValueMessageStore
eliminated possibility for NPE during the Message removal, added test

INT-2212 polishing

INT-2212 polishing
added remove(..) method to MessageGroupMetadata
This commit is contained in:
Oleg Zhurakousky
2011-10-31 16:55:28 -04:00
parent 61b7108f72
commit 2d504904db
5 changed files with 77 additions and 11 deletions

View File

@@ -42,8 +42,7 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
protected static final String MESSAGE_GROUP_KEY_PREFIX = "MESSAGE_GROUP_";
protected static final String CREATED_DATE = "CREATED_DATE";
// MessageStore methods
public Message<?> getMessage(UUID id) {
@@ -68,7 +67,10 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
if (message != null) {
Assert.isInstanceOf(Message.class, message);
}
return (Message<?>) message;
if (message != null){
return this.normalizeMessage((Message<?>) message);
}
return null;
}
@ManagedAttribute
@@ -146,7 +148,7 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
public void completeGroup(Object groupId) {
Assert.notNull(groupId, "'groupId' must not be null");
SimpleMessageGroup messageGroup = this.buildMessageGroup(this.getMessageGroup(groupId), true);
SimpleMessageGroup messageGroup = this.buildMessageGroup(groupId, true);
messageGroup.complete();
this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(messageGroup));
}
@@ -182,9 +184,15 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
Assert.isInstanceOf(MessageGroupMetadata.class, mgm);
MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata) mgm;
Message<?> message = this.removeMessage(messageGroupMetadata.firstId());
Message<?> normalizedMessage = this.normalizeMessage(message);
return normalizedMessage;
UUID firstId = messageGroupMetadata.firstId();
if (firstId != null){
Message<?> message = this.removeMessage(firstId);
messageGroupMetadata.remove(message.getHeaders().getId());
this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, messageGroupMetadata);
return message;
}
}
return null;
}
@@ -273,8 +281,7 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS
private Message<?> getRawMessage(UUID id) {
Assert.notNull(id, "'id' must not be null");
Object message = this.doRetrieve(MESSAGE_KEY_PREFIX + id);
Assert.isInstanceOf(Message.class, message);
Object message = this.doRetrieve(MESSAGE_KEY_PREFIX + id);
return (Message<?>) message;
}

View File

@@ -18,6 +18,7 @@ package org.springframework.integration.store;
import java.io.Serializable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.UUID;
@@ -62,6 +63,16 @@ public class MessageGroupMetadata implements Serializable{
this.lastReleasedMessageSequenceNumber = messageGroup.getLastReleasedMessageSequenceNumber();
}
public void remove(UUID messageId){
long currentTimestamp = 0;
for (Entry<Long, UUID> entry : messageCreationDateToIdMappings.entrySet()) {
if (entry.getValue().equals(messageId)){
currentTimestamp = entry.getKey();
break;
}
}
this.messageCreationDateToIdMappings.remove(currentTimestamp);
}
public Object getGroupId() {
return this.groupId;
@@ -72,7 +83,11 @@ public class MessageGroupMetadata implements Serializable{
}
public UUID firstId(){
return messageCreationDateToIdMappings.firstEntry().getValue();
Entry<Long, UUID> firstEntry = messageCreationDateToIdMappings.firstEntry();
if (firstEntry != null){
return firstEntry.getValue();
}
return null;
}
public boolean isComplete() {