[prev in list] [next in list] [prev in thread] [next in thread] 

List:       james-dev
Subject:    svn commit: r1716962 - in /james/project/trunk/mailbox/store/src: main/java/org/apache/james/mailbox
From:       btellier () apache ! org
Date:       2015-11-28 13:06:02
Message-ID: 20151128130602.87AFB3A0367 () svn01-us-west ! apache ! org
[Download RAW message or body]

Author: btellier
Date: Sat Nov 28 13:06:02 2015
New Revision: 1716962

URL: http://svn.apache.org/viewvc?rev=1716962&view=rev
Log:
MAILBOX-211 Distributed Delegating Mailbox Listener

Added:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/DistributedDelegatingMailboxListener.java
  james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
  james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListenerTest.java
 Modified:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java


Modified: 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=1716962&r1=1716961&r2=1716962&view=diff
 ==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java \
                (original)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java \
Sat Nov 28 13:06:02 2015 @@ -74,9 +74,9 @@ public class DefaultDelegatingMailboxLis
     @Override
     public void event(Event event) {
         Collection<MailboxListener> listenerSnapshot = \
                registry.getLocalMailboxListeners(event.getMailboxPath());
-        if (event instanceof MailboxDeletion) {
+        if (event instanceof MailboxDeletion && listenerSnapshot.size() > 0) {
             registry.deleteRegistryFor(event.getMailboxPath());
-        } else if (event instanceof MailboxRenamed) {
+        } else if (event instanceof MailboxRenamed && listenerSnapshot.size() > 0) {
             MailboxRenamed renamed = (MailboxRenamed) event;
             registry.handleRename(renamed.getMailboxPath(), renamed.getNewPath());
         }

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/DistributedDelegatingMailboxListener.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/ \
apache/james/mailbox/store/event/distributed/DistributedDelegatingMailboxListener.java?rev=1716962&view=auto
 ==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/DistributedDelegatingMailboxListener.java \
                (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/DistributedDelegatingMailboxListener.java \
Sat Nov 28 13:06:02 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.distributed;
+
+import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
+import org.apache.james.mailbox.store.publisher.MessageReceiver;
+
+public interface DistributedDelegatingMailboxListener extends \
DelegatingMailboxListener, MessageReceiver { +
+}

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/ \
apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java?rev=1716962&view=auto
 ==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java \
                (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java \
Sat Nov 28 13:06:02 2015 @@ -0,0 +1,174 @@
+/****************************************************************
+ * 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.distributed;
+
+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;
+import org.apache.james.mailbox.store.event.EventSerializer;
+import org.apache.james.mailbox.store.event.MailboxListenerRegistry;
+import org.apache.james.mailbox.store.publisher.MessageConsumer;
+import org.apache.james.mailbox.store.publisher.Publisher;
+import org.apache.james.mailbox.store.publisher.Topic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Set;
+
+public class RegisteredDelegatingMailboxListener implements \
DistributedDelegatingMailboxListener { +
+    private static final Logger LOGGER = \
LoggerFactory.getLogger(RegisteredDelegatingMailboxListener.class); +
+    private final MailboxListenerRegistry mailboxListenerRegistry;
+    private final MailboxPathRegister mailboxPathRegister;
+    private final Publisher publisher;
+    private final EventSerializer eventSerializer;
+
+    public RegisteredDelegatingMailboxListener(EventSerializer eventSerializer,
+                                               Publisher publisher,
+                                               MessageConsumer messageConsumer,
+                                               MailboxPathRegister \
mailboxPathRegister) throws Exception { +        this.eventSerializer = \
eventSerializer; +        this.publisher = publisher;
+        this.mailboxPathRegister = mailboxPathRegister;
+        this.mailboxListenerRegistry = new MailboxListenerRegistry();
+        messageConsumer.setMessageReceiver(this);
+        messageConsumer.init(mailboxPathRegister.getLocalTopic());
+    }
+
+    @Override
+    public ListenerType getType() {
+        return ListenerType.ONCE;
+    }
+
+    @Override
+    public void addListener(MailboxPath path, MailboxListener listener, \
MailboxSession session) throws MailboxException { +        \
mailboxListenerRegistry.addListener(path, listener); +        \
mailboxPathRegister.register(path); +    }
+
+    @Override
+    public void addGlobalListener(MailboxListener listener, MailboxSession session) \
throws MailboxException { +        if \
(listener.getType().equals(ListenerType.EACH_NODE)) { +            throw new \
MailboxException("Attempt to register a global listener that need to be called on \
each node while using a non compatible delegating listeners"); +        }
+        mailboxListenerRegistry.addGlobalListener(listener);
+    }
+
+    @Override
+    public void removeListener(MailboxPath mailboxPath, MailboxListener listener, \
MailboxSession session) throws MailboxException { +        \
mailboxListenerRegistry.removeListener(mailboxPath, listener); +        \
mailboxPathRegister.unregister(mailboxPath); +    }
+
+    @Override
+    public void removeGlobalListener(MailboxListener listener, MailboxSession \
session) throws MailboxException { +        \
mailboxListenerRegistry.removeGlobalListener(listener); +    }
+
+    @Override
+    public void event(Event event) {
+        try {
+            deliverEventToOnceGlobalListeners(event);
+            deliverToMailboxPathRegisteredListeners(event);
+            sendToRemoteJames(event);
+        } catch (Throwable t) {
+            event.getSession()
+                .getLog()
+                .error("Error while delegating event " + \
event.getClass().getCanonicalName(), t); +        }
+    }
+
+    public void receiveSerializedEvent(byte[] serializedEvent) {
+        try {
+            Event event = eventSerializer.deSerializeEvent(serializedEvent);
+            deliverToMailboxPathRegisteredListeners(event);
+        } catch (Exception e) {
+            LOGGER.error("Error while receiving serialized event", e);
+        }
+    }
+
+    private void deliverToMailboxPathRegisteredListeners(Event event) throws \
MailboxException { +        Collection<MailboxListener> listenerSnapshot = \
mailboxListenerRegistry.getLocalMailboxListeners(event.getMailboxPath()); +        if \
(event instanceof MailboxDeletion && listenerSnapshot.size() > 0) { +            \
mailboxListenerRegistry.deleteRegistryFor(event.getMailboxPath()); +            \
mailboxPathRegister.doCompleteUnRegister(event.getMailboxPath()); +        } else if \
(event instanceof MailboxRenamed && listenerSnapshot.size() > 0) { +            \
MailboxRenamed renamed = (MailboxRenamed) event; +            \
mailboxListenerRegistry.handleRename(renamed.getMailboxPath(), renamed.getNewPath()); \
+            mailboxPathRegister.doRename(renamed.getMailboxPath(), \
renamed.getNewPath()); +        }
+        for (MailboxListener listener : listenerSnapshot) {
+            deliverEvent(event, listener);
+        }
+    }
+
+    private void deliverEventToOnceGlobalListeners(Event event) {
+        for (MailboxListener mailboxListener : \
mailboxListenerRegistry.getGlobalListeners()) { +            if \
(mailboxListener.getType() == ListenerType.ONCE) { +                \
deliverEvent(event, mailboxListener); +            }
+        }
+    }
+
+    private void sendToRemoteJames(Event event) {
+        Set<Topic> topics = mailboxPathRegister.getTopics(event.getMailboxPath());
+        topics.remove(mailboxPathRegister.getLocalTopic());
+        if (topics.size() > 0) {
+            sendEventToRemotesJamesByTopic(event, topics);
+        }
+    }
+
+    private void sendEventToRemotesJamesByTopic(Event event, Set<Topic> topics) {
+        byte[] serializedEvent;
+        try {
+            serializedEvent = eventSerializer.serializeEvent(event);
+        } catch (Exception e) {
+            event.getSession()
+                .getLog()
+                .error("Unable to serialize " + event.getClass().getCanonicalName(), \
e); +            return;
+        }
+        for (Topic topic : topics) {
+            try {
+                publisher.publish(topic, serializedEvent);
+            } catch (Throwable t) {
+                event.getSession().getLog().error("Unable to send serialized event \
to topic " + topic); +            }
+        }
+    }
+
+    private void deliverEvent(Event event, MailboxListener listener) {
+        try {
+            listener.event(event);
+        } catch(Throwable throwable) {
+            event.getSession()
+                .getLog()
+                .error("Error while processing listener "
+                        + listener.getClass().getCanonicalName()
+                        + " for "
+                        + event.getClass().getCanonicalName(),
+                    throwable);
+        }
+    }
+
+}

Added: james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListenerTest.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/test/java/org/ \
apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListenerTest.java?rev=1716962&view=auto
 ==============================================================================
--- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListenerTest.java \
                (added)
+++ james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListenerTest.java \
Sat Nov 28 13:06:02 2015 @@ -0,0 +1,278 @@
+/****************************************************************
+ * 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.distributed;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import com.google.common.collect.Sets;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.event.EventSerializer;
+import org.apache.james.mailbox.store.publisher.MessageConsumer;
+import org.apache.james.mailbox.store.publisher.Publisher;
+import org.apache.james.mailbox.store.publisher.Topic;
+import org.apache.james.mailbox.util.EventCollector;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.util.Set;
+
+public class RegisteredDelegatingMailboxListenerTest {
+
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", \
"user", "name"); +    private static final MailboxPath MAILBOX_PATH_NEW = new \
MailboxPath("namespace_new", "user_new", "name_new"); +    private static final Topic \
TOPIC = new Topic("topic"); +    private static final Topic TOPIC_2 = new \
Topic("topic_2"); +    private static final byte[] BYTES = new byte[0];
+    private static final MailboxSession mailboxSession = new \
MockMailboxSession("benwa"); +    public static final MailboxListener.Event EVENT = \
new MailboxListener.Event(mailboxSession, MAILBOX_PATH) {}; +
+    private RegisteredDelegatingMailboxListener testee;
+    private MailboxPathRegister mockedMailboxPathRegister;
+    private EventSerializer mockedEventSerializer;
+    private Publisher mockedPublisher;
+    private EventCollector mailboxEventCollector;
+    private EventCollector eachEventCollector;
+    private EventCollector onceEventCollector;
+
+    @Before
+    public void setUp() throws Exception {
+        mockedEventSerializer = mock(EventSerializer.class);
+        mockedPublisher = mock(Publisher.class);
+        mockedMailboxPathRegister = mock(MailboxPathRegister.class);
+        MessageConsumer messageConsumer = mock(MessageConsumer.class);
+        testee = new RegisteredDelegatingMailboxListener(mockedEventSerializer, \
mockedPublisher, messageConsumer, mockedMailboxPathRegister); +        \
mailboxEventCollector = new EventCollector(MailboxListener.ListenerType.MAILBOX); +   \
eachEventCollector = new EventCollector(MailboxListener.ListenerType.EACH_NODE); +    \
onceEventCollector = new EventCollector(MailboxListener.ListenerType.ONCE); +    }
+
+    @Test
+    public void eventShouldBeLocallyDeliveredIfThereIsNoOtherRegisteredServers() \
throws Exception { +        testee.addListener(MAILBOX_PATH, mailboxEventCollector, \
mailboxSession); +        verify(mockedMailboxPathRegister).register(MAILBOX_PATH);
+        when(mockedMailboxPathRegister.getTopics(MAILBOX_PATH)).thenAnswer(new \
Answer<Set<Topic>>() { +            @Override
+            public Set<Topic> answer(InvocationOnMock invocation) throws Throwable {
+                return Sets.newHashSet(TOPIC);
+            }
+        });
+        when(mockedMailboxPathRegister.getLocalTopic()).thenAnswer(new \
Answer<Topic>() { +            @Override
+            public Topic answer(InvocationOnMock invocation) throws Throwable {
+                return TOPIC;
+            }
+        });
+        testee.event(EVENT);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(EVENT);
+        verify(mockedMailboxPathRegister, times(2)).getLocalTopic();
+        verify(mockedMailboxPathRegister).getTopics(MAILBOX_PATH);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+    @Test
+    public void eventShouldBeRemotelySent() throws Exception {
+        testee.addListener(MAILBOX_PATH, mailboxEventCollector, mailboxSession);
+        verify(mockedMailboxPathRegister).register(MAILBOX_PATH);
+        when(mockedMailboxPathRegister.getTopics(MAILBOX_PATH)).thenAnswer(new \
Answer<Set<Topic>>() { +            @Override
+            public Set<Topic> answer(InvocationOnMock invocation) throws Throwable {
+                return Sets.newHashSet(TOPIC, TOPIC_2);
+            }
+        });
+        when(mockedMailboxPathRegister.getLocalTopic()).thenAnswer(new \
Answer<Topic>() { +            @Override
+            public Topic answer(InvocationOnMock invocation) throws Throwable {
+                return TOPIC;
+            }
+        });
+        when(mockedEventSerializer.serializeEvent(EVENT)).thenAnswer(new \
Answer<byte[]>() { +            @Override
+            public byte[] answer(InvocationOnMock invocation) throws Throwable {
+                return BYTES;
+            }
+        });
+        testee.event(EVENT);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(EVENT);
+        verify(mockedMailboxPathRegister, times(2)).getLocalTopic();
+        verify(mockedMailboxPathRegister).getTopics(MAILBOX_PATH);
+        verify(mockedEventSerializer).serializeEvent(EVENT);
+        verify(mockedPublisher).publish(TOPIC_2, BYTES);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+    @Test
+    public void onceListenersShouldBeTriggered() throws Exception {
+        MailboxListener.Event event = new MailboxListener.Event(mailboxSession, \
MAILBOX_PATH) {}; +        testee.addGlobalListener(onceEventCollector, \
mailboxSession); +        \
when(mockedMailboxPathRegister.getTopics(MAILBOX_PATH)).thenAnswer(new \
Answer<Set<Topic>>() { +            @Override
+            public Set<Topic> answer(InvocationOnMock invocation) throws Throwable {
+                return Sets.newHashSet(TOPIC);
+            }
+        });
+        when(mockedMailboxPathRegister.getLocalTopic()).thenAnswer(new \
Answer<Topic>() { +            @Override
+            public Topic answer(InvocationOnMock invocation) throws Throwable {
+                return TOPIC;
+            }
+        });
+        testee.event(event);
+        assertThat(onceEventCollector.getEvents()).containsOnly(event);
+        verify(mockedMailboxPathRegister, times(2)).getLocalTopic();
+        verify(mockedMailboxPathRegister).getTopics(MAILBOX_PATH);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+    @Test(expected = MailboxException.class)
+    public void eachNodeListenersShouldBeRejected() throws Exception {
+        testee.addGlobalListener(eachEventCollector, mailboxSession);
+    }
+
+    @Test
+    public void distantEventShouldBeLocallyDelivered() throws Exception {
+        testee.addListener(MAILBOX_PATH, mailboxEventCollector, mailboxSession);
+        verify(mockedMailboxPathRegister).register(MAILBOX_PATH);
+        when(mockedEventSerializer.deSerializeEvent(BYTES)).thenAnswer(new \
Answer<MailboxListener.Event>() { +            @Override
+            public MailboxListener.Event answer(InvocationOnMock invocation) throws \
Throwable { +                return EVENT;
+            }
+        });
+        testee.receiveSerializedEvent(BYTES);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(EVENT);
+        verify(mockedMailboxPathRegister).getLocalTopic();
+        verify(mockedEventSerializer).deSerializeEvent(BYTES);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+
+    @Test
+    public void distantEventShouldNotBeDeliveredToOnceGlobalListeners() throws \
Exception { +        testee.addGlobalListener(onceEventCollector, mailboxSession);
+        when(mockedEventSerializer.deSerializeEvent(BYTES)).thenAnswer(new \
Answer<MailboxListener.Event>() { +            @Override
+            public MailboxListener.Event answer(InvocationOnMock invocation) throws \
Throwable { +                return EVENT;
+            }
+        });
+        testee.receiveSerializedEvent(BYTES);
+        assertThat(onceEventCollector.getEvents()).isEmpty();
+        verify(mockedMailboxPathRegister).getLocalTopic();
+        verify(mockedEventSerializer).deSerializeEvent(BYTES);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+    @Test
+    public void deletionEventsShouldBeWellHandled() throws Exception {
+        MailboxListener.Event event = new \
MailboxListener.MailboxDeletion(mailboxSession, MAILBOX_PATH); +        \
testee.addListener(MAILBOX_PATH, mailboxEventCollector, mailboxSession); +        \
verify(mockedMailboxPathRegister).register(MAILBOX_PATH); +        \
when(mockedMailboxPathRegister.getTopics(MAILBOX_PATH)).thenAnswer(new \
Answer<Set<Topic>>() { +            @Override
+            public Set<Topic> answer(InvocationOnMock invocation) throws Throwable {
+                return Sets.newHashSet(TOPIC, TOPIC_2);
+            }
+        });
+        when(mockedMailboxPathRegister.getLocalTopic()).thenAnswer(new \
Answer<Topic>() { +            @Override
+            public Topic answer(InvocationOnMock invocation) throws Throwable {
+                return TOPIC;
+            }
+        });
+        when(mockedEventSerializer.serializeEvent(event)).thenAnswer(new \
Answer<byte[]>() { +            @Override
+            public byte[] answer(InvocationOnMock invocation) throws Throwable {
+                return BYTES;
+            }
+        });
+        testee.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(event);
+        verify(mockedMailboxPathRegister, times(2)).getLocalTopic();
+        verify(mockedMailboxPathRegister).getTopics(MAILBOX_PATH);
+        verify(mockedMailboxPathRegister).doCompleteUnRegister(MAILBOX_PATH);
+        verify(mockedEventSerializer).serializeEvent(event);
+        verify(mockedPublisher).publish(TOPIC_2, BYTES);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+
+    @Test
+    public void renameEventsShouldBeWellHandled() throws Exception {
+        MailboxListener.Event event = new \
MailboxListener.MailboxRenamed(mailboxSession, MAILBOX_PATH) { +            @Override
+            public MailboxPath getNewPath() {
+                return MAILBOX_PATH_NEW;
+            }
+        };
+        testee.addListener(MAILBOX_PATH, mailboxEventCollector, mailboxSession);
+        verify(mockedMailboxPathRegister).register(MAILBOX_PATH);
+        when(mockedMailboxPathRegister.getTopics(MAILBOX_PATH)).thenAnswer(new \
Answer<Set<Topic>>() { +            @Override
+            public Set<Topic> answer(InvocationOnMock invocation) throws Throwable {
+                return Sets.newHashSet(TOPIC, TOPIC_2);
+            }
+        });
+        when(mockedMailboxPathRegister.getLocalTopic()).thenAnswer(new \
Answer<Topic>() { +            @Override
+            public Topic answer(InvocationOnMock invocation) throws Throwable {
+                return TOPIC;
+            }
+        });
+        when(mockedEventSerializer.serializeEvent(event)).thenAnswer(new \
Answer<byte[]>() { +            @Override
+            public byte[] answer(InvocationOnMock invocation) throws Throwable {
+                return BYTES;
+            }
+        });
+        testee.event(event);
+        assertThat(mailboxEventCollector.getEvents()).containsOnly(event);
+        verify(mockedMailboxPathRegister, times(2)).getLocalTopic();
+        verify(mockedMailboxPathRegister).getTopics(MAILBOX_PATH);
+        verify(mockedMailboxPathRegister).doRename(MAILBOX_PATH, MAILBOX_PATH_NEW);
+        verify(mockedEventSerializer).serializeEvent(event);
+        verify(mockedPublisher).publish(TOPIC_2, BYTES);
+        verifyNoMoreInteractions(mockedEventSerializer);
+        verifyNoMoreInteractions(mockedPublisher);
+        verifyNoMoreInteractions(mockedMailboxPathRegister);
+    }
+}



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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic