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