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 2010/04/15 12:14:55 UTC

svn commit: r934354 - in /james/imap/trunk: jcr/src/main/java/org/apache/james/imap/jcr/ jpa/src/main/java/org/apache/james/imap/jpa/ memory/src/main/java/org/apache/james/imap/inmemory/ store/src/main/java/org/apache/james/imap/store/

Author: norman
Date: Thu Apr 15 10:14:55 2010
New Revision: 934354

URL: http://svn.apache.org/viewvc?rev=934354&view=rev
Log:
Revert changes from yesterday. After thinkin a bit more about it I think the fix needs to be a bit different

Modified:
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
    james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
    james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
    james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java   (contents, props changed)

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java?rev=934354&r1=934353&r2=934354&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java Thu Apr 15 10:14:55 2010
@@ -70,6 +70,7 @@ public class JCRGlobalUserMailboxManager
 
             public void run() throws MailboxException {
                 mapper.deleteAll(); 
+                mailboxes.clear();
             }
             
         });

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=934354&r1=934353&r2=934354&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 Thu Apr 15 10:14:55 2010
@@ -75,6 +75,7 @@ public abstract class JPAMailboxManager 
 
             public void run() throws MailboxException {
                 mapper.deleteAll(); 
+                mailboxes.clear();
             }
             
         });

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=934354&r1=934353&r2=934354&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 Thu Apr 15 10:14:55 2010
@@ -176,6 +176,7 @@ public class InMemoryMailboxManager exte
 
             public void run() throws MailboxException {
                 mapper.deleteAll(); 
+                mailboxes.clear();
             }
             
         });

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=934354&r1=934353&r2=934354&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 Thu Apr 15 10:14:55 2010
@@ -22,8 +22,10 @@ package org.apache.james.imap.store;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Random;
 
 import org.apache.commons.logging.Log;
@@ -55,6 +57,8 @@ public abstract class StoreMailboxManage
 
     private final static Random random = new Random();
 
+    protected final Map<String, StoreMailbox<Id>> mailboxes;
+
     private final Authenticator authenticator;    
     private final Subscriber subscriber;    
     
@@ -68,6 +72,7 @@ public abstract class StoreMailboxManage
 
     
     public StoreMailboxManager(final Authenticator authenticator, final Subscriber subscriber, final char delimiter) {
+        mailboxes = new HashMap<String, StoreMailbox<Id>>();
         this.authenticator = authenticator;
         this.subscriber = subscriber;
         this.delimiter = delimiter;
@@ -114,19 +119,27 @@ public abstract class StoreMailboxManage
      * @throws MailboxException get thrown if no Mailbox could be found for the given name
      */
     private StoreMailbox<Id> doGetMailbox(String mailboxName, MailboxSession session) throws MailboxException {
-        final MailboxMapper<Id> mapper = createMailboxMapper(session);
-        Mailbox<Id> mailboxRow = mapper.findMailboxByName(mailboxName);
-
-        if (mailboxRow == null) {
-            getLog().info("Mailbox '" + mailboxName + "' not found.");
-            throw new MailboxNotFoundException(mailboxName);
+        synchronized (mailboxes) {
+            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            Mailbox<Id> mailboxRow = mapper.findMailboxByName(mailboxName);
+            
+            if (mailboxRow == null) {
+                getLog().info("Mailbox '" + mailboxName + "' not found.");
+                throw new MailboxNotFoundException(mailboxName);
 
-        } else {
-            getLog().debug("Loaded mailbox " + mailboxName);
-
-            StoreMailbox<Id> result = createMailbox(mailboxRow, session);
-            return result;
+            } else {
+                getLog().debug("Loaded mailbox " + mailboxName);
 
+                StoreMailbox<Id> result = (StoreMailbox<Id>) mailboxes.get(mailboxName);
+                if (result == null) {
+                    result = createMailbox(mailboxRow, session);
+                    mailboxes.put(mailboxName, result);
+                    
+                    // store the mailbox in the session so we can cleanup things later
+                    //session.getAttributes().put(MAILBOX, result);
+                }
+                return result;
+            }
         }
     }
 
@@ -134,7 +147,8 @@ public abstract class StoreMailboxManage
      * (non-Javadoc)
      * @see org.apache.james.imap.mailbox.MailboxManager#createMailbox(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
      */
-    public void createMailbox(String namespaceName, MailboxSession mailboxSession) throws MailboxException {
+    public void createMailbox(String namespaceName, MailboxSession mailboxSession)
+    throws MailboxException {
         getLog().debug("createMailbox " + namespaceName);
         final int length = namespaceName.length();
         if (length == 0) {
@@ -142,54 +156,64 @@ public abstract class StoreMailboxManage
         } else if (namespaceName.charAt(length - 1) == delimiter) {
             createMailbox(namespaceName.substring(0, length - 1), mailboxSession);
         } else {
-            // Create root first
-            // If any creation fails then mailbox will not be created
-            // TODO: transaction
-            int index = namespaceName.indexOf(delimiter);
-            int count = 0;
-            while (index >= 0) {
-                // Until explicit namespace support is added,
-                // this workaround prevents the namespaced elements being
-                // created
-                // TODO: add explicit support for namespaces
-                if (index > 0 && count++ > 1) {
-                    final String mailbox = namespaceName.substring(0, index);
-                    if (!mailboxExists(mailbox, mailboxSession)) {
-                        doCreate(mailbox, mailboxSession);
+            synchronized (mailboxes) {
+                // Create root first
+                // If any creation fails then mailbox will not be created
+                // TODO: transaction
+                int index = namespaceName.indexOf(delimiter);
+                int count = 0;
+                while (index >= 0) {
+                    // Until explicit namespace support is added,
+                    // this workaround prevents the namespaced elements being
+                    // created
+                    // TODO: add explicit support for namespaces
+                    if (index > 0 && count++ > 1) {
+                        final String mailbox = namespaceName
+                        .substring(0, index);
+                        if (!mailboxExists(mailbox, mailboxSession)) {
+                            doCreate(mailbox, mailboxSession);
+                        }
                     }
+                    index = namespaceName.indexOf(delimiter, ++index);
+                }
+                if (mailboxExists(namespaceName, mailboxSession)) {
+                    throw new MailboxExistsException(namespaceName); 
+                } else {
+                    doCreate(namespaceName, mailboxSession);
                 }
-                index = namespaceName.indexOf(delimiter, ++index);
-            }
-            if (mailboxExists(namespaceName, mailboxSession)) {
-                throw new MailboxExistsException(namespaceName);
-            } else {
-                doCreate(namespaceName, mailboxSession);
             }
         }
-
     }
 
     /*
      * (non-Javadoc)
      * @see org.apache.james.imap.mailbox.MailboxManager#deleteMailbox(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
      */
-    public void deleteMailbox(final String mailboxName, final MailboxSession session) throws MailboxException {
+    public void deleteMailbox(final String mailboxName, final MailboxSession session)
+    throws MailboxException {
         session.getLog().info("deleteMailbox " + mailboxName);
-        // TODO put this into a serilizable transaction
-        final MailboxMapper<Id> mapper = createMailboxMapper(session);
-
-        mapper.execute(new TransactionalMapper.Transaction() {
-
-            public void run() throws MailboxException {
-                Mailbox<Id> mailbox = mapper.findMailboxByName(mailboxName);
-                if (mailbox == null) {
-                    throw new MailboxNotFoundException("Mailbox not found");
+        synchronized (mailboxes) {
+            // TODO put this into a serilizable transaction
+            
+            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            
+            mapper.execute(new TransactionalMapper.Transaction() {
+
+                public void run() throws MailboxException {
+                    Mailbox<Id> mailbox = mapper.findMailboxByName(mailboxName);
+                    if (mailbox == null) {
+                        throw new MailboxNotFoundException("Mailbox not found");
+                    }
+                    mapper.delete(mailbox);
                 }
-                mapper.delete(mailbox);
+                
+            });
+            
+            final StoreMailbox<Id> storeMailbox = mailboxes.remove(mailboxName);
+            if (storeMailbox != null) {
+                storeMailbox.deleted(session);
             }
-
-        });
-
+        }
     }
 
     /*
@@ -199,40 +223,44 @@ public abstract class StoreMailboxManage
     public void renameMailbox(final String from, final String to, final MailboxSession session)
     throws MailboxException {
         final Log log = getLog();
-        if (log.isDebugEnabled())
-            log.debug("renameMailbox " + from + " to " + to);
-        if (mailboxExists(to, session)) {
-            throw new MailboxExistsException(to);
-        }
+        if (log.isDebugEnabled()) log.debug("renameMailbox " + from + " to " + to);
+        synchronized (mailboxes) {
+            if (mailboxExists(to, session)) {
+                throw new MailboxExistsException(to);
+            }
 
-        final MailboxMapper<Id> mapper = createMailboxMapper(session);
-        mapper.execute(new TransactionalMapper.Transaction() {
+            final MailboxMapper<Id> mapper = createMailboxMapper(session);                
+            mapper.execute(new TransactionalMapper.Transaction() {
 
-            public void run() throws MailboxException {
-                // TODO put this into a serilizable transaction
-                final Mailbox<Id> mailbox = mapper.findMailboxByName(from);
+                public void run() throws MailboxException {
+                    // TODO put this into a serilizable transaction
+                    final Mailbox<Id> mailbox = mapper.findMailboxByName(from);
 
-                if (mailbox == null) {
-                    throw new MailboxNotFoundException(from);
-                }
-                mailbox.setName(to);
-                mapper.save(mailbox);
+                    if (mailbox == null) {
+                        throw new MailboxNotFoundException(from);
+                    }
+                    mailbox.setName(to);
+                    mapper.save(mailbox);
 
-                // rename submailbox
-                final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithNameLike(from + delimiter + "%");
-                for (Mailbox<Id> sub : subMailboxes) {
-                    final String subOriginalName = sub.getName();
-                    final String subNewName = to + subOriginalName.substring(from.length());
-                    sub.setName(subNewName);
-                    mapper.save(sub);
+                    changeMailboxName(from, to);
 
-                    if (log.isDebugEnabled())
-                        log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
-                }
-            }
+                    // rename submailbox
+                    final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithNameLike(from + delimiter + "%");
+                    for (Mailbox<Id> sub:subMailboxes) {
+                        final String subOriginalName = sub.getName();
+                        final String subNewName = to + subOriginalName.substring(from.length());
+                        sub.setName(subNewName);
+                        mapper.save(sub);
 
-        });
-        
+                        changeMailboxName(subOriginalName, subNewName);
+
+                        if (log.isDebugEnabled()) log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to "
+                                + subNewName);
+                    }
+                }
+                
+            });
+        }
     }
 
     /**
@@ -243,6 +271,19 @@ public abstract class StoreMailboxManage
     protected int randomUidValidity() {
         return Math.abs(random.nextInt());
     }
+    
+    /**
+     * Changes the name of the mailbox instance in the cache.
+     * @param from not null
+     * @param to not null
+     */
+    private void changeMailboxName(String from, String to) {
+        final StoreMailbox<Id> jpaMailbox = mailboxes.remove(from);
+        if (jpaMailbox != null) {
+            jpaMailbox.reportRenamed(to);
+            mailboxes.put(to, jpaMailbox);
+        }
+    }
 
     /*
      * (non-Javadoc)
@@ -311,24 +352,27 @@ public abstract class StoreMailboxManage
 
     /*
      * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.imap.mailbox.MailboxManager#mailboxExists(java.lang.
-     * String, org.apache.james.imap.mailbox.MailboxSession)
+     * @see org.apache.james.imap.mailbox.MailboxManager#mailboxExists(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
      */
     public boolean mailboxExists(String mailboxName, MailboxSession session) throws MailboxException {
-        final MailboxMapper<Id> mapper = createMailboxMapper(session);
-        final long count = mapper.countMailboxesWithName(mailboxName);
-        if (count == 0) {
-            return false;
-        } else {
-            if (count == 1) {
-                return true;
+        synchronized (mailboxes) {
+            final MailboxMapper<Id> mapper = createMailboxMapper(session);
+            final long count = mapper.countMailboxesWithName(mailboxName);
+            if (count == 0) {
+                mailboxes.remove(mailboxName);
+                return false;
             } else {
-                throw new MailboxException(HumanReadableText.DUPLICATE_MAILBOXES, "Expected one mailbox but found " + count + " mailboxes");
+                if (count == 1) {
+                    return true;
+                } else {
+                    throw new MailboxException(HumanReadableText.DUPLICATE_MAILBOXES, 
+                            "Expected one mailbox but found " + count + " mailboxes");
+                }
             }
         }
     }
+
+  
     
     /*
      * (non-Javadoc)

Propchange: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
            ('svn:mergeinfo' removed)



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