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

svn commit: r1129288 - in /james/mailbox/trunk: jcr/src/main/java/org/apache/james/mailbox/jcr/ jcr/src/main/java/org/apache/james/mailbox/jcr/mail/ jcr/src/main/java/org/apache/james/mailbox/jcr/user/ jpa/src/main/java/org/apache/james/mailbox/jpa/ jp...

Author: norman
Date: Mon May 30 18:44:56 2011
New Revision: 1129288

URL: http://svn.apache.org/viewvc?rev=1129288&view=rev
Log:
Allow to inject a MessageSearchIndex in the AbstractMessageMapper. Part of MAILBOX-10

Modified:
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.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/MaildirMailboxSessionMapperFactory.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/InMemoryMailboxSessionMapperFactory.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/AbstractMessageMapper.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java Mon May 30 18:44:56 2011
@@ -35,15 +35,13 @@ import org.slf4j.Logger;
 public abstract class AbstractJCRMapper extends TransactionalMapper implements JCRImapConstants {
     public final static String MAILBOXES_PATH =  "mailboxes";
 
-    private final Logger logger;
     private final MailboxSessionJCRRepository repository;
     protected final MailboxSession mSession;
 
     
-    public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, Logger logger) {
+    public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession) {
         this.repository = repository;
         this.mSession = mSession;
-        this.logger = logger;
     }
 
     /**
@@ -52,7 +50,7 @@ public abstract class AbstractJCRMapper 
      * @return logger
      */
     protected Logger getLogger() {
-        return logger;
+        return mSession.getLog();
     }
     
     /**

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java Mon May 30 18:44:56 2011
@@ -23,7 +23,6 @@ import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.james.mailbox.MailboxSession;
-import org.slf4j.Logger;
 
 /**
  * Abstract base class for Mapper's which support scaling 
@@ -34,8 +33,8 @@ public abstract class AbstractJCRScaling
     private final int scaling;
     private final static char PAD ='_';
     
-    public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, int scaling, Logger logger) {
-        super(repository, mSession, logger);
+    public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, int scaling) {
+        super(repository, mSession);
         this.scaling = scaling;
     }
 

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.jcr.mail
 import org.apache.james.mailbox.jcr.mail.JCRMessageMapper;
 import org.apache.james.mailbox.jcr.user.JCRSubscriptionMapper;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -39,37 +40,37 @@ import org.slf4j.LoggerFactory;
 public class JCRMailboxSessionMapperFactory extends MailboxSessionMapperFactory<String> {
 
     private final MailboxSessionJCRRepository repository;
-    private final Logger logger;
     private final static int DEFAULT_SCALING = 2;
     private final int scaling;
     private int messageScaling;
+    private final MessageSearchIndex<String> index;
 
     public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository) {
-        this(repository, DEFAULT_SCALING, JCRMessageMapper.MESSAGE_SCALE_DAY);
+        this(repository, null, DEFAULT_SCALING, JCRMessageMapper.MESSAGE_SCALE_DAY);
     }
 
-    public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final int scaling, final int messageScaling) {
+    public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final MessageSearchIndex<String> index, final int scaling, final int messageScaling) {
         this.repository = repository;
-        this.logger = LoggerFactory.getLogger(JCRMailboxSessionMapperFactory.class);
+        this.index = index;
         this.scaling = scaling;
         this.messageScaling = messageScaling;
     }
     
     @Override
     public MailboxMapper<String> createMailboxMapper(MailboxSession session) throws MailboxException {
-        JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, scaling, logger);
+        JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, scaling);
         return mapper;
     }
 
     @Override
     public MessageMapper<String> createMessageMapper(MailboxSession session) throws MailboxException {
-        JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, logger, messageScaling);
+        JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, index, messageScaling);
         return messageMapper;
     }
 
     @Override
     public SubscriptionMapper createSubscriptionMapper(MailboxSession session) throws SubscriptionException {
-        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, DEFAULT_SCALING, logger);
+        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, DEFAULT_SCALING);
         return mapper;
     }
     

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java Mon May 30 18:44:56 2011
@@ -42,7 +42,6 @@ import org.apache.james.mailbox.jcr.Mail
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.slf4j.Logger;
 
 /**
  * JCR implementation of a MailboxMapper
@@ -52,8 +51,8 @@ import org.slf4j.Logger;
 public class JCRMailboxMapper extends AbstractJCRScalingMapper implements MailboxMapper<String> {
 
 
-	public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling, final Logger logger) {
-        super(repos, session, scaling, logger);
+	public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling) {
+        super(repos, session, scaling);
     }
 
     /*

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -46,12 +46,12 @@ import org.apache.james.mailbox.jcr.JCRI
 import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
+import org.apache.james.mailbox.store.MessageSearchIndex;
 import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
-import org.slf4j.Logger;
 
 /**
  * JCR implementation of a {@link MessageMapper}. The implementation store each message as 
@@ -97,9 +97,7 @@ public class JCRMessageMapper extends Ab
 
     private final int scaleType;
     
-    private final Logger logger;
     private final MailboxSessionJCRRepository repository;
-    protected final MailboxSession mSession;
 
     
     /**
@@ -109,25 +107,16 @@ public class JCRMessageMapper extends Ab
      * @param session {@link MailboxSession} to which the mapper is bound
      * @param logger Log
      */
-    public JCRMessageMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, final Logger logger, int scaleType) {
-        this.repository = repository;
-        this.mSession = mSession;
-        this.logger = logger;
+    public JCRMessageMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, final MessageSearchIndex<String> index,  int scaleType) {
+        super(mSession, index);
+        this.repository = repository;        
         this.scaleType = scaleType;
     }
     
-    public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final Logger logger) {
-        this(repos, session, logger, MESSAGE_SCALE_DAY);
+    public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session) {
+        this(repos, session, null, MESSAGE_SCALE_DAY);
     }
 
-    /**
-     * Return the logger
-     * 
-     * @return logger
-     */
-    protected Logger getLogger() {
-        return logger;
-    }
     
     /**
      * Return the JCR Session
@@ -135,7 +124,7 @@ public class JCRMessageMapper extends Ab
      * @return session
      */
     protected Session getSession() throws RepositoryException{
-        return repository.login(mSession);
+        return repository.login(mailboxSession);
     }
 
     /**
@@ -322,7 +311,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -337,7 +326,7 @@ public class JCRMessageMapper extends Ab
         QueryResult result = query.execute();
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -354,7 +343,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -371,7 +360,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -387,7 +376,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -402,7 +391,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            JCRMessage member = new JCRMessage(iterator.nextNode(), getLogger());
+            JCRMessage member = new JCRMessage(iterator.nextNode(), mailboxSession.getLog());
             list.add(member);
         }
         return list;
@@ -417,7 +406,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+            list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
         }
         return list;
     }
@@ -432,7 +421,7 @@ public class JCRMessageMapper extends Ab
 
         NodeIterator iterator = result.getNodes();
         while (iterator.hasNext()) {
-            JCRMessage member = new JCRMessage(iterator.nextNode(), getLogger());
+            JCRMessage member = new JCRMessage(iterator.nextNode(), mailboxSession.getLog());
             list.add(member);
         }
         return list;
@@ -500,7 +489,7 @@ public class JCRMessageMapper extends Ab
             
             NodeIterator iterator = result.getNodes();
             while(iterator.hasNext()) {
-                list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+                list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
             }
             return list;
 
@@ -526,7 +515,7 @@ public class JCRMessageMapper extends Ab
 
             NodeIterator iterator = result.getNodes();
             if(iterator.hasNext()) {
-                return new JCRMessage(iterator.nextNode(), getLogger()).getUid();
+                return new JCRMessage(iterator.nextNode(), mailboxSession.getLog()).getUid();
             } else {
                 return null;
             }
@@ -560,7 +549,7 @@ public class JCRMessageMapper extends Ab
      * Logout from open JCR Session
      */
     public void endRequest() {
-       repository.logout(mSession);
+       repository.logout(mailboxSession);
     }
     
 

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java Mon May 30 18:44:56 2011
@@ -41,7 +41,6 @@ import org.apache.james.mailbox.jcr.Mail
 import org.apache.james.mailbox.jcr.user.model.JCRSubscription;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
-import org.slf4j.Logger;
 
 /**
  * JCR implementation of a SubscriptionManager
@@ -49,8 +48,8 @@ import org.slf4j.Logger;
  */
 public class JCRSubscriptionMapper extends AbstractJCRScalingMapper implements SubscriptionMapper {
 
-    public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling, final Logger log) {
-        super(repos,session, scaling, log);
+    public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling) {
+        super(repos,session, scaling);
     }
 
     /*

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.jpa.mail
 import org.apache.james.mailbox.jpa.mail.JPAMessageMapper;
 import org.apache.james.mailbox.jpa.user.JPASubscriptionMapper;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -37,12 +38,18 @@ import org.apache.james.mailbox.store.us
 public class JPAMailboxSessionMapperFactory extends MailboxSessionMapperFactory<Long> {
 
     private final EntityManagerFactory entityManagerFactory;
+    private MessageSearchIndex<Long> index;
 
-    public JPAMailboxSessionMapperFactory(EntityManagerFactory entityManagerFactory) {
+    public JPAMailboxSessionMapperFactory(MessageSearchIndex<Long> index, EntityManagerFactory entityManagerFactory) {
         this.entityManagerFactory = entityManagerFactory;
+        this.index = index;
         createEntityManager().close();
     }
     
+    public JPAMailboxSessionMapperFactory(EntityManagerFactory entityManagerFactory) {
+        this(null, entityManagerFactory);
+    }
+    
     @Override
     public MailboxMapper<Long> createMailboxMapper(MailboxSession session) {
         return new JPAMailboxMapper(entityManagerFactory);
@@ -50,7 +57,7 @@ public class JPAMailboxSessionMapperFact
 
     @Override
     public MessageMapper<Long> createMessageMapper(MailboxSession session) {
-        return new JPAMessageMapper(entityManagerFactory);
+        return new JPAMessageMapper(session, index, entityManagerFactory);
     }
 
     @Override

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -30,6 +30,7 @@ import javax.persistence.PersistenceExce
 import javax.persistence.Query;
 
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageMetaData;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageRange.Type;
@@ -37,6 +38,7 @@ import org.apache.james.mailbox.jpa.mail
 import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;
+import org.apache.james.mailbox.store.MessageSearchIndex;
 import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
@@ -51,7 +53,8 @@ public class JPAMessageMapper extends Ab
     protected EntityManagerFactory entityManagerFactory;
     protected EntityManager entityManager;
     
-    public JPAMessageMapper(final EntityManagerFactory entityManagerFactory) {
+    public JPAMessageMapper(final MailboxSession session, MessageSearchIndex<Long> index, final EntityManagerFactory entityManagerFactory) {
+        super(session, index);
         this.entityManagerFactory = entityManagerFactory;
     }
 

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.maildir.
 import org.apache.james.mailbox.maildir.mail.MaildirMessageMapper;
 import org.apache.james.mailbox.maildir.user.MaildirSubscriptionMapper;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -33,11 +34,19 @@ public class MaildirMailboxSessionMapper
         MailboxSessionMapperFactory<Integer> {
 
     private final MaildirStore store;
+    private final MessageSearchIndex<Integer> index;
     
     public MaildirMailboxSessionMapperFactory(MaildirStore store) {
+        this(store, null);
+    }
+    
+    
+    public MaildirMailboxSessionMapperFactory(MaildirStore store, MessageSearchIndex<Integer> index) {
         this.store = store;
+        this.index = index;
     }
     
+    
     @Override
     protected MailboxMapper<Integer> createMailboxMapper(MailboxSession session)
             throws MailboxException {
@@ -47,7 +56,7 @@ public class MaildirMailboxSessionMapper
     @Override
     protected MessageMapper<Integer> createMessageMapper(MailboxSession session)
             throws MailboxException {
-        return new MaildirMessageMapper(store);
+        return new MaildirMessageMapper(session, index, store);
     }
 
     @Override

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -25,20 +25,18 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.Map.Entry;
 
-import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageMetaData;
 import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -46,18 +44,19 @@ import org.apache.james.mailbox.maildir.
 import org.apache.james.mailbox.maildir.mail.model.AbstractMaildirMessage;
 import org.apache.james.mailbox.maildir.mail.model.LazyLoadingMaildirMessage;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMessage;
-import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.MessageSearchIndex;
+import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
-import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 
-public class MaildirMessageMapper extends NonTransactionalMapper implements MessageMapper<Integer> {
+public class MaildirMessageMapper extends AbstractMessageMapper<Integer> {
 
     private final MaildirStore maildirStore;
     private final int BUF_SIZE = 2048;
 
-    public MaildirMessageMapper(MaildirStore  maildirStore) {
+    public MaildirMessageMapper(MailboxSession session, MessageSearchIndex<Integer> index, MaildirStore  maildirStore) {
+        super(session, index);
         this.maildirStore = maildirStore;
     }
     
@@ -186,41 +185,6 @@ public class MaildirMessageMapper extend
     }
 
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.MessageRange)
-     */
-    public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox<Integer> mailbox, MessageRange set) throws MailboxException {
-        List<Message<Integer>> results = new ArrayList<Message<Integer>>();
-        final long from = set.getUidFrom();
-        final long to = set.getUidTo();
-        final Type type = set.getType();
-        switch (type) {
-        default:
-        case ALL:
-            results = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
-            break;
-        case FROM:
-            results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1);
-            break;
-        case ONE:
-            results = findDeletedMessageInMailboxWithUID(mailbox, from);
-            break;
-        case RANGE:
-            results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, to);
-            break;       
-        }
-        Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
-        for (int i = 0; i < results.size(); i++) {
-            Message<Integer> m = results.get(i);
-            long uid = m.getUid();
-            uids.put(uid, new SimpleMessageMetaData(m));
-            delete(mailbox, m);
-        }
-        
-        return uids;
-    }
-
     private List<Message<Integer>> findMessagesInMailbox(Mailbox<Integer> mailbox,
             FilenameFilter filter, int limit) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -289,27 +253,169 @@ public class MaildirMessageMapper extend
     }
 
 
+    /* 
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#endRequest()
+     */
+    public void endRequest() {
+        // not used
+        
+    }
+
+    /**
+     * Call {@link #calculateHigestModSeq(Mailbox)} as we do no caching here
+     */
+    public long getHighestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
+        return calculateHigestModSeq(mailbox);
+    }
+
+    /**
+     * Call {@link #calculateLastUid(Mailbox)} as we do no caching here
+     */
+    public long getLastUid(Mailbox<Integer> mailbox) throws MailboxException {
+        return calculateLastUid(mailbox);
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#calculateHigestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
+     */
+    protected long calculateHigestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
+        MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+        try {
+            return folder.getHighestModSeq();
+        } catch (IOException e) {
+            throw new MailboxException("Unable to get highest mod-seq for mailbox " + mailbox, e);
+        }
+    }
+
+
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#add(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.MailboxMembership)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#calculateLastUid(org.apache.james.mailbox.store.mail.model.Mailbox)
      */
-    public MessageMetaData add(Mailbox<Integer> mailbox, Message<Integer> message)
-    throws MailboxException {
-        AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) message;
+    protected long calculateLastUid(Mailbox<Integer> mailbox) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        long uid = 0;
-        // a new message
-        if (maildirMessage.isNew()) {
+        try {
+            return folder.getLastUid();
+        } catch (IOException e) {
+            throw new MailboxException("Unable to get last uid for mailbox " + mailbox, e);
+        }
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message)
+     */
+    protected void copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException {
+        MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original);
+        save(mailbox, theCopy);        
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#expungeMarkedForDeletion(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.MessageRange)
+     */
+    protected Map<Long, MessageMetaData> expungeMarkedForDeletion(Mailbox<Integer> mailbox, MessageRange set) throws MailboxException {
+        List<Message<Integer>> results = new ArrayList<Message<Integer>>();
+        final long from = set.getUidFrom();
+        final long to = set.getUidTo();
+        final Type type = set.getType();
+        switch (type) {
+        default:
+        case ALL:
+            results = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
+            break;
+        case FROM:
+            results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1);
+            break;
+        case ONE:
+            results = findDeletedMessageInMailboxWithUID(mailbox, from);
+            break;
+        case RANGE:
+            results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, to);
+            break;       
+        }
+        Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
+        for (int i = 0; i < results.size(); i++) {
+            Message<Integer> m = results.get(i);
+            long uid = m.getUid();
+            uids.put(uid, new SimpleMessageMetaData(m));
+            delete(mailbox, m);
+        }
+        
+        return uids;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
+     */
+    protected void save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException {
+        if (message instanceof LazyLoadingMaildirMessage) {
+            // if the message is an instanceof LazyLoadingMaildirMessage we can be sure it was loaded out of the store and 
+            // so we need only to update the flags
+            try {
+                MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+                LazyLoadingMaildirMessage maildirMessage = (LazyLoadingMaildirMessage) message;
+                MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
+                File messageFile = messageName.getFile();
+                // System.out.println("save existing " + message +
+                // " as " + messageFile.getName());
+                messageName.setFlags(maildirMessage.createFlags());
+                // this automatically moves messages from new to cur if
+                // needed
+                String newMessageName = messageName.getFullName();
+
+                File newMessageFile;
+
+                // See MAILBOX-57
+                if (message.createFlags().contains(Flag.RECENT)) {
+                    // message is recent so save it in the new folder
+                    newMessageFile = new File(folder.getNewFolder(), newMessageName);
+                } else {
+                    newMessageFile = new File(folder.getCurFolder(), newMessageName);
+                }
+                long modSeq;
+                // if the flags don't have change we should not try to move the
+                // file
+                if (newMessageFile.equals(messageFile) == false) {
+                    FileUtils.moveFile(messageFile, newMessageFile);
+                    modSeq = newMessageFile.lastModified();
+
+                } else {
+                    modSeq = messageFile.lastModified();
+                }
+                maildirMessage.setModSeq(modSeq);
+
+                long uid = maildirMessage.getUid();
+                folder.update(uid, newMessageName);
+            } catch (IOException e) {
+                throw new MailboxException("Unable to save flags update for message " + message + " in mailbox " + mailbox, e);
+            }
+        } else {
+            MaildirMessage maildirMessage = (MaildirMessage) message;
+            MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+            long uid = 0;
+            // a new message
             // save file to "tmp" folder
             File tmpFolder = folder.getTmpFolder();
-            // The only case in which we could get problems with clashing names is if the system clock
-            // has been set backwards, then the server is restarted with the same pid, delivers the same
-            // number of messages since its start in the exact same millisecond as done before and the
+            // The only case in which we could get problems with clashing names
+            // is if the system clock
+            // has been set backwards, then the server is restarted with the
+            // same pid, delivers the same
+            // number of messages since its start in the exact same millisecond
+            // as done before and the
             // random number generator returns the same number.
-            // In order to prevent this case we would need to check ALL files in all folders and compare
-            // them to this message name. We rather let this happen once in a billion years...
-            MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder,
-                    message.getFullContentOctets());
+            // In order to prevent this case we would need to check ALL files in
+            // all folders and compare
+            // them to this message name. We rather let this happen once in a
+            // billion years...
+            MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets());
             File messageFile = new File(tmpFolder, messageName.getFullName());
             FileOutputStream fos = null;
             InputStream input = null;
@@ -321,11 +427,9 @@ public class MaildirMessageMapper extend
                 int len = 0;
                 while ((len = input.read(b)) != -1)
                     fos.write(b, 0, len);
-            }
-            catch (IOException ioe) {
-                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe );
-            }
-            finally {
+            } catch (IOException ioe) {
+                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe);
+            } finally {
                 try {
                     if (fos != null)
                         fos.close();
@@ -342,157 +446,67 @@ public class MaildirMessageMapper extend
             if (maildirMessage.isRecent()) {
                 messageName.setFlags(message.createFlags());
                 newMessageFile = new File(folder.getNewFolder(), messageName.getFullName());
-                //System.out.println("save new recent " + message + " as " + newMessageFile.getName());
+                // System.out.println("save new recent " + message + " as " +
+                // newMessageFile.getName());
             }
-            // appended via IMAP (might already have flags etc, goes to ./cur directly)
+            // appended via IMAP (might already have flags etc, goes to ./cur
+            // directly)
             else {
                 messageName.setFlags(message.createFlags());
                 newMessageFile = new File(folder.getCurFolder(), messageName.getFullName());
-                //System.out.println("save new not recent " + message + " as " + newMessageFile.getName());
+                // System.out.println("save new not recent " + message + " as "
+                // + newMessageFile.getName());
             }
             try {
                 FileUtils.moveFile(messageFile, newMessageFile);
             } catch (IOException e) {
                 // TODO: Try copy and delete
-                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e );
+                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
             }
             try {
                 uid = folder.appendMessage(newMessageFile.getName());
                 maildirMessage.setUid(uid);
             } catch (IOException e) {
-                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e );
+                throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
             }
-        } else {
-            throw new MailboxException("Message already exists!");
         }
-        
-        return new SimpleMessageMetaData(maildirMessage);
-    }
 
-
-
-
-    /* 
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#endRequest()
-     */
-    public void endRequest() {
-        // not used
-        
     }
 
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox, javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange)
+    /**
+     * Do nothing as maildir store the uid and modseq everytime by it own
      */
-    public Iterator<UpdatedFlags> updateFlags(final Mailbox<Integer> mailbox, final Flags flags, final boolean value, final boolean replace, MessageRange set) throws MailboxException {
-        final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>();
-        final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-
-        findInMailbox(mailbox, set, new MailboxMembershipCallback<Integer>() {
-
-            public void onMailboxMembers(List<Message<Integer>> members) throws MailboxException {
-                for (final Message<Integer> member : members) {
-                    Flags originalFlags = member.createFlags();
-                    if (replace) {
-                        member.setFlags(flags);
-                    } else {
-                        Flags current = member.createFlags();
-                        if (value) {
-                            current.add(flags);
-                        } else {
-                            current.remove(flags);
-                        }
-                        member.setFlags(current);
-                    }
-                    Flags newFlags = member.createFlags();
-
-                    try {
-                        AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) member;
-                        MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
-                        File messageFile = messageName.getFile();
-                        // System.out.println("save existing " + message +
-                        // " as " + messageFile.getName());
-                        messageName.setFlags(maildirMessage.createFlags());
-                        // this automatically moves messages from new to cur if
-                        // needed
-                        String newMessageName = messageName.getFullName();
-
-                        File newMessageFile;
-                        
-                        // See MAILBOX-57
-                        if (newFlags.contains(Flag.RECENT)) {
-                            // message is recent so save it in the new folder
-                            newMessageFile = new File(folder.getNewFolder(), newMessageName);
-                        } else {
-                            newMessageFile = new File(folder.getCurFolder(), newMessageName);
-                        }
-                        long modSeq;
-                        // if the flags don't have change we should not try to move the file
-                        if (newMessageFile.equals(messageFile) == false) {
-                            FileUtils.moveFile(messageFile, newMessageFile );
-                            modSeq = newMessageFile.lastModified();
-
-                        } else {
-                            modSeq = messageFile.lastModified();
-                        } 
-                        maildirMessage.setModSeq(modSeq);
-                        
-                        updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, originalFlags, newFlags));
-
-                        long uid = maildirMessage.getUid();
-                        folder.update(uid, newMessageName);
-                    } catch (IOException e) {
-                        throw new MailboxException("Failure while save Message " + member + " in Mailbox " + mailbox, e);
-                    }
-
-                }
-            }
-        });
-        
-        return updatedFlags.iterator();       
+    protected void saveSequences(Mailbox<Integer> mailbox, long lastUid, long highestModSeq) throws MailboxException {
+        // Nothing todo as maildir does its own sequence-keeping
         
     }
 
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
+     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#begin()
      */
-    public MessageMetaData copy(Mailbox<Integer> mailbox, Message<Integer> original) throws MailboxException {
-        MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original);
-
-        return add(mailbox, theCopy);
+    protected void begin() throws MailboxException {
+        //nothing todo
     }
 
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#getHighestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
+     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#commit()
      */
-    public long getHighestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
-        MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        try {
-            return folder.getHighestModSeq();
-        } catch (IOException e) {
-            throw new MailboxException("Unable to get highest mod-seq for mailbox " + mailbox, e);
-        }
-            
-       
+    protected void commit() throws MailboxException {
+        //nothing todo
     }
 
+
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#getLastUid(org.apache.james.mailbox.store.mail.model.Mailbox)
+     * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#rollback()
      */
-    public long getLastUid(Mailbox<Integer> mailbox) throws MailboxException {
-        MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        try {
-            return folder.getLastUid();
-        } catch (IOException e) {
-            throw new MailboxException("Unable to get last uid for mailbox " + mailbox, e);
-        }
+    protected void rollback() throws MailboxException {
+        //nothing todo
     }
 
 }

Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -37,7 +37,7 @@ public class InMemoryMailboxSessionMappe
     
     public InMemoryMailboxSessionMapperFactory() {
         mailboxMapper = new InMemoryMailboxMapper();
-        messageMapper = new InMemoryMessageMapper();
+        messageMapper = new InMemoryMessageMapper(null);
         subscriptionMapper = new InMemorySubscriptionMapper();
     }
     

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageMetaData;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.inmemory.mail.model.SimpleMailboxMembership;
@@ -41,7 +42,8 @@ public class InMemoryMessageMapper exten
     private Map<Long, Map<Long, Message<Long>>> mailboxByUid;
     private static final int INITIAL_SIZE = 256;
     
-    public InMemoryMessageMapper() {
+    public InMemoryMessageMapper(MailboxSession session) {
+        super(session);
         this.mailboxByUid = new ConcurrentHashMap<Long, Map<Long, Message<Long>>>(INITIAL_SIZE);
     }
     

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -25,7 +25,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -46,11 +45,8 @@ import org.apache.james.mailbox.MessageM
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.SearchQuery;
-import org.apache.james.mailbox.SearchQuery.NumericRange;
-import org.apache.james.mailbox.SearchQuery.UidCriterion;
 import org.apache.james.mailbox.UpdatedFlags;
 import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.SearchQuery.Criterion;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Header;
@@ -600,62 +596,7 @@ public abstract class StoreMessageManage
      */
     public Iterator<Long> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException {
         MessageMapper<Id> messageMapper = mapperFactory.getMessageMapper(mailboxSession);
-        List<Criterion> crits = query.getCriterias();
-
-        if (crits.size() == 1  && crits.get(0) instanceof UidCriterion) {
-            final List<Long> uids = new ArrayList<Long>();
-            UidCriterion uidCrit = (UidCriterion) crits.get(0);
-            NumericRange[] ranges = uidCrit.getOperator().getRange();
-            for (int i = 0; i < ranges.length; i++) {
-                NumericRange r = ranges[i];
-                messageMapper.findInMailbox(getMailboxEntity(), MessageRange.range(r.getLowValue(), r.getHighValue()), new MailboxMembershipCallback<Id>() {
-
-                    public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
-                        for (int i = 0; i < list.size(); i++) {
-                            long uid = list.get(i).getUid();
-                            if (uids.contains(uid) == false) {
-                                uids.add(uid);
-                            }
-                        }
-                    }
-                });
-            }
-            Collections.sort(uids);
-            return uids.iterator();
-            
-           
-        } else {
-            final List<Message<Id>> hits = new ArrayList<Message<Id>>();
-
-            messageMapper.findInMailbox(getMailboxEntity(), MessageRange.all(), new MailboxMembershipCallback<Id>() {
-
-                public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
-                    for (int i = 0; i < list.size(); i++) {
-                        Message<Id> m = list.get(i);
-                        if (hits.contains(m) == false) {
-                            hits.add(m);
-                        }
-                    }
-                }
-            });
-            Collections.sort(hits);
-            
-            return new SearchQueryIterator(new Iterator<Message<?>>() {
-                final Iterator<Message<Id>> it = hits.iterator();
-                public boolean hasNext() {
-                    return it.hasNext();
-                }
-
-                public Message<?> next() {
-                    return it.next();
-                }
-
-                public void remove() {
-                    it.remove();
-                }
-                
-            }, query, mailboxSession.getLog());
-        }
+        return messageMapper.search(getMailboxEntity(), query);
         
     }
 

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Mon May 30 18:44:56 2011
@@ -19,6 +19,7 @@
 package org.apache.james.mailbox.store.mail;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +32,13 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageMetaData;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.UpdatedFlags;
+import org.apache.james.mailbox.SearchQuery.Criterion;
+import org.apache.james.mailbox.SearchQuery.NumericRange;
+import org.apache.james.mailbox.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.store.MessageSearchIndex;
+import org.apache.james.mailbox.store.SearchQueryIterator;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
@@ -46,7 +53,19 @@ public abstract class AbstractMessageMap
     
     private final static ConcurrentHashMap<Object, AtomicLong> seqs = new ConcurrentHashMap<Object, AtomicLong>();
     private final static ConcurrentHashMap<Object, AtomicLong> uids = new ConcurrentHashMap<Object, AtomicLong>();
-
+    protected final MailboxSession mailboxSession;
+    protected final MessageSearchIndex<Id> index;
+    
+    public AbstractMessageMapper(MailboxSession mailboxSession) {
+        this(mailboxSession, null);
+    }
+    
+    public AbstractMessageMapper(MailboxSession mailboxSession, MessageSearchIndex<Id> index) {
+        this.mailboxSession = mailboxSession;
+        this.index = index;
+    }
+    
+    
     /*
      * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.MessageMapper#getHighestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
@@ -154,6 +173,12 @@ public abstract class AbstractMessageMap
             saveSequences(mailbox, nextUid(mailbox), nextModSeq(mailbox));
 
         }
+        if (index != null) {
+            Iterator<MessageRange> rangeIt = MessageRange.toRanges(new ArrayList<Long>(data.keySet())).iterator();
+            while(rangeIt.hasNext()) {
+                index.delete(mailboxSession, mailbox, rangeIt.next());
+            }
+        }
         return data;
     }
 
@@ -190,16 +215,21 @@ public abstract class AbstractMessageMap
                         // increase the mod-seq as we changed the flags
                         member.setModSeq(modSeq);
                         save(mailbox, member);
+                        
+
+                        if (index != null) {
+                            index.update(mailboxSession, mailbox, MessageRange.one(member.getUid()), newFlags);
+                        }
 
                     }
 
+                    
                     UpdatedFlags uFlags = new UpdatedFlags(member.getUid(), member.getModSeq(), originalFlags, newFlags);
                     
                     updatedFlags.add(uFlags);
                     
 
                 }
-
             }
         });
 
@@ -214,6 +244,9 @@ public abstract class AbstractMessageMap
         message.setUid(nextUid(mailbox));
         message.setModSeq(nextModSeq(mailbox));
         save(mailbox, message);
+        if (index != null) {
+            index.add(mailboxSession, mailbox, message);
+        }
         return new SimpleMessageMetaData(message);
     }
 
@@ -232,6 +265,74 @@ public abstract class AbstractMessageMap
     
 
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.MessageMapper#search(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.SearchQuery)
+     */
+    public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery query) throws MailboxException {
+        if (index == null) {
+            List<Criterion> crits = query.getCriterias();
+
+            if (crits.size() == 1  && crits.get(0) instanceof UidCriterion) {
+                final List<Long> uids = new ArrayList<Long>();
+                UidCriterion uidCrit = (UidCriterion) crits.get(0);
+                NumericRange[] ranges = uidCrit.getOperator().getRange();
+                for (int i = 0; i < ranges.length; i++) {
+                    NumericRange r = ranges[i];
+                    findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), new MailboxMembershipCallback<Id>() {
+
+                        public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
+                            for (int i = 0; i < list.size(); i++) {
+                                long uid = list.get(i).getUid();
+                                if (uids.contains(uid) == false) {
+                                    uids.add(uid);
+                                }
+                            }
+                        }
+                    });
+                }
+                Collections.sort(uids);
+                return uids.iterator();
+                
+               
+            } else {
+                final List<Message<Id>> hits = new ArrayList<Message<Id>>();
+
+                findInMailbox(mailbox, MessageRange.all(), new MailboxMembershipCallback<Id>() {
+
+                    public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
+                        for (int i = 0; i < list.size(); i++) {
+                            Message<Id> m = list.get(i);
+                            if (hits.contains(m) == false) {
+                                hits.add(m);
+                            }
+                        }
+                    }
+                });
+                Collections.sort(hits);
+                
+                return new SearchQueryIterator(new Iterator<Message<?>>() {
+                    final Iterator<Message<Id>> it = hits.iterator();
+                    public boolean hasNext() {
+                        return it.hasNext();
+                    }
+
+                    public Message<?> next() {
+                        return it.next();
+                    }
+
+                    public void remove() {
+                        it.remove();
+                    }
+                    
+                }, query, mailboxSession.getLog());
+            }
+        } else {
+            return index.search(mailboxSession, mailbox, query);
+        }
+
+    }
+
     /**
      * Return the higest mod-seq for the given {@link Mailbox}. This method is called in a lazy fashion. So when the first mod-seq is needed for a {@link Mailbox}
      * it will get called to get the higest used. After that it will stored in memory and just increment there on each {@link #nextModSeq(MailboxSession, Mailbox)} call.

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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -25,8 +25,10 @@ import java.util.Map;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageMetaData;
 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.Message;
@@ -170,5 +172,8 @@ public interface MessageMapper<Id> exten
      * @throws MailboxException
      */
     public abstract long getHighestModSeq(Mailbox<Id> mailbox) throws MailboxException;
+    
+    public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery query) throws MailboxException;
+
 
 }
\ No newline at end of file



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