Author: rdonkin
Date: Fri Jan 23 06:29:45 2009
New Revision: 737031

URL: http://svn.apache.org/viewvc?rev=737031&view=rev
Log:
Simplified API

Removed:
    
james/protocols/imap/trunk/mailbox/src/test/java/org/apache/james/imap/mailbox/util/UidChangeTrackerTest.java
Modified:
    
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
    
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/util/UidChangeTracker.java
    
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/StoreProcessor.java
    
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/fetch/FetchResponseBuilder.java
    
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/ResultIterator.java
    
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
    
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/MessageRowUtils.java
    
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
    
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java

Modified: 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
 (original)
+++ 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/Mailbox.java
 Fri Jan 23 06:29:45 2009
@@ -21,6 +21,7 @@
 
 import java.util.Date;
 import java.util.Iterator;
+import java.util.Map;
 
 import javax.mail.Flags;
 
@@ -51,25 +52,21 @@
 
     /**
      * 
-     * @param mailboxSession
-     *            TODO
+     * @param mailboxSession not null
      * @return the uid that will be assigned to the next appended message
      * @throws MailboxException
      */
 
-    long getUidNext(MailboxSession mailboxSession)
-            throws MailboxException;
+    long getUidNext(MailboxSession mailboxSession) throws MailboxException;
 
     /**
      * @return Flags that can be stored
      */
     Flags getPermanentFlags();
 
-    long[] recent(boolean reset, MailboxSession mailboxSession)
-            throws MailboxException;
+    long[] recent(boolean reset, MailboxSession mailboxSession) throws 
MailboxException;
 
-    int getUnseenCount(MailboxSession mailboxSession)
-            throws MailboxException;
+    int getUnseenCount(MailboxSession mailboxSession) throws MailboxException;
 
     /**
      * Gets the UID of the first unseen message.
@@ -91,9 +88,8 @@
     Iterator<Long> expunge(MessageRange set, MailboxSession mailboxSession) 
throws MailboxException;
 
     /**
-     * this is much more straight forward for IMAP instead of setting Flags of
-     * an array of lazy-loading MimeMessages. <br />
-     * required by IMAP
+     * Sets flags on messages within the given range.
+     * The new flags are returned for each message altered.
      * 
      * @param flags
      *            Flags to be set
@@ -103,17 +99,13 @@
      *            replace all Flags with this flags, value has to be true
      * @param set
      *            the range of messages
-     * @param fetchGroup
-     *            fetch group for results
-     * @param mailboxSession
-     *            TODO
+     * @param mailboxSession not null
      * @return {...@link MessageResult} <code>Iterator</code> containing 
messages
      *         whose flags have been updated, not null
      * @throws MailboxException
      */
-    Iterator setFlags(Flags flags, boolean value, boolean replace,
-            MessageRange set, FetchGroup fetchGroup,
-            MailboxSession mailboxSession) throws MailboxException;
+    Map<Long, Flags> setFlags(Flags flags, boolean value, boolean replace,
+            MessageRange set, MailboxSession mailboxSession) throws 
MailboxException;
 
     /**
      * Appends a message to this mailbox.

Modified: 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/util/UidChangeTracker.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/util/UidChangeTracker.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/util/UidChangeTracker.java
 (original)
+++ 
james/protocols/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/util/UidChangeTracker.java
 Fri Jan 23 06:29:45 2009
@@ -21,7 +21,9 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
@@ -72,16 +74,22 @@
      *            id of the session upating the flags
      * @see #flagsUpdated(MessageResult, long)
      */
-    public synchronized void flagsUpdated(MessageFlags[] messageFlags,
-            long sessionId) {
-        if (messageFlags != null) {
-            final int length = messageFlags.length;
-            for (int i = 0; i < length; i++) {
-                final MessageFlags result = messageFlags[i];
-                final long uid = result.getUid();
-                final Flags flags = result.getFlags();
-                final Long uidObject = new Long(uid);
-                updatedFlags(uid, flags, uidObject, sessionId);
+    public synchronized void flagsUpdated(SortedMap<Long,Flags> newFlagsByUid, 
Map<Long,Flags> originalFlagsByUid, long sessionId) {
+        if (newFlagsByUid != null) {
+            for(Map.Entry<Long, Flags> entry:newFlagsByUid.entrySet()) {
+                final Long uid = entry.getKey();
+                final Flags newFlags = entry.getValue();
+                final Flags cachedFlags = cache.get(uid);
+                final Flags lastFlags;
+                if (cachedFlags == null) {
+                    lastFlags = originalFlagsByUid.get(uid);
+                } else {
+                    lastFlags = cachedFlags;
+                }
+                if (!newFlags.equals(lastFlags)) {
+                    eventDispatcher.flagsUpdated(uid, sessionId, lastFlags, 
newFlags);
+                }
+                cache.put(uid, newFlags);
             }
         }
     }
@@ -126,34 +134,33 @@
     }
 
     public synchronized void found(UidRange range,
-            final Collection messageResults) throws MessagingException {
-        found(range, MessageFlags.toMessageFlags(messageResults));
+            final Collection<MessageResult> messageResults) throws 
MessagingException {
+        final Map<Long, Flags> flagsByIndex = new HashMap<Long, Flags>();
+        for (MessageResult result: messageResults) {
+            flagsByIndex.put(result.getUid(), result.getFlags());
+        }
+        found(range, flagsByIndex);
     }
 
     public synchronized void found(UidRange range,
-            final MessageFlags[] messageFlags) {
+            final Map<Long, Flags> flagsByIndex) {
         Set<Long> expectedSet = getSubSet(range);
-        final int length = messageFlags.length;
-        for (int i = 0; i < length; i++) {
-            final MessageFlags message = messageFlags[i];
-            if (message != null) {
-                long uid = message.getUid();
-                if (uid > lastScannedUid) {
-                    lastScannedUid = uid;
-                }
-                final Flags flags = message.getFlags();
-                final Long uidLong = new Long(uid);
-                if (expectedSet.contains(uidLong)) {
-                    expectedSet.remove(uidLong);
-                    updatedFlags(uid, flags, uidLong, 
Mailbox.ANONYMOUS_SESSION);
-                } else {
-                    cache.put(uidLong, flags);
-                    if (uid > lastUidAtStart) {
-                        eventDispatcher.added(uid, 0);
-                    }
+        for (Map.Entry<Long, Flags> entry:flagsByIndex.entrySet()) {
+            long uid = entry.getKey();
+            if (uid > lastScannedUid) {
+                lastScannedUid = uid;
+            }
+            final Flags flags = entry.getValue();
+            final Long uidLong = new Long(uid);
+            if (expectedSet.contains(uidLong)) {
+                expectedSet.remove(uidLong);
+                updatedFlags(uid, flags, uidLong, Mailbox.ANONYMOUS_SESSION);
+            } else {
+                cache.put(uidLong, flags);
+                if (uid > lastUidAtStart) {
+                    eventDispatcher.added(uid, Mailbox.ANONYMOUS_SESSION);
                 }
             }
-
         }
 
         if (lastScannedUid > lastUid) {
@@ -169,19 +176,16 @@
 
         for (Iterator iter = expectedSet.iterator(); iter.hasNext();) {
             long uid = ((Long) iter.next()).longValue();
-            eventDispatcher.expunged(uid, 0);
+            eventDispatcher.expunged(uid, Mailbox.ANONYMOUS_SESSION);
         }
     }
 
     private void updatedFlags(final long uid, final Flags flags,
             final Long uidLong, final long sessionId) {
         if (flags != null) {
-            Flags cachedFlags = (Flags) cache.get(uidLong);
+            Flags cachedFlags = cache.get(uidLong);
             if (cachedFlags == null || !flags.equals(cachedFlags)) {
-                if (cachedFlags != null) {
-                    eventDispatcher.flagsUpdated(uid, sessionId, cachedFlags,
-                            flags);
-                }
+                eventDispatcher.flagsUpdated(uid, sessionId, cachedFlags, 
flags);
                 cache.put(uidLong, flags);
             }
         }

Modified: 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/StoreProcessor.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/StoreProcessor.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/StoreProcessor.java
 (original)
+++ 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/StoreProcessor.java
 Fri Jan 23 06:29:45 2009
@@ -19,7 +19,7 @@
 
 package org.apache.james.imap.processor.imap4rev1;
 
-import java.util.Iterator;
+import java.util.Map;
 
 import javax.mail.Flags;
 
@@ -36,18 +36,13 @@
 import org.apache.james.imap.mailbox.MailboxManagerProvider;
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.mailbox.MessageRange;
-import org.apache.james.imap.mailbox.MessageResult;
-import org.apache.james.imap.mailbox.MessageResult.FetchGroup;
-import org.apache.james.imap.mailbox.util.FetchGroupImpl;
 import org.apache.james.imap.mailbox.util.MessageRangeImpl;
 import org.apache.james.imap.message.request.imap4rev1.StoreRequest;
 import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
 import org.apache.james.imap.processor.base.ImapSessionUtils;
 
 public class StoreProcessor extends AbstractMailboxProcessor {
-
-    private static final FetchGroup STORE_FETCH_GROUP = FetchGroupImpl.FLAGS;
-
+    
     public StoreProcessor(final ImapProcessor next, final 
MailboxManagerProvider mailboxManagerProvider,
             final StatusResponseFactory factory) {
         super(next, mailboxManagerProvider, factory);
@@ -96,14 +91,13 @@
                         lowVal, highVal);
                 final MailboxSession mailboxSession = ImapSessionUtils
                         .getMailboxSession(session);
-                final Iterator it = mailbox.setFlags(flags, value, replace,
-                        messageSet, STORE_FETCH_GROUP, mailboxSession);
+                final Map<Long, Flags> flagsByUid = mailbox.setFlags(flags, 
value, replace,
+                        messageSet, mailboxSession);
                 if (!silent) {
-                    while (it.hasNext()) {
-                        final MessageResult result = (MessageResult) it.next();
-                        final long uid = result.getUid();
+                    for (Map.Entry<Long, Flags> entry: flagsByUid.entrySet()) {
+                        final long uid = entry.getKey();
                         final int msn = selected.msn(uid);
-                        final Flags resultFlags = result.getFlags();
+                        final Flags resultFlags = entry.getValue();
                         final Long resultUid;
                         if (useUids) {
                             resultUid = new Long(uid);

Modified: 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/fetch/FetchResponseBuilder.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/fetch/FetchResponseBuilder.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/fetch/FetchResponseBuilder.java
 (original)
+++ 
james/protocols/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/imap4rev1/fetch/FetchResponseBuilder.java
 Fri Jan 23 06:29:45 2009
@@ -40,7 +40,6 @@
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.mailbox.MessageResult;
-import org.apache.james.imap.mailbox.util.FetchGroupImpl;
 import org.apache.james.imap.mailbox.util.MessageRangeImpl;
 import org.apache.james.imap.mailbox.util.MessageResultUtils;
 import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
@@ -117,8 +116,7 @@
         final Flags resultFlags = result.getFlags();
         if (fetch.isSetSeen() && !resultFlags.contains(Flags.Flag.SEEN)) {
             mailbox.setFlags(new Flags(Flags.Flag.SEEN), true, false,
-                    MessageRangeImpl.oneUid(resultUid), FetchGroupImpl.MINIMAL,
-                    mailboxSession);
+                    MessageRangeImpl.oneUid(resultUid), mailboxSession);
             resultFlags.add(Flags.Flag.SEEN);
             ensureFlagsResponse = true;
         }

Modified: 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/ResultIterator.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/ResultIterator.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/ResultIterator.java
 (original)
+++ 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/ResultIterator.java
 Fri Jan 23 06:29:45 2009
@@ -52,12 +52,7 @@
         }
         this.fetchGroup = fetchGroup;
     }
-
-    public MessageFlags[] getMessageFlags() {
-        final MessageFlags[] results = ResultUtils.toMessageFlags(messages);
-        return results;
-    }
-
+    
     /**
      * Iterates over the contained rows.
      * 

Modified: 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 (original)
+++ 
james/protocols/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 Fri Jan 23 06:29:45 2009
@@ -27,9 +27,13 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
 import java.util.TreeSet;
 
 import javax.mail.Flags;
@@ -57,6 +61,8 @@
 
 public abstract class StoreMailbox extends AbstractLogEnabled implements 
org.apache.james.imap.mailbox.Mailbox {
 
+    private static final int INITIAL_SIZE_FLAGS = 32;
+
     private static final int INITIAL_SIZE_HEADERS = 32;
 
     protected final long mailboxId;
@@ -186,8 +192,12 @@
     }
 
     private ResultIterator getMessages(FetchGroup result, UidRange range, 
List<MailboxMembership> messages) {
+        final Map<Long, Flags> flagsByIndex = new HashMap<Long, Flags>();
+        for (MailboxMembership member:messages) {
+            flagsByIndex.put(member.getUid(), member.createFlags());
+        }
         final ResultIterator results = getResults(result, messages);
-        getUidChangeTracker().found(range, results.getMessageFlags());
+        getUidChangeTracker().found(range, flagsByIndex);
         return results;
     }
 
@@ -293,23 +303,20 @@
         return uids.iterator();
     }
 
-    public Iterator setFlags(Flags flags, boolean value, boolean replace,
-            MessageRange set, FetchGroup fetchGroup,
-            MailboxSession mailboxSession) throws MailboxException {
-        return doSetFlags(flags, value, replace, set, fetchGroup,
-                mailboxSession);
+    public Map<Long, Flags> setFlags(Flags flags, boolean value, boolean 
replace,
+            MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
+        return doSetFlags(flags, value, replace, set, mailboxSession);
     }
 
-    private Iterator doSetFlags(Flags flags, boolean value, boolean replace,
-            final MessageRange set, FetchGroup fetchGroup,
-            MailboxSession mailboxSession) throws MailboxException {
+    private Map<Long, Flags> doSetFlags(Flags flags, boolean value, boolean 
replace,
+            final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
         final MessageMapper mapper = createMessageMapper();
+        final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, 
Flags>();
+        final Map<Long, Flags> originalFlagsByUid = new HashMap<Long, 
Flags>(INITIAL_SIZE_FLAGS);
         mapper.begin();
         final List<MailboxMembership> members = mapper.findInMailbox(set, 
mailboxId);
-        UidRange uidRange = uidRangeForMessageSet(set);
-        getUidChangeTracker().found(uidRange,
-                ResultUtils.toMessageFlags(members));
         for (final MailboxMembership member:members) {
+            originalFlagsByUid.put(member.getUid(), member.createFlags());
             if (replace) {
                 member.setFlags(flags);
             } else {
@@ -321,18 +328,12 @@
                 }
                 member.setFlags(current);
             }
+            newFlagsByUid.put(member.getUid(), member.createFlags());
             mapper.save(member);
         }
-        final OrFetchGroup orFetchGroup = new OrFetchGroup(fetchGroup,
-                FetchGroup.FLAGS);
-        final ResultIterator resultIterator = new ResultIterator(
-                members, orFetchGroup);
-        final org.apache.james.imap.mailbox.util.MessageFlags[] messageFlags = 
resultIterator
-        .getMessageFlags();
         mapper.commit();
-        tracker.flagsUpdated(messageFlags, mailboxSession.getSessionId());
-        tracker.found(uidRange, messageFlags);
-        return resultIterator;
+        tracker.flagsUpdated(newFlagsByUid, originalFlagsByUid, 
mailboxSession.getSessionId());
+        return newFlagsByUid;
     }
 
     public void addListener(MailboxListener listener) throws MailboxException {

Modified: 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/MessageRowUtils.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/MessageRowUtils.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/MessageRowUtils.java
 (original)
+++ 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/MessageRowUtils.java
 Fri Jan 23 06:29:45 2009
@@ -67,7 +67,7 @@
         int i = 0;
         for (final Iterator it = messageRows.iterator(); it.hasNext();) {
             MessageRow row = (MessageRow) it.next();
-            final Flags flags = row.getMessageFlags().getFlagsObject();
+            final Flags flags = row.getMessageFlags().createFlags();
             final long uid = row.getUid();
             results[i++] = new MessageFlags(uid, flags);
         }
@@ -134,7 +134,7 @@
                 org.apache.james.mailboxmanager.torque.om.MessageFlags 
messageFlags = messageRow
                         .getMessageFlags();
                 if (messageFlags != null) {
-                    messageResult.setFlags(messageFlags.getFlagsObject());
+                    messageResult.setFlags(messageFlags.createFlags());
                 }
                 content -= FetchGroup.FLAGS;
             }

Modified: 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 (original)
+++ 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 Fri Jan 23 06:29:45 2009
@@ -28,9 +28,13 @@
 import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
 import java.util.TreeSet;
 
 import javax.mail.Flags;
@@ -305,12 +309,17 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     private TorqueResultIterator getMessages(FetchGroup result, UidRange range,
             Criteria c) throws TorqueException, MessagingException,
             MailboxException {
-        List rows = MessageRowPeer.doSelectJoinMessageFlags(c);
+        List<MessageRow> rows = MessageRowPeer.doSelectJoinMessageFlags(c);
+        final Map<Long, Flags> flagsByIndex = new HashMap<Long, Flags>();
+        for (MessageRow row:rows) {
+            flagsByIndex.put(row.getUid(), 
row.getMessageFlags().createFlags());
+        }
         final TorqueResultIterator results = getResults(result, rows);
-        getUidChangeTracker().found(range, results.getMessageFlags());
+        getUidChangeTracker().found(range, flagsByIndex);
         return results;
     }
 
@@ -503,14 +512,12 @@
         }
     }
 
-    public Iterator setFlags(Flags flags, boolean value, boolean replace,
-            MessageRange set, FetchGroup fetchGroup,
-            MailboxSession mailboxSession) throws MailboxException {
+    public Map<Long, Flags> setFlags(Flags flags, boolean value, boolean 
replace,
+            MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
         try {
             lock.writeLock().acquire();
             try {
-                return doSetFlags(flags, value, replace, set, fetchGroup,
-                        mailboxSession);
+                return doSetFlags(flags, value, replace, set, mailboxSession);
             } finally {
                 lock.writeLock().release();
             }
@@ -520,25 +527,23 @@
         }
     }
 
-    private Iterator doSetFlags(Flags flags, boolean value, boolean replace,
-            final MessageRange set, FetchGroup fetchGroup,
-            MailboxSession mailboxSession) throws MailboxException {
+    private Map<Long, Flags> doSetFlags(Flags flags, boolean value, boolean 
replace,
+            final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
         checkAccess();
         try {
             // TODO put this into a serializeable transaction
-            final List messageRows = getMailboxRow().getMessageRows(
-                    criteriaForMessageSet(set));
-            UidRange uidRange = uidRangeForMessageSet(set);
-            getUidChangeTracker().found(uidRange,
-                    MessageRowUtils.toMessageFlags(messageRows));
+            final List messageRows = 
getMailboxRow().getMessageRows(criteriaForMessageSet(set));
+            SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, Flags>();
+            Map<Long, Flags> originalFlagsByUid = new HashMap<Long, Flags>(32);
             for (Iterator iter = messageRows.iterator(); iter.hasNext();) {
                 final MessageRow messageRow = (MessageRow) iter.next();
                 final MessageFlags messageFlags = messageRow.getMessageFlags();
                 if (messageFlags != null) {
+                    originalFlagsByUid.put(messageRow.getUid(), 
messageFlags.createFlags());
                     if (replace) {
                         messageFlags.setFlags(flags);
                     } else {
-                        Flags current = messageFlags.getFlagsObject();
+                        Flags current = messageFlags.createFlags();
                         if (value) {
                             current.add(flags);
                         } else {
@@ -546,18 +551,15 @@
                         }
                         messageFlags.setFlags(current);
                     }
+                    newFlagsByUid.put(messageRow.getUid(), 
messageFlags.createFlags());
                     messageFlags.save();
                 }
             }
-            final OrFetchGroup orFetchGroup = new OrFetchGroup(fetchGroup,
-                    FetchGroup.FLAGS);
-            final TorqueResultIterator resultIterator = new 
TorqueResultIterator(
-                    messageRows, orFetchGroup);
+            final TorqueResultIterator resultIterator = new 
TorqueResultIterator(messageRows, FetchGroupImpl.FLAGS);
             final org.apache.james.imap.mailbox.util.MessageFlags[] 
messageFlags = resultIterator
                     .getMessageFlags();
-            tracker.flagsUpdated(messageFlags, mailboxSession.getSessionId());
-            tracker.found(uidRange, messageFlags);
-            return resultIterator;
+            tracker.flagsUpdated(newFlagsByUid, originalFlagsByUid, 
mailboxSession.getSessionId());
+            return newFlagsByUid;
         } catch (Exception e) {
             throw new MailboxException(e);
         }
@@ -774,7 +776,7 @@
                     newRow.setInternalDate(fromRow.getInternalDate());
                     newRow.setSize(fromRow.getSize());
                     buildFlags(newRow, fromRow.getMessageFlags()
-                            .getFlagsObject());
+                            .createFlags());
 
                     final List headers = fromRow.getMessageHeaders();
                     for (Iterator iterator = headers.iterator(); iterator

Modified: 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java
URL: 
http://svn.apache.org/viewvc/james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java?rev=737031&r1=737030&r2=737031&view=diff
==============================================================================
--- 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java
 (original)
+++ 
james/protocols/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java
 Fri Jan 23 06:29:45 2009
@@ -45,7 +45,7 @@
         setSeen(flags.contains(Flags.Flag.SEEN));
     }
 
-    public Flags getFlagsObject() {
+    public Flags createFlags() {
         Flags flags = new Flags();
 
         if (getAnswered()) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to