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/04/14 12:39:40 UTC

svn commit: r1092111 - in /james/mailbox/trunk: api/src/main/java/org/apache/james/mailbox/ api/src/main/java/org/apache/james/mailbox/util/ api/src/test/java/org/apache/james/mailbox/util/ jcr/src/main/java/org/apache/james/mailbox/jcr/mail/ jpa/src/m...

Author: norman
Date: Thu Apr 14 10:39:39 2011
New Revision: 1092111

URL: http://svn.apache.org/viewvc?rev=1092111&view=rev
Log:
Fire one event per operation which contains all effected uids. See MAILBOX-53

Added:
    james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java
      - copied, changed from r1090983, james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/UpdatedFlags.java
Removed:
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/UpdatedFlags.java
Modified:
    james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
    james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java
    james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java
    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/StoreMessageManager.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java

Modified: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java?rev=1092111&r1=1092110&r2=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java (original)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java Thu Apr 14 10:39:39 2011
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox;
 
 import java.util.Iterator;
+import java.util.List;
 
 import javax.mail.Flags;
 
@@ -130,11 +131,11 @@ public interface MailboxListener {
         }
 
         /**
-         * Gets the message UID for the subject of this event.
+         * Gets the message UIDs for the subject of this event.
          * 
-         * @return message uid
+         * @return message uids
          */
-        public abstract long getSubjectUid();
+        public abstract List<Long> getUids();
     }
 
     public abstract class Expunged extends MessageEvent {
@@ -153,17 +154,7 @@ public interface MailboxListener {
             super(session, path);
         }
 
-        /**
-         * Gets new flags for this message.
-         */
-        public abstract Flags getNewFlags();
-
-        /**
-         * Gets an iterator for the system flags changed.
-         * 
-         * @return <code>Flags.Flag</code> <code>Iterator</code>, not null
-         */
-        public abstract Iterator<Flags.Flag> flagsIterator();
+        public abstract List<UpdatedFlags> getUpdatedFlags();
     }
 
     /**

Copied: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java (from r1090983, james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/UpdatedFlags.java)
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java?p2=james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java&p1=james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/UpdatedFlags.java&r1=1090983&r2=1092111&rev=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/UpdatedFlags.java (original)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java Thu Apr 14 10:39:39 2011
@@ -17,27 +17,50 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.store.mail.model;
+package org.apache.james.mailbox;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.lang.UnsupportedOperationException;
 
 import javax.mail.Flags;
+import javax.mail.Flags.Flag;
 
 /**
  * Represent a Flag update for a message
  * 
  *
  */
-public class UpdatedFlags {
+public class UpdatedFlags implements Iterable<Flags.Flag>{
 
     private final long uid;
     private final Flags oldFlags;
     private final Flags newFlags;
+    private final boolean[] modifiedFlags;
 
     public UpdatedFlags(long uid, Flags oldFlags, Flags newFlags) {
        this.uid = uid;
        this.oldFlags = oldFlags;
        this.newFlags = newFlags;
+       this.modifiedFlags = new boolean[NUMBER_OF_SYSTEM_FLAGS];
+       this.modifiedFlags[0] = isChanged(oldFlags, newFlags, Flags.Flag.ANSWERED);
+       this.modifiedFlags[1] = isChanged(oldFlags, newFlags, Flags.Flag.DELETED);
+       this.modifiedFlags[2] = isChanged(oldFlags, newFlags, Flags.Flag.DRAFT);
+       this.modifiedFlags[3] = isChanged(oldFlags, newFlags, Flags.Flag.FLAGGED);
+       this.modifiedFlags[4] = isChanged(oldFlags, newFlags, Flags.Flag.RECENT);
+       this.modifiedFlags[5] = isChanged(oldFlags, newFlags, Flags.Flag.SEEN);
     }
     
+
+    private static boolean isChanged(final Flags original, final Flags updated, Flags.Flag flag) {
+        return original != null && updated != null && (original.contains(flag) ^ updated.contains(flag));
+    }
+
+    private static final Flags.Flag[] FLAGS = { Flags.Flag.ANSWERED, Flags.Flag.DELETED, Flags.Flag.DRAFT, Flags.Flag.FLAGGED, Flags.Flag.RECENT, Flags.Flag.SEEN };
+
+    private static final int NUMBER_OF_SYSTEM_FLAGS = 6;
+
+    
     /**
      * Return the old {@link Flags} for the message
      * 
@@ -64,4 +87,62 @@ public class UpdatedFlags {
     public long getUid() {
         return uid;
     }
+    
+    private class FlagsIterator implements Iterator<Flag> {
+        private int position;
+
+        public FlagsIterator() {
+            position = 0;
+            nextPosition();
+        }
+
+        private void nextPosition() {
+            if ((position < NUMBER_OF_SYSTEM_FLAGS) && (!modifiedFlags[position])) {
+                position++;
+                nextPosition();
+            }
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see java.util.Iterator#hasNext()
+         */
+        public boolean hasNext() {
+            return position < NUMBER_OF_SYSTEM_FLAGS;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see java.util.Iterator#next()
+         */
+        public Flag next() {
+            if (!hasNext()) {
+                throw new NoSuchElementException();
+            }
+            final Flag result = FLAGS[position++];
+            nextPosition();
+            return result;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see java.util.Iterator#remove()
+         */
+        public void remove() {
+            throw new UnsupportedOperationException("Read only");
+        }
+    }
+
+    /**
+     * Gets an iterator for the system flags changed.
+     * 
+     * @return <code>Flags.Flag</code> <code>Iterator</code>, not null
+     */
+
+    public Iterator<Flags.Flag> iterator() {
+        return new FlagsIterator();
+    }
 }

Modified: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java?rev=1092111&r1=1092110&r2=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java (original)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java Thu Apr 14 10:39:39 2011
@@ -23,16 +23,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
-import javax.mail.Flags;
-import javax.mail.Flags.Flag;
-
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.UpdatedFlags;
 
 /**
  * Helper class to dispatch {@link Event}'s to registerend MailboxListener
@@ -70,13 +67,13 @@ public class MailboxEventDispatcher impl
      * Should get called when a new message was added to a Mailbox. All
      * registered MailboxListener will get triggered then
      * 
-     * @param uid
+     * @param uids
      * @param sessionId
      * @param path
      */
-    public void added(MailboxSession session, long uid, MailboxPath path) {
+    public void added(MailboxSession session, List<Long> uids, MailboxPath path) {
         pruneClosed();
-        final AddedImpl added = new AddedImpl(session, path, uid);
+        final AddedImpl added = new AddedImpl(session, path, uids);
         event(added);
     }
 
@@ -85,11 +82,11 @@ public class MailboxEventDispatcher impl
      * registered MailboxListener will get triggered then
      * 
      * @param session
-     * @param uid
+     * @param uids
      * @param path
      */
-    public void expunged(final MailboxSession session, final long uid, MailboxPath path) {
-        final ExpungedImpl expunged = new ExpungedImpl(session, path, uid);
+    public void expunged(final MailboxSession session, final List<Long> uids, MailboxPath path) {
+        final ExpungedImpl expunged = new ExpungedImpl(session, path, uids);
         event(expunged);
     }
 
@@ -98,13 +95,13 @@ public class MailboxEventDispatcher impl
      * registered MailboxListener will get triggered then
      * 
      * @param session
-     * @param uid
+     * @param uids
      * @param path
      * @param original
      * @param updated
      */
-    public void flagsUpdated(MailboxSession session, final long uid, final MailboxPath path, final Flags original, final Flags updated) {
-        final FlagsUpdatedImpl flags = new FlagsUpdatedImpl(session, path, uid, original, updated);
+    public void flagsUpdated(MailboxSession session, final List<Long> uids, final MailboxPath path, final List<UpdatedFlags> uflags) {
+        final FlagsUpdatedImpl flags = new FlagsUpdatedImpl(session, path, uids, uflags);
         event(flags);
     }
 
@@ -152,149 +149,69 @@ public class MailboxEventDispatcher impl
 
     private final static class AddedImpl extends MailboxListener.Added {
 
-        private final long subjectUid;
+        private final List<Long> uids;
 
-        public AddedImpl(final MailboxSession session, final MailboxPath path, final long subjectUid) {
+        public AddedImpl(final MailboxSession session, final MailboxPath path, final List<Long> uids) {
             super(session, path);
-            this.subjectUid = subjectUid;
+            this.uids = uids;
         }
 
         /*
          * (non-Javadoc)
-         * 
-         * @see
-         * org.apache.james.mailbox.MailboxListener.MessageEvent#getSubjectUid()
+         * @see org.apache.james.mailbox.MailboxListener.MessageEvent#getUids()
          */
-        public long getSubjectUid() {
-            return subjectUid;
+        public List<Long> getUids() {
+            return uids;
         }
     }
 
     private final static class ExpungedImpl extends MailboxListener.Expunged {
 
-        private final long subjectUid;
+        private final List<Long> uids;
 
-        public ExpungedImpl(MailboxSession session, final MailboxPath path, final long subjectUid) {
+        public ExpungedImpl(MailboxSession session, final MailboxPath path, final List<Long> uids) {
             super(session, path);
-            this.subjectUid = subjectUid;
+            this.uids = uids;
         }
-
-        public long getSubjectUid() {
-            return subjectUid;
+        /*
+         * (non-Javadoc)
+         * @see org.apache.james.mailbox.MailboxListener.MessageEvent#getUids()
+         */
+        public List<Long> getUids() {
+            return uids;
         }
     }
 
     private final static class FlagsUpdatedImpl extends MailboxListener.FlagsUpdated {
 
-        private static boolean isChanged(final Flags original, final Flags updated, Flags.Flag flag) {
-            return original != null && updated != null && (original.contains(flag) ^ updated.contains(flag));
-        }
-
-        private static final Flags.Flag[] FLAGS = { Flags.Flag.ANSWERED, Flags.Flag.DELETED, Flags.Flag.DRAFT, Flags.Flag.FLAGGED, Flags.Flag.RECENT, Flags.Flag.SEEN };
+        private final List<Long> uids;
 
-        private static final int NUMBER_OF_SYSTEM_FLAGS = 6;
 
-        private final long subjectUid;
+        private final List<UpdatedFlags> uFlags;
 
-        private final boolean[] modifiedFlags;
-
-        private final Flags newFlags;
-
-        public FlagsUpdatedImpl(MailboxSession session, final MailboxPath path, final long subjectUid, final Flags original, final Flags updated) {
-            this(session, path, subjectUid, updated, isChanged(original, updated, Flags.Flag.ANSWERED), isChanged(original, updated, Flags.Flag.DELETED), isChanged(original, updated, Flags.Flag.DRAFT), isChanged(original, updated, Flags.Flag.FLAGGED),
-                    isChanged(original, updated, Flags.Flag.RECENT), isChanged(original, updated, Flags.Flag.SEEN));
-        }
-
-        public FlagsUpdatedImpl(MailboxSession session, final MailboxPath path, final long subjectUid, final Flags newFlags, boolean answeredUpdated, boolean deletedUpdated, boolean draftUpdated, boolean flaggedUpdated, boolean recentUpdated, boolean seenUpdated) {
+        public FlagsUpdatedImpl(MailboxSession session, final MailboxPath path, final List<Long> uids, final List<UpdatedFlags> uFlags) {
             super(session, path);
-            this.subjectUid = subjectUid;
-            this.modifiedFlags = new boolean[NUMBER_OF_SYSTEM_FLAGS];
-            this.modifiedFlags[0] = answeredUpdated;
-            this.modifiedFlags[1] = deletedUpdated;
-            this.modifiedFlags[2] = draftUpdated;
-            this.modifiedFlags[3] = flaggedUpdated;
-            this.modifiedFlags[4] = recentUpdated;
-            this.modifiedFlags[5] = seenUpdated;
-            this.newFlags = newFlags;
-        }
+            this.uids = uids;
 
-        /*
-         * (non-Javadoc)
-         * 
-         * @see
-         * org.apache.james.mailbox.MailboxListener.MessageEvent#getSubjectUid()
-         */
-        public long getSubjectUid() {
-            return subjectUid;
+            this.uFlags = uFlags;
         }
 
         /*
          * (non-Javadoc)
-         * 
-         * @see
-         * org.apache.james.mailbox.MailboxListener.FlagsUpdated#flagsIterator()
+         * @see org.apache.james.mailbox.MailboxListener.MessageEvent#getUids()
          */
-        public Iterator<Flag> flagsIterator() {
-            return new FlagsIterator();
+        public List<Long> getUids() {
+            return uids;
         }
 
         /*
          * (non-Javadoc)
-         * 
-         * @see
-         * org.apache.james.mailbox.MailboxListener.FlagsUpdated#getNewFlags()
+         * @see org.apache.james.mailbox.MailboxListener.FlagsUpdated#getUpdatedFlags()
          */
-        public Flags getNewFlags() {
-            return newFlags;
+        public List<UpdatedFlags> getUpdatedFlags() {
+            return uFlags;
         }
 
-        private class FlagsIterator implements Iterator<Flag> {
-            private int position;
-
-            public FlagsIterator() {
-                position = 0;
-                nextPosition();
-            }
-
-            private void nextPosition() {
-                if ((position < NUMBER_OF_SYSTEM_FLAGS) && (!modifiedFlags[position])) {
-                    position++;
-                    nextPosition();
-                }
-            }
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see java.util.Iterator#hasNext()
-             */
-            public boolean hasNext() {
-                return position < NUMBER_OF_SYSTEM_FLAGS;
-            }
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see java.util.Iterator#next()
-             */
-            public Flag next() {
-                if (!hasNext()) {
-                    throw new NoSuchElementException();
-                }
-                final Flag result = FLAGS[position++];
-                nextPosition();
-                return result;
-            }
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see java.util.Iterator#remove()
-             */
-            public void remove() {
-                throw new UnsupportedOperationException("Read only");
-            }
-        }
     }
 
     /**

Modified: james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java?rev=1092111&r1=1092110&r2=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java (original)
+++ james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java Thu Apr 14 10:39:39 2011
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.util;
 
 import static org.junit.Assert.*;
 
+import java.util.Arrays;
 import java.util.Iterator;
 
 import javax.mail.Flags;
@@ -29,6 +30,7 @@ import org.apache.james.mailbox.MailboxL
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
 import org.jmock.Expectations;
@@ -68,46 +70,33 @@ public class MailboxEventDispatcherFlags
         dispatcher.addMailboxListener(collector);
         result = mockery.mock(MessageResult.class);
         mockery.checking(new Expectations() {{
-            oneOf (result).getUid();will(returnValue(23L));
+            allowing(result).getUid();will(returnValue(23L));
         }});
     }
 
-   
-    @Test
-    public void testShouldReturnNoChangesWhenOriginalNull() throws Exception {
-        dispatcher.flagsUpdated(session, result.getUid(), path, null, new Flags(
-                Flags.Flag.DELETED));
-        assertEquals(1, collector.events.size());
-        assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
-        MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
-                .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
-        assertNotNull(iterator);
-        assertFalse(iterator.hasNext());
-    }
 
     @Test
     public void testShouldReturnNoChangesWhenSystemFlagsUnchanged() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.DELETED), new Flags(Flags.Flag.DELETED));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.DELETED), new Flags(Flags.Flag.DELETED))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertFalse(iterator.hasNext());
     }
 
     @Test
     public void testShouldShowAnsweredAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.ANSWERED));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.ANSWERED))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());
@@ -116,13 +105,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowAnsweredRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.ANSWERED), new Flags());
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.ANSWERED), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());
@@ -131,13 +120,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowDeletedAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.DELETED));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.DELETED))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DELETED, iterator.next());
@@ -146,13 +135,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowDeletedRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.DELETED), new Flags());
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.DELETED), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DELETED, iterator.next());
@@ -161,13 +150,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowDraftAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.DRAFT));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.DRAFT))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DRAFT, iterator.next());
@@ -176,13 +165,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowDraftRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.DRAFT), new Flags());
+        dispatcher.flagsUpdated(session,Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.DRAFT), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DRAFT, iterator.next());
@@ -191,13 +180,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowFlaggedAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.FLAGGED));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.FLAGGED))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.FLAGGED, iterator.next());
@@ -206,13 +195,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowFlaggedRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.FLAGGED), new Flags());
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.FLAGGED), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.FLAGGED, iterator.next());
@@ -221,13 +210,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowRecentAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.RECENT));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.RECENT))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.RECENT, iterator.next());
@@ -236,13 +225,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowRecentRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.RECENT), new Flags());
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.RECENT), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.RECENT, iterator.next());
@@ -251,13 +240,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowSeenAdded() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(),
-                new Flags(Flags.Flag.SEEN));
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(),
+                new Flags(Flags.Flag.SEEN))));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.SEEN, iterator.next());
@@ -266,13 +255,13 @@ public class MailboxEventDispatcherFlags
 
     @Test
     public void testShouldShowSeenRemoved() {
-        dispatcher.flagsUpdated(session, result.getUid(), path, new Flags(
-                Flags.Flag.SEEN), new Flags());
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), new Flags(
+                Flags.Flag.SEEN), new Flags())));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.SEEN, iterator.next());
@@ -289,12 +278,12 @@ public class MailboxEventDispatcherFlags
         updated.add(Flags.Flag.DRAFT);
         updated.add(Flags.Flag.SEEN);
 
-        dispatcher.flagsUpdated(session, result.getUid(), path, originals, updated);
+        dispatcher.flagsUpdated(session, Arrays.asList(result.getUid()), path, Arrays.asList(new UpdatedFlags(result.getUid(), originals, updated)));
         assertEquals(1, collector.events.size());
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.flagsIterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());

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=1092111&r1=1092110&r2=1092111&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 Thu Apr 14 10:39:39 2011
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.SearchQuery.Criterion;
 import org.apache.james.mailbox.SearchQuery.NumericRange;
@@ -50,7 +51,6 @@ import org.apache.james.mailbox.store.Se
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.slf4j.Logger;
 
 /**

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=1092111&r1=1092110&r2=1092111&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 Thu Apr 14 10:39:39 2011
@@ -30,6 +30,7 @@ import javax.persistence.Query;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.SearchQuery.Criterion;
 import org.apache.james.mailbox.SearchQuery.NumericRange;
@@ -42,7 +43,6 @@ import org.apache.james.mailbox.store.Se
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.apache.openjpa.persistence.ArgumentException;
 
 /**

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=1092111&r1=1092110&r2=1092111&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 Thu Apr 14 10:39:39 2011
@@ -36,6 +36,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.SearchQuery.Criterion;
 import org.apache.james.mailbox.SearchQuery.NumericRange;
@@ -50,7 +51,6 @@ import org.apache.james.mailbox.store.Se
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 
 public class MaildirMessageMapper extends NonTransactionalMapper implements MessageMapper<Integer> {

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=1092111&r1=1092110&r2=1092111&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 Thu Apr 14 10:39:39 2011
@@ -31,13 +31,13 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.inmemory.mail.model.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.SearchQueryIterator;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
 import org.apache.james.mailbox.store.mail.model.MailboxMembershipComparator;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 
 public class InMemoryMessageMapper extends NonTransactionalMapper implements MessageMapper<Long> {

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1092111&r1=1092110&r2=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java Thu Apr 14 10:39:39 2011
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PushbackInputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -42,6 +43,7 @@ import org.apache.james.mailbox.MailboxS
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
@@ -50,7 +52,6 @@ import org.apache.james.mailbox.store.ma
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.apache.james.mailbox.store.streaming.ConfigurableMimeTokenStream;
 import org.apache.james.mailbox.store.streaming.CountingInputStream;
 import org.apache.james.mailbox.store.transaction.Mapper;
@@ -132,9 +133,9 @@ public abstract class StoreMessageManage
         Iterator<Long> uidIt = deleteMarkedInMailbox(set, mailboxSession);
         while(uidIt.hasNext()) {
             long uid = uidIt.next();
-            dispatcher.expunged(mailboxSession, uid, new StoreMailboxPath<Id>(getMailboxEntity()));
             uids.add(uid);
         }
+        dispatcher.expunged(mailboxSession, uids, new StoreMailboxPath<Id>(getMailboxEntity()));
         return uids.iterator();    
     }
 
@@ -261,7 +262,7 @@ public abstract class StoreMessageManage
             final MailboxMembership<Id> message = createMessage(nextUid, internalDate, size, bodyStartOctet, tmpMsgIn.newStream(0, -1), flags, headers, propertyBuilder);
             long uid = appendMessageToStore(message, mailboxSession);
                         
-            dispatcher.added(mailboxSession, uid, new StoreMailboxPath<Id>(getMailboxEntity()));
+            dispatcher.added(mailboxSession, Arrays.asList(uid), new StoreMailboxPath<Id>(getMailboxEntity()));
             return uid;
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message", e);
@@ -413,12 +414,16 @@ public abstract class StoreMessageManage
             }
         });
         
-        
+        final SortedMap<Long, UpdatedFlags> uFlags = new TreeMap<Long, UpdatedFlags>();
+
         while (it.hasNext()) {
             UpdatedFlags flag = it.next();
-            dispatcher.flagsUpdated(mailboxSession, flag.getUid(), new StoreMailboxPath<Id>(getMailboxEntity()), flag.getOldFlags(), flag.getNewFlags());
             newFlagsByUid.put(flag.getUid(), flag.getNewFlags());
+            uFlags.put(flag.getUid(), flag);
         }
+        
+        dispatcher.flagsUpdated(mailboxSession, new ArrayList<Long>(uFlags.keySet()), new StoreMailboxPath<Id>(getMailboxEntity()), new ArrayList<UpdatedFlags>(uFlags.values()));
+
         return newFlagsByUid;
     }
 
@@ -436,11 +441,14 @@ public abstract class StoreMessageManage
         try {
             List<MessageRange> result=new ArrayList<MessageRange>();
             Iterator<Long> copiedUids = copy(set, toMailbox, session);
+            List<Long> uids = new ArrayList<Long>();
             while(copiedUids.hasNext()) {
                 long uid = copiedUids.next();
                 result.add(MessageRange.one(uid));
-                dispatcher.added(session, uid, new StoreMailboxPath<Id>(toMailbox.getMailboxEntity()));
+                uids.add(uid);
             }
+            dispatcher.added(session, uids, new StoreMailboxPath<Id>(toMailbox.getMailboxEntity()));
+
             return result;
         } catch (MailboxException e) {
             throw new MailboxException("Unable to parse message", e);

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java?rev=1092111&r1=1092110&r2=1092111&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java Thu Apr 14 10:39:39 2011
@@ -26,10 +26,10 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
 import org.apache.james.mailbox.store.mail.model.Message;
-import org.apache.james.mailbox.store.mail.model.UpdatedFlags;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
 /**



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org