Author: norman
Date: Thu Jun 16 16:11:07 2011
New Revision: 1136515

URL: http://svn.apache.org/viewvc?rev=1136515&view=rev
Log:
Allow MailboxPathLocker to return an object after executing code. See MAILBOX-93

Modified:
    
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
    
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java

Modified: 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
 (original)
+++ 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
 Thu Jun 16 16:11:07 2011
@@ -35,12 +35,12 @@ public interface MailboxPathLocker {
      * @param execution
      * @throws MailboxException
      */
-    public void executeWithLock(MailboxSession session, MailboxPath path, 
LockAwareExecution execution) throws MailboxException;
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, 
LockAwareExecution<T> execution) throws MailboxException;
 
     /**
      * Execute code while holding a lock
      */
-    public interface LockAwareExecution {
+    public interface LockAwareExecution<T> {
 
         /**
          * Execute code block
@@ -49,7 +49,7 @@ public interface MailboxPathLocker {
          * @param path
          * @throws MailboxException
          */
-        public void execute(MailboxSession session, MailboxPath path) throws 
MailboxException;
+        public T execute() throws MailboxException;
     }
 
 }

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
 Thu Jun 16 16:11:07 2011
@@ -147,12 +147,13 @@ public class MaildirFolder {
     
     /**
      * Returns the last uid used in this mailbox
+     * @param session
      * @return lastUid
      * @throws MailboxException
      */
-    public long getLastUid() throws MailboxException {
+    public long getLastUid(MailboxSession session) throws MailboxException {
         if (lastUid == -1) {
-            readLastUid();
+            readLastUid(session);
         }
         return lastUid;
     }
@@ -168,13 +169,15 @@ public class MaildirFolder {
 
     /**
      * Read the lastUid of the given mailbox from the file system.
+     * 
+     * @param session
      * @throws MailboxException if there are problems with the uidList file
      */
-    private void readLastUid() throws MailboxException {
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+    private void readLastUid(MailboxSession session) throws MailboxException {
+        locker.executeWithLock(session, path, new LockAwareExecution<Void>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public Void execute() throws MailboxException {
                 File uidList = uidFile;
                 FileReader fileReader = null;
                 BufferedReader reader = null;
@@ -186,6 +189,7 @@ public class MaildirFolder {
                     String line = reader.readLine();
                     if (line != null)
                         readUidListHeader(line);
+                    return null;
                 } catch (IOException e) {
                     throw new MailboxException("Unable to read last uid", e);
                 } finally {
@@ -275,16 +279,18 @@ public class MaildirFolder {
     
     /**
      * Searches the uid list for a certain uid and returns the according 
{@link MaildirMessageName}
+     * 
+     * @param session
      * @param uid The uid to search for
      * @return The {@link MaildirMessageName} that belongs to the uid
      * @throws IOException If the uidlist file cannot be found or read
      */
-    public MaildirMessageName getMessageNameByUid(final Long uid) throws 
MailboxException {
-        final MaildirMessageName[] messageName = new MaildirMessageName[1];
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+    public MaildirMessageName getMessageNameByUid(MailboxSession session, 
final Long uid) throws MailboxException {
+       
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<MaildirMessageName>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public MaildirMessageName execute() throws MailboxException {
                 FileReader fileReader = null;
                 BufferedReader reader = null;
                 File uidList = uidFile;
@@ -303,11 +309,13 @@ public class MaildirFolder {
                             }
                             
                             if (line.substring(0, gap).equals(uidString)) {
-                                messageName[0] = new 
MaildirMessageName(MaildirFolder.this, line.substring(gap + 1));
-                                break;
+                                return new 
MaildirMessageName(MaildirFolder.this, line.substring(gap + 1));
                             }
                         }
                     }
+                    
+                    // TODO: Is this right!?
+                    return null;
                 } catch (IOException e) {
                     throw new MailboxException("Unable to read messagename for 
uid " + uid, e);
                 } finally {
@@ -316,26 +324,26 @@ public class MaildirFolder {
                 }                
             }
         });
-
-        return messageName[0];
     }
     
     /**
      * Reads all uids between the two boundaries from the folder and returns 
them as
      * a sorted map together with their corresponding {@link 
MaildirMessageName}s.
+     *
+     * @param session
      * @param from The lower uid limit
      * @param to The upper uid limit. <code>-1</code> disables the upper limit
      * @return a {@link Map} whith all uids in the given range and associated 
{@link MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getUidMap(final long from, 
final long to)
+    public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession 
session, final long from, final long to)
     throws MailboxException {
-        final SortedMap<Long, MaildirMessageName> uidMap = new TreeMap<Long, 
MaildirMessageName>();
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<Long, MaildirMessageName>>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
-                    
+            public SortedMap<Long, MaildirMessageName> execute() throws 
MailboxException {
+                final SortedMap<Long, MaildirMessageName> uidMap = new 
TreeMap<Long, MaildirMessageName>();
+
                 File uidList = uidFile;
 
                 if (uidList.isFile()) {
@@ -355,16 +363,15 @@ public class MaildirFolder {
                 } else {
                     // the uidList does not exist
                     uidMap.putAll(truncateMap(createUidFile(), from, to));
-                }          
+                }
+                return uidMap;
             }
         });
-
-        return uidMap;
     }
     
-    public SortedMap<Long, MaildirMessageName> getUidMap(FilenameFilter 
filter, long from, long to)
+    public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, long from, long to)
     throws MailboxException {
-        SortedMap<Long, MaildirMessageName> allUids = getUidMap(from, to);
+        SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, from, 
to);
         SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, 
MaildirMessageName>();
         for (Entry<Long, MaildirMessageName> entry : allUids.entrySet()) {
             if (filter.accept(null, entry.getValue().getFullName()))
@@ -376,14 +383,17 @@ public class MaildirFolder {
     /**
      * Reads all uids from the uid list file which match the given filter
      * and returns as many of them as a sorted map as the limit specifies.
+     * 
+     * 
+     * @param session
      * @param filter The file names of all returned items match the filter. 
      * The dir argument to {@link FilenameFilter}.accept(dir, name) will 
always be null.
      * @param limit The number of items; a limit smaller then 1 disables the 
limit
      * @return A {@link Map} with all uids and associated {@link 
MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getUidMap(FilenameFilter 
filter, int limit) throws MailboxException {
-        SortedMap<Long, MaildirMessageName> allUids = getUidMap(0, -1);
+    public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, int limit) throws MailboxException {
+        SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, 0, 
-1);
         SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, 
MaildirMessageName>();
         int theLimit = limit;
         if (limit < 1)
@@ -402,19 +412,23 @@ public class MaildirFolder {
     
     /**
      * Creates a map of recent messages.
+     * 
+     * @param session
      * @return A {@link Map} with all uids and associated {@link 
MaildirMessageName}s of recent messages
      * @throws MailboxException If there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getRecentMessages() throws 
MailboxException {
+    public SortedMap<Long, MaildirMessageName> 
getRecentMessages(MailboxSession session) throws MailboxException {
         final String[] recentFiles = getNewFolder().list();
         final LinkedList<String> lines = new LinkedList<String>();
         final int theLimit = recentFiles.length;
-        final SortedMap<Long, MaildirMessageName> recentMessages = new 
TreeMap<Long, MaildirMessageName>();
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<Long, MaildirMessageName>>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public SortedMap<Long, MaildirMessageName> execute() throws 
MailboxException {
+                final SortedMap<Long, MaildirMessageName> recentMessages = new 
TreeMap<Long, MaildirMessageName>();
+
                 File uidList = uidFile;
+
                 try {
                     if (!uidList.isFile()) {
                         uidList.createNewFile();
@@ -477,11 +491,10 @@ public class MaildirFolder {
                     }
                 } catch (IOException e) {
                     throw new MailboxException("Unable to read recent 
messages", e);
-                }                
+                }   
+                return recentMessages;
             }
         });
-
-        return recentMessages;
     }
     
     
@@ -675,16 +688,16 @@ public class MaildirFolder {
 
     /**
      * Appends a message to the uidlist and returns its uid.
+     * @param session
      * @param name The name of the message's file
      * @return The uid of the message
      * @throws IOException
      */
-    public long appendMessage(final String name) throws MailboxException {
-        final long[] lockUid = new long[1];
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+    public long appendMessage(final MailboxSession session, final String name) 
throws MailboxException {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<Long>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public Long execute() throws MailboxException {
                 File uidList = uidFile;
                 long uid = -1;
                 FileReader fileReader = null;
@@ -739,25 +752,25 @@ public class MaildirFolder {
                 if (uid == -1) {
                     throw new MailboxException("Unable to append msg");
                 } else {
-                    lockUid[0] = uid;
+                   return uid;
                 }
             }
         });
 
-        return lockUid[0];
     }
 
     /**
      * Updates an entry in the uid list.
+     * @param session
      * @param uid
      * @param messageName
      * @throws MailboxException
      */
-    public void update(final long uid, final String messageName) throws 
MailboxException {
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+    public void update(final MailboxSession session, final long uid, final 
String messageName) throws MailboxException {
+        locker.executeWithLock(session, path, new LockAwareExecution<Void>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public Void execute() throws MailboxException {
                 File uidList = uidFile;
                 FileReader fileReader = null;
                 BufferedReader reader = null;
@@ -783,7 +796,8 @@ public class MaildirFolder {
                     IOUtils.closeQuietly(writer);
                     IOUtils.closeQuietly(reader);
                     IOUtils.closeQuietly(fileReader);
-                }                
+                }    
+                return null;
             }
         });
 
@@ -796,17 +810,16 @@ public class MaildirFolder {
      * @return The {@link MaildirMessageName} of the deleted message
      * @throws MailboxException If the file cannot be deleted of there is a 
problem with the uid list
      */
-    public MaildirMessageName delete(final long uid) throws MailboxException {
-        final MaildirMessageName[] deletedMessage = new MaildirMessageName[1];
-        
-        locker.executeWithLock(null, path, new LockAwareExecution() {
+    public MaildirMessageName delete(final MailboxSession session, final long 
uid) throws MailboxException {        
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<MaildirMessageName>() {
             
             @Override
-            public void execute(MailboxSession session, MailboxPath path) 
throws MailboxException {
+            public MaildirMessageName execute() throws MailboxException {
                 File uidList = uidFile;
                 FileReader fileReader = null;
                 BufferedReader reader = null;
                 PrintWriter writer = null;
+                MaildirMessageName deletedMessage = null;
                 try {
                     fileReader = new FileReader(uidList);
                     reader = new BufferedReader(fileReader);
@@ -822,33 +835,34 @@ public class MaildirFolder {
                         }
                         
                         if (uid == Long.valueOf(line.substring(0, 
line.indexOf(" ")))) {
-                            deletedMessage[0] = new 
MaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length()));
+                            deletedMessage = new 
MaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length()));
                             messageCount--;
                         }
                         else {
                             lines.add(line);
                         }
                     }
-                    if (deletedMessage[0] != null) {
-                        if (!deletedMessage[0].getFile().delete())
-                            throw new IOException("Cannot delete file " + 
deletedMessage[0].getFile().getAbsolutePath());
+                    if (deletedMessage != null) {
+                        if (!deletedMessage.getFile().delete())
+                            throw new IOException("Cannot delete file " + 
deletedMessage.getFile().getAbsolutePath());
                         writer = new PrintWriter(uidList);
                         writer.println(createUidListHeader());
                         for (String entry : lines)
                             writer.println(entry);
                     }
+                    return deletedMessage;
+
                 } catch (IOException e) {
                     throw new MailboxException("Unable to delete msg with uid 
" + uid, e);
                 } finally {
                     IOUtils.closeQuietly(writer);
                     IOUtils.closeQuietly(reader);
                     IOUtils.closeQuietly(fileReader);
-                }                
+                }   
             }
         });
         
 
-        return deletedMessage[0];
     }
     
     /** 

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
 Thu Jun 16 16:11:07 2011
@@ -87,9 +87,9 @@ public class MaildirStore {
      * @return The Mailbox object populated with data from the file system
      * @throws MailboxException If the mailbox folder doesn't exist or can't 
be read
      */
-    public Mailbox<Integer> loadMailbox(File root, String namespace, String 
user, String folderName) throws MailboxException {
+    public Mailbox<Integer> loadMailbox(MailboxSession session, File root, 
String namespace, String user, String folderName) throws MailboxException {
         String mailboxName = getMailboxNameFromFolderName(folderName);
-        return loadMailbox(new File(root, folderName), new 
MailboxPath(namespace, user, mailboxName));
+        return loadMailbox(session, new File(root, folderName), new 
MailboxPath(namespace, user, mailboxName));
     }
 
     /**
@@ -99,13 +99,13 @@ public class MaildirStore {
      * @throws MailboxNotFoundException If the mailbox folder doesn't exist
      * @throws MailboxException If the mailbox folder can't be read
      */
-    public Mailbox<Integer> loadMailbox(MailboxPath mailboxPath)
+    public Mailbox<Integer> loadMailbox(MailboxSession session, MailboxPath 
mailboxPath)
     throws MailboxNotFoundException, MailboxException {
         MaildirFolder folder = new MaildirFolder(getFolderName(mailboxPath), 
mailboxPath, locker);
 
         if (!folder.exists())
             throw new MailboxNotFoundException(mailboxPath);
-        return loadMailbox(folder.getRootFile(), mailboxPath);
+        return loadMailbox(session, folder.getRootFile(), mailboxPath);
     }
 
     /**
@@ -115,13 +115,13 @@ public class MaildirStore {
      * @return The Mailbox object populated with data from the file system
      * @throws MailboxException If the mailbox folder doesn't exist or can't 
be read
      */
-    private Mailbox<Integer> loadMailbox(File mailboxFile, MailboxPath 
mailboxPath) throws MailboxException {
+    private Mailbox<Integer> loadMailbox(MailboxSession session, File 
mailboxFile, MailboxPath mailboxPath) throws MailboxException {
         long uidValidity;
         long lastUid;
         MaildirFolder folder = new 
MaildirFolder(mailboxFile.getAbsolutePath(), mailboxPath, locker);
         try {
             uidValidity = folder.getUidValidity();
-            lastUid = folder.getLastUid();
+            lastUid = folder.getLastUid(session);
             return new MaildirMailbox(mailboxPath, uidValidity, lastUid, 
folder.getHighestModSeq());
 
         } catch (IOException e) {
@@ -239,7 +239,7 @@ public class MaildirStore {
      */
     public long nextUid(MailboxSession session, Mailbox<Integer> mailbox) 
throws MailboxException {
         try {
-            return createMaildirFolder(mailbox).getLastUid() +1;
+            return createMaildirFolder(mailbox).getLastUid(session) +1;
         } catch (MailboxException e) {
             throw new MailboxException("Unable to generate next uid", e);
         }

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
 Thu Jun 16 16:11:07 2011
@@ -85,7 +85,7 @@ public class MaildirMailboxMapper extend
      */
     public Mailbox<Integer> findMailboxByPath(MailboxPath mailboxPath)
             throws MailboxException, MailboxNotFoundException {      
-        Mailbox<Integer> mailbox = maildirStore.loadMailbox(mailboxPath);
+        Mailbox<Integer> mailbox = maildirStore.loadMailbox(session, 
mailboxPath);
         return cacheMailbox(mailbox);
     }
     
@@ -103,12 +103,12 @@ public class MaildirMailboxMapper extend
         ArrayList<Mailbox<Integer>> mailboxList = new 
ArrayList<Mailbox<Integer>>();
         for (File folder : folders)
             if (folder.isDirectory()) {
-                Mailbox<Integer> mailbox = maildirStore.loadMailbox(root, 
mailboxPath.getNamespace(), mailboxPath.getUser(), folder.getName());
+                Mailbox<Integer> mailbox = maildirStore.loadMailbox(session, 
root, mailboxPath.getNamespace(), mailboxPath.getUser(), folder.getName());
                 mailboxList.add(cacheMailbox(mailbox));
             }
         // INBOX is in the root of the folder
         if 
(Pattern.matches(mailboxPath.getName().replace(MaildirStore.WILDCARD, ".*"), 
MailboxConstants.INBOX)) {
-            Mailbox<Integer> mailbox = maildirStore.loadMailbox(root, 
mailboxPath.getNamespace(), mailboxPath.getUser(), "");
+            Mailbox<Integer> mailbox = maildirStore.loadMailbox(session, root, 
mailboxPath.getNamespace(), mailboxPath.getUser(), "");
             mailboxList.add(0, cacheMailbox(mailbox));
         }
         return mailboxList;
@@ -264,7 +264,7 @@ public class MaildirMailboxMapper extend
             
             // Special case for INBOX: Let's use the user's folder.
             MailboxPath inboxMailboxPath = new 
MailboxPath(session.getPersonalSpace(), userName, MailboxConstants.INBOX);
-            mailboxList.add(maildirStore.loadMailbox(inboxMailboxPath));
+            mailboxList.add(maildirStore.loadMailbox(session, 
inboxMailboxPath));
             
             // List all INBOX sub folders.
             
@@ -280,7 +280,7 @@ public class MaildirMailboxMapper extend
                 MailboxPath mailboxPath = new 
MailboxPath(MailboxConstants.USER_NAMESPACE, 
                         userName, 
                         mailbox.getName().substring(1));
-                mailboxList.add(maildirStore.loadMailbox(mailboxPath));
+                mailboxList.add(maildirStore.loadMailbox(session, 
mailboxPath));
 
             }
 

Modified: 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
 Thu Jun 16 16:11:07 2011
@@ -105,7 +105,7 @@ public class MaildirMessageMapper extend
     public void delete(Mailbox<Integer> mailbox, Message<Integer> message) 
throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            folder.delete(message.getUid());
+            folder.delete(mailboxSession, message.getUid());
         } catch (MailboxException e) {
             throw new MailboxException("Unable to delete Message " + message + 
" in Mailbox " + mailbox, e);
         }
@@ -153,7 +153,7 @@ public class MaildirMessageMapper extend
     throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            MaildirMessageName messageName = folder.getMessageNameByUid(uid);
+            MaildirMessageName messageName = 
folder.getMessageNameByUid(mailboxSession, uid);
         
              ArrayList<Message<Integer>> messages = new 
ArrayList<Message<Integer>>();
              if (messageName != null) {
@@ -172,9 +172,9 @@ public class MaildirMessageMapper extend
         SortedMap<Long, MaildirMessageName> uidMap = null;
         try {
             if (filter != null)
-                uidMap = folder.getUidMap(filter, from, to);
+                uidMap = folder.getUidMap(mailboxSession, filter, from, to);
             else
-                uidMap = folder.getUidMap(from, to);
+                uidMap = folder.getUidMap(mailboxSession, from, to);
             
             ArrayList<Message<Integer>> messages = new 
ArrayList<Message<Integer>>();
             for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) {
@@ -192,7 +192,7 @@ public class MaildirMessageMapper extend
             FilenameFilter filter, int limit) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            SortedMap<Long, MaildirMessageName> uidMap = 
folder.getUidMap(filter, limit);
+            SortedMap<Long, MaildirMessageName> uidMap = 
folder.getUidMap(mailboxSession, filter, limit);
             
             ArrayList<Message<Integer>> filtered = new 
ArrayList<Message<Integer>>(uidMap.size());
             for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet())
@@ -208,7 +208,7 @@ public class MaildirMessageMapper extend
             Mailbox<Integer> mailbox, long uid) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            MaildirMessageName messageName = folder.getMessageNameByUid(uid);
+            MaildirMessageName messageName = 
folder.getMessageNameByUid(mailboxSession, uid);
              ArrayList<Message<Integer>> messages = new 
ArrayList<Message<Integer>>();
              if (MaildirMessageName.FILTER_DELETED_MESSAGES.accept(null, 
messageName.getFullName())) {
                  messages.add(new LazyLoadingMaildirMessage(mailbox, uid, 
messageName));
@@ -229,7 +229,7 @@ public class MaildirMessageMapper extend
     throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            SortedMap<Long, MaildirMessageName> recentMessageNames = 
folder.getRecentMessages();
+            SortedMap<Long, MaildirMessageName> recentMessageNames = 
folder.getRecentMessages(mailboxSession);
             
             List<Message<Integer>> recentMessages = new 
ArrayList<Message<Integer>>(recentMessageNames.size());
             for (Entry<Long, MaildirMessageName> entry : 
recentMessageNames.entrySet())
@@ -301,7 +301,7 @@ public class MaildirMessageMapper extend
     protected long calculateLastUid(Mailbox<Integer> mailbox) throws 
MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            return folder.getLastUid();
+            return folder.getLastUid(mailboxSession);
         } catch (MailboxException e) {
             throw new MailboxException("Unable to get last uid for mailbox " + 
mailbox, e);
         }
@@ -429,7 +429,7 @@ public class MaildirMessageMapper extend
             throw new MailboxException("Failure while save Message " + message 
+ " in Mailbox " + mailbox, e);
         }
         try {
-            uid = folder.appendMessage(newMessageFile.getName());
+            uid = folder.appendMessage(mailboxSession, 
newMessageFile.getName());
             maildirMessage.setUid(uid);
             maildirMessage.setModSeq(newMessageFile.lastModified());
             return new SimpleMessageMetaData(message);
@@ -501,7 +501,7 @@ public class MaildirMessageMapper extend
 
                     try {
                         AbstractMaildirMessage maildirMessage = 
(AbstractMaildirMessage) member;
-                        MaildirMessageName messageName = 
folder.getMessageNameByUid(maildirMessage.getUid());
+                        MaildirMessageName messageName = 
folder.getMessageNameByUid(mailboxSession, maildirMessage.getUid());
                         File messageFile = messageName.getFile();
                         // System.out.println("save existing " + message +
                         // " as " + messageFile.getName());
@@ -533,7 +533,7 @@ public class MaildirMessageMapper extend
                         updatedFlags.add(new UpdatedFlags(member.getUid(), 
modSeq, originalFlags, newFlags));
 
                         long uid = maildirMessage.getUid();
-                        folder.update(uid, newMessageName);
+                        folder.update(mailboxSession, uid, newMessageName);
                     } catch (IOException e) {
                         throw new MailboxException("Failure while save Message 
" + member + " in Mailbox " + mailbox, e);
                     }

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
 Thu Jun 16 16:11:07 2011
@@ -28,12 +28,12 @@ public abstract class AbstractMailboxPat
 
     /*
      * (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)
+     * @see 
org.apache.james.mailbox.MailboxPathLocker#executeWithLock(org.apache.james.mailbox.MailboxSession,
 org.apache.james.mailbox.MailboxPath, 
org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution)
      */
-    public void executeWithLock(MailboxSession session, MailboxPath path, 
LockAwareExecution execution) throws MailboxException {
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, 
LockAwareExecution<T> execution) throws MailboxException {
         try {
             lock(session, path);
-            execution.execute(session, path);
+            return execution.execute();
         } finally {
             unlock(session, path);
         }

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
 Thu Jun 16 16:11:07 2011
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store;
 
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.james.mailbox.MailboxException;
@@ -36,7 +37,7 @@ import org.apache.james.mailbox.MailboxS
  */
 public final class JVMMailboxPathLocker extends AbstractMailboxPathLocker {
 
-    private final ConcurrentHashMap<MailboxPath, ReentrantLock> paths = new 
ConcurrentHashMap<MailboxPath, ReentrantLock>();
+    private final ConcurrentHashMap<MailboxPath, Lock> paths = new 
ConcurrentHashMap<MailboxPath, Lock>();
 
 
     /*
@@ -44,10 +45,10 @@ public final class JVMMailboxPathLocker 
      * @see 
org.apache.james.mailbox.store.AbstractMailboxPathLocker#lock(org.apache.james.mailbox.MailboxSession,
 org.apache.james.mailbox.MailboxPath)
      */
     protected void lock(MailboxSession session, MailboxPath path) throws 
MailboxException {
-        ReentrantLock lock = paths.get(path);
+        Lock lock = paths.get(path);
         if (lock == null) {
             lock = new ReentrantLock();
-            ReentrantLock storedLock = paths.putIfAbsent(path, lock);
+            Lock storedLock = paths.putIfAbsent(path, lock);
             if (storedLock != null) {
                 lock = storedLock;
             }
@@ -60,7 +61,7 @@ public final class JVMMailboxPathLocker 
      * @see 
org.apache.james.mailbox.store.AbstractMailboxPathLocker#unlock(org.apache.james.mailbox.MailboxSession,
 org.apache.james.mailbox.MailboxPath)
      */
     protected void unlock(MailboxSession session, MailboxPath path) throws 
MailboxException {
-        ReentrantLock lock = paths.get(path);
+        Lock lock = paths.get(path);
         
         if (lock != null) {
             lock.unlock();

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1136515&r1=1136514&r2=1136515&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 Thu Jun 16 16:11:07 2011
@@ -276,12 +276,12 @@ public abstract class StoreMailboxManage
             // TODO: transaction
             for (final MailboxPath mailbox : 
mailboxPath.getHierarchyLevels(getDelimiter()))
 
-                locker.executeWithLock(mailboxSession, mailbox, new 
LockAwareExecution() {
+                locker.executeWithLock(mailboxSession, mailbox, new 
LockAwareExecution<Void>() {
 
-                    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);
+                    public Void execute() throws MailboxException {
+                        if (!mailboxExists(mailbox, mailboxSession)) {
+                            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 {
@@ -291,8 +291,10 @@ public abstract class StoreMailboxManage
                             });
                             
                             // notify listeners
-                            dispatcher.mailboxAdded(session, m);
+                            dispatcher.mailboxAdded(mailboxSession, m);
                         }
+                        return null;
+
                     }
                 });
 
@@ -418,9 +420,9 @@ public abstract class StoreMailboxManage
 
                 // rename submailboxes
                 final MailboxPath children = new 
MailboxPath(MailboxConstants.USER_NAMESPACE, from.getUser(), from.getName() + 
getDelimiter() + "%");
-                locker.executeWithLock(session, children, new 
LockAwareExecution() {
+                locker.executeWithLock(session, children, new 
LockAwareExecution<Void>() {
                     
-                    public void execute(MailboxSession session, MailboxPath 
children) throws MailboxException {
+                    public Void execute() throws MailboxException {
                         final List<Mailbox<Id>> subMailboxes = 
mapper.findMailboxWithPathLike(children);
                         for (Mailbox<Id> sub : subMailboxes) {
                             final String subOriginalName = sub.getName();
@@ -433,6 +435,8 @@ public abstract class StoreMailboxManage
                             if (log.isDebugEnabled())
                                 log.debug("Rename mailbox sub-mailbox " + 
subOriginalName + " to " + subNewName);
                         }
+                        return null;
+
                     }
                 });
     



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

Reply via email to