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