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]