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/11/25 20:57:54 UTC

svn commit: r1039160 - in /james/imap/trunk: jcr/src/main/java/org/apache/james/mailbox/jcr/ jpa/src/main/java/org/apache/james/mailbox/jpa/ jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/ maildir/src/main/java/org/apache/james/mailbox/maildir/...

Author: norman
Date: Thu Nov 25 19:57:54 2010
New Revision: 1039160

URL: http://svn.apache.org/viewvc?rev=1039160&view=rev
Log:
Make the MailboxPathLocker pluggable by introducing the MailboxPathLocker interface. See IMAP-234. This will make it easier to run james later in a cluster

Added:
    james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
    james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
      - copied, changed from r1003563, james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLock.java
    james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLocker.java
Removed:
    james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLock.java
Modified:
    james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
    james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
    james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
    james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
    james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
    james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -27,6 +27,8 @@ import org.apache.james.mailbox.MailboxP
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
+import org.apache.james.mailbox.store.MailboxPathLocker;
 import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -42,11 +44,11 @@ public class JCRMailboxManager extends S
     private final Log logger = LogFactory.getLog(JCRMailboxManager.class);
     
     public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, final Authenticator authenticator) {
-	    this(mapperFactory, authenticator, new JCRVmNodeLocker());
+	    this(mapperFactory, authenticator, new JVMMailboxPathLocker());
     }
 
-    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, final Authenticator authenticator, final NodeLocker locker) {
-        super(mapperFactory, authenticator);
+    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, final Authenticator authenticator, final MailboxPathLocker locker) {
+        super(mapperFactory, authenticator, locker);
         this.mapperFactory = mapperFactory;
     }
 

Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java (original)
+++ james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -24,6 +24,7 @@ import org.apache.james.mailbox.MailboxS
 import org.apache.james.mailbox.jpa.mail.JPAMailboxMapper;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.MailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
@@ -34,8 +35,8 @@ import org.apache.james.mailbox.store.tr
 public abstract class JPAMailboxManager extends StoreMailboxManager<Long> {
     
     public JPAMailboxManager(JPAMailboxSessionMapperFactory mailboxSessionMapperFactory,
-            final Authenticator authenticator) {
-        super(mailboxSessionMapperFactory, authenticator);
+            final Authenticator authenticator, final MailboxPathLocker locker) {
+        super(mailboxSessionMapperFactory, authenticator, locker);
     }
     
     @Override

Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java (original)
+++ james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -27,6 +27,8 @@ import org.apache.james.mailbox.MailboxS
 import org.apache.james.mailbox.jpa.JPAMailboxManager;
 import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
+import org.apache.james.mailbox.store.MailboxPathLocker;
 import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.util.MailboxEventDispatcher;
@@ -39,13 +41,13 @@ public class OpenJPAMailboxManager exten
 
     private boolean useStreaming;
 
-    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, boolean useStreaming) {
-        super(mapperFactory, authenticator);
+    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, MailboxPathLocker locker, boolean useStreaming) {
+        super(mapperFactory, authenticator, locker);
         this.useStreaming = useStreaming;
     }
 
     public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator) {
-        this(mapperFactory, authenticator, false);
+        this(mapperFactory, authenticator, new JVMMailboxPathLocker(), false);
     }
 
     @Override

Modified: james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java (original)
+++ james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -25,6 +25,8 @@ import org.apache.james.mailbox.MailboxP
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMailbox;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
+import org.apache.james.mailbox.store.MailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
@@ -36,7 +38,13 @@ public class MaildirMailboxManager exten
     public MaildirMailboxManager(
             MailboxSessionMapperFactory<Integer> mailboxSessionMapperFactory,
             Authenticator authenticator) {
-        super(mailboxSessionMapperFactory, authenticator);
+        this(mailboxSessionMapperFactory, authenticator, new JVMMailboxPathLocker());
+    }
+
+    public MaildirMailboxManager(
+            MailboxSessionMapperFactory<Integer> mailboxSessionMapperFactory,
+            Authenticator authenticator, MailboxPathLocker locker) {
+        super(mailboxSessionMapperFactory, authenticator, locker);
     }
 
     @Override

Modified: james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java (original)
+++ james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.MailboxP
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.inmemory.mail.model.InMemoryMailbox;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.MapperStoreMessageManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
@@ -35,7 +36,7 @@ import org.apache.james.mailbox.util.Mai
 public class InMemoryMailboxManager extends StoreMailboxManager<Long> {
 
     public InMemoryMailboxManager(MailboxSessionMapperFactory<Long> mapperFactory, Authenticator authenticator) {
-        super(mapperFactory, authenticator);
+        super(mapperFactory, authenticator, new JVMMailboxPathLocker());
     }
 
     @Override

Added: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java?rev=1039160&view=auto
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java (added)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java Thu Nov 25 19:57:54 2010
@@ -0,0 +1,59 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.store;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
+
+
+public abstract class AbstractMailboxPathLocker implements MailboxPathLocker{
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.MailboxPathLocker#executeWithLock(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.MailboxPath, org.apache.james.mailbox.store.MailboxPathLocker.LockAwareExecution)
+     */
+    public void executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution execution) throws MailboxException {
+        try {
+            lock(session, path);
+            execution.execute(session, path);
+        } finally {
+            unlock(session, path);
+        }
+    }
+    
+    /**
+     * Perform lock
+     * 
+     * @param session
+     * @param path
+     * @throws MailboxException
+     */
+    protected abstract void lock(MailboxSession session, MailboxPath path) throws MailboxException;
+
+    /**
+     * Release lock
+     * 
+     * @param session
+     * @param path
+     * @throws MailboxException
+     */
+    protected abstract void unlock(MailboxSession session, MailboxPath path) throws MailboxException;
+
+}

Copied: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java (from r1003563, james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLock.java)
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java?p2=james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java&p1=james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLock.java&r1=1003563&r2=1039160&rev=1039160&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLock.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java Thu Nov 25 19:57:54 2010
@@ -21,32 +21,29 @@ package org.apache.james.mailbox.store;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
 
 /**
  * 
- * Helper class which helps to synchronize the access the 
+ * {@link MailboxPathLocker} implementation which helps to synchronize the access the 
  * same MailboxPath. This is done using one {@link ReentrantLock}
- * per {@link MailboxPath}.
- * 
- * Its very important to call the {@link #unlock(MailboxPath)} method
- * in a finally block to not risk a dead lock
+ * per {@link MailboxPath} so its only usable in a single JVM.
  *
  */
-public final class MailboxPathLock {
+public final class JVMMailboxPathLocker extends AbstractMailboxPathLocker {
 
     private final Map<MailboxPath, ReentrantLock> paths = new HashMap<MailboxPath, ReentrantLock>();
-    
-    /**
-     * Obtain a {@link Lock} for the given path. It will block if the lock for the {@link MailboxPath} is
-     * already held by some other thread 
-     * 
-     * @param path
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.AbstractMailboxPathLocker#lock(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.MailboxPath)
      */
-    public void lock(MailboxPath path) {
+    protected void lock(MailboxSession session, MailboxPath path) throws MailboxException {
         ReentrantLock lock;
         synchronized (paths) {
             lock = paths.get(path);
@@ -56,21 +53,20 @@ public final class MailboxPathLock {
                 paths.put(path, lock);
             }
         }
-        lock.lock();
+        lock.lock();        
     }
-    
-    /**
-     * Unlock the previous obtained {@link Lock} for the given path
-     * 
-     * @param path
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.AbstractMailboxPathLocker#unlock(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.MailboxPath)
      */
-    public void unlock(MailboxPath path) {
+    protected void unlock(MailboxSession session, MailboxPath path) throws MailboxException {
         ReentrantLock lock;
         synchronized (paths) {
             lock = paths.remove(path);
         }
         if (lock != null) {
             lock.unlock();
-        }
+        }        
     }
 }

Added: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLocker.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLocker.java?rev=1039160&view=auto
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLocker.java (added)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxPathLocker.java Thu Nov 25 19:57:54 2010
@@ -0,0 +1,62 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.store;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
+
+/**
+ * The {@link MailboxPathLocker} is responsible to help to synchronize the access to a {@link MailboxPath}
+ * and execute an given {@link LockAwareExecution}
+ *
+ */
+public interface MailboxPathLocker {
+    
+    
+    /**
+     * Execute the {@link LockAwareExecution} while holding a lock on the {@link MailboxPath}
+     * 
+     * @param session
+     * @param path
+     * @param execution
+     * @throws MailboxException
+     */
+    public void executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution execution) throws MailboxException;
+    
+    
+    /**
+     * Execute code while holding a lock
+     * 
+     *
+     */
+    public interface LockAwareExecution {
+        
+        /**
+         * Execute code block
+         * 
+         * @param session
+         * @param path
+         * @throws MailboxException
+         */
+        public void execute(MailboxSession session, MailboxPath path) throws MailboxException;
+    }
+
+}

Modified: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1039160&r1=1039159&r2=1039160&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java Thu Nov 25 19:57:54 2010
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.MessageR
 import org.apache.james.mailbox.RequestAware;
 import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
 import org.apache.james.mailbox.MailboxMetaData.Selectability;
+import org.apache.james.mailbox.store.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.transaction.Mapper;
@@ -67,7 +68,6 @@ public abstract class StoreMailboxManage
     
     private final MailboxEventDispatcher dispatcher = new MailboxEventDispatcher();
     private final DelegatingMailboxListener delegatingListener = new DelegatingMailboxListener();   
-    private final MailboxPathLock lock = new MailboxPathLock();
     protected final MailboxMapperFactory<Id> mailboxSessionMapperFactory;    
     
     private final Authenticator authenticator;
@@ -75,9 +75,12 @@ public abstract class StoreMailboxManage
     
     private Log log = LogFactory.getLog("org.apache.james.imap");
     private ConcurrentMap<MailboxPath, AtomicLong> lastUids = new ConcurrentHashMap<MailboxPath, AtomicLong>();
+
+    private MailboxPathLocker locker;
     
-    public StoreMailboxManager(MailboxMapperFactory<Id> mailboxSessionMapperFactory, final Authenticator authenticator) {
+    public StoreMailboxManager(MailboxMapperFactory<Id> mailboxSessionMapperFactory, final Authenticator authenticator, final MailboxPathLocker locker) {
         this.authenticator = authenticator;
+        this.locker = locker;
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         
         // The dispatcher need to have the delegating listener added
@@ -229,7 +232,7 @@ public abstract class StoreMailboxManage
      * (non-Javadoc)
      * @see org.apache.james.mailbox.MailboxManager#createMailbox(org.apache.james.imap.api.MailboxPath, org.apache.james.mailbox.MailboxSession)
      */
-    public void createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession)
+    public void createMailbox(MailboxPath mailboxPath, final MailboxSession mailboxSession)
     throws MailboxException {
         getLog().debug("createMailbox " + mailboxPath);
         final int length = mailboxPath.getName().length();
@@ -243,23 +246,25 @@ public abstract class StoreMailboxManage
             // Create parents first
             // If any creation fails then the mailbox will not be created
             // TODO: transaction
-            for (MailboxPath mailbox : mailboxPath.getHierarchyLevels(MailboxConstants.DEFAULT_DELIMITER))
-                if (!mailboxExists(mailbox, mailboxSession)) {
-                    try {
-                        lock.lock(mailbox);
-                        final org.apache.james.mailbox.store.mail.model.Mailbox<Id> m = doCreateMailbox(mailbox, mailboxSession);
-                        final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
-                        mapper.execute(new TransactionalMapper.VoidTransaction(){
-
-                            public void runVoid() throws MailboxException {
-                                mapper.save(m);
-                            }
-                            
-                        });
-                    } finally {
-                        lock.unlock(mailbox);
+            for (final MailboxPath mailbox : mailboxPath.getHierarchyLevels(MailboxConstants.DEFAULT_DELIMITER))
+
+                locker.executeWithLock(mailboxSession, mailbox, new LockAwareExecution() {
+
+                    public void execute(MailboxSession session, MailboxPath mailbox) throws MailboxException {
+                        if (!mailboxExists(mailbox, session)) {
+                            final org.apache.james.mailbox.store.mail.model.Mailbox<Id> m = doCreateMailbox(mailbox, session);
+                            final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
+                            mapper.execute(new TransactionalMapper.VoidTransaction() {
+
+                                public void runVoid() throws MailboxException {
+                                    mapper.save(m);
+                                }
+
+                            });
+                        }
                     }
-                }
+                });
+
         }
     }
 
@@ -316,28 +321,28 @@ public abstract class StoreMailboxManage
                 dispatcher.mailboxRenamed(from, to, session.getSessionId());
 
                 // rename submailboxes
-                MailboxPath children = new MailboxPath(MailboxConstants.USER_NAMESPACE, from.getUser(), from.getName() + MailboxConstants.DEFAULT_DELIMITER + "%");
-                try {
-                    lock.lock(children);
-                    final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithPathLike(children);
-                    for (Mailbox<Id> sub : subMailboxes) {
-                        final String subOriginalName = sub.getName();
-                        final String subNewName = to.getName() + subOriginalName.substring(from.getName().length());
-                        final MailboxPath fromPath = new MailboxPath(children, subOriginalName);
-                        final MailboxPath toPath = new MailboxPath(children, subNewName);
-
-                        sub.setName(subNewName);
-                        mapper.save(sub);
-                        dispatcher.mailboxRenamed(fromPath, toPath, session.getSessionId());
-
-                        if (log.isDebugEnabled())
-                            log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
-                            
-                      
+                final MailboxPath children = new MailboxPath(MailboxConstants.USER_NAMESPACE, from.getUser(), from.getName() + MailboxConstants.DEFAULT_DELIMITER + "%");
+                locker.executeWithLock(session, children, new LockAwareExecution() {
+                    
+                    public void execute(MailboxSession session, MailboxPath children) throws MailboxException {
+                        final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithPathLike(children);
+                        for (Mailbox<Id> sub : subMailboxes) {
+                            final String subOriginalName = sub.getName();
+                            final String subNewName = to.getName() + subOriginalName.substring(from.getName().length());
+                            final MailboxPath fromPath = new MailboxPath(children, subOriginalName);
+                            final MailboxPath toPath = new MailboxPath(children, subNewName);
+
+                            sub.setName(subNewName);
+                            mapper.save(sub);
+                            dispatcher.mailboxRenamed(fromPath, toPath, session.getSessionId());
+
+                            if (log.isDebugEnabled())
+                                log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
+                        }
                     }
-                } finally {
-                    lock.unlock(children);
-                }
+                });
+    
+               
                 
             }
 



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