You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/10/15 13:41:03 UTC
svn commit: r1022887 - in /james/imap/trunk:
mailbox/src/main/java/org/apache/james/mailbox/
mailbox/src/main/java/org/apache/james/mailbox/util/
processor/src/main/java/org/apache/james/imap/processor/base/
store/src/main/java/org/apache/james/mailbox...
Author: norman
Date: Fri Oct 15 11:41:02 2010
New Revision: 1022887
URL: http://svn.apache.org/viewvc?rev=1022887&view=rev
Log:
Make sure we clear up resources in UidToMsnConverter and MailboxEventAnalyser once they are closed (IMAP-222)
Modified:
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MailboxListener.java
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/LastUidTracker.java
Modified: james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MailboxListener.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MailboxListener.java?rev=1022887&r1=1022886&r2=1022887&view=diff
==============================================================================
--- james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MailboxListener.java (original)
+++ james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MailboxListener.java Fri Oct 15 11:41:02 2010
@@ -41,7 +41,10 @@ public interface MailboxListener {
/**
* Is this listener closed?
- * Closed listeners may be unsubscribed.
+ * Closed listeners may be unsubscribed.
+ *
+ * Be aware that if the listener is marked as close it will not get any events passed anymore!
+ *
* @return true when closed,
* false when open
*/
@@ -80,9 +83,9 @@ public interface MailboxListener {
/**
* Indicates that mailbox has been deleted.
*/
- public class MailboxDeletionEvent extends Event {
+ public class MailboxDeletion extends Event {
- public MailboxDeletionEvent(long sessionId, MailboxPath path) {
+ public MailboxDeletion(long sessionId, MailboxPath path) {
super(sessionId, path);
}
}
Modified: james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java?rev=1022887&r1=1022886&r2=1022887&view=diff
==============================================================================
--- james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java (original)
+++ james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/util/MailboxEventDispatcher.java Fri Oct 15 11:41:02 2010
@@ -306,7 +306,7 @@ public class MailboxEventDispatcher impl
}
private static final class MailboxDeletionEventImpl extends
- MailboxListener.MailboxDeletionEvent {
+ MailboxListener.MailboxDeletion {
public MailboxDeletionEventImpl(final long sessionId, MailboxPath path) {
super(sessionId, path);
}
Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java?rev=1022887&r1=1022886&r2=1022887&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java Fri Oct 15 11:41:02 2010
@@ -38,9 +38,9 @@ import org.apache.james.mailbox.MailboxP
public class MailboxEventAnalyser implements MailboxListener {
private final long sessionId;
- private final Set<Long> flagUpdateUids;
- private final Flags.Flag uninterestingFlag;
- private final Set<Long> expungedUids;
+ private Set<Long> flagUpdateUids;
+ private Flags.Flag uninterestingFlag;
+ private Set<Long> expungedUids;
private boolean isDeletedByOtherSession = false;
private boolean sizeChanged = false;
@@ -102,7 +102,7 @@ public class MailboxEventAnalyser implem
final Long uidObject = new Long(uid);
expungedUids.add(uidObject);
}
- } else if (event instanceof MailboxDeletionEvent) {
+ } else if (event instanceof MailboxDeletion) {
if (eventSessionId != sessionId) {
isDeletedByOtherSession = true;
}
@@ -208,17 +208,23 @@ public class MailboxEventAnalyser implem
}
/**
- * Mark the listener as closed. If its marked as closed it will get removed
+ * Mark the listener as closed and dispose all stored stuff
*/
- public void close() {
+ public synchronized void close() {
closed = true;
+ flagUpdateUids.clear();
+ flagUpdateUids = null;
+
+ uninterestingFlag = null;
+ expungedUids.clear();
+ expungedUids = null;
}
/*
* (non-Javadoc)
* @see org.apache.james.mailbox.MailboxListener#isClosed()
*/
- public boolean isClosed() {
+ public synchronized boolean isClosed() {
return closed;
}
}
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=1022887&r1=1022886&r2=1022887&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 Fri Oct 15 11:41:02 2010
@@ -36,9 +36,9 @@ import org.apache.james.mailbox.MailboxL
* TODO: Each concurrent session requires one, and typical clients now open many
*/
public class UidToMsnConverter implements MailboxListener {
- private final SortedMap<Integer, Long> msnToUid;
+ private SortedMap<Integer, Long> msnToUid;
- private final SortedMap<Long, Integer> uidToMsn;
+ private SortedMap<Long, Integer> uidToMsn;
private long highestUid = 0;
@@ -47,14 +47,12 @@ public class UidToMsnConverter implement
private boolean closed = false;
public UidToMsnConverter(final Iterator<Long> uids) {
-
msnToUid = new TreeMap<Integer, Long>();
uidToMsn = new TreeMap<Long, Integer>();
if (uids != null) {
int msn = 1;
while (uids.hasNext()) {
- final Long uid = uids.next();
-
+ final Long uid = uids.next();
highestUid = uid.longValue();
highestMsn = msn;
msnToUid.put(msn, uid);
@@ -157,11 +155,11 @@ public class UidToMsnConverter implement
* @see SelectedMailbox#getFirstUid()
*/
public synchronized long getFirstUid() {
- if (uidToMsn.isEmpty()) {
- return -1;
- } else {
- return uidToMsn.firstKey();
- }
+ if (uidToMsn.isEmpty()) {
+ return -1;
+ } else {
+ return uidToMsn.firstKey();
+ }
}
@@ -169,16 +167,20 @@ public class UidToMsnConverter implement
* @see SelectedMailbox#getLastUid()
*/
public synchronized long getLastUid() {
- if (uidToMsn.isEmpty()) {
- return -1;
- } else {
- return uidToMsn.lastKey();
- }
+ if (uidToMsn.isEmpty()) {
+ return -1;
+ } else {
+ return uidToMsn.lastKey();
+ }
}
/**
- * Close this {@link MailboxListener}
+ * Close this {@link MailboxListener} and dispose all stored stuff
*/
public synchronized void close() {
+ uidToMsn.clear();
+ uidToMsn = null;
+ msnToUid.clear();
+ msnToUid = null;
closed = true;
}
Modified: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java?rev=1022887&r1=1022886&r2=1022887&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java Fri Oct 15 11:41:02 2010
@@ -52,7 +52,8 @@ public class DelegatingMailboxListener i
* @see org.apache.james.mailbox.MailboxListener#event(org.apache.james.mailbox.MailboxListener.Event)
*/
public synchronized void event(Event event) {
- List<MailboxListener> mListeners = listeners.get(event.getMailboxPath());
+ MailboxPath path = event.getMailboxPath();
+ List<MailboxListener> mListeners = listeners.get(path);
if (mListeners != null && mListeners.isEmpty() == false) {
List<MailboxListener> closedListener = new ArrayList<MailboxListener>();
@@ -66,8 +67,22 @@ public class DelegatingMailboxListener i
}
}
+ if (event instanceof MailboxDeletion) {
+ // remove listeners if the mailbox was deleted
+ listeners.remove(path);
+ } else if (event instanceof MailboxRenamed) {
+ // handle rename events
+ MailboxRenamed renamed = (MailboxRenamed) event;
+ List<MailboxListener> l = listeners.remove(path);
+ if (l != null) {
+ listeners.put(renamed.getNewPath(), l);
+ }
+ }
if (closedListener.isEmpty() == false) {
mListeners.removeAll(closedListener);
+ if (mListeners.isEmpty()) {
+ listeners.remove(path);
+ }
}
}
}
Modified: james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/LastUidTracker.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/LastUidTracker.java?rev=1022887&r1=1022886&r2=1022887&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/LastUidTracker.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/LastUidTracker.java Fri Oct 15 11:41:02 2010
@@ -51,9 +51,9 @@ public class LastUidTracker implements M
if (uid > lastUid.get()) {
lastUid.set(uid);
}
- } else if (event instanceof MailboxDeletionEvent) {
+ } else if (event instanceof MailboxDeletion) {
// remove the lastUid if the Mailbox was deleted
- lastUids.remove(((MailboxDeletionEvent) event).getMailboxPath());
+ lastUids.remove(((MailboxDeletion) event).getMailboxPath());
} else if (event instanceof MailboxRenamed) {
// If the mailbox was renamed we need take care of update the lastUid
// and move it to the new MailboxPath
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org