Author: norman
Date: Sun May  2 16:55:26 2010
New Revision: 940260

URL: http://svn.apache.org/viewvc?rev=940260&view=rev
Log:
Refactor api a bit to make it more elegant and flexible. We use now a Mapper 
per Request pattern

Modified:
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
    james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
 Sun May  2 16:55:26 2010
@@ -92,5 +92,10 @@ public abstract class AbstractJCRMapper 
     protected void rollback() throws MailboxException {
         // no rollback supported by level 1 jcr
     }
+
+    public void dispose() {
+        session.logout();
+    }
+    
     
 }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java 
(original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java 
Sun May  2 16:55:26 2010
@@ -105,9 +105,7 @@ public class JCRMailbox extends StoreMai
 
     @Override
     protected MessageMapper<String> createMessageMapper(MailboxSession 
session) throws MailboxException {
-        Session jcrSession = getSession(session);
-        JCRUtils.addJCRSession(session, jcrSession);
-        
+        Session jcrSession = getSession(session);        
         JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession, 
getMailboxId(), getScaling(), log);
         
         return messageMapper;
@@ -122,9 +120,7 @@ public class JCRMailbox extends StoreMai
      * @throws MailboxException
      */
     protected JCRMailboxMapper createMailboxMapper(MailboxSession session) 
throws MailboxException {
-        Session jcrSession = getSession(session);
-        JCRUtils.addJCRSession(session, jcrSession);
-        
+        Session jcrSession = getSession(session);        
         JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, 
getScaling(), log);
         return mapper;
 

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
 Sun May  2 16:55:26 2010
@@ -19,7 +19,6 @@
 package org.apache.james.imap.jcr;
 
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Locale;
 
 import javax.jcr.LoginException;
@@ -90,8 +89,6 @@ public class JCRMailboxManager extends S
     protected MailboxMapper<String> createMailboxMapper(MailboxSession 
session) throws MailboxException {
 
         Session jcrSession = getSession(session);
-
-        JCRUtils.addJCRSession(session, jcrSession);
         
         JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, 
getScaling(), getLog());
         return mapper;
@@ -166,24 +163,6 @@ public class JCRMailboxManager extends S
     protected Repository getRepository() {
         return repository;
     }
-
-
-    /**
-     * Logout from all opened JCR Sessions
-     */
-    public void endProcessingRequest(MailboxSession session) {
-        List<Session> sessions = JCRUtils.getJCRSessions(session);
-        for (int i = 0 ; i < sessions.size(); i++) {
-            Session jcrSession = sessions.get(i);
-            if (jcrSession.isLive()) {
-                try {
-                    jcrSession.logout();
-                } catch (Exception e) {
-                    // just catch exceptions on logout
-                }
-            }
-        }
-    }
     
     
 }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
 Sun May  2 16:55:26 2010
@@ -73,9 +73,7 @@ public class JCRSubscriptionManager exte
     
     @Override
     protected SubscriptionMapper createMapper(MailboxSession session) throws 
SubscriptionException {
-        Session jcrSession = getSession(session);
-        JCRUtils.addJCRSession(session, jcrSession);
-        
+        Session jcrSession = getSession(session);        
         
         JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(jcrSession, 
getScaling(), logger);
 

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java 
(original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java 
Sun May  2 16:55:26 2010
@@ -20,8 +20,6 @@ package org.apache.james.imap.jcr;
 
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.jcr.ItemExistsException;
 import javax.jcr.Node;
@@ -36,7 +34,6 @@ import javax.jcr.version.VersionExceptio
 
 import org.apache.jackrabbit.commons.cnd.CndImporter;
 import org.apache.jackrabbit.util.Text;
-import org.apache.james.imap.mailbox.MailboxSession;
 
 /**
  * Utilities used for JCR 
@@ -180,40 +177,6 @@ public class JCRUtils implements JCRImap
         return pathBuf.toString();
     }
 
-    /**
-     * Return a List of JCR Sessions for the given MailboxSession
-     * 
-     * @param session
-     * @return jcrSessionList
-     */
-    @SuppressWarnings("unchecked")
-    public static List<Session> getJCRSessions(MailboxSession session) {
-        List<Session> sessions = null;
-        if (session != null) {
-            sessions = (List<Session>) 
session.getAttributes().get(JCR_SESSIONS);
-        }
-        if (sessions == null) {
-            sessions = new ArrayList<Session>();
-        }
-        return sessions;
-    }
-
-       /**
-        * Add the JCR Session to the MailboxSession
-        * @param session
-        * @param jcrSession
-        */
-    @SuppressWarnings("unchecked")
-    public static void addJCRSession(MailboxSession session, Session 
jcrSession) {
-        if (session != null) {
-            List<Session> sessions = (List<Session>) 
session.getAttributes().get(JCR_SESSIONS); 
-            if (sessions == null) {
-                sessions = new ArrayList<Session>();
-            }
-            sessions.add(jcrSession);
-            session.getAttributes().put(JCR_SESSIONS, sessions); 
-        }
-    }
     
 
     /**

Modified: 
james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd 
(original)
+++ james/imap/trunk/jcr/src/main/resources/org/apache/james/imap/jcr/imap.cnd 
Sun May  2 16:55:26 2010
@@ -54,7 +54,7 @@
     + mailboxMemberships (imap:mailboxMemberships) 
  
 [imap:mailboxMembership] >  mix:referenceable, nt:base
-    - imap:mailboxUUID (REFERENCE) mandatory < 'imap:mailbox'
+    - imap:mailboxUUID (String) mandatory
     - imap:uid (LONG) mandatory
     - imap:size (LONG) mandatory
     - imap:answered (BOOLEAN) mandatory

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
 Sun May  2 16:55:26 2010
@@ -50,7 +50,7 @@ public abstract class JPAMailboxManager 
     @Override
     protected void doCreate(String namespaceName, MailboxSession session) 
throws MailboxException {
         final Mailbox<Long> mailbox = new 
org.apache.james.imap.jpa.mail.model.JPAMailbox(namespaceName, 
randomUidValidity());
-        final MailboxMapper<Long> mapper = createMailboxMapper(session);
+        final MailboxMapper<Long> mapper = getMailboxMapperForRequest(session);
         mapper.execute(new TransactionalMapper.Transaction(){
 
             public void run() throws MailboxException {
@@ -66,8 +66,8 @@ public abstract class JPAMailboxManager 
      * @param maibloxSession
      * @throws MailboxException
      */
-    public void deleteEverything(MailboxSession maibloxSession) throws 
MailboxException {
-        final MailboxMapper<Long> mapper = createMailboxMapper(maibloxSession);
+    public void deleteEverything(MailboxSession mailboxSession) throws 
MailboxException {
+        final MailboxMapper<Long> mapper = 
getMailboxMapperForRequest(mailboxSession);
         mapper.execute(new TransactionalMapper.Transaction() {
 
             public void run() throws MailboxException {

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java
 Sun May  2 16:55:26 2010
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.imap.jpa;
 
+
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
@@ -32,11 +33,10 @@ import org.apache.james.imap.store.trans
  * JPA implementation of TransactionMapper. This class is not thread-safe!
  *
  */
-public class JPATransactionalMapper extends AbstractTransactionalMapper {
+public abstract class JPATransactionalMapper extends 
AbstractTransactionalMapper {
 
     private final EntityManagerFactory factory;
     private EntityManager entityManager;
-    
     public JPATransactionalMapper(final EntityManagerFactory factory) {
         this.factory = factory;
     }
@@ -72,7 +72,6 @@ public class JPATransactionalMapper exte
     protected void commit() throws MailboxException {
         try {
             getManager().getTransaction().commit();
-            getManager().close();
         } catch (PersistenceException e) {
             throw new 
StorageException(HumanReadableText.COMMIT_TRANSACTION_FAILED, e);
         }
@@ -89,5 +88,15 @@ public class JPATransactionalMapper exte
             getManager().getTransaction().rollback();
         }
     }
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.transaction.TransactionalMapper#dispose()
+     */
+    public void dispose() {
+        if (entityManager != null && entityManager.isOpen()) {
+            entityManager.close();
+        }
+    }
 
 }

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
 Sun May  2 16:55:26 2010
@@ -208,5 +208,17 @@ public class InMemoryMailboxManager exte
         storeMailboxByName.clear();
         idNameMap.clear();
     }
+
+    public void dispose() {
+        // do nothing
+        
+    }
+
+    @Override
+    protected MailboxMapper<Long> getMailboxMapperForRequest(MailboxSession 
session) throws MailboxException {
+        return createMailboxMapper(session);
+    }
+    
+    
     
 }

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 Sun May  2 16:55:26 2010
@@ -246,4 +246,15 @@ public class InMemoryStoreMailbox extend
     public void execute(Transaction transaction) throws MailboxException {
         transaction.run();
     }
+
+
+    public void dispose() {
+        // do nothing
+        
+    }
+    
+    
+    public MessageMapper<Long> getMessageMapperForRequest(MailboxSession 
session) throws MailboxException {
+        return createMessageMapper(session);
+    }
 }

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java
 Sun May  2 16:55:26 2010
@@ -174,4 +174,13 @@ public class InMemorySubscriptionManager
     public void execute(Transaction transaction) throws MailboxException {
         transaction.run();
     }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.transaction.TransactionalMapper#dispose()
+     */
+    public void dispose() {
+        // do nothing
+        
+    }
 }

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 Sun May  2 16:55:26 2010
@@ -83,10 +83,29 @@ public abstract class StoreMailbox<Id> i
     
     private MailboxEventDispatcher dispatcher;
     
+    public final static String MESSAGE_MAPPER = "MESSAGE_MAPPER";
+    
     public StoreMailbox(final MailboxEventDispatcher dispatcher, final 
Mailbox<Id> mailbox) {
         this.mailboxId = mailbox.getMailboxId();
         this.dispatcher = dispatcher;
     }
+    
+    /**
+     * Return the {...@link MessageMapper} for the current Request. If none 
exists, it will get created.
+     * 
+     * @param session
+     * @return mapper
+     * @throws MailboxException
+     */
+    @SuppressWarnings("unchecked")
+    public MessageMapper<Id> getMessageMapperForRequest(MailboxSession 
session) throws MailboxException {
+        MessageMapper<Id> mapper = (MessageMapper<Id>) 
session.getAttributes().get(MESSAGE_MAPPER);
+        if (mapper == null) {
+            mapper = createMessageMapper(session);
+            session.getAttributes().put(MESSAGE_MAPPER, mapper);
+        }
+        return mapper;
+    }
 
     /**
      * Return the {...@link MailboxEventDispatcher} for this Mailbox
@@ -107,7 +126,7 @@ public abstract class StoreMailbox<Id> i
     protected abstract MailboxMembership<Id> copyMessage(MailboxMembership<Id> 
originalMessage, long uid, MailboxSession session) throws MailboxException;
     
     /**
-     * Create a new {...@link MessageMapper} to use
+     * Create a new {...@link MessageMapper} to use for the current Request. 
      * 
      * @return mapper
      */
@@ -137,7 +156,7 @@ public abstract class StoreMailbox<Id> i
      * @see 
org.apache.james.imap.mailbox.Mailbox#getMessageCount(org.apache.james.imap.mailbox.MailboxSession)
      */
     public int getMessageCount(MailboxSession mailboxSession) throws 
MailboxException {
-        final MessageMapper<Id> messageMapper = 
createMessageMapper(mailboxSession);
+        final MessageMapper<Id> messageMapper = 
getMessageMapperForRequest(mailboxSession);
         return (int) messageMapper.countMessagesInMailbox();
     }
 
@@ -149,7 +168,7 @@ public abstract class StoreMailbox<Id> i
             final MailboxSession mailboxSession,final boolean isRecent, final 
Flags flagsToBeSet)
     throws MailboxException {
         // this will hold the uid after the transaction was complete
-        final MessageMapper<Id> mapper = createMessageMapper(mailboxSession);
+        final MessageMapper<Id> mapper = 
getMessageMapperForRequest(mailboxSession);
         
         final Mailbox<Id> mailbox = reserveNextUid(mailboxSession);
         final long uid = mailbox.getLastUid();
@@ -388,7 +407,7 @@ public abstract class StoreMailbox<Id> i
     public Iterator<MessageResult> getMessages(final MessageRange set, 
FetchGroup fetchGroup,
             MailboxSession mailboxSession) throws MailboxException {
         UidRange range = uidRangeForMessageSet(set);
-        final MessageMapper<Id> messageMapper = 
createMessageMapper(mailboxSession);
+        final MessageMapper<Id> messageMapper = 
getMessageMapperForRequest(mailboxSession);
         final List<MailboxMembership<Id>> rows = new 
ArrayList<MailboxMembership<Id>>(messageMapper.findInMailbox(set));
         return getMessages(fetchGroup, range, rows);
     }
@@ -427,7 +446,7 @@ public abstract class StoreMailbox<Id> i
     }
 
     private long[] recent(final boolean reset, MailboxSession mailboxSession) 
throws MailboxException {
-        final MessageMapper<Id> mapper = createMessageMapper(mailboxSession);
+        final MessageMapper<Id> mapper = 
getMessageMapperForRequest(mailboxSession);
         final List<Long> results = new ArrayList<Long>();
 
         mapper.execute(new TransactionalMapper.Transaction() {
@@ -451,7 +470,7 @@ public abstract class StoreMailbox<Id> i
 
     private Long getFirstUnseen(MailboxSession mailboxSession) throws 
MailboxException {
         try {
-            final MessageMapper<Id> messageMapper = 
createMessageMapper(mailboxSession);
+            final MessageMapper<Id> messageMapper = 
getMessageMapperForRequest(mailboxSession);
             final List<MailboxMembership<Id>> members = 
messageMapper.findUnseenMessagesInMailbox();
             final Iterator<MailboxMembership<Id>> it = members.iterator();
             final Long result;
@@ -468,7 +487,7 @@ public abstract class StoreMailbox<Id> i
     }
 
     private int getUnseenCount(MailboxSession mailboxSession) throws 
MailboxException {
-        final MessageMapper<Id> messageMapper = 
createMessageMapper(mailboxSession);
+        final MessageMapper<Id> messageMapper = 
getMessageMapperForRequest(mailboxSession);
         final int count = (int) messageMapper.countUnseenMessagesInMailbox();
         return count;
     }
@@ -483,7 +502,7 @@ public abstract class StoreMailbox<Id> i
 
     private Iterator<Long> doExpunge(final MessageRange set, MailboxSession 
mailboxSession)
     throws MailboxException {
-        final MessageMapper<Id> mapper = createMessageMapper(mailboxSession);
+        final MessageMapper<Id> mapper = 
getMessageMapperForRequest(mailboxSession);
         final Collection<Long> uids = new TreeSet<Long>();
         
         mapper.execute(new TransactionalMapper.Transaction() {
@@ -516,7 +535,7 @@ public abstract class StoreMailbox<Id> i
 
     private Map<Long, Flags> doSetFlags(final Flags flags, final boolean 
value, final boolean replace,
             final MessageRange set, final MailboxSession mailboxSession) 
throws MailboxException {
-        final MessageMapper<Id> mapper = createMessageMapper(mailboxSession);
+        final MessageMapper<Id> mapper = 
getMessageMapperForRequest(mailboxSession);
         final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, 
Flags>();
         final Map<Long, Flags> originalFlagsByUid = new HashMap<Long, 
Flags>(INITIAL_SIZE_FLAGS);
         mapper.execute(new TransactionalMapper.Transaction(){
@@ -576,7 +595,7 @@ public abstract class StoreMailbox<Id> i
      * @see 
org.apache.james.imap.mailbox.Mailbox#search(org.apache.james.imap.mailbox.SearchQuery,
 org.apache.james.imap.mailbox.MailboxSession)
      */
     public Iterator<Long> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
-        final MessageMapper<Id> messageMapper = 
createMessageMapper(mailboxSession);
+        final MessageMapper<Id> messageMapper = 
getMessageMapperForRequest(mailboxSession);
         final List<MailboxMembership<Id>> members = 
messageMapper.searchMailbox(query);
         final Set<Long> uids = new TreeSet<Long>();
         for (MailboxMembership<Id> member:members) {
@@ -611,7 +630,7 @@ public abstract class StoreMailbox<Id> i
     private void copy(final List<MailboxMembership<Id>> originalRows, final 
MailboxSession session) throws MailboxException {
         try {
             final List<MailboxMembership<Id>> copiedRows = new 
ArrayList<MailboxMembership<Id>>();
-            final MessageMapper<Id> mapper = createMessageMapper(session);
+            final MessageMapper<Id> mapper = 
getMessageMapperForRequest(session);
             
 
             for (final MailboxMembership<Id> originalMessage:originalRows) {
@@ -655,7 +674,7 @@ public abstract class StoreMailbox<Id> i
      */
     public void copyTo(MessageRange set, StoreMailbox<Id> toMailbox, 
MailboxSession session) throws MailboxException {
         try {
-            final MessageMapper<Id> mapper = createMessageMapper(session);
+            final MessageMapper<Id> mapper = 
getMessageMapperForRequest(session);
             
             final List<MailboxMembership<Id>> originalRows = 
mapper.findInMailbox(set);
             toMailbox.copy(originalRows, session);

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
 Sun May  2 16:55:26 2010
@@ -46,6 +46,7 @@ import org.apache.james.imap.mailbox.Mai
 import org.apache.james.imap.mailbox.util.MailboxEventDispatcher;
 import org.apache.james.imap.mailbox.util.SimpleMailboxMetaData;
 import org.apache.james.imap.store.mail.MailboxMapper;
+import org.apache.james.imap.store.mail.MessageMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
 import org.apache.james.imap.store.transaction.TransactionalMapper;
 
@@ -71,7 +72,7 @@ public abstract class StoreMailboxManage
     private final DelegatingMailboxListener delegatingListener = new 
DelegatingMailboxListener();
     private final Authenticator authenticator;    
     private final Subscriber subscriber;    
-    
+    private final static String MAILBOX_MAPPER = "MAILBOX_MAPPER"; 
     private final char delimiter;
     
     public StoreMailboxManager(final Authenticator authenticator, final 
Subscriber subscriber) {
@@ -86,6 +87,22 @@ public abstract class StoreMailboxManage
     }
 
     /**
+     * Return the {...@link MailboxMapper} for the current Request. If none 
exists, it will get created lazy
+     * 
+     * @param session
+     * @return mapper
+     * @throws MailboxException
+     */
+    @SuppressWarnings("unchecked")
+    protected MailboxMapper<Id> getMailboxMapperForRequest(MailboxSession 
session) throws MailboxException {
+        MailboxMapper<Id> mapper = (MailboxMapper<Id>) 
session.getAttributes().get(MAILBOX_MAPPER);
+        if (mapper == null) {
+            mapper = createMailboxMapper(session);
+            session.getAttributes().put(MAILBOX_MAPPER, mapper);
+        }
+        return mapper;
+    }
+    /**
      * Create a StoreMailbox for the given Mailbox
      * 
      * @param mailboxRow
@@ -94,7 +111,7 @@ public abstract class StoreMailboxManage
     protected abstract StoreMailbox<Id> createMailbox(MailboxEventDispatcher 
dispatcher, Mailbox<Id> mailboxRow);
     
     /**
-     * Create the MailboxMapper which should get used 
+     * Create the MailboxMapper
      * 
      * @return mailboxMapper
      */
@@ -127,7 +144,7 @@ public abstract class StoreMailboxManage
      */
     private StoreMailbox<Id> doGetMailbox(String mailboxName, MailboxSession 
session) throws MailboxException {
         synchronized (mutex) {
-            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            final MailboxMapper<Id> mapper = 
getMailboxMapperForRequest(session);
             Mailbox<Id> mailboxRow = mapper.findMailboxByName(mailboxName);
             
             if (mailboxRow == null) {
@@ -196,7 +213,7 @@ public abstract class StoreMailboxManage
         synchronized (mutex) {
             // TODO put this into a serilizable transaction
             
-            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            final MailboxMapper<Id> mapper = 
getMailboxMapperForRequest(session);
             
             mapper.execute(new TransactionalMapper.Transaction() {
 
@@ -227,7 +244,7 @@ public abstract class StoreMailboxManage
                 throw new MailboxExistsException(to);
             }
 
-            final MailboxMapper<Id> mapper = createMailboxMapper(session);     
           
+            final MailboxMapper<Id> mapper = 
getMailboxMapperForRequest(session);                
             mapper.execute(new TransactionalMapper.Transaction() {
 
                 public void run() throws MailboxException {
@@ -313,7 +330,7 @@ public abstract class StoreMailboxManage
                 delimiter).replace(freeWildcard, SQL_WILDCARD_CHAR)
                 .replace(localWildcard, SQL_WILDCARD_CHAR);
 
-        final MailboxMapper<Id> mapper = createMailboxMapper(session);
+        final MailboxMapper<Id> mapper = getMailboxMapperForRequest(session);
         final List<Mailbox<Id>> mailboxes = 
mapper.findMailboxWithNameLike(search);
         final List<MailboxMetaData> results = new 
ArrayList<MailboxMetaData>(mailboxes.size());
         for (Mailbox<Id> mailbox: mailboxes) {
@@ -353,7 +370,7 @@ public abstract class StoreMailboxManage
      */
     public boolean mailboxExists(String mailboxName, MailboxSession session) 
throws MailboxException {
         synchronized (mutex) {
-            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            final MailboxMapper<Id> mapper = 
getMailboxMapperForRequest(session);
             final long count = mapper.countMailboxesWithName(mailboxName);
             if (count == 0) {
                 return false;
@@ -496,13 +513,21 @@ public abstract class StoreMailboxManage
 
 
     /**
-     * End processing of Request for session. Default is to do nothing.
-     * 
-     * Implementations should override this if they need todo anything special
+     * End processing of Request for session. This will dispose all objects 
which belong to the current
+     * Request
      */
+    @SuppressWarnings("unchecked")
     public void endProcessingRequest(MailboxSession session) {
-        // Default do nothing
-        
+        if (session != null) {
+            // dispose mapper
+            MailboxMapper<Id> mapper = (MailboxMapper<Id>) 
session.getAttributes().remove(MAILBOX_MAPPER);
+            if (mapper != null)
+                mapper.dispose();
+
+            MessageMapper<Id> messageMapper = (MessageMapper<Id>) 
session.getAttributes().remove(StoreMailbox.MESSAGE_MAPPER);
+            if (messageMapper != null)
+                messageMapper.dispose();
+        }
     }
 
 

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
 Sun May  2 16:55:26 2010
@@ -26,7 +26,8 @@ import org.apache.james.imap.store.mail.
 import org.apache.james.imap.store.transaction.TransactionalMapper;
 
 /**
- * Mapper for {...@link Mailbox}
+ * Mapper for {...@link Mailbox} actions. A {...@link MailboxMapper} has a 
lifecycle from the start of a request 
+ * to the end of the request.
  *
  */
 public interface MailboxMapper<Id> extends TransactionalMapper{

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
 Sun May  2 16:55:26 2010
@@ -29,7 +29,8 @@ import org.apache.james.imap.store.mail.
 import org.apache.james.imap.store.transaction.TransactionalMapper;
 
 /**
- * Maps {...@link Document} in a {...@link Mailbox}.
+ * Maps {...@link Document} in a {...@link Mailbox}. A {...@link 
MessageMapper} has a lifecycle from the start of a request 
+ * to the end of the request.
  */
 public interface MessageMapper<Id> extends TransactionalMapper {
 

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java
 Sun May  2 16:55:26 2010
@@ -65,6 +65,6 @@ public abstract class AbstractTransactio
      * @throws StorageException
      */
     protected abstract void rollback() throws MailboxException;
-
+    
 
 }

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java?rev=940260&r1=940259&r2=940260&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java
 Sun May  2 16:55:26 2010
@@ -50,4 +50,8 @@ public interface TransactionalMapper {
         public void run() throws MailboxException;
     }
 
+    /**
+     * Dispose the mapper
+     */
+    public void dispose();
 }



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

Reply via email to