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: [email protected]
For additional commands, e-mail: [email protected]