You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/05/31 15:24:09 UTC

svn commit: r1129661 - in /james/mailbox/trunk: jcr/src/main/java/org/apache/james/mailbox/jcr/mail/ jpa/src/main/java/org/apache/james/mailbox/jpa/mail/ maildir/src/main/java/org/apache/james/mailbox/maildir/mail/ memory/src/main/java/org/apache/james...

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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org