Author: rdonkin
Date: Sat Jun  6 06:38:15 2009
New Revision: 782193

URL: http://svn.apache.org/viewvc?rev=782193&view=rev
Log:
IMAP-98 Switch from old concurrent utils to Java 1.5.  
https://issues.apache.org/jira/browse/IMAP-98

Added:
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
   (with props)
Removed:
    james/imap/trunk/stage/concurrent/
Modified:
    james/imap/trunk/build-tools/common-build.xml
    james/imap/trunk/include.properties
    james/imap/trunk/mailbox/pom.xml
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
    james/imap/trunk/parent/pom.xml
    james/imap/trunk/seda/pom.xml
    james/imap/trunk/torque/pom.xml
    
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
    
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java

Modified: james/imap/trunk/build-tools/common-build.xml
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/build-tools/common-build.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/build-tools/common-build.xml (original)
+++ james/imap/trunk/build-tools/common-build.xml Sat Jun  6 06:38:15 2009
@@ -179,7 +179,6 @@
                     <include name="${javax-activation.jar}"/>
                     <include name="${commons-logging.jar}"/>
                     <include name="${commons-lang.jar}"/>
-                    <include name="${concurrent.jar}"/>  
                     <include name="${mime4j.jar}"/>     
                     <include name="${log4j.jar}"/>       
                 </fileset> 

Modified: james/imap/trunk/include.properties
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/include.properties?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/include.properties (original)
+++ james/imap/trunk/include.properties Sat Jun  6 06:38:15 2009
@@ -57,7 +57,6 @@
 path.lib.commonsio=commons-io/jars
 path.lib.derby=org.apache.derby/jars
 path.lib.torque=org.apache.torque/jars
-path.lib.concurrent=concurrent/jars
 path.lib.commonslogging=commons-logging/jars
 path.lib.village=org.apache.torque/jars
 path.lib.commonsconfiguration=commons-configuration/jars
@@ -109,9 +108,6 @@
 jarname.commons-collections.jar=commons-collections-3.1.jar
 
commons-collections.jar=${path.lib.commonscollections}/${jarname.commons-collections.jar}
 
-jarname.concurrent.jar=concurrent-1.3.4.jar
-concurrent.jar=${path.lib.concurrent}/${jarname.concurrent.jar}
-
 jarname.derby.jar=derby-10.2.2.0.jar
 derby.jar=${path.lib.derby}/${jarname.derby.jar}
 

Modified: james/imap/trunk/mailbox/pom.xml
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/mailbox/pom.xml (original)
+++ james/imap/trunk/mailbox/pom.xml Sat Jun  6 06:38:15 2009
@@ -38,13 +38,7 @@
       <groupId>org.apache.james</groupId>
       <artifactId>apache-james-imap-api</artifactId>
     </dependency>
-
-    <dependency>
-      <groupId>concurrent</groupId>
-      <artifactId>concurrent</artifactId>
-      <!--  <scope>runtime</scope> -->
-    </dependency>
-
+    
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>

Added: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java?rev=782193&view=auto
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
 (added)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
 Sat Jun  6 06:38:15 2009
@@ -0,0 +1,55 @@
+/****************************************************************
+ * 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.imap.mailbox;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+import org.apache.james.imap.api.display.HumanReadableText;
+
+/**
+ * Indicates that required locks cannot be acquired at this time.
+ */
+public class LockException extends MailboxException {
+
+    private static final long serialVersionUID = 698379731076300030L;
+
+    public LockException(HumanReadableText key, String message) {
+        super(key, message);
+    }
+
+    public LockException(HumanReadableText key) {
+        super(key);}
+
+    public LockException(HumanReadableText key, Exception cause) {
+        super(key, cause);
+    }
+
+    public static void tryLock(final Lock lock, final int timeoutInSeconds) 
throws LockException {
+        try {
+            if (!lock.tryLock(timeoutInSeconds, TimeUnit.SECONDS)) {
+                throw new LockException(HumanReadableText.LOCK_FAILED);
+            }
+        } catch (InterruptedException e) {
+            throw new LockException(HumanReadableText.LOCK_FAILED, e);
+        }
+    }
+
+}

Propchange: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/LockException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
 (original)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxException.java
 Sat Jun  6 06:38:15 2009
@@ -40,9 +40,8 @@
         this.key = key;
     }
 
-    public MailboxException(final HumanReadableText key, Throwable cause) {
-        super(key.getDefaultValue());
-        initCause(cause);
+    public MailboxException(final HumanReadableText key, Exception cause) {
+        super(key.getDefaultValue(), cause);
         this.key = key;
     }
 

Modified: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
 (original)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/StorageException.java
 Sat Jun  6 06:38:15 2009
@@ -28,7 +28,7 @@
 
     private static final long serialVersionUID = 2708951014093934093L;
 
-    public StorageException(HumanReadableText key, Throwable cause) {
+    public StorageException(HumanReadableText key, Exception cause) {
         super(key, cause);
     }
 }

Modified: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
 (original)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/SubscriptionException.java
 Sat Jun  6 06:38:15 2009
@@ -32,7 +32,7 @@
         super(key);
     }
 
-    public SubscriptionException(final HumanReadableText key, Throwable cause) 
{
+    public SubscriptionException(final HumanReadableText key, Exception cause) 
{
         super(key, cause);
     }
 }

Modified: james/imap/trunk/parent/pom.xml
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/parent/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/parent/pom.xml (original)
+++ james/imap/trunk/parent/pom.xml Sat Jun  6 06:38:15 2009
@@ -424,14 +424,8 @@
       </dependency>
       <!-- 
         END Commons
-      -->
-
-      <dependency>
-        <groupId>concurrent</groupId>
-        <artifactId>concurrent</artifactId>
-        <version>1.3.4</version>
-      </dependency>
-
+      -->
+      
       <!--
         START Testing
       -->

Modified: james/imap/trunk/seda/pom.xml
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/seda/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/seda/pom.xml (original)
+++ james/imap/trunk/seda/pom.xml Sat Jun  6 06:38:15 2009
@@ -41,10 +41,7 @@
       <groupId>org.apache.james</groupId>
       <artifactId>apache-james-imap-decode</artifactId>
     </dependency>
-    <dependency>
-      <groupId>concurrent</groupId>
-      <artifactId>concurrent</artifactId>
-    </dependency>
+
     <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>

Modified: james/imap/trunk/torque/pom.xml
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/torque/pom.xml?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- james/imap/trunk/torque/pom.xml (original)
+++ james/imap/trunk/torque/pom.xml Sat Jun  6 06:38:15 2009
@@ -64,10 +64,7 @@
       <groupId>org.apache.torque</groupId>
       <artifactId>village</artifactId>
     </dependency>
-    <dependency>
-      <groupId>concurrent</groupId>
-      <artifactId>concurrent</artifactId>
-    </dependency>
+
     <dependency>
       <groupId>commons-collections</groupId>
       <artifactId>commons-collections</artifactId>

Modified: 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 (original)
+++ 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 Sat Jun  6 06:38:15 2009
@@ -36,12 +36,14 @@
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.mailbox.LockException;
 import org.apache.james.imap.mailbox.Mailbox;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxListener;
@@ -69,23 +71,23 @@
 import org.apache.torque.TorqueException;
 import org.apache.torque.util.Criteria;
 
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
-
 import com.workingdogs.village.DataSetException;
 
 public class TorqueMailbox implements Mailbox {
 
+    private static final int LOCK_TIMEOUT = 10;
+
     private boolean open = true;
 
     private MailboxRow mailboxRow;
 
     private final UidChangeTracker tracker;
 
-    private final ReadWriteLock lock;
+    private final ReentrantReadWriteLock lock;
 
     private final MessageSearches searches;
 
-    TorqueMailbox(final MailboxRow mailboxRow, final ReadWriteLock lock) {
+    TorqueMailbox(final MailboxRow mailboxRow, final ReentrantReadWriteLock 
lock) {
         this.searches = new MessageSearches();
         this.mailboxRow = mailboxRow;
         this.tracker = new UidChangeTracker(mailboxRow.getLastUid());
@@ -98,27 +100,33 @@
     }
 
     public int getMessageCount(MailboxSession mailboxSession)
-            throws MailboxException {
+    throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
+            checkAccess();
             try {
-                checkAccess();
-                try {
-                    return getMailboxRow().countMessages();
-                } catch (Exception e) {
-                    throw new MailboxException(HumanReadableText.COUNT_FAILED, 
e);
-                }
-            } finally {
-                lock.readLock().release();
+                return getMailboxRow().countMessages();
+            } catch (Exception e) {
+                throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
+    private void lockForWriting() throws LockException {
+        if (!lock.isWriteLockedByCurrentThread()) {
+            LockException.tryLock(this.lock.writeLock(), LOCK_TIMEOUT);
+        }
+    }
+
+    private void lockForReading() throws LockException {
+        LockException.tryLock(lock.readLock(), LOCK_TIMEOUT);
+    }
+
     public long appendMessage(byte[] message, Date internalDate,
             MailboxSession mailboxSession, boolean isRecent, Flags flags)
-            throws MailboxException {
+    throws MailboxException {
 
         try {
             checkAccess();
@@ -178,20 +186,20 @@
     }
 
     private void populateFlags(MimeMessage message, MessageRow messageRow)
-            throws MessagingException, TorqueException {
+    throws MessagingException, TorqueException {
         final Flags flags = message.getFlags();
         buildFlags(messageRow, flags);
     }
 
     private void buildFlags(MessageRow messageRow, final Flags flags)
-            throws TorqueException {
+    throws TorqueException {
         MessageFlags messageFlags = new MessageFlags();
         messageFlags.setFlags(flags);
         messageRow.addMessageFlags(messageFlags);
     }
 
     private MessageBody populateBody(MimeMessage message) throws IOException,
-            MessagingException {
+    MessagingException {
         MessageBody mb = new MessageBody();
 
         InputStream is = message.getInputStream();
@@ -202,11 +210,11 @@
     }
 
     private void addHeaders(MimeMessage message, MessageRow messageRow)
-            throws MessagingException, TorqueException {
+    throws MessagingException, TorqueException {
         int line_number = 0;
 
         for (Enumeration lines = message.getAllHeaderLines(); lines
-                .hasMoreElements();) {
+        .hasMoreElements();) {
             String line = (String) lines.nextElement();
             int colon = line.indexOf(": ");
             if (colon > 0) {
@@ -222,7 +230,7 @@
     }
 
     private int size(MimeMessage message) throws IOException,
-            MessagingException {
+    MessagingException {
         // TODO very ugly size mesurement
         ByteArrayOutputStream sizeBos = new ByteArrayOutputStream();
         message.writeTo(new CRLFOutputStream(sizeBos));
@@ -230,34 +238,39 @@
         return size;
     }
 
-    private void save(MessageRow messageRow) throws TorqueException,
-            InterruptedException {
+    private void save(MessageRow messageRow) throws TorqueException, 
LockException {
         try {
-            lock.writeLock().acquire();
+            lockForWriting();
             messageRow.save();
         } finally {
-            lock.writeLock().release();
+            unlockAfterWriting();
         }
     }
 
     private MailboxRow reserveNextUid() throws InterruptedException,
-            MailboxException {
+    MailboxException {
         final MailboxRow myMailboxRow;
         try {
-            lock.writeLock().acquire();
+            lockForWriting();
             myMailboxRow = getMailboxRow().consumeNextUid();
         } catch (TorqueException e) {
             throw new MailboxException(HumanReadableText.COMSUME_UID_FAILED, 
e);
         } catch (SQLException e) {
             throw new MailboxException(HumanReadableText.COMSUME_UID_FAILED, 
e);
         } finally {
-            lock.writeLock().release();
+            unlockAfterWriting();
         }
         return myMailboxRow;
     }
 
+    private void unlockAfterWriting() {
+        if (lock.isWriteLockedByCurrentThread()) {
+            lock.writeLock().unlock();
+        }
+    }
+
     private Criteria criteriaForMessageSet(MessageRange set)
-            throws MailboxException {
+    throws MailboxException {
         Criteria criteria = new Criteria();
         criteria.addAscendingOrderByColumn(MessageRowPeer.UID);
         switch (set.getType()) {
@@ -286,26 +299,22 @@
 
     public Iterator getMessages(final MessageRange set, FetchGroup fetchGroup,
             MailboxSession mailboxSession) throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
+            checkAccess();
+            UidRange range = uidRangeForMessageSet(set);
             try {
-                checkAccess();
-                UidRange range = uidRangeForMessageSet(set);
-                try {
-                    Criteria c = criteriaForMessageSet(set);
-                    c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
-                            .getMailboxId());
-                    return getMessages(fetchGroup, range, c);
-                } catch (TorqueException e) {
-                    throw new 
MailboxException(HumanReadableText.SEARCH_FAILED, e);
-                } catch (MessagingException e) {
-                    throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
-                }
-            } finally {
-                lock.readLock().release();
+                Criteria c = criteriaForMessageSet(set);
+                c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
+                        .getMailboxId());
+                return getMessages(fetchGroup, range, c);
+            } catch (TorqueException e) {
+                throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+            } catch (MessagingException e) {
+                throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
@@ -324,7 +333,7 @@
     }
 
     private TorqueResultIterator getResults(FetchGroup result, List rows)
-            throws TorqueException {
+    throws TorqueException {
         Collections.sort(rows, MessageRowUtils.getUidComparator());
         final TorqueResultIterator results = new TorqueResultIterator(rows,
                 result);
@@ -332,7 +341,7 @@
     }
 
     private static UidRange uidRangeForMessageSet(MessageRange set)
-            throws MailboxException {
+    throws MailboxException {
         if (set.getType().equals(MessageRange.Type.ALL)) {
             return new UidRange(1, -1);
         } else {
@@ -357,34 +366,29 @@
     }
 
     public long[] recent(boolean reset, MailboxSession mailboxSession)
-            throws MailboxException {
+    throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
-            try {
-                checkAccess();
-                final Criteria criterion = queryRecentFlagSet();
-                final List messageRows = getMailboxRow().getMessageRows(
-                        criterion);
-                final long[] results = new long[messageRows.size()];
-                int count = 0;
-                for (Iterator it = messageRows.iterator(); it.hasNext();) {
-                    final MessageRow row = (MessageRow) it.next();
-                    results[count++] = row.getUid();
-                }
+            checkAccess();
+            final Criteria criterion = queryRecentFlagSet();
+            final List messageRows = getMailboxRow().getMessageRows(
+                    criterion);
+            final long[] results = new long[messageRows.size()];
+            int count = 0;
+            for (Iterator it = messageRows.iterator(); it.hasNext();) {
+                final MessageRow row = (MessageRow) it.next();
+                results[count++] = row.getUid();
+            }
 
-                if (reset) {
-                    getMailboxRow().resetRecent();
-                }
-                return results;
-            } catch (TorqueException e) {
-                throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
-            } finally {
-                lock.readLock().release();
+            if (reset) {
+                getMailboxRow().resetRecent();
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+            return results;
+        } catch (TorqueException e) {
+            throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
-
     }
 
     private Criteria queryRecentFlagSet() {
@@ -399,89 +403,76 @@
     }
 
     public Long getFirstUnseen(MailboxSession mailboxSession) throws 
MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
-            try {
-                checkAccess();
-                Criteria c = new Criteria();
-                c.addAscendingOrderByColumn(MessageRowPeer.UID);
-                c.setLimit(1);
-                c.setSingleRecord(true);
-
-                c.addJoin(MessageFlagsPeer.MAILBOX_ID,
-                        MessageRowPeer.MAILBOX_ID);
-                c.addJoin(MessageRowPeer.UID, MessageFlagsPeer.UID);
+            checkAccess();
+            Criteria c = new Criteria();
+            c.addAscendingOrderByColumn(MessageRowPeer.UID);
+            c.setLimit(1);
+            c.setSingleRecord(true);
 
-                MessageFlagsPeer.addFlagsToCriteria(new Flags(Flags.Flag.SEEN),
-                        false, c);
+            c.addJoin(MessageFlagsPeer.MAILBOX_ID,
+                    MessageRowPeer.MAILBOX_ID);
+            c.addJoin(MessageRowPeer.UID, MessageFlagsPeer.UID);
 
-                try {
-                    List messageRows = getMailboxRow().getMessageRows(c);
-                    if (messageRows.size() > 0) {
-                        MessageResult messageResult = fillMessageResult(
-                                (MessageRow) messageRows.get(0), 
FetchGroupImpl.MINIMAL);
-                        if (messageResult != null) {
-                            
getUidChangeTracker().found(messageResult.getUid(), messageResult.getFlags());
-                        }
+            MessageFlagsPeer.addFlagsToCriteria(new Flags(Flags.Flag.SEEN),
+                    false, c);
 
-                        return messageResult.getUid();
-                    } else {
-                        return null;
+            try {
+                List messageRows = getMailboxRow().getMessageRows(c);
+                if (messageRows.size() > 0) {
+                    MessageResult messageResult = fillMessageResult(
+                            (MessageRow) messageRows.get(0), 
FetchGroupImpl.MINIMAL);
+                    if (messageResult != null) {
+                        getUidChangeTracker().found(messageResult.getUid(), 
messageResult.getFlags());
                     }
-                } catch (TorqueException e) {
-                    throw new 
MailboxException(HumanReadableText.SEARCH_FAILED, e);
-                } catch (MessagingException e) {
-                    throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
-                } catch (MimeException e) {
-                    throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
+
+                    return messageResult.getUid();
+                } else {
+                    return null;
                 }
-            } finally {
-                lock.readLock().release();
+            } catch (TorqueException e) {
+                throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+            } catch (MessagingException e) {
+                throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
+            } catch (MimeException e) {
+                throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
     public int getUnseenCount(MailboxSession mailboxSession)
-            throws MailboxException {
+    throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
+            checkAccess();
             try {
-                checkAccess();
-                try {
-                    final int count = getMailboxRow().countMessages(
-                            new Flags(Flags.Flag.SEEN), false);
-                    return count;
-                } catch (TorqueException e) {
-                    throw new MailboxException(HumanReadableText.COUNT_FAILED, 
e);
-                } catch (DataSetException e) {
-                    throw new MailboxException(HumanReadableText.COUNT_FAILED, 
e);
-                }
-            } finally {
-                lock.readLock().release();
+                final int count = getMailboxRow().countMessages(
+                        new Flags(Flags.Flag.SEEN), false);
+                return count;
+            } catch (TorqueException e) {
+                throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
+            } catch (DataSetException e) {
+                throw new MailboxException(HumanReadableText.COUNT_FAILED, e);
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
     public Iterator<Long> expunge(MessageRange set, MailboxSession 
mailboxSession) throws MailboxException {
+        lockForWriting();
         try {
-            lock.writeLock().acquire();
-            try {
-                return doExpunge(set);
-            } finally {
-                lock.writeLock().release();
-            }
-
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+            return doExpunge(set);
+        } finally {
+            unlockAfterWriting();
         }
     }
 
     private Iterator<Long> doExpunge(final MessageRange set)
-            throws MailboxException {
+    throws MailboxException {
         checkAccess();
         try {
             // TODO put this into a serializable transaction
@@ -499,8 +490,8 @@
                 uids.add(messageRow.getUid());
                 Criteria todelc = new Criteria();
                 todelc
-                        .add(MessageRowPeer.MAILBOX_ID, messageRow
-                                .getMailboxId());
+                .add(MessageRowPeer.MAILBOX_ID, messageRow
+                        .getMailboxId());
                 todelc.add(MessageRowPeer.UID, messageRow.getUid());
                 MessageRowPeer.doDelete(todelc);
             }
@@ -513,16 +504,11 @@
 
     public Map<Long, Flags> setFlags(Flags flags, boolean value, boolean 
replace,
             MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
+        lockForWriting();
         try {
-            lock.writeLock().acquire();
-            try {
-                return doSetFlags(flags, value, replace, set, mailboxSession);
-            } finally {
-                lock.writeLock().release();
-            }
-
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+            return doSetFlags(flags, value, replace, set, mailboxSession);
+        } finally {
+            unlockAfterWriting();
         }
     }
 
@@ -562,58 +548,47 @@
     }
 
     public void addListener(MailboxListener listener)
-            throws MailboxException {
+    throws MailboxException {
         checkAccess();
         tracker.addMailboxListener(listener);
     }
 
     public long getUidValidity(MailboxSession mailboxSession)
-            throws MailboxException {
+    throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
-            try {
-                checkAccess();
-                final long result = getMailboxRow().getUidValidity();
-                return result;
-            } finally {
-                lock.readLock().release();
-            }
-
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+            checkAccess();
+            final long result = getMailboxRow().getUidValidity();
+            return result;
+        } finally {
+            unlockAfterReading();
         }
-
     }
 
     public long getUidNext(MailboxSession mailboxSession)
-            throws MailboxException {
+    throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
+            checkAccess();
             try {
-                checkAccess();
-                try {
-                    MailboxRow myMailboxRow = MailboxRowPeer
-                            .retrieveByPK(mailboxRow.getPrimaryKey());
-                    if (myMailboxRow != null) {
-                        mailboxRow = myMailboxRow;
-                        final long lastUid = mailboxRow.getLastUid();
-                        return lastUid + 1;
-                    } else {
-                        throw new 
MailboxException(HumanReadableText.MAILBOX_DELETED);
-                    }
-                } catch (NoRowsException e) {
-                    throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
-                } catch (TooManyRowsException e) {
-                    throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
-                } catch (TorqueException e) {
-                    throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
-                }
-            } finally {
-                lock.readLock().release();
+                MailboxRow myMailboxRow = MailboxRowPeer
+                .retrieveByPK(mailboxRow.getPrimaryKey());
+                if (myMailboxRow != null) {
+                    mailboxRow = myMailboxRow;
+                    final long lastUid = mailboxRow.getLastUid();
+                    return lastUid + 1;
+                } else {
+                    throw new 
MailboxException(HumanReadableText.MAILBOX_DELETED);
+                }
+            } catch (NoRowsException e) {
+                throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
+            } catch (TooManyRowsException e) {
+                throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
+            } catch (TorqueException e) {
+                throw new 
MailboxException(HumanReadableText.COMSUME_UID_FAILED, e);
             }
-
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
@@ -636,41 +611,37 @@
     }
 
     public Iterator<Long> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
+        lockForReading();
         try {
-            lock.readLock().acquire();
-            try {
-                checkAccess();
+            checkAccess();
 
-                final Criteria criterion = preSelect(query);
-                final List rows = MessageRowPeer
-                        .doSelectJoinMessageFlags(criterion);
-                final Set<Long> uids = new TreeSet<Long>();
-                for (Iterator it = rows.iterator(); it.hasNext();) {
-                    final MessageRow row = (MessageRow) it.next();
-                    try {
-                        if (searches.isMatch(query, row)) {
-                            uids.add(row.getUid());
-                        }
-                    } catch (TorqueException e) {
-                        mailboxSession.getLog()
-                                .info(
-                                        "Cannot test message against search 
criteria. Will continue to test other messages.",
-                                        e);
-                        if (mailboxSession.getLog().isDebugEnabled())
-                            mailboxSession.getLog().debug("UID: " + 
row.getUid());
+            final Criteria criterion = preSelect(query);
+            final List rows = MessageRowPeer
+            .doSelectJoinMessageFlags(criterion);
+            final Set<Long> uids = new TreeSet<Long>();
+            for (Iterator it = rows.iterator(); it.hasNext();) {
+                final MessageRow row = (MessageRow) it.next();
+                try {
+                    if (searches.isMatch(query, row)) {
+                        uids.add(row.getUid());
                     }
+                } catch (TorqueException e) {
+                    mailboxSession.getLog()
+                    .info(
+                            "Cannot test message against search criteria. Will 
continue to test other messages.",
+                            e);
+                    if (mailboxSession.getLog().isDebugEnabled())
+                        mailboxSession.getLog().debug("UID: " + row.getUid());
                 }
-
-                return uids.iterator();
-            } catch (TorqueException e) {
-                throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
-            } catch (MimeException e) {
-                throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
-            } finally {
-                lock.readLock().release();
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+
+            return uids.iterator();
+        } catch (TorqueException e) {
+            throw new MailboxException(HumanReadableText.SEARCH_FAILED, e);
+        } catch (MimeException e) {
+            throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, 
e);
+        } finally {
+            unlockAfterReading();
         }
     }
 
@@ -700,12 +671,12 @@
                 results.add(MessageRowPeer.UID, low);
             } else {
                 final Criteria.Criterion fromCriterion = results
-                        .getNewCriterion(MessageRowPeer.UID, new Long(low),
-                                Criteria.GREATER_EQUAL);
+                .getNewCriterion(MessageRowPeer.UID, new Long(low),
+                        Criteria.GREATER_EQUAL);
                 if (high > 0 && high < Long.MAX_VALUE) {
                     final Criteria.Criterion toCriterion = results
-                            .getNewCriterion(MessageRowPeer.UID,
-                                    new Long(high), Criteria.LESS_EQUAL);
+                    .getNewCriterion(MessageRowPeer.UID,
+                            new Long(high), Criteria.LESS_EQUAL);
                     fromCriterion.and(toCriterion);
                 }
                 results.add(fromCriterion);
@@ -719,31 +690,38 @@
 
     public void copyTo(MessageRange set, TorqueMailbox toMailbox,
             MailboxSession session) throws MailboxException {
+        final List rows;
+        lockForReading();
         try {
-            lock.readLock().acquire();
+            checkAccess();
             try {
-                checkAccess();
-                try {
-                    Criteria c = criteriaForMessageSet(set);
-                    c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
-                            .getMailboxId());
-                    List rows = MessageRowPeer.doSelectJoinMessageFlags(c);
-                    toMailbox.copy(rows, session);
-                } catch (TorqueException e) {
-                    throw new MailboxException(HumanReadableText.SAVE_FAILED, 
e);
-                } catch (MessagingException e) {
-                    throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
-                }
-            } finally {
-                lock.readLock().release();
+                final Criteria c = criteriaForMessageSet(set);
+                c.add(MessageFlagsPeer.MAILBOX_ID, getMailboxRow()
+                        .getMailboxId());
+                rows = MessageRowPeer.doSelectJoinMessageFlags(c);
+                
+            } catch (TorqueException e) {
+                throw new MailboxException(HumanReadableText.SAVE_FAILED, e);
+            } catch (MessagingException e) {
+                throw new 
MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, e);
             }
-        } catch (InterruptedException e) {
-            throw new MailboxException(HumanReadableText.LOCK_FAILED, e);
+        } finally {
+            unlockAfterReading();
+        }
+        // Release read lock before copying
+        toMailbox.copy(rows, session);
+    }
+
+    private void unlockAfterReading() {
+        try {
+            lock.readLock().unlock();
+        } catch (RuntimeException e) {
+            // Swallow
         }
     }
 
     private void copy(List rows, MailboxSession session)
-            throws MailboxException {
+    throws MailboxException {
         try {
             for (Iterator iter = rows.iterator(); iter.hasNext();) {
                 MessageRow fromRow = (MessageRow) iter.next();
@@ -771,9 +749,9 @@
 
                     final List headers = fromRow.getMessageHeaders();
                     for (Iterator iterator = headers.iterator(); iterator
-                            .hasNext();) {
+                    .hasNext();) {
                         final MessageHeader fromHeader = (MessageHeader) 
iterator
-                                .next();
+                        .next();
                         final MessageHeader newHeader = new MessageHeader(
                                 fromHeader.getField(), fromHeader.getValue(),
                                 fromHeader.getLineNumber());
@@ -831,10 +809,10 @@
                 break;
             default:
                 firstUnseen = null;
-                unseenCount = 0;
-                break;
+            unseenCount = 0;
+            break;
         }
-            
+
         return new MailboxMetaData(recent, permanentFlags, uidValidity, 
uidNext, messageCount, unseenCount, firstUnseen, isWriteable());
     }
 }

Modified: 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java?rev=782193&r1=782192&r2=782193&view=diff
==============================================================================
--- 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
 (original)
+++ 
james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
 Sat Jun  6 06:38:15 2009
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -53,9 +54,6 @@
 import org.apache.torque.util.CountHelper;
 import org.apache.torque.util.Criteria;
 
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
-import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;
-
 public class TorqueMailboxManager implements MailboxManager {
 
     public static final String USER_NAMESPACE_PREFIX = "#mail";
@@ -66,7 +64,7 @@
 
     protected Log log = LogFactory.getLog(TorqueMailboxManager.class);
 
-    private final ReadWriteLock lock;
+    private final ReentrantReadWriteLock lock;
 
     private final Map<String, TorqueMailbox> mailboxes;
 
@@ -79,7 +77,7 @@
     }
     
     public TorqueMailboxManager(final UserManager userManager, final char 
delimiter) {
-        this.lock = new ReentrantWriterPreferenceReadWriteLock();
+        this.lock = new ReentrantReadWriteLock();
         mailboxes = new HashMap<String, TorqueMailbox>();
         this.userManager = userManager;
         this.delimiter = delimiter;



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

Reply via email to