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 2011/04/14 07:42:36 UTC
svn commit: r1092009 -
/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
Author: norman
Date: Thu Apr 14 05:42:36 2011
New Revision: 1092009
URL: http://svn.apache.org/viewvc?rev=1092009&view=rev
Log:
Fix RaceCondition in AbstractDelegatingMailboxListener. See MAILBOX-51
Modified:
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
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=1092009&r1=1092008&r2=1092009&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 Thu Apr 14 05:42:36 2011
@@ -42,66 +42,72 @@ public abstract class AbstractDelegating
public void event(Event event) {
MailboxPath path = event.getMailboxPath();
Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
-
- 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);
- }
- }
-
- 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);
+ 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);
+ }
}
- }
- if (closedListener.isEmpty() == false) {
- mListeners.removeAll(closedListener);
- if (mListeners.isEmpty()) {
+
+ 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);
+ }
+ }
+ }
+
+ }
+
List<MailboxListener> globalListeners = getGlobalListeners();
- if (globalListeners != null && globalListeners.isEmpty() == false) {
- List<MailboxListener> closedListener = new ArrayList<MailboxListener>();
-
- 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);
+ synchronized (globalListeners) {
+ if (globalListeners != null && globalListeners.isEmpty() == false) {
+ List<MailboxListener> closedListener = new ArrayList<MailboxListener>();
+
+ 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);
+ }
+ }
+
+
+ if (closedListener.isEmpty() == false) {
+ globalListeners.removeAll(closedListener);
}
}
-
-
- if (closedListener.isEmpty() == false) {
- globalListeners.removeAll(closedListener);
- }
- }
+ }
+
}
/**
* Close the listener
*/
- public void close() {
- isClosed = true;
+ public synchronized void close() {
+ isClosed = true;
}
/**
@@ -115,16 +121,18 @@ public abstract class AbstractDelegating
* (non-Javadoc)
* @see org.apache.james.mailbox.MailboxListenerSupport#addListener(org.apache.james.mailbox.MailboxPath, org.apache.james.mailbox.MailboxListener, org.apache.james.mailbox.MailboxSession)
*/
- public synchronized void addListener(MailboxPath path, MailboxListener listener, MailboxSession session) throws MailboxException {
+ public void addListener(MailboxPath path, MailboxListener listener, MailboxSession session) throws MailboxException {
Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
- List<MailboxListener> mListeners = listeners.get(path);
- if (mListeners == null) {
- mListeners = new ArrayList<MailboxListener>();
- listeners.put(path, mListeners);
+ synchronized (listeners) {
+ List<MailboxListener> mListeners = listeners.get(path);
+ if (mListeners == null) {
+ mListeners = new ArrayList<MailboxListener>();
+ listeners.put(path, mListeners);
+ }
+ if (mListeners.contains(listener) == false) {
+ mListeners.add(listener);
+ }
}
- if (mListeners.contains(listener) == false) {
- mListeners.add(listener);
- }
}
@@ -132,8 +140,11 @@ public abstract class AbstractDelegating
* (non-Javadoc)
* @see org.apache.james.mailbox.MailboxListenerSupport#addGlobalListener(org.apache.james.mailbox.MailboxListener, org.apache.james.mailbox.MailboxSession)
*/
- public synchronized void addGlobalListener(MailboxListener listener, MailboxSession session) throws MailboxException {
- getGlobalListeners().add(listener);
+ public void addGlobalListener(MailboxListener listener, MailboxSession session) throws MailboxException {
+ List<MailboxListener> gListeners = getGlobalListeners();
+ synchronized (gListeners) {
+ gListeners.add(listener);
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org