Author: norman
Date: Fri Dec  3 20:22:42 2010
New Revision: 1041977

URL: http://svn.apache.org/viewvc?rev=1041977&view=rev
Log:
Merge MapperStoreMessageManager and StoreMessageManager. I thought it would be 
a good idea to split them in the past but I did not come up with a good use 
case yet, so better to follow KISS here.

Removed:
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java
Modified:
    
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
    
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
    
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
    
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
    
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
    
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java

Modified: 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
 Fri Dec  3 20:22:42 2010
@@ -27,8 +27,8 @@ import org.apache.james.mailbox.MailboxS
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
@@ -53,7 +53,7 @@ public class JCRMailboxManager extends S
 
     
     @Override
-    protected MapperStoreMessageManager<String> 
createMessageManager(UidProvider<String> uidProvider, MailboxEventDispatcher 
dispatcher, Mailbox<String> mailboxEntity, MailboxSession session) throws 
MailboxException{
+    protected StoreMessageManager<String> 
createMessageManager(UidProvider<String> uidProvider, MailboxEventDispatcher 
dispatcher, Mailbox<String> mailboxEntity, MailboxSession session) throws 
MailboxException{
         return new JCRMessageManager(mapperFactory, uidProvider, dispatcher, 
(JCRMailbox) mailboxEntity, logger, getDelimiter());
     }
 

Modified: 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
 Fri Dec  3 20:22:42 2010
@@ -30,7 +30,7 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.jcr.mail.model.JCRHeader;
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
@@ -41,7 +41,7 @@ import org.apache.james.mailbox.util.Mai
  * JCR implementation of a {...@link MapperStoreMessageManager}
  *
  */
-public class JCRMessageManager extends MapperStoreMessageManager<String> {
+public class JCRMessageManager extends StoreMessageManager<String> {
 
     private final Log log;
 

Modified: 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
 Fri Dec  3 20:22:42 2010
@@ -28,7 +28,7 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMembership;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -39,7 +39,7 @@ import org.apache.james.mailbox.util.Mai
 /**
  * Abstract base class which should be used from JPA 2.0 implementations
  */
-public class JPAMessageManager extends MapperStoreMessageManager<Long> {
+public class JPAMessageManager extends StoreMessageManager<Long> {
     
     public JPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory, 
UidProvider<Long> uidProvider,
             final MailboxEventDispatcher dispatcher,final Mailbox<Long> 
mailbox) throws MailboxException {

Modified: 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
 Fri Dec  3 20:22:42 2010
@@ -27,7 +27,7 @@ import org.apache.james.mailbox.jpa.JPAM
 import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
@@ -50,8 +50,8 @@ public class OpenJPAMailboxManager exten
     }
 
     @Override
-    protected MapperStoreMessageManager<Long> 
createMessageManager(UidProvider<Long> uidProvider, MailboxEventDispatcher 
dispatcher, Mailbox<Long> mailboxRow, MailboxSession session) throws 
MailboxException {
-        MapperStoreMessageManager<Long> result =  new 
OpenJPAMessageManager((JPAMailboxSessionMapperFactory) 
mailboxSessionMapperFactory, uidProvider, dispatcher, mailboxRow, useStreaming);
+    protected StoreMessageManager<Long> createMessageManager(UidProvider<Long> 
uidProvider, MailboxEventDispatcher dispatcher, Mailbox<Long> mailboxRow, 
MailboxSession session) throws MailboxException {
+        StoreMessageManager<Long> result =  new 
OpenJPAMessageManager((JPAMailboxSessionMapperFactory) 
mailboxSessionMapperFactory, uidProvider, dispatcher, mailboxRow, useStreaming);
         return result;
     }
 }

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
 Fri Dec  3 20:22:42 2010
@@ -26,8 +26,8 @@ import org.apache.james.mailbox.maildir.
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
@@ -47,7 +47,7 @@ public class MaildirMailboxManager exten
     }
 
     @Override
-    protected MapperStoreMessageManager<Integer> 
createMessageManager(UidProvider<Integer> uidProvider, MailboxEventDispatcher 
dispatcher,
+    protected StoreMessageManager<Integer> 
createMessageManager(UidProvider<Integer> uidProvider, MailboxEventDispatcher 
dispatcher,
             Mailbox<Integer> mailboxEntiy, MailboxSession session) throws 
MailboxException {
         return new 
MaildirMessageManager((MailboxSessionMapperFactory<Integer>)mailboxSessionMapperFactory,
 uidProvider, dispatcher, mailboxEntiy);
     }

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
 Fri Dec  3 20:22:42 2010
@@ -28,8 +28,8 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.maildir.mail.model.MaildirHeader;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMessage;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.MessageMapperFactory;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -37,7 +37,7 @@ import org.apache.james.mailbox.store.ma
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
 
-public class MaildirMessageManager extends MapperStoreMessageManager<Integer> {
+public class MaildirMessageManager extends StoreMessageManager<Integer> {
 
     public MaildirMessageManager(MessageMapperFactory<Integer> mapperFactory, 
UidProvider<Integer> uidProvider,
             MailboxEventDispatcher dispatcher, Mailbox<Integer> mailboxEntiy)

Modified: 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
 Fri Dec  3 20:22:42 2010
@@ -26,8 +26,8 @@ import org.apache.james.mailbox.inmemory
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
@@ -39,7 +39,7 @@ public class InMemoryMailboxManager exte
     }
 
     @Override
-    protected MapperStoreMessageManager<Long> 
createMessageManager(UidProvider<Long> uidProvider, MailboxEventDispatcher 
dispatcher, Mailbox<Long> mailboxRow, MailboxSession session) throws 
MailboxException {
+    protected StoreMessageManager<Long> createMessageManager(UidProvider<Long> 
uidProvider, MailboxEventDispatcher dispatcher, Mailbox<Long> mailboxRow, 
MailboxSession session) throws MailboxException {
         return new 
InMemoryStoreMessageManager((MailboxSessionMapperFactory<Long>)mailboxSessionMapperFactory,
 uidProvider, dispatcher, (InMemoryMailbox)mailboxRow);
     }
 

Modified: 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java?rev=1041977&r1=1041976&r2=1041977&view=diff
==============================================================================
--- 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
 (original)
+++ 
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
 Fri Dec  3 20:22:42 2010
@@ -31,14 +31,14 @@ import org.apache.james.mailbox.inmemory
 import org.apache.james.mailbox.inmemory.mail.model.SimpleHeader;
 import org.apache.james.mailbox.inmemory.mail.model.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.MapperStoreMessageManager;
+import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.MailboxMembership;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
 
-public class InMemoryStoreMessageManager extends 
MapperStoreMessageManager<Long> {
+public class InMemoryStoreMessageManager extends StoreMessageManager<Long> {
 
     public InMemoryStoreMessageManager(MailboxSessionMapperFactory<Long> 
mapperFactory, UidProvider<Long> uidProvider,
             MailboxEventDispatcher dispatcher, InMemoryMailbox mailbox) throws 
MailboxException {

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=1041977&r1=1041976&r2=1041977&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
 Fri Dec  3 20:22:42 2010
@@ -25,12 +25,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PushbackInputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.TreeSet;
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
@@ -40,6 +42,9 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.SearchQuery;
+import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -47,6 +52,7 @@ import org.apache.james.mailbox.store.ma
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 import org.apache.james.mailbox.store.streaming.ConfigurableMimeTokenStream;
 import org.apache.james.mailbox.store.streaming.CountingInputStream;
+import org.apache.james.mailbox.store.transaction.Mapper;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.descriptor.MaximalBodyDescriptor;
@@ -68,11 +74,14 @@ public abstract class StoreMessageManage
     private final MailboxEventDispatcher dispatcher;    
     
     protected final UidProvider<Id> uidProvider;
+
+    protected MessageMapperFactory<Id> mapperFactory;
     
-    public StoreMessageManager(final UidProvider<Id> uidProvider, final 
MailboxEventDispatcher dispatcher, final Mailbox<Id> mailbox) throws 
MailboxException {
+    public StoreMessageManager(final MessageMapperFactory<Id> mapperFactory, 
final UidProvider<Id> uidProvider, final MailboxEventDispatcher dispatcher, 
final Mailbox<Id> mailbox) throws MailboxException {
         this.mailbox = mailbox;
         this.dispatcher = dispatcher;
         this.uidProvider = uidProvider;
+        this.mapperFactory = mapperFactory;
     }
     
     
@@ -110,18 +119,6 @@ public abstract class StoreMessageManage
         return permanentFlags;
     }
 
-    /**
-     * Return a List which holds all uids of recent messages and optional 
reset the recent flag on the messages for the uids
-     * 
-     * @param reset
-     * @param mailboxSession
-     * @return list
-     * @throws MailboxException
-     */
-    protected abstract List<Long> recent(final boolean reset, MailboxSession 
mailboxSession) throws MailboxException;
-
-
-    protected abstract Iterator<Long> deleteMarkedInMailbox(MessageRange 
range, MailboxSession session) throws MailboxException;
     /*
      * (non-Javadoc)
      * @see 
org.apache.james.mailbox.Mailbox#expunge(org.apache.james.mailbox.MessageRange, 
org.apache.james.mailbox.MailboxSession)
@@ -283,8 +280,6 @@ public abstract class StoreMessageManage
 
     }
     
-    protected abstract long appendMessageToStore(MailboxMembership<Id> 
message, MailboxSession session) throws MailboxException;
-
     /**
      * Return the position in the given {...@link InputStream} at which the 
Body of the 
      * Message starts
@@ -393,25 +388,7 @@ public abstract class StoreMessageManage
         return new MailboxMetaData(recent, permanentFlags, uidValidity, 
uidNext, messageCount, unseenCount, firstUnseen, isWriteable(mailboxSession));
     }
 
-    /**
-     * Return the uid of the first unseen message or null of none is found
-     * 
-     * @param mailbox
-     * @param session
-     * @return uid
-     * @throws MailboxException
-     */
-    protected abstract Long findFirstUnseenMessageUid(MailboxSession session) 
throws MailboxException;
-
-    /**
-     * Return the count of unseen messages
-     * 
-     * @param mailbox
-     * @param session
-     * @return
-     * @throws MailboxException
-     */
-    protected abstract long countUnseenMessagesInMailbox(MailboxSession 
session) throws MailboxException;
+ 
     
     /*
      * (non-Javadoc)
@@ -431,20 +408,6 @@ public abstract class StoreMessageManage
         return newFlagsByUid;
     }
 
-    /**
-     * Update the Flags for the given {...@link MessageRange} 
-     * 
-     * @param flags
-     * @param value
-     * @param replace
-     * @param set
-     * @param mailboxSession
-     * @return
-     * @throws MailboxException
-     */
-    protected abstract Iterator<UpdatedFlag> updateFlags(final Flags flags, 
final boolean value, final boolean replace,
-            final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException;
-
 
 
     /**
@@ -471,16 +434,217 @@ public abstract class StoreMessageManage
         }
     }
     
+    protected long appendMessageToStore(final MailboxMembership<Id> message, 
MailboxSession session) throws MailboxException {
+        final MessageMapper<Id> mapper = 
mapperFactory.getMessageMapper(session);
+        return mapperFactory.getMessageMapper(session).execute(new 
Mapper.Transaction<Long>() {
+
+            public Long run() throws MailboxException {
+                return mapper.save(getMailboxEntity(), message);
+            }
+            
+        });
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.Mailbox#getMessageCount(org.apache.james.mailbox.MailboxSession)
+     */
+    public long getMessageCount(MailboxSession mailboxSession) throws 
MailboxException {
+        return 
mapperFactory.getMessageMapper(mailboxSession).countMessagesInMailbox(getMailboxEntity());
+    }
+
+
+
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.Mailbox#getMessages(org.apache.james.mailbox.MessageRange,
 org.apache.james.mailbox.MessageResult.FetchGroup, 
org.apache.james.mailbox.MailboxSession)
+     */
+    public Iterator<MessageResult> getMessages(final MessageRange set, 
FetchGroup fetchGroup,
+            MailboxSession mailboxSession) throws MailboxException {
+        final List<MailboxMembership<Id>> rows = 
mapperFactory.getMessageMapper(mailboxSession).findInMailbox(getMailboxEntity(),
 set);
+        return new ResultIterator<Id>(rows.iterator(), fetchGroup);
+    }
+
+    /**
+     * Return a List which holds all uids of recent messages and optional 
reset the recent flag on the messages for the uids
+     * 
+     * @param reset
+     * @param mailboxSession
+     * @return list
+     * @throws MailboxException
+     */
+    protected List<Long> recent(final boolean reset, MailboxSession 
mailboxSession) throws MailboxException {
+        final MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(mailboxSession);
+        
+        return messageMapper.execute(new Mapper.Transaction<List<Long>>() {
+
+            public List<Long> run() throws MailboxException {
+                final List<MailboxMembership<Id>> members = 
messageMapper.findRecentMessagesInMailbox(getMailboxEntity(), -1);
+                final List<Long> results = new ArrayList<Long>();
+
+                for (MailboxMembership<Id> member:members) {
+                    results.add(member.getUid());
+                    if (reset) {
+                        member.unsetRecent();
+                        
+                        // only call save if we need to
+                        messageMapper.save(getMailboxEntity(), member);
+                    }
+                }
+                return results;
+            }
+            
+        });
+        
+    }
+
+    
+    protected Iterator<Long> deleteMarkedInMailbox(final MessageRange range, 
final MailboxSession session) throws MailboxException {
+        final MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(session);
+
+        return messageMapper.execute(new Mapper.Transaction<Iterator<Long>>() {
+
+            public Iterator<Long> run() throws MailboxException {
+                final Collection<Long> uids = new TreeSet<Long>();
+
+                final List<MailboxMembership<Id>> members = 
messageMapper.findMarkedForDeletionInMailbox(getMailboxEntity(), range);
+                for (MailboxMembership<Id> message:members) {
+                    uids.add(message.getUid());
+                    messageMapper.delete(getMailboxEntity(), message);
+                    
+                }  
+                return uids.iterator();
+            }
+            
+        });       
+    }
+
+
     
     /**
-     * Copy the messages in the given {...@link MessageRange} to the given 
{...@link StoreMessageManager} and return a {...@link Iterator} which
-     * holds the uids of the copied messages
+     * Update the Flags for the given {...@link MessageRange} 
      * 
-     * @param range
-     * @param toMailbox
+     * @param flags
+     * @param value
+     * @param replace
+     * @param set
+     * @param mailboxSession
+     * @return
+     * @throws MailboxException
+     */
+    public Iterator<UpdatedFlag> updateFlags(final Flags flags, final boolean 
value, final boolean replace,
+            final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
+        final MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(mailboxSession);
+
+        return messageMapper.execute(new 
Mapper.Transaction<Iterator<UpdatedFlag>>(){
+
+            public Iterator<UpdatedFlag> run() throws MailboxException {
+                final List<UpdatedFlag> updatedFlags = new 
ArrayList<UpdatedFlag>();
+
+                final List<MailboxMembership<Id>> members = 
messageMapper.findInMailbox(getMailboxEntity(), set);
+                for (final MailboxMembership<Id> 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();
+                    messageMapper.save(getMailboxEntity(), member);
+                    updatedFlags.add(new 
UpdatedFlag(member.getUid(),originalFlags, newFlags));
+                }
+                
+                return updatedFlags.iterator();
+            }
+            
+        });
+       
+    }
+
+
+
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.Mailbox#search(org.apache.james.mailbox.SearchQuery, 
org.apache.james.mailbox.MailboxSession)
+     */
+    public Iterator<Long> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
+        return 
mapperFactory.getMessageMapper(mailboxSession).searchMailbox(getMailboxEntity(),
 query);    
+    }
+
+
+    private Iterator<Long> copy(final List<MailboxMembership<Id>> 
originalRows, final MailboxSession session) throws MailboxException {
+        try {
+            final List<Long> copiedRows = new ArrayList<Long>();
+            final MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(session);
+
+            for (final MailboxMembership<Id> originalMessage:originalRows) {
+               copiedRows.add(messageMapper.execute(new 
Mapper.Transaction<Long>() {
+
+                    public Long run() throws MailboxException {
+
+                        return messageMapper.copy(getMailboxEntity(), 
originalMessage);
+                        
+                    }
+                    
+                }));
+            }
+            return copiedRows.iterator();
+        } catch (MessagingException e) {
+            throw new MailboxException("Unable to parse message", e);
+        }
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.store.AbstractStoreMessageManager#copy(org.apache.james.mailbox.MessageRange,
 org.apache.james.mailbox.store.AbstractStoreMessageManager, 
org.apache.james.mailbox.MailboxSession)
+     */
+    protected Iterator<Long> copy(MessageRange set, StoreMessageManager<Id> 
to, MailboxSession session) throws MailboxException {
+        try {
+            MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(session);
+            final List<MailboxMembership<Id>> originalRows = 
messageMapper.findInMailbox(getMailboxEntity(), set);
+            return to.copy(originalRows, session);
+
+        } catch (MessagingException e) {
+            throw new MailboxException("Unable to parse message", e);
+        }
+    }
+
+
+
+    /**
+     * Return the count of unseen messages
+     * 
+     * @param mailbox
+     * @param session
+     * @return
+     * @throws MailboxException
+     */
+    protected long countUnseenMessagesInMailbox(MailboxSession session) throws 
MailboxException {
+        MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(session);
+        return messageMapper.countUnseenMessagesInMailbox(getMailboxEntity());
+    }
+
+
+
+    /**
+     * Return the uid of the first unseen message or null of none is found
+     * 
+     * @param mailbox
      * @param session
-     * @return uids
+     * @return uid
      * @throws MailboxException
      */
-    protected abstract Iterator<Long> copy(MessageRange range, 
StoreMessageManager<Id> toMailbox, MailboxSession session) throws 
MailboxException;
+    protected Long findFirstUnseenMessageUid(MailboxSession session) throws 
MailboxException{
+        MessageMapper<Id> messageMapper = 
mapperFactory.getMessageMapper(session);
+        return messageMapper.findFirstUnseenMessageUid(getMailboxEntity());
+    }
 }



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

Reply via email to