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