/** Add a Message to the group with the provided group ID. */
  public MessageGroup addMessageToGroup(Object groupId, Message<?> message) {
    Assert.notNull(groupId, "'groupId' must not be null");
    Assert.notNull(message, "'message' must not be null");

    // add message as is to the MG accessible by the caller
    SimpleMessageGroup messageGroup = this.getSimpleMessageGroup(this.getMessageGroup(groupId));

    messageGroup.add(message);

    // enrich Message with additional headers and add it to MS
    Message<?> enrichedMessage = this.enrichMessage(message);

    this.addMessage(enrichedMessage);

    // build raw MessageGroup and add enriched Message to it
    SimpleMessageGroup rawGroup = this.buildMessageGroup(groupId, true);

    rawGroup.add(enrichedMessage);

    // store MessageGroupMetadata built from enriched MG
    this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(rawGroup));

    // return clean MG
    return messageGroup;
  }
  private SimpleMessageGroup buildMessageGroup(Object groupId, boolean raw) {
    Assert.notNull(groupId, "'groupId' must not be null");
    Object mgm = this.doRetrieve(MESSAGE_GROUP_KEY_PREFIX + groupId);
    if (mgm != null) {
      Assert.isInstanceOf(MessageGroupMetadata.class, mgm);
      MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata) mgm;
      ArrayList<Message<?>> messages = new ArrayList<Message<?>>();

      Iterator<UUID> messageIds = messageGroupMetadata.messageIdIterator();
      while (messageIds.hasNext()) {
        if (raw) {
          messages.add(this.getRawMessage(messageIds.next()));
        } else {
          messages.add(this.getMessage(messageIds.next()));
        }
      }

      SimpleMessageGroup messageGroup =
          new SimpleMessageGroup(
              messages,
              groupId,
              messageGroupMetadata.getTimestamp(),
              messageGroupMetadata.isComplete());
      messageGroup.setLastReleasedMessageSequenceNumber(
          messageGroupMetadata.getLastReleasedMessageSequenceNumber());
      return messageGroup;
    } else {
      return new SimpleMessageGroup(groupId);
    }
  }
 private SimpleMessageGroup normalizeSimpleMessageGroup(SimpleMessageGroup messageGroup) {
   SimpleMessageGroup normalizedGroup = new SimpleMessageGroup(messageGroup.getGroupId());
   for (Message<?> message : messageGroup.getMessages()) {
     Message<?> normailizedMessage = this.normalizeMessage(message);
     normalizedGroup.add(normailizedMessage);
   }
   return normalizedGroup;
 }
 public MessageGroup addMessageToGroup(Object groupId, Message<?> message) {
   if (!groupUpperBound.tryAcquire(0)) {
     throw new MessagingException(
         this.getClass().getSimpleName()
             + " was out of capacity at, try constructing it with a larger capacity.");
   }
   SimpleMessageGroup group = getMessageGroupInternal(groupId);
   group.add(message);
   return group;
 }
  /** Remove a Message from the group with the provided group ID. */
  public MessageGroup removeMessageFromGroup(Object groupId, Message<?> messageToRemove) {
    Assert.notNull(groupId, "'groupId' must not be null");
    Assert.notNull(messageToRemove, "'messageToRemove' must not be null");

    // build raw MG
    SimpleMessageGroup rawGroup = this.buildMessageGroup(groupId, true);

    // create a clean instance of
    SimpleMessageGroup messageGroup = this.normalizeSimpleMessageGroup(rawGroup);

    for (Message<?> message : rawGroup.getMessages()) {
      if (message.getHeaders().getId().equals(messageToRemove.getHeaders().getId())) {
        rawGroup.remove(message);
      }
    }
    this.removeMessage(messageToRemove.getHeaders().getId());

    this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(rawGroup));
    messageGroup = this.getSimpleMessageGroup(this.getMessageGroup(groupId));

    return messageGroup;
  }
 public void setLastReleasedSequenceNumberForGroup(Object groupId, int sequenceNumber) {
   Assert.notNull(groupId, "'groupId' must not be null");
   SimpleMessageGroup messageGroup = this.buildMessageGroup(groupId, true);
   messageGroup.setLastReleasedMessageSequenceNumber(sequenceNumber);
   this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(messageGroup));
 }
 public void completeGroup(Object groupId) {
   Assert.notNull(groupId, "'groupId' must not be null");
   SimpleMessageGroup messageGroup = this.buildMessageGroup(groupId, true);
   messageGroup.complete();
   this.doStore(MESSAGE_GROUP_KEY_PREFIX + groupId, new MessageGroupMetadata(messageGroup));
 }
 public void completeGroup(Object groupId) {
   SimpleMessageGroup group = getMessageGroupInternal(groupId);
   group.complete();
 }
 public void setLastReleasedSequenceNumberForGroup(Object groupId, int sequenceNumber) {
   SimpleMessageGroup group = getMessageGroupInternal(groupId);
   group.setLastReleasedMessageSequenceNumber(sequenceNumber);
 }
 public MessageGroup removeMessageFromGroup(Object key, Message<?> messageToRemove) {
   SimpleMessageGroup group = getMessageGroupInternal(key);
   group.remove(messageToRemove);
   return group;
 }