Author: norman Date: Tue May 31 13:24:08 2011 New Revision: 1129661 URL: http://svn.apache.org/viewvc?rev=1129661&view=rev Log: Last adjustments on the mailbox api for mod-sequences. See MAILBOX-74
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff ============================================================================== --- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java (original) +++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java Tue May 31 13:24:08 2011 @@ -600,7 +600,7 @@ public class JCRMessageMapper extends Ab } @Override - protected void copy(Mailbox<String> mailbox, long uid, long modSeq, Message<String> original) throws MailboxException { + protected MessageMetaData copy(Mailbox<String> mailbox, long uid, long modSeq, Message<String> original) throws MailboxException { try { String newMessagePath = getSession().getNodeByIdentifier(mailbox.getMailboxId()).getPath() + NODE_DELIMITER + String.valueOf(uid); getSession().getWorkspace().copy(((JCRMessage)original).getNode().getPath(), getSession().getNodeByIdentifier(mailbox.getMailboxId()).getPath() + NODE_DELIMITER + String.valueOf(uid)); @@ -608,14 +608,15 @@ public class JCRMessageMapper extends Ab node.setProperty(JCRMessage.MAILBOX_UUID_PROPERTY, mailbox.getMailboxId()); node.setProperty(JCRMessage.UID_PROPERTY, uid); node.setProperty(JCRMessage.MODSEQ_PROPERTY, modSeq); - + + return new SimpleMessageMetaData(new JCRMessage(node, mailboxSession.getLog())); } catch (RepositoryException e) { throw new MailboxException("Unable to copy message " +original + " in mailbox " + mailbox, e); } } @Override - protected void save(Mailbox<String> mailbox, Message<String> message) throws MailboxException { + protected MessageMetaData save(Mailbox<String> mailbox, Message<String> message) throws MailboxException { final JCRMessage membership = (JCRMessage) message; try { @@ -683,6 +684,7 @@ public class JCRMessageMapper extends Ab } else { membership.merge(messageNode); } + return new SimpleMessageMetaData(membership); } catch (RepositoryException e) { throw new MailboxException("Unable to save message " + message + " in mailbox " + mailbox, e); } catch (IOException e) { Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff ============================================================================== --- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java (original) +++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java Tue May 31 13:24:08 2011 @@ -405,14 +405,14 @@ public class JPAMessageMapper extends Ab * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message) */ - protected void copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException { + protected MessageMetaData copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException { Message<Long> copy; if (original instanceof JPAStreamingMessage) { copy = new JPAStreamingMessage((JPAMailbox) mailbox, uid, modSeq, original); } else { copy = new JPAMessage((JPAMailbox) mailbox, uid, modSeq, original); } - save(mailbox, copy); + return save(mailbox, copy); } @@ -420,7 +420,7 @@ public class JPAMessageMapper extends Ab * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message) */ - protected void save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException { + protected MessageMetaData save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException { try { @@ -429,7 +429,7 @@ public class JPAMessageMapper extends Ab ((AbstractJPAMessage) message).setMailbox(getEntityManager().find(JPAMailbox.class, mailbox.getMailboxId())); getEntityManager().persist(message); - + return new SimpleMessageMetaData(message); } catch (PersistenceException e) { throw new MailboxException("Save of message " + message + " failed in mailbox " + mailbox, e); } catch (ArgumentException e) { Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff ============================================================================== --- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java (original) +++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java Tue May 31 13:24:08 2011 @@ -25,11 +25,13 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.Map.Entry; +import javax.mail.Flags; import javax.mail.Flags.Flag; import org.apache.commons.io.FileUtils; @@ -37,6 +39,7 @@ import org.apache.james.mailbox.MailboxE import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageMetaData; import org.apache.james.mailbox.MessageRange; +import org.apache.james.mailbox.UpdatedFlags; import org.apache.james.mailbox.MessageRange.Type; import org.apache.james.mailbox.maildir.MaildirFolder; import org.apache.james.mailbox.maildir.MaildirMessageName; @@ -309,9 +312,9 @@ public class MaildirMessageMapper extend * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message) */ - protected void copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException { + protected MessageMetaData copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException { MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original); - save(mailbox, theCopy); + return save(mailbox, theCopy); } @@ -353,127 +356,89 @@ public class MaildirMessageMapper extend /* * (non-Javadoc) - * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message) + * + * @see + * org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache + * .james.mailbox.store.mail.model.Mailbox, + * org.apache.james.mailbox.store.mail.model.Message) */ - protected void save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException { - if (message instanceof LazyLoadingMaildirMessage) { - // if the message is an instanceof LazyLoadingMaildirMessage we can be sure it was loaded out of the store and - // so we need only to update the flags - try { - MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); - LazyLoadingMaildirMessage maildirMessage = (LazyLoadingMaildirMessage) message; - MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid()); - File messageFile = messageName.getFile(); - // System.out.println("save existing " + message + - // " as " + messageFile.getName()); - messageName.setFlags(maildirMessage.createFlags()); - // this automatically moves messages from new to cur if - // needed - String newMessageName = messageName.getFullName(); - - File newMessageFile; - - // See MAILBOX-57 - if (message.createFlags().contains(Flag.RECENT)) { - // message is recent so save it in the new folder - newMessageFile = new File(folder.getNewFolder(), newMessageName); - } else { - newMessageFile = new File(folder.getCurFolder(), newMessageName); - } - long modSeq; - // if the flags don't have change we should not try to move the - // file - if (newMessageFile.equals(messageFile) == false) { - FileUtils.moveFile(messageFile, newMessageFile); - modSeq = newMessageFile.lastModified(); - - } else { - modSeq = messageFile.lastModified(); - } - maildirMessage.setModSeq(modSeq); - - long uid = maildirMessage.getUid(); - folder.update(uid, newMessageName); - } catch (IOException e) { - throw new MailboxException("Unable to save flags update for message " + message + " in mailbox " + mailbox, e); - } - } else { - MaildirMessage maildirMessage = (MaildirMessage) message; - MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); - long uid = 0; - // a new message - // save file to "tmp" folder - File tmpFolder = folder.getTmpFolder(); - // The only case in which we could get problems with clashing names - // is if the system clock - // has been set backwards, then the server is restarted with the - // same pid, delivers the same - // number of messages since its start in the exact same millisecond - // as done before and the - // random number generator returns the same number. - // In order to prevent this case we would need to check ALL files in - // all folders and compare - // them to this message name. We rather let this happen once in a - // billion years... - MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets()); - File messageFile = new File(tmpFolder, messageName.getFullName()); - FileOutputStream fos = null; - InputStream input = null; - try { - messageFile.createNewFile(); - fos = new FileOutputStream(messageFile); - input = message.getFullContent(); - byte[] b = new byte[BUF_SIZE]; - int len = 0; - while ((len = input.read(b)) != -1) - fos.write(b, 0, len); - } catch (IOException ioe) { - throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe); - } finally { - try { - if (fos != null) - fos.close(); - } catch (IOException e) { - } - try { - if (input != null) - input.close(); - } catch (IOException e) { - } - } - File newMessageFile = null; - // delivered via SMTP, goes to ./new without flags - if (maildirMessage.isRecent()) { - messageName.setFlags(message.createFlags()); - newMessageFile = new File(folder.getNewFolder(), messageName.getFullName()); - // System.out.println("save new recent " + message + " as " + - // newMessageFile.getName()); - } - // appended via IMAP (might already have flags etc, goes to ./cur - // directly) - else { - messageName.setFlags(message.createFlags()); - newMessageFile = new File(folder.getCurFolder(), messageName.getFullName()); - // System.out.println("save new not recent " + message + " as " - // + newMessageFile.getName()); - } + protected MessageMetaData save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException { + AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) message; + MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); + long uid = 0; + // a new message + // save file to "tmp" folder + File tmpFolder = folder.getTmpFolder(); + // The only case in which we could get problems with clashing names + // is if the system clock + // has been set backwards, then the server is restarted with the + // same pid, delivers the same + // number of messages since its start in the exact same millisecond + // as done before and the + // random number generator returns the same number. + // In order to prevent this case we would need to check ALL files in + // all folders and compare + // them to this message name. We rather let this happen once in a + // billion years... + MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets()); + File messageFile = new File(tmpFolder, messageName.getFullName()); + FileOutputStream fos = null; + InputStream input = null; + try { + messageFile.createNewFile(); + fos = new FileOutputStream(messageFile); + input = message.getFullContent(); + byte[] b = new byte[BUF_SIZE]; + int len = 0; + while ((len = input.read(b)) != -1) + fos.write(b, 0, len); + } catch (IOException ioe) { + throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe); + } finally { try { - FileUtils.moveFile(messageFile, newMessageFile); + if (fos != null) + fos.close(); } catch (IOException e) { - // TODO: Try copy and delete - throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e); } try { - uid = folder.appendMessage(newMessageFile.getName()); - maildirMessage.setUid(uid); + if (input != null) + input.close(); } catch (IOException e) { - throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e); } } + File newMessageFile = null; + // delivered via SMTP, goes to ./new without flags + if (maildirMessage.isRecent()) { + messageName.setFlags(message.createFlags()); + newMessageFile = new File(folder.getNewFolder(), messageName.getFullName()); + // System.out.println("save new recent " + message + " as " + + // newMessageFile.getName()); + } + // appended via IMAP (might already have flags etc, goes to ./cur + // directly) + else { + messageName.setFlags(message.createFlags()); + newMessageFile = new File(folder.getCurFolder(), messageName.getFullName()); + // System.out.println("save new not recent " + message + " as " + // + newMessageFile.getName()); + } + try { + FileUtils.moveFile(messageFile, newMessageFile); + } catch (IOException e) { + // TODO: Try copy and delete + throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e); + } + try { + uid = folder.appendMessage(newMessageFile.getName()); + maildirMessage.setUid(uid); + maildirMessage.setModSeq(newMessageFile.lastModified()); + return new SimpleMessageMetaData(message); + } catch (IOException e) { + throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e); + } } - /** * Do nothing as maildir store the uid and modseq everytime by it own */ @@ -508,5 +473,77 @@ public class MaildirMessageMapper extend protected void rollback() throws MailboxException { //nothing todo } + /* + * (non-Javadoc) + * @see org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox, javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange) + */ + public Iterator<UpdatedFlags> updateFlags(final Mailbox<Integer> mailbox, final Flags flags, final boolean value, final boolean replace, MessageRange set) throws MailboxException { + final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>(); + final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox); + + findInMailbox(mailbox, set, new MailboxMembershipCallback<Integer>() { + + public void onMailboxMembers(List<Message<Integer>> members) throws MailboxException { + for (final Message<Integer> member : members) { + Flags originalFlags = member.createFlags(); + if (replace) { + member.setFlags(flags); + } else { + Flags current = member.createFlags(); + if (value) { + current.add(flags); + } else { + current.remove(flags); + } + member.setFlags(current); + } + Flags newFlags = member.createFlags(); + + try { + AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) member; + MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid()); + File messageFile = messageName.getFile(); + // System.out.println("save existing " + message + + // " as " + messageFile.getName()); + messageName.setFlags(maildirMessage.createFlags()); + // this automatically moves messages from new to cur if + // needed + String newMessageName = messageName.getFullName(); + + File newMessageFile; + + // See MAILBOX-57 + if (newFlags.contains(Flag.RECENT)) { + // message is recent so save it in the new folder + newMessageFile = new File(folder.getNewFolder(), newMessageName); + } else { + newMessageFile = new File(folder.getCurFolder(), newMessageName); + } + long modSeq; + // if the flags don't have change we should not try to move the file + if (newMessageFile.equals(messageFile) == false) { + FileUtils.moveFile(messageFile, newMessageFile ); + modSeq = newMessageFile.lastModified(); + + } else { + modSeq = messageFile.lastModified(); + } + maildirMessage.setModSeq(modSeq); + + updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, originalFlags, newFlags)); + + long uid = maildirMessage.getUid(); + folder.update(uid, newMessageName); + } catch (IOException e) { + throw new MailboxException("Failure while save Message " + member + " in Mailbox " + mailbox, e); + } + + } + } + }); + + return updatedFlags.iterator(); + + } } Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff ============================================================================== --- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java (original) +++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java Tue May 31 13:24:08 2011 @@ -214,8 +214,8 @@ public class InMemoryMessageMapper exten * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message) */ - protected void copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException { - save(mailbox, new SimpleMailboxMembership(mailbox.getMailboxId(), uid, modSeq, (SimpleMailboxMembership)original)); + protected MessageMetaData copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException { + return save(mailbox, new SimpleMailboxMembership(mailbox.getMailboxId(), uid, modSeq, (SimpleMailboxMembership)original)); } /* @@ -239,8 +239,9 @@ public class InMemoryMessageMapper exten * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message) */ - protected void save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException { + protected MessageMetaData save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException { getMembershipByUidForMailbox(mailbox).put(message.getUid(), message); + return new SimpleMessageMetaData(message); } /** Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff ============================================================================== --- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java (original) +++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Tue May 31 13:24:08 2011 @@ -18,8 +18,11 @@ ****************************************************************/ package org.apache.james.mailbox.store.mail; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -39,8 +42,10 @@ import org.apache.james.mailbox.SearchQu import org.apache.james.mailbox.SearchQuery.UidCriterion; import org.apache.james.mailbox.store.MessageSearchIndex; import org.apache.james.mailbox.store.SearchQueryIterator; +import org.apache.james.mailbox.store.mail.model.Header; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.Message; +import org.apache.james.mailbox.store.mail.model.Property; import org.apache.james.mailbox.store.transaction.TransactionalMapper; /** @@ -250,11 +255,12 @@ public abstract class AbstractMessageMap public MessageMetaData add(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException { message.setUid(nextUid(mailbox)); message.setModSeq(nextModSeq(mailbox)); - save(mailbox, message); + MessageMetaData data = save(mailbox, message); if (index != null) { index.add(mailboxSession, mailbox, message); } - return new SimpleMessageMetaData(message); + return data; + } @@ -262,11 +268,141 @@ public abstract class AbstractMessageMap * (non-Javadoc) * @see org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message) */ - public MessageMetaData copy(Mailbox<Id> mailbox, Message<Id> original) throws MailboxException { + public MessageMetaData copy(final Mailbox<Id> mailbox, final Message<Id> original) throws MailboxException { long uid = nextUid(mailbox); long modSeq = nextModSeq(mailbox); - copy(mailbox, uid, modSeq, original); - return new SimpleMessageMetaData(uid, modSeq, original.createFlags(), original.getFullContentOctets(), original.getInternalDate()); + final MessageMetaData metaData = copy(mailbox, uid, modSeq, original); + if (index != null) { + // index the copied message by building a wrapper around the original message and the returned metadata + index.add(mailboxSession, mailbox, new Message<Id>() { + + @Override + public Flags createFlags() { + return original.createFlags(); + } + + @Override + public InputStream getBodyContent() throws IOException { + return original.getBodyContent(); + } + + @Override + public long getBodyOctets() { + return original.getBodyOctets(); + } + + @Override + public InputStream getFullContent() throws IOException { + return original.getFullContent(); + } + + @Override + public long getFullContentOctets() { + return original.getFullContentOctets(); + } + + @Override + public List<Header> getHeaders() { + return original.getHeaders(); + } + + @Override + public Date getInternalDate() { + return metaData.getInternalDate(); + } + + @Override + public Id getMailboxId() { + return mailbox.getMailboxId(); + } + + @Override + public String getMediaType() { + return original.getMediaType(); + } + + @Override + public long getModSeq() { + return metaData.getModSeq(); + } + + @Override + public List<Property> getProperties() { + return original.getProperties(); + } + + @Override + public String getSubType() { + return original.getSubType(); + } + + @Override + public Long getTextualLineCount() { + return original.getTextualLineCount(); + } + + @Override + public long getUid() { + return metaData.getUid(); + } + + @Override + public boolean isAnswered() { + return original.isAnswered(); + } + + @Override + public boolean isDeleted() { + return original.isDeleted(); + + } + + @Override + public boolean isDraft() { + return original.isDraft(); + + } + + @Override + public boolean isFlagged() { + return original.isFlagged(); + } + + @Override + public boolean isRecent() { + return original.isRecent(); + } + + @Override + public boolean isSeen() { + return original.isSeen(); + } + + @Override + public void setFlags(Flags flags) { + throw new UnsupportedOperationException("Read-Only Message"); + } + + @Override + public void setModSeq(long modSeq) { + throw new UnsupportedOperationException("Read-Only Message"); + } + + @Override + public void setUid(long uid) { + throw new UnsupportedOperationException("Read-Only Message"); + } + + @Override + public int compareTo(Message<Id> o) { + return (int) (metaData.getUid() - o.getUid()); + } + + + }); + } + + return metaData; } @@ -370,13 +506,14 @@ public abstract class AbstractMessageMap /** - * Save the {@link Message} for the given {@link Mailbox} + * Save the {@link Message} for the given {@link Mailbox} and return the {@link MessageMetaData} * * @param mailbox * @param message + * @return metaData * @throws MailboxException */ - protected abstract void save(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException; + protected abstract MessageMetaData save(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException; /** @@ -386,9 +523,10 @@ public abstract class AbstractMessageMap * @param uid * @param modSeq * @param original + * @return metaData * @throws MailboxException */ - protected abstract void copy(Mailbox<Id> mailbox, long uid, long modSeq, Message<Id> original) throws MailboxException; + protected abstract MessageMetaData copy(Mailbox<Id> mailbox, long uid, long modSeq, Message<Id> original) throws MailboxException; /** --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org