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