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 bt...@apache.org on 2015/11/28 13:55:00 UTC

svn commit: r1716954 - in /james/project/trunk/mailbox/store/src: main/java/org/apache/james/mailbox/store/ main/java/org/apache/james/mailbox/store/event/ test/java/org/apache/james/mailbox/store/event/

Author: btellier
Date: Sat Nov 28 12:54:59 2015
New Revision: 1716954

URL: http://svn.apache.org/viewvc?rev=1716954&view=rev
Log:
MAILBOX-211 Should be based on more generic components

Added:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxListenerRegistry.java
    james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/
    james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListenerTest.java
Removed:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AbstractDelegatingMailboxListener.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/HashMapDelegatingMailboxListener.java
Modified:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java

Modified: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1716954&r1=1716953&r2=1716954&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java (original)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java Sat Nov 28 12:54:59 2015
@@ -55,8 +55,8 @@ import org.apache.james.mailbox.model.Me
 import org.apache.james.mailbox.model.SimpleMailboxACL;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.event.AbstractDelegatingMailboxListener;
-import org.apache.james.mailbox.store.event.HashMapDelegatingMailboxListener;
+import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
+import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
@@ -88,7 +88,7 @@ public class StoreMailboxManager<Id exte
     public static final int DEFAULT_FETCH_BATCH_SIZE = 200;
 
     private MailboxEventDispatcher<Id> dispatcher;
-    private AbstractDelegatingMailboxListener delegatingListener = null;
+    private DelegatingMailboxListener delegatingListener = null;
     private final MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory;
 
     private final Authenticator authenticator;
@@ -193,13 +193,13 @@ public class StoreMailboxManager<Id exte
     }
 
     /**
-     * Return the {@link AbstractDelegatingMailboxListener} which is used by this {@link MailboxManager}
+     * Return the {@link DelegatingMailboxListener} which is used by this {@link MailboxManager}
      *
      * @return delegatingListener
      */
-    public AbstractDelegatingMailboxListener getDelegationListener() {
+    public DelegatingMailboxListener getDelegationListener() {
         if (delegatingListener == null) {
-            delegatingListener = new HashMapDelegatingMailboxListener();
+            delegatingListener = new DefaultDelegatingMailboxListener();
         }
         return delegatingListener;
     }
@@ -253,12 +253,12 @@ public class StoreMailboxManager<Id exte
     }
 
     /**
-     * Set the {@link AbstractDelegatingMailboxListener} to use with this {@link MailboxManager} instance. If none is set here a {@link HashMapDelegatingMailboxListener} instance will
+     * Set the {@link DelegatingMailboxListener} to use with this {@link MailboxManager} instance. If none is set here a {@link DefaultDelegatingMailboxListener} instance will
      * be created lazy
      *
      * @param delegatingListener
      */
-    public void setDelegatingMailboxListener(AbstractDelegatingMailboxListener delegatingListener) {
+    public void setDelegatingMailboxListener(DelegatingMailboxListener delegatingListener) {
         this.delegatingListener = delegatingListener;
         dispatcher = new MailboxEventDispatcher<Id>(getDelegationListener());
     }

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java?rev=1716954&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java Sat Nov 28 12:54:59 2015
@@ -0,0 +1,103 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.store.event;
+
+import java.util.Collection;
+
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxPath;
+
+/**
+ * Receive a {@link org.apache.james.mailbox.MailboxListener.Event} and delegate it to an other
+ * {@link MailboxListener} depending on the registered name
+ *
+ * This is a mono instance Thread safe implementation for DelegatingMailboxListener
+ */
+public class DefaultDelegatingMailboxListener implements DelegatingMailboxListener {
+
+    private MailboxListenerRegistry registry;
+
+    @Override
+    public ListenerType getType() {
+        return ListenerType.EACH_NODE;
+    }
+
+    public DefaultDelegatingMailboxListener() {
+        this.registry = new MailboxListenerRegistry();
+    }
+
+    @Override
+    public void addListener(MailboxPath path, MailboxListener listener, MailboxSession session) throws MailboxException {
+        if (listener.getType() != ListenerType.MAILBOX) {
+            throw new MailboxException(listener.getClass().getCanonicalName() + " registred on specific MAILBOX operation while its listener type was " + listener.getType());
+        }
+        registry.addListener(path, listener);
+    }
+
+    @Override
+    public void addGlobalListener(MailboxListener listener, MailboxSession session) throws MailboxException {
+        if (listener.getType() != ListenerType.EACH_NODE && listener.getType() != ListenerType.ONCE) {
+            throw new MailboxException(listener.getClass().getCanonicalName() + " registered on global event dispatching while its listener type was " + listener.getType());
+        }
+        registry.addGlobalListener(listener);
+    }
+
+    @Override
+    public void removeListener(MailboxPath mailboxPath, MailboxListener listener, MailboxSession session) throws MailboxException {
+        registry.removeListener(mailboxPath, listener);
+    }
+
+    @Override
+    public void removeGlobalListener(MailboxListener listener, MailboxSession session) throws MailboxException {
+        registry.removeGlobalListener(listener);
+    }
+
+    @Override
+    public void event(Event event) {
+        Collection<MailboxListener> listenerSnapshot = registry.getLocalMailboxListeners(event.getMailboxPath());
+        if (event instanceof MailboxDeletion) {
+            registry.deleteRegistryFor(event.getMailboxPath());
+        } else if (event instanceof MailboxRenamed) {
+            MailboxRenamed renamed = (MailboxRenamed) event;
+            registry.handleRename(renamed.getMailboxPath(), renamed.getNewPath());
+        }
+        deliverEventToMailboxListeners(event, listenerSnapshot);
+        deliverEventToGlobalListeners(event);
+    }
+
+    protected void deliverEventToMailboxListeners(Event event, Collection<MailboxListener> listenerSnapshot) {
+        for (MailboxListener listener : listenerSnapshot) {
+            deliverEvent(event, listener);
+        }
+    }
+
+    protected void deliverEventToGlobalListeners(Event event) {
+        for (MailboxListener mailboxListener : registry.getGlobalListeners()) {
+            deliverEvent(event, mailboxListener);
+        }
+    }
+
+    private void deliverEvent(Event event, MailboxListener listener) {
+        listener.event(event);
+    }
+
+}

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java?rev=1716954&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java Sat Nov 28 12:54:59 2015
@@ -0,0 +1,27 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.store.event;
+
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxListenerSupport;
+
+public interface DelegatingMailboxListener extends MailboxListenerSupport, MailboxListener{
+
+}

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxListenerRegistry.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxListenerRegistry.java?rev=1716954&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxListenerRegistry.java (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxListenerRegistry.java Sat Nov 28 12:54:59 2015
@@ -0,0 +1,77 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.store.event;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxPath;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class MailboxListenerRegistry {
+
+    private Multimap<MailboxPath, MailboxListener> listeners;
+    private ConcurrentLinkedQueue<MailboxListener> globalListeners;
+
+    public MailboxListenerRegistry() {
+        this.globalListeners = new ConcurrentLinkedQueue<MailboxListener>();
+        this.listeners = Multimaps.synchronizedMultimap(HashMultimap.<MailboxPath, MailboxListener>create());
+    }
+
+    public void addListener(MailboxPath path, MailboxListener listener) throws MailboxException {
+        listeners.put(path, listener);
+    }
+
+    public void addGlobalListener(MailboxListener listener) throws MailboxException {
+        globalListeners.add(listener);
+    }
+
+    public void removeListener(MailboxPath mailboxPath, MailboxListener listener) throws MailboxException {
+        listeners.remove(mailboxPath, listener);
+    }
+
+    public void removeGlobalListener(MailboxListener listener) throws MailboxException {
+        globalListeners.remove(listener);
+    }
+
+    public List<MailboxListener> getLocalMailboxListeners(MailboxPath path) {
+        return ImmutableList.copyOf(listeners.get(path));
+    }
+
+    public List<MailboxListener> getGlobalListeners() {
+        return ImmutableList.copyOf(globalListeners);
+    }
+
+    public void deleteRegistryFor(MailboxPath path) {
+        listeners.removeAll(path);
+    }
+
+    public void handleRename(MailboxPath oldName, MailboxPath newName) {
+        listeners.putAll(newName, listeners.removeAll(oldName));
+    }
+
+}

Added: james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListenerTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListenerTest.java?rev=1716954&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListenerTest.java (added)
+++ james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListenerTest.java Sat Nov 28 12:54:59 2015
@@ -0,0 +1,182 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.store.event;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.util.EventCollector;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DefaultDelegatingMailboxListenerTest {
+
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", "user", "name");
+    private static final MailboxPath OTHER_MAILBOX_PATH = new MailboxPath("namespace", "other", "name");
+
+    private DefaultDelegatingMailboxListener defaultDelegatingMailboxListener;
+    private EventCollector mailboxEventCollector;
+    private EventCollector eachNodeEventCollector;
+    private EventCollector onceEventCollector;
+
+    @Before
+    public void setUp() throws Exception {
+        mailboxEventCollector = new EventCollector(MailboxListener.ListenerType.MAILBOX);
+        eachNodeEventCollector = new EventCollector(MailboxListener.ListenerType.EACH_NODE);
+        onceEventCollector = new EventCollector(MailboxListener.ListenerType.ONCE);
+        defaultDelegatingMailboxListener = new DefaultDelegatingMailboxListener();
+        defaultDelegatingMailboxListener.addListener(MAILBOX_PATH, mailboxEventCollector, null);
+        defaultDelegatingMailboxListener.addGlobalListener(onceEventCollector, null);
+        defaultDelegatingMailboxListener.addGlobalListener(eachNodeEventCollector, null);
+    }
+
+    @Test(expected = MailboxException.class)
+    public void addListenerShouldThrowOnEACH_NODEListenerType() throws Exception {
+        MailboxListener mailboxListener = new EventCollector(MailboxListener.ListenerType.EACH_NODE);
+        defaultDelegatingMailboxListener.addListener(MAILBOX_PATH, mailboxListener, null);
+    }
+
+    @Test(expected = MailboxException.class)
+    public void addListenerShouldThrowOnONCEListenerType() throws Exception {
+        MailboxListener mailboxListener = new EventCollector(MailboxListener.ListenerType.ONCE);
+        defaultDelegatingMailboxListener.addListener(MAILBOX_PATH, mailboxListener, null);
+    }
+
+    @Test(expected = MailboxException.class)
+    public void addGlobalListenerShouldThrowOnMAILBOXListenerType() throws Exception {
+        MailboxListener mailboxListener = new EventCollector(MailboxListener.ListenerType.MAILBOX);
+        defaultDelegatingMailboxListener.addGlobalListener(mailboxListener, null);
+    }
+
+    @Test
+    public void eventShouldWork() throws Exception {
+        MailboxListener.Event event = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsExactly(event);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event);
+    }
+
+    @Test
+    public void eventShouldOnlyTriggerMAILBOXListenerRelatedToTheEvent() throws Exception {
+        MailboxListener.Event event = new MailboxListener.Event(null, OTHER_MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).isEmpty();
+        assertThat(eachNodeEventCollector.getEvents()).containsExactly(event);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event);
+    }
+
+    @Test
+    public void mailboxRenamedEventShouldUnregisterMAILBOXFromTheirPreviousPath() throws Exception {
+        MailboxListener.MailboxRenamed event = new MailboxListener.MailboxRenamed(null, MAILBOX_PATH) {
+            @Override
+            public MailboxPath getNewPath() {
+                return OTHER_MAILBOX_PATH;
+            }
+        };
+        defaultDelegatingMailboxListener.event(event);
+        MailboxListener.Event secondEvent = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(secondEvent);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsOnly(event, secondEvent);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event, secondEvent);
+    }
+
+    @Test
+    public void mailboxRenamedEventShouldRegisterMAILBOXToTheirNewPath() throws Exception {
+        MailboxListener.MailboxRenamed event = new MailboxListener.MailboxRenamed(null, MAILBOX_PATH) {
+            @Override
+            public MailboxPath getNewPath() {
+                return OTHER_MAILBOX_PATH;
+            }
+        };
+        defaultDelegatingMailboxListener.event(event);
+        MailboxListener.Event secondEvent = new MailboxListener.Event(null, OTHER_MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(secondEvent);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(event, secondEvent);
+        assertThat(eachNodeEventCollector.getEvents()).containsOnly(event, secondEvent);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event, secondEvent);
+    }
+
+    @Test
+    public void mailboxDeletionShouldUnregisterMAILBOXListeners() throws Exception {
+        MailboxListener.MailboxDeletion event = new MailboxListener.MailboxDeletion(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        MailboxListener.Event secondEvent = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(secondEvent);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsOnly(event, secondEvent);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event, secondEvent);
+    }
+
+    @Test
+    public void mailboxDeletionShouldNotRegisterMAILBOXListenerToOtherPaths() throws Exception {
+        MailboxListener.MailboxDeletion event = new MailboxListener.MailboxDeletion(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        MailboxListener.Event secondEvent = new MailboxListener.Event(null, OTHER_MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(secondEvent);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsOnly(event, secondEvent);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event, secondEvent);
+    }
+
+    @Test
+    public void removeListenerShouldWork() throws Exception {
+        defaultDelegatingMailboxListener.removeListener(MAILBOX_PATH, mailboxEventCollector, null);
+        MailboxListener.Event event = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).isEmpty();
+        assertThat(eachNodeEventCollector.getEvents()).containsExactly(event);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event);
+    }
+
+    @Test
+    public void removeListenerShouldNotRemoveAListenerFromADifferentPath() throws Exception {
+        defaultDelegatingMailboxListener.removeListener(OTHER_MAILBOX_PATH, mailboxEventCollector, null);
+        MailboxListener.Event event = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsExactly(event);
+        assertThat(onceEventCollector.getEvents()).containsExactly(event);
+    }
+
+    @Test
+    public void removeGlobalListenerShouldWorkForONCE() throws Exception {
+        defaultDelegatingMailboxListener.removeGlobalListener(eachNodeEventCollector, null);
+        MailboxListener.Event event = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).isEmpty();
+        assertThat(onceEventCollector.getEvents()).containsExactly(event);
+    }
+
+    @Test
+    public void removeGlobalListenerShouldWorkForEACH_NODE() throws Exception {
+        defaultDelegatingMailboxListener.removeGlobalListener(onceEventCollector, null);
+        MailboxListener.Event event = new MailboxListener.Event(null, MAILBOX_PATH) {};
+        defaultDelegatingMailboxListener.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsExactly(event);
+        assertThat(eachNodeEventCollector.getEvents()).containsExactly(event);
+        assertThat(onceEventCollector.getEvents()).isEmpty();
+    }
+
+}



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