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: [email protected]
For additional commands, e-mail: [email protected]