Author: norman
Date: Mon Feb  7 11:17:35 2011
New Revision: 1067916

URL: http://svn.apache.org/viewvc?rev=1067916&view=rev
Log:
Make sure the UidToMsnConverter is disposed when no references on it exist. See 
IMAP-255

Modified:
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java?rev=1067916&r1=1067915&r2=1067916&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
 Mon Feb  7 11:17:35 2011
@@ -84,6 +84,7 @@ abstract class AbstractSelectionProcesso
             responder.respond(statusResponseFactory.taggedNo(tag, command,
                     HumanReadableText.FAILURE_NO_SUCH_MAILBOX));
         } catch (MailboxException e) {
+            e.printStackTrace();
             no(command, tag, responder, HumanReadableText.SELECT);
         }
     }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java?rev=1067916&r1=1067915&r2=1067916&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
 Mon Feb  7 11:17:35 2011
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.MailboxL
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.SearchQuery;
 
 /**
@@ -59,6 +58,8 @@ public class UidToMsnConverter {
 
     // hold the reference count for a shared UidToMsnConverter
     private AtomicInteger references = new AtomicInteger(0);
+
+    private MailboxPath path;
     
     /**
      * Return a instance of the {@link UidToMsnConverter} which can be a new 
one or a shared if there is already a {@link UidToMsnConverter} for the given
@@ -90,7 +91,7 @@ public class UidToMsnConverter {
             final UidToMsnConverter c = converter;
             // the converter was not found before so we need to init it to get 
a list of all uids
             if (!found) {
-                converter.init(manager.getMailbox(path, session), session);
+                converter.init(manager, path, session);
                 manager.addListener(path, new MailboxListener() {
                     
                     /*
@@ -129,15 +130,15 @@ public class UidToMsnConverter {
     private UidToMsnConverter() {
     }
 
-    private void init(MessageManager mailbox, MailboxSession mailboxSession) 
throws MailboxException {
+    private void init(MailboxManager manager, MailboxPath path, MailboxSession 
mailboxSession) throws MailboxException {
+       
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
         // use search here to allow implementation a better way to improve
         // selects on mailboxes.
         // See https://issues.apache.org/jira/browse/IMAP-192
-        final Iterator<Long> uids = mailbox.search(query, mailboxSession);
-
+        final Iterator<Long> uids = manager.getMailbox(path, 
mailboxSession).search(query, mailboxSession);
         msnToUid = new TreeMap<Integer, Long>();
         uidToMsn = new TreeMap<Long, Integer>();
         if (uids != null) {
@@ -153,6 +154,7 @@ public class UidToMsnConverter {
             }
 
         }
+        this.path = path;
     }
 
     /**
@@ -256,11 +258,16 @@ public class UidToMsnConverter {
     /**
      * Close this {@link MailboxListener} and dispose all stored stuff 
      */
-    public synchronized void close() {
-        if (references.incrementAndGet() == 0) {
-            uidToMsn.clear();
-            msnToUid.clear();
+    public void close() {
+        // check if we can clear all resources which are wired with this 
UidToMsnConverter
+        synchronized (converters) {
+            if (references.decrementAndGet() == 0) {
+                converters.remove(path);
+                uidToMsn.clear();
+                msnToUid.clear();
+            }
         }
+        
     }
     
 



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

Reply via email to