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 2018/12/12 10:52:07 UTC
[14/16] james-project git commit: MAILBOX-357 ListeningSearchIndex
should not rely on "available messages"
MAILBOX-357 ListeningSearchIndex should not rely on "available messages"
This method is not part of the mailbox-api and messages will not be carried along
in distributed events.
AddedImpl no longer need to carry along cached messages.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/07489896
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/07489896
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/07489896
Branch: refs/heads/master
Commit: 074898961aa1847639f1a583ec693cc799773cbf
Parents: 8d2db2c
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Dec 10 14:00:13 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Dec 12 17:50:58 2018 +0700
----------------------------------------------------------------------
.../mailbox/store/StoreMessageManager.java | 4 +-
.../james/mailbox/store/event/EventFactory.java | 16 +-
.../store/event/MailboxEventDispatcher.java | 8 +-
.../search/ListeningMessageSearchIndex.java | 319 +++++++++----------
.../processor/base/SelectedMailboxImplTest.java | 3 +-
5 files changed, 169 insertions(+), 181 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/07489896/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index fc5492f..434c948 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -739,7 +739,7 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
for (MailboxMessage message : originalRows.getEntriesSeen()) {
messagesMap.put(message.getUid(), immutableMailboxMessageFactory.from(to.getMailboxEntity().getMailboxId(), message));
}
- dispatcher.added(session, copiedUids, to.getMailboxEntity(), messagesMap.build());
+ dispatcher.added(session, copiedUids, to.getMailboxEntity());
dispatcher.moved(session,
MessageMoves.builder()
.previousMailboxIds(getMailboxEntity().getMailboxId())
@@ -759,7 +759,7 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
for (MailboxMessage message : originalRows.getEntriesSeen()) {
messagesMap.put(message.getUid(), immutableMailboxMessageFactory.from(to.getMailboxEntity().getMailboxId(), message));
}
- dispatcher.added(session, moveUids, to.getMailboxEntity(), messagesMap.build());
+ dispatcher.added(session, moveUids, to.getMailboxEntity());
dispatcher.expunged(session, collectMetadata(moveResult.getOriginalMessages()), getMailboxEntity());
dispatcher.moved(session,
MessageMoves.builder()
http://git-wip-us.apache.org/repos/asf/james-project/blob/07489896/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
index dd47954..1fd51e5 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
@@ -51,14 +51,12 @@ public class EventFactory {
public final class AddedImpl extends MailboxListener.Added implements MailboxAware {
private final Map<MessageUid, MessageMetaData> added;
- private final Map<MessageUid, MailboxMessage> availableMessages;
private final Mailbox mailbox;
- public AddedImpl(MailboxSession.SessionId sessionId, User user, Mailbox mailbox, SortedMap<MessageUid, MessageMetaData> uids, Map<MessageUid, MailboxMessage> availableMessages) {
+ public AddedImpl(MailboxSession.SessionId sessionId, User user, Mailbox mailbox, SortedMap<MessageUid, MessageMetaData> uids) {
super(sessionId, user, new StoreMailboxPath(mailbox), mailbox.getMailboxId());
this.added = ImmutableMap.copyOf(uids);
this.mailbox = mailbox;
- this.availableMessages = ImmutableMap.copyOf(availableMessages);
}
@Override
@@ -75,10 +73,6 @@ public class EventFactory {
public Mailbox getMailbox() {
return mailbox;
}
-
- public Map<MessageUid, MailboxMessage> getAvailableMessages() {
- return availableMessages;
- }
}
public final class ExpungedImpl extends MailboxListener.Expunged implements MailboxAware {
@@ -193,12 +187,12 @@ public class EventFactory {
}
}
- public MailboxListener.Added added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox, Map<MessageUid, MailboxMessage> cachedMessages) {
- return added(session.getSessionId(), session.getUser().getCoreUser(), uids, mailbox, cachedMessages);
+ public MailboxListener.Added added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
+ return added(session.getSessionId(), session.getUser().getCoreUser(), uids, mailbox);
}
- public MailboxListener.Added added(MailboxSession.SessionId sessionId, User user, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox, Map<MessageUid, MailboxMessage> cachedMessages) {
- return new AddedImpl(sessionId, user, mailbox, uids, cachedMessages);
+ public MailboxListener.Added added(MailboxSession.SessionId sessionId, User user, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
+ return new AddedImpl(sessionId, user, mailbox, uids);
}
public MailboxListener.Expunged expunged(MailboxSession session, Map<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/07489896/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
index 206e8b7..2d6afd9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
@@ -81,8 +81,8 @@ public class MailboxEventDispatcher {
* @param uids Sorted map with uids and message meta data
* @param mailbox The mailbox
*/
- public void added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox, Map<MessageUid, MailboxMessage> cachedMessages) {
- listener.event(eventFactory.added(session, uids, mailbox, cachedMessages));
+ public void added(MailboxSession session, SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
+ listener.event(eventFactory.added(session, uids, mailbox));
}
public void added(MailboxSession session, Mailbox mailbox, MailboxMessage mailboxMessage) {
@@ -90,14 +90,14 @@ public class MailboxEventDispatcher {
SortedMap<MessageUid, MessageMetaData> metaDataMap = ImmutableSortedMap.<MessageUid, MessageMetaData>naturalOrder()
.put(messageMetaData.getUid(), messageMetaData)
.build();
- added(session, metaDataMap, mailbox, ImmutableMap.of(mailboxMessage.getUid(), mailboxMessage));
+ added(session, metaDataMap, mailbox);
}
public void added(MailboxSession session, MessageMetaData messageMetaData, Mailbox mailbox) {
SortedMap<MessageUid, MessageMetaData> metaDataMap = ImmutableSortedMap.<MessageUid, MessageMetaData>naturalOrder()
.put(messageMetaData.getUid(), messageMetaData)
.build();
- added(session, metaDataMap, mailbox, ImmutableMap.<MessageUid, MailboxMessage>of());
+ added(session, metaDataMap, mailbox);
}
/**
http://git-wip-us.apache.org/repos/asf/james-project/blob/07489896/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 01a0d21..104291e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -1,162 +1,157 @@
-/****************************************************************
- * 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.search;
-
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.james.mailbox.Event;
-import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.UpdatedFlags;
-import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.event.EventFactory;
-import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * {@link MessageSearchIndex} which needs to get registered as global {@link MailboxListener} and so get
- * notified about message changes. This will then allow to update the underlying index.
- *
- *
- */
-public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, MailboxListener {
- private static final Logger LOGGER = LoggerFactory.getLogger(ListeningMessageSearchIndex.class);
-
- private static final int UNLIMITED = -1;
- private final MailboxSessionMapperFactory factory;
- private final MailboxManager mailboxManager;
-
- public ListeningMessageSearchIndex(MailboxSessionMapperFactory factory, MailboxManager mailboxManager) {
- this.factory = factory;
- this.mailboxManager = mailboxManager;
- }
-
- /**
- * Process the {@link org.apache.james.mailbox.Event} and update the index if
- * something relevant is received
- */
- @Override
- public void event(Event event) {
- try {
- MailboxSession session = mailboxManager.createSystemSession(event.getUser().asString());
- if (event instanceof MessageEvent) {
- if (event instanceof EventFactory.AddedImpl) {
- EventFactory.AddedImpl added = (EventFactory.AddedImpl) event;
- Mailbox mailbox = added.getMailbox();
-
- for (MessageUid uid : added.getUids()) {
- retrieveMailboxMessage(session, added, mailbox, uid)
- .ifPresent(mailboxMessage -> addMessage(session, mailbox, mailboxMessage));
- }
- } else if (event instanceof EventFactory.ExpungedImpl) {
- EventFactory.ExpungedImpl expunged = (EventFactory.ExpungedImpl) event;
- try {
- delete(session, expunged.getMailbox(), expunged.getUids());
- } catch (MailboxException e) {
- LOGGER.error("Unable to deleted messages {} from index for mailbox {}", expunged.getUids(), expunged.getMailbox(), e);
- }
- } else if (event instanceof EventFactory.FlagsUpdatedImpl) {
- EventFactory.FlagsUpdatedImpl flagsUpdated = (EventFactory.FlagsUpdatedImpl) event;
- Mailbox mailbox = flagsUpdated.getMailbox();
-
- try {
- update(session, mailbox, flagsUpdated.getUpdatedFlags());
- } catch (MailboxException e) {
- LOGGER.error("Unable to update flags in index for mailbox {}", mailbox, e);
- }
- }
- } else if (event instanceof EventFactory.MailboxDeletionImpl) {
- deleteAll(session, ((EventFactory.MailboxDeletionImpl) event).getMailbox());
- }
- } catch (MailboxException e) {
- LOGGER.error("Unable to update index", e);
- }
- }
-
- private Optional<MailboxMessage> retrieveMailboxMessage(MailboxSession session, EventFactory.AddedImpl added, Mailbox mailbox, MessageUid next) {
- Optional<MailboxMessage> firstChoice = Optional.ofNullable(added.getAvailableMessages().get(next));
- if (firstChoice.isPresent()) {
- return firstChoice;
- } else {
- try {
- return Optional.of(factory.getMessageMapper(session)
- .findInMailbox(mailbox, MessageRange.one(next), FetchType.Full, UNLIMITED)
- .next());
- } catch (Exception e) {
- LOGGER.error("Could not retrieve message {} in mailbox {}", next, mailbox.getMailboxId().serialize(), e);
- return Optional.empty();
- }
- }
- }
-
- private void addMessage(MailboxSession session, Mailbox mailbox, MailboxMessage message) {
- try {
- add(session, mailbox, message);
- } catch (MailboxException e) {
- LOGGER.error("Unable to index message {} for mailbox {}", message.getUid(), mailbox, e);
- }
- }
-
- /**
- * Add the {@link MailboxMessage} for the given {@link Mailbox} to the index
- *
- * @param session The mailbox session performing the message addition
- * @param mailbox mailbox on which the message addition was performed
- * @param message The added message
- * @throws MailboxException
- */
- public abstract void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws MailboxException;
-
- /**
- * Delete the concerned UIDs for the given {@link Mailbox} from the index
- *
- * @param session The mailbox session performing the expunge
- * @param mailbox mailbox on which the expunge was performed
- * @param expungedUids UIDS to be deleted
- * @throws MailboxException
- */
- public abstract void delete(MailboxSession session, Mailbox mailbox, List<MessageUid> expungedUids) throws MailboxException;
-
- /**
- * Delete the messages contained in the given {@link Mailbox} from the index
- *
- * @param session The mailbox session performing the expunge
- * @param mailbox mailbox on which the expunge was performed
- * @throws MailboxException
- */
- public abstract void deleteAll(MailboxSession session, Mailbox mailbox) throws MailboxException;
-
- /**
- * Update the messages concerned by the updated flags list for the given {@link Mailbox}
- *
- * @param session session that performed the update
- * @param mailbox mailbox containing the updated messages
- * @param updatedFlagsList list of flags that were updated
- * @throws MailboxException
- */
- public abstract void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException;
-}
+/****************************************************************
+ * 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.search;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.james.mailbox.Event;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.event.EventFactory;
+import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link MessageSearchIndex} which needs to get registered as global {@link MailboxListener} and so get
+ * notified about message changes. This will then allow to update the underlying index.
+ *
+ *
+ */
+public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, MailboxListener {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ListeningMessageSearchIndex.class);
+
+ private static final int UNLIMITED = -1;
+ private final MailboxSessionMapperFactory factory;
+ private final MailboxManager mailboxManager;
+
+ public ListeningMessageSearchIndex(MailboxSessionMapperFactory factory, MailboxManager mailboxManager) {
+ this.factory = factory;
+ this.mailboxManager = mailboxManager;
+ }
+
+ /**
+ * Process the {@link org.apache.james.mailbox.Event} and update the index if
+ * something relevant is received
+ */
+ @Override
+ public void event(Event event) {
+ try {
+ MailboxSession session = mailboxManager.createSystemSession(event.getUser().asString());
+ if (event instanceof MessageEvent) {
+ if (event instanceof EventFactory.AddedImpl) {
+ EventFactory.AddedImpl added = (EventFactory.AddedImpl) event;
+ Mailbox mailbox = added.getMailbox();
+
+ for (MessageUid uid : added.getUids()) {
+ retrieveMailboxMessage(session, mailbox, uid)
+ .ifPresent(mailboxMessage -> addMessage(session, mailbox, mailboxMessage));
+ }
+ } else if (event instanceof EventFactory.ExpungedImpl) {
+ EventFactory.ExpungedImpl expunged = (EventFactory.ExpungedImpl) event;
+ try {
+ delete(session, expunged.getMailbox(), expunged.getUids());
+ } catch (MailboxException e) {
+ LOGGER.error("Unable to deleted messages {} from index for mailbox {}", expunged.getUids(), expunged.getMailbox(), e);
+ }
+ } else if (event instanceof EventFactory.FlagsUpdatedImpl) {
+ EventFactory.FlagsUpdatedImpl flagsUpdated = (EventFactory.FlagsUpdatedImpl) event;
+ Mailbox mailbox = flagsUpdated.getMailbox();
+
+ try {
+ update(session, mailbox, flagsUpdated.getUpdatedFlags());
+ } catch (MailboxException e) {
+ LOGGER.error("Unable to update flags in index for mailbox {}", mailbox, e);
+ }
+ }
+ } else if (event instanceof EventFactory.MailboxDeletionImpl) {
+ deleteAll(session, ((EventFactory.MailboxDeletionImpl) event).getMailbox());
+ }
+ } catch (MailboxException e) {
+ LOGGER.error("Unable to update index", e);
+ }
+ }
+
+ private Optional<MailboxMessage> retrieveMailboxMessage(MailboxSession session, Mailbox mailbox, MessageUid uid) {
+ try {
+ return Optional.of(factory.getMessageMapper(session)
+ .findInMailbox(mailbox, MessageRange.one(uid), FetchType.Full, UNLIMITED)
+ .next());
+ } catch (Exception e) {
+ LOGGER.error("Could not retrieve message {} in mailbox {}", uid.asLong(), mailbox.getMailboxId().serialize(), e);
+ return Optional.empty();
+ }
+ }
+
+ private void addMessage(MailboxSession session, Mailbox mailbox, MailboxMessage message) {
+ try {
+ add(session, mailbox, message);
+ } catch (MailboxException e) {
+ LOGGER.error("Unable to index message {} for mailbox {}", message.getUid(), mailbox, e);
+ }
+ }
+
+ /**
+ * Add the {@link MailboxMessage} for the given {@link Mailbox} to the index
+ *
+ * @param session The mailbox session performing the message addition
+ * @param mailbox mailbox on which the message addition was performed
+ * @param message The added message
+ * @throws MailboxException
+ */
+ public abstract void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws MailboxException;
+
+ /**
+ * Delete the concerned UIDs for the given {@link Mailbox} from the index
+ *
+ * @param session The mailbox session performing the expunge
+ * @param mailbox mailbox on which the expunge was performed
+ * @param expungedUids UIDS to be deleted
+ * @throws MailboxException
+ */
+ public abstract void delete(MailboxSession session, Mailbox mailbox, List<MessageUid> expungedUids) throws MailboxException;
+
+ /**
+ * Delete the messages contained in the given {@link Mailbox} from the index
+ *
+ * @param session The mailbox session performing the expunge
+ * @param mailbox mailbox on which the expunge was performed
+ * @throws MailboxException
+ */
+ public abstract void deleteAll(MailboxSession session, Mailbox mailbox) throws MailboxException;
+
+ /**
+ * Update the messages concerned by the updated flags list for the given {@link Mailbox}
+ *
+ * @param session session that performed the update
+ * @param mailbox mailbox containing the updated messages
+ * @param updatedFlagsList list of flags that were updated
+ * @throws MailboxException
+ */
+ public abstract void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException;
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/07489896/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index dfb1797..7973ab2 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -63,7 +63,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
public class SelectedMailboxImplTest {
@@ -171,6 +170,6 @@ public class SelectedMailboxImplTest {
TreeMap<MessageUid, MessageMetaData> result = new TreeMap<>();
result.put(EMITTED_EVENT_UID, new SimpleMessageMetaData(EMITTED_EVENT_UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()));
mailboxListener.event(new EventFactory().added(MailboxSession.SessionId.of(random.nextLong()),
- mock(User.class), result, mailbox, ImmutableMap.of()));
+ mock(User.class), result, mailbox));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org