Author: norman
Date: Fri Sep 16 17:30:15 2011
New Revision: 1171685

URL: http://svn.apache.org/viewvc?rev=1171685&view=rev
Log:
Change MailboxListener removing from lazy to direct. This makes sure we don't 
leak MailboxListener's. See MAILBOX-134

Modified:
    
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
    
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxEventDispatcher.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java

Modified: 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java?rev=1171685&r1=1171684&r2=1171685&view=diff
==============================================================================
--- 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
 (original)
+++ 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
 Fri Sep 16 17:30:15 2011
@@ -39,20 +39,6 @@ public interface MailboxListener {
     void event(final Event event);
 
     /**
-     * <p>
-     * Is this listener closed?<br>
-     * Closed listeners may be unsubscribed.
-     * </p>
-     * <p>
-     * Be aware that if the listener is marked as close it will not get any
-     * events passed anymore!
-     * </p>
-     * 
-     * @return true when closed, false when open
-     */
-    boolean isClosed();
-
-    /**
      * A mailbox event.
      */
     public class Event {

Modified: 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java?rev=1171685&r1=1171684&r2=1171685&view=diff
==============================================================================
--- 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
 (original)
+++ 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
 Fri Sep 16 17:30:15 2011
@@ -49,6 +49,16 @@ public interface MailboxListenerSupport 
     void addListener(MailboxPath mailboxPath, MailboxListener listener, 
MailboxSession session) throws MailboxException;
 
     /**
+     * Remove the {@link MailboxListener}
+     * 
+     * @param mailboxPath
+     * @param listner
+     * @param session
+     * @throws MailboxException
+     */
+    void removeListener(MailboxPath mailboxPath, MailboxListener listner, 
MailboxSession session) throws MailboxException;
+    
+    /**
      * Add a {@link MailboxListener} which get fired for ever
      * {@link MailboxPath}
      * 
@@ -57,5 +67,16 @@ public interface MailboxListenerSupport 
      * @throws MailboxException
      */
     void addGlobalListener(MailboxListener listener, MailboxSession session) 
throws MailboxException;
+    
+    
+    /**
+     * Remove the {@link MailboxListener}
+     * 
+     * @param listner
+     * @param session
+     * @throws MailboxException
+     */
+    void removeGlobalListener(MailboxListener listner, MailboxSession session) 
throws MailboxException;
+
 
 }

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java?rev=1171685&r1=1171684&r2=1171685&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
 Fri Sep 16 17:30:15 2011
@@ -45,16 +45,12 @@ public abstract class AbstractDelegating
         synchronized (listeners) {
             List<MailboxListener> mListeners = listeners.get(path);
             if (mListeners != null && mListeners.isEmpty() == false) {
-                List<MailboxListener> closedListener = new 
ArrayList<MailboxListener>();
                 
                 int sz = mListeners.size();
                 for (int i = 0; i < sz; i++) {
                     MailboxListener l = mListeners.get(i);
-                    if (l.isClosed()) {
-                        closedListener.add(l);
-                    } else {
-                        l.event(event);
-                    }
+                    l.event(event);
+                    
                 }
                 
                 if (event instanceof MailboxDeletion) {
@@ -68,12 +64,7 @@ public abstract class AbstractDelegating
                         listeners.put(renamed.getNewPath(), l);
                     }
                 }
-                if (closedListener.isEmpty() == false) {
-                    mListeners.removeAll(closedListener);
-                    if (mListeners.isEmpty()) {
-                        listeners.remove(path);
-                    }
-                }
+                
             }  
             
         }
@@ -87,11 +78,8 @@ public abstract class AbstractDelegating
                 int sz = globalListeners.size();
                 for (int i = 0; i < sz; i++) {
                     MailboxListener l = globalListeners.get(i);
-                    if (l.isClosed()) {
-                        closedListener.add(l);
-                    } else {
-                        l.event(event);
-                    }
+                    l.event(event);
+                    
                 }
                 
               
@@ -125,13 +113,13 @@ public abstract class AbstractDelegating
         Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
         synchronized (listeners) {
             List<MailboxListener> mListeners = listeners.get(path);
-            if (mListeners == null) {
-                mListeners = new ArrayList<MailboxListener>();
-                listeners.put(path, mListeners);
+            if (mListeners != null) {
+                mListeners.remove(listener);
+                if (mListeners.isEmpty()) {
+                    listeners.remove(path);
+                }
             }
-            if (mListeners.contains(listener) == false) {
-                mListeners.add(listener);
-            }        
+                  
         }
     }
 
@@ -147,6 +135,38 @@ public abstract class AbstractDelegating
         }
     }
 
+    
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.MailboxListenerSupport#removeListener(org.apache.james.mailbox.MailboxPath,
 org.apache.james.mailbox.MailboxListener, 
org.apache.james.mailbox.MailboxSession)
+     */
+    public void removeListener(MailboxPath mailboxPath, MailboxListener 
listener, MailboxSession session) throws MailboxException {
+        Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
+        synchronized (listeners) {
+            List<MailboxListener> mListeners = listeners.get(mailboxPath);
+            if (mListeners == null) {
+                mListeners = new ArrayList<MailboxListener>();
+                listeners.put(mailboxPath, mListeners);
+            }
+            if (mListeners.contains(listener) == false) {
+                mListeners.add(listener);
+            }        
+        }        
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.MailboxListenerSupport#removeGlobalListener(org.apache.james.mailbox.MailboxListener,
 org.apache.james.mailbox.MailboxSession)
+     */
+    public void removeGlobalListener(MailboxListener listener, MailboxSession 
session) throws MailboxException {
+        List<MailboxListener> gListeners = getGlobalListeners();
+
+        synchronized (gListeners) {
+            gListeners.remove(listener);
+        }
+    }
+
     /**
      * Return the {@link Map} which is used to store the {@link 
MailboxListener}
      * 
@@ -160,4 +180,6 @@ public abstract class AbstractDelegating
      * @return globalListeners
      */
     protected abstract List<MailboxListener> getGlobalListeners();
+    
+    
 }

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxEventDispatcher.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxEventDispatcher.java?rev=1171685&r1=1171684&r2=1171685&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxEventDispatcher.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/MailboxEventDispatcher.java
 Fri Sep 16 17:30:15 2011
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.store;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -41,20 +40,7 @@ public class MailboxEventDispatcher<Id> 
 
     private final Set<MailboxListener> listeners = new 
CopyOnWriteArraySet<MailboxListener>();
 
-    /**
-     * Remove all closed MailboxListener
-     */
-    private void pruneClosed() {
-        final Collection<MailboxListener> closedListeners = new 
ArrayList<MailboxListener>();
-        for (MailboxListener listener : listeners) {
-            if (listener.isClosed()) {
-                closedListeners.add(listener);
-            }
-        }
-        if (!closedListeners.isEmpty()) {
-            listeners.removeAll(closedListeners);
-        }
-    }
+    
 
     /**
      * Add a MailboxListener to this dispatcher
@@ -62,7 +48,6 @@ public class MailboxEventDispatcher<Id> 
      * @param mailboxListener
      */
     public void addMailboxListener(MailboxListener mailboxListener) {
-        pruneClosed();
         listeners.add(mailboxListener);
     }
 
@@ -75,7 +60,6 @@ public class MailboxEventDispatcher<Id> 
      * @param path
      */
     public void added(MailboxSession session, Map<Long, MessageMetaData> uids, 
Mailbox<Id> mailbox) {
-        pruneClosed();
         final AddedImpl added = new AddedImpl(session, mailbox, uids);
         event(added);
     }
@@ -119,11 +103,8 @@ public class MailboxEventDispatcher<Id> 
         List<MailboxListener> closed = new ArrayList<MailboxListener>();
         for (Iterator<MailboxListener> iter = listeners.iterator(); 
iter.hasNext();) {
             MailboxListener mailboxListener = iter.next();
-            if (mailboxListener.isClosed() == false) {
-                mailboxListener.event(event);
-            } else {
-                closed.add(mailboxListener);
-            }
+            mailboxListener.event(event);
+           
         }
         for (int i = 0; i < closed.size(); i++)
             listeners.remove(closed.get(i));

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1171685&r1=1171684&r2=1171685&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 Fri Sep 16 17:30:15 2011
@@ -550,4 +550,19 @@ public class StoreMailboxManager<Id> imp
     public void addGlobalListener(MailboxListener listener, MailboxSession 
session) throws MailboxException {
         delegatingListener.addGlobalListener(listener, session);
     }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.MailboxListenerSupport#removeListener(org.apache.james.mailbox.MailboxPath,
 org.apache.james.mailbox.MailboxListener, 
org.apache.james.mailbox.MailboxSession)
+     */
+    public void removeListener(MailboxPath mailboxPath, MailboxListener 
listener, MailboxSession session) throws MailboxException {
+        delegatingListener.removeListener(mailboxPath, listener, session);
+        
+    }
+
+    @Override
+    public void removeGlobalListener(MailboxListener listener, MailboxSession 
session) throws MailboxException {
+        delegatingListener.removeGlobalListener(listener, session);
+        
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to