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 2019/01/17 06:50:35 UTC

[19/27] james-project git commit: JAMES-2641 Allow specifying group of registered listeners

JAMES-2641 Allow specifying group of registered listeners

This allow duplicate listeners to be registered, a feature used by over-quota mailing
to specify several thresholds.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8d66bb11
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8d66bb11
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8d66bb11

Branch: refs/heads/master
Commit: 8d66bb110a21a7a473dc3fcea84fb5a5399499b3
Parents: 24fe28f
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Jan 14 10:44:20 2019 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Jan 17 13:49:09 2019 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxListener.java   |  2 +-
 .../apache/james/mailbox/events/EventBus.java   |  2 +-
 .../james/mailbox/events/GenericGroup.java      | 45 ++++++++++++++++++++
 .../org/apache/james/mailbox/events/Group.java  |  4 +-
 .../apache/james/mailbox/events/GroupTest.java  |  7 +++
 .../james/mailbox/util/EventCollector.java      |  2 +-
 .../CacheInvalidatingMailboxListener.java       |  2 +-
 .../MailboxOperationLoggingListener.java        |  2 +-
 ...lasticSearchListeningMessageSearchIndex.java |  2 +-
 .../lucene/search/LuceneMessageSearchIndex.java |  2 +-
 .../QuotaThresholdCrossingListener.java         |  2 +-
 .../ElasticSearchQuotaMailboxListener.java      |  2 +-
 .../spamassassin/SpamAssassinListener.java      |  2 +-
 .../store/event/MailboxAnnotationListener.java  |  2 +-
 .../quota/ListeningCurrentQuotaUpdater.java     |  2 +-
 .../store/search/LazyMessageSearchIndex.java    |  2 +-
 .../modules/mailbox/CassandraQuotaModule.java   |  2 +-
 .../modules/mailbox/ListenerConfiguration.java  | 13 ++++--
 .../modules/mailbox/MailboxListenerFactory.java |  6 +--
 .../modules/mailbox/MailboxListenersLoader.java |  6 ++-
 .../mailbox/MailboxListenersLoaderImpl.java     | 29 ++++++++++---
 .../modules/mailbox/NoopMailboxListener.java    |  2 +-
 .../mailbox/ListenerConfigurationTest.java      | 25 ++++++++++-
 .../mailbox/MailboxListenersLoaderImplTest.java | 39 ++++++++++++++++-
 .../src/test/resources/listeners.xml            |  2 +
 .../src/test/resources/listeners.xml            |  2 +
 .../src/test/resources/listeners.xml            |  2 +
 .../event/PropagateLookupRightListener.java     |  2 +-
 28 files changed, 176 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxListener.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
index fd79dd9..d845154 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxListener.java
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableMap;
 public interface MailboxListener {
 
     interface GroupMailboxListener extends MailboxListener {
-        Group getGroup();
+        Group getDefaultGroup();
     }
 
     enum ExecutionMode {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventBus.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventBus.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventBus.java
index 70275cc..6b25f1b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventBus.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventBus.java
@@ -40,6 +40,6 @@ public interface EventBus {
     }
 
     default Registration register(MailboxListener.GroupMailboxListener groupMailboxListener) {
-        return register(groupMailboxListener, groupMailboxListener.getGroup());
+        return register(groupMailboxListener, groupMailboxListener.getDefaultGroup());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
new file mode 100644
index 0000000..ed36568
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
@@ -0,0 +1,45 @@
+/****************************************************************
+ * 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.events;
+
+import java.util.Objects;
+
+public class GenericGroup extends Group {
+    private final String groupName;
+
+    public GenericGroup(String groupName) {
+        this.groupName = groupName;
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof GenericGroup) {
+            GenericGroup that = (GenericGroup) o;
+
+            return Objects.equals(this.groupName, that.groupName);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(groupName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
index 33df511..2da5cb4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
@@ -23,7 +23,7 @@ import java.util.Objects;
 
 public class Group {
     @Override
-    public final boolean equals(Object o) {
+    public boolean equals(Object o) {
         if (o == null) {
             return false;
         }
@@ -31,7 +31,7 @@ public class Group {
     }
 
     @Override
-    public final int hashCode() {
+    public int hashCode() {
         return Objects.hash(getClass());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
index 80a7029..0acb141 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
@@ -58,4 +58,11 @@ class GroupTest {
     void equalsShouldReturnFalseOnParentClass() {
         assertThat(new GroupC()).isNotEqualTo(new GroupA());
     }
+
+    @Test
+    void genericGroupShouldMatchBeanContract() {
+        EqualsVerifier.forClass(GenericGroup.class)
+            .withRedefinedSuperclass()
+            .verify();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
index c88eefb..f2f3c42 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java
@@ -34,7 +34,7 @@ public class EventCollector implements MailboxListener.GroupMailboxListener {
     private final List<Event> events = new ArrayList<>();
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
----------------------------------------------------------------------
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
index 1c98ce1..e3f38c8 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java
@@ -27,7 +27,7 @@ public class CacheInvalidatingMailboxListener implements MailboxListener.GroupMa
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
index bf1822a..660a748 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java
@@ -40,7 +40,7 @@ public class MailboxOperationLoggingListener implements MailboxListener.GroupMai
     private static final Group GROUP = new MailboxOperationLoggingListenerGroup();
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 010b7e7..398e792 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -82,7 +82,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index 3952deb..6ede59f 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -402,7 +402,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     }
 
     @Override
-    public org.apache.james.mailbox.events.Group getGroup() {
+    public org.apache.james.mailbox.events.Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
index ee8546b..73c6b1c 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
@@ -66,7 +66,7 @@ public class QuotaThresholdCrossingListener implements MailboxListener.GroupMail
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
index 03b5d6f..a546492 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
@@ -51,7 +51,7 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
index 8efc15c..5427320 100644
--- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
@@ -72,7 +72,7 @@ public class SpamAssassinListener implements SpamEventListener {
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
index eff61a7..b026186 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
@@ -51,7 +51,7 @@ public class MailboxAnnotationListener implements MailboxListener.GroupMailboxLi
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index 26fea63..251541b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -60,7 +60,7 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index 9145620..6a44864 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -73,7 +73,7 @@ public class LazyMessageSearchIndex extends ListeningMessageSearchIndex {
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
index 6cdef0f..1684aa6 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
@@ -65,7 +65,7 @@ public class CassandraQuotaModule extends AbstractModule {
 
         bind(ListeningCurrentQuotaUpdater.class).in(Scopes.SINGLETON);
         bind(QuotaUpdater.class).to(ListeningCurrentQuotaUpdater.class);
-        Multibinder.newSetBinder(binder(), MailboxListener.class)
+        Multibinder.newSetBinder(binder(), MailboxListener.GroupMailboxListener.class)
             .addBinding()
             .to(ListeningCurrentQuotaUpdater.class);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java
index ec99546..2eea8a2 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java
@@ -31,11 +31,12 @@ public class ListenerConfiguration {
         String listenerClass = configuration.getString("class");
         Preconditions.checkState(!Strings.isNullOrEmpty(listenerClass), "class name is mandatory");
         Optional<Boolean> isAsync = Optional.ofNullable(configuration.getBoolean("async", null));
-        return new ListenerConfiguration(listenerClass, extractSubconfiguration(configuration), isAsync);
+        Optional<String> group = Optional.ofNullable(configuration.getString("group", null));
+        return new ListenerConfiguration(listenerClass, group, extractSubconfiguration(configuration), isAsync);
     }
 
     public static ListenerConfiguration forClass(String clazz) {
-        return new ListenerConfiguration(clazz, Optional.empty(), Optional.empty());
+        return new ListenerConfiguration(clazz, Optional.empty(), Optional.empty(), Optional.empty());
     }
 
     private static Optional<HierarchicalConfiguration> extractSubconfiguration(HierarchicalConfiguration configuration) {
@@ -45,15 +46,21 @@ public class ListenerConfiguration {
     }
 
     private final String clazz;
+    private final Optional<String> group;
     private final Optional<HierarchicalConfiguration> configuration;
     private final Optional<Boolean> isAsync;
 
-    private ListenerConfiguration(String clazz, Optional<HierarchicalConfiguration> configuration, Optional<Boolean> isAsync) {
+    private ListenerConfiguration(String clazz, Optional<String> group, Optional<HierarchicalConfiguration> configuration, Optional<Boolean> isAsync) {
         this.clazz = clazz;
+        this.group = group;
         this.configuration = configuration;
         this.isAsync = isAsync;
     }
 
+    public Optional<String> getGroup() {
+        return group;
+    }
+
     public String getClazz() {
         return clazz;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java
index 9af26be..4c39661 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java
@@ -32,7 +32,7 @@ public class MailboxListenerFactory {
 
     public static class MailboxListenerBuilder {
         private final Injector injector;
-        private Optional<Class<MailboxListener.GroupMailboxListener>> clazz;
+        private Optional<Class<MailboxListener>> clazz;
         private Optional<MailboxListener.ExecutionMode> executionMode;
         private Optional<HierarchicalConfiguration> configuration;
 
@@ -63,12 +63,12 @@ public class MailboxListenerFactory {
             return this;
         }
 
-        public MailboxListenerBuilder clazz(Class<MailboxListener.GroupMailboxListener> clazz) {
+        public MailboxListenerBuilder clazz(Class<MailboxListener> clazz) {
             this.clazz = Optional.of(clazz);
             return this;
         }
 
-        public MailboxListener.GroupMailboxListener build() {
+        public MailboxListener build() {
             Preconditions.checkState(clazz.isPresent(), "'clazz' is mandatory");
             return injector.createChildInjector(
                 binder -> binder.bind(MailboxListener.ExecutionMode.class)

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java
index 1909a3f..0f0b458 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java
@@ -18,10 +18,12 @@
  ****************************************************************/
 package org.apache.james.modules.mailbox;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.events.Group;
 
 public interface MailboxListenersLoader {
-    MailboxListener.GroupMailboxListener createListener(ListenerConfiguration configuration);
+    Pair<Group, MailboxListener> createListener(ListenerConfiguration configuration);
 
-    void register(MailboxListener.GroupMailboxListener listener);
+    void register(Pair<Group, MailboxListener> listener);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java
index b4bf0fa..e1721fb 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java
@@ -21,13 +21,17 @@ package org.apache.james.modules.mailbox;
 import java.util.Set;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.GenericGroup;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.utils.ExtendedClassLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 
 public class MailboxListenersLoaderImpl implements Configurable, MailboxListenersLoader {
@@ -39,7 +43,7 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
     private final Set<MailboxListener.GroupMailboxListener> guiceDefinedListeners;
 
     @Inject
-    public MailboxListenersLoaderImpl(MailboxListenerFactory mailboxListenerFactory, EventBus eventBus,
+    MailboxListenersLoaderImpl(MailboxListenerFactory mailboxListenerFactory, EventBus eventBus,
                                   ExtendedClassLoader classLoader, Set<MailboxListener.GroupMailboxListener> guiceDefinedListeners) {
         this.mailboxListenerFactory = mailboxListenerFactory;
         this.eventBus = eventBus;
@@ -53,7 +57,7 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
 
         ListenersConfiguration listenersConfiguration = ListenersConfiguration.from(configuration);
 
-        guiceDefinedListeners.forEach(this::register);
+        guiceDefinedListeners.forEach(eventBus::register);
 
         listenersConfiguration.getListenersConfiguration().stream()
             .map(this::createListener)
@@ -61,26 +65,39 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
     }
 
     @Override
-    public void register(MailboxListener.GroupMailboxListener listener) {
-        eventBus.register(listener);
+    public void register(Pair<Group, MailboxListener> listener) {
+        eventBus.register(listener.getRight(), listener.getLeft());
     }
 
     @Override
-    public MailboxListener.GroupMailboxListener createListener(ListenerConfiguration configuration) {
+    public Pair<Group, MailboxListener> createListener(ListenerConfiguration configuration) {
         String listenerClass = configuration.getClazz();
         try {
             LOGGER.info("Loading user registered mailbox listener {}", listenerClass);
-            return mailboxListenerFactory.newInstance()
+            MailboxListener mailboxListener = mailboxListenerFactory.newInstance()
                 .withConfiguration(configuration.getConfiguration())
                 .withExecutionMode(configuration.isAsync().map(this::getExecutionMode))
                 .clazz(classLoader.locateClass(listenerClass))
                 .build();
+
+
+            return configuration.getGroup()
+                .map(GenericGroup::new)
+                .map(group -> Pair.<Group, MailboxListener>of(group, mailboxListener))
+                .orElseGet(() -> withDefaultGroup(mailboxListener));
         } catch (ClassNotFoundException e) {
             LOGGER.error("Error while loading user registered global listener {}", listenerClass, e);
             throw new RuntimeException(e);
         }
     }
 
+    private Pair<Group, MailboxListener> withDefaultGroup(MailboxListener mailboxListener) {
+        Preconditions.checkArgument(mailboxListener instanceof MailboxListener.GroupMailboxListener);
+
+        MailboxListener.GroupMailboxListener groupMailboxListener = (MailboxListener.GroupMailboxListener) mailboxListener;
+        return Pair.of(groupMailboxListener.getDefaultGroup(), groupMailboxListener);
+    }
+
     private MailboxListener.ExecutionMode getExecutionMode(boolean isAsync) {
         if (isAsync) {
             return MailboxListener.ExecutionMode.ASYNCHRONOUS;

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/NoopMailboxListener.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
index 14dd45d..70a544d 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/NoopMailboxListener.java
@@ -28,7 +28,7 @@ public class NoopMailboxListener implements MailboxListener.GroupMailboxListener
     static final Group GROUP = new NoopMailboxListenerGroup();
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java
index b2db84c..5184717 100644
--- a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java
+++ b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java
@@ -57,12 +57,33 @@ public class ListenerConfigurationTest {
     @Test
     public void isAsyncShouldReturnConfiguredValue() {
         DefaultConfigurationBuilder configuration = new DefaultConfigurationBuilder();
-        String expectedClazz = "MyClassName";
-        configuration.addProperty("class", expectedClazz);
+        configuration.addProperty("class", "MyClassName");
         configuration.addProperty("async", "false");
 
         ListenerConfiguration listenerConfiguration = ListenerConfiguration.from(configuration);
 
         assertThat(listenerConfiguration.isAsync()).contains(false);
     }
+
+    @Test
+    public void getGroupShouldBeEmptyByDefault() {
+        DefaultConfigurationBuilder configuration = new DefaultConfigurationBuilder();
+        configuration.addProperty("class", "MyClassName");
+
+        ListenerConfiguration listenerConfiguration = ListenerConfiguration.from(configuration);
+
+        assertThat(listenerConfiguration.getGroup()).isEmpty();
+    }
+
+    @Test
+    public void getGroupShouldContainsConfiguredValue() {
+        String groupName = "Avengers";
+        DefaultConfigurationBuilder configuration = new DefaultConfigurationBuilder();
+        configuration.addProperty("class", "MyClassName");
+        configuration.addProperty("group", groupName);
+
+        ListenerConfiguration listenerConfiguration = ListenerConfiguration.from(configuration);
+
+        assertThat(listenerConfiguration.getGroup()).contains(groupName);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
index a9f454d..bcdbcc6 100644
--- a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
+++ b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java
@@ -30,8 +30,11 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.events.GenericGroup;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
 import org.apache.james.metrics.api.NoopMetricFactory;
@@ -86,9 +89,9 @@ public class MailboxListenersLoaderImplTest {
     public void createListenerShouldReturnMailboxListenerWhenConfigurationIsGood() {
         ListenerConfiguration configuration = ListenerConfiguration.forClass("org.apache.james.modules.mailbox.NoopMailboxListener");
 
-        MailboxListener listener = testee.createListener(configuration);
+        Pair<Group, MailboxListener> listener = testee.createListener(configuration);
 
-        assertThat(listener).isInstanceOf(NoopMailboxListener.class);
+        assertThat(listener.getRight()).isInstanceOf(NoopMailboxListener.class);
     }
 
     @Test
@@ -104,6 +107,38 @@ public class MailboxListenersLoaderImplTest {
         assertThat(eventBus.registeredGroups()).containsExactly(NoopMailboxListener.GROUP);
     }
 
+    @Test
+    public void customGroupCanBePassed() throws ConfigurationException {
+        DefaultConfigurationBuilder configuration = toConfigutation("<listeners>" +
+                    "<listener>" +
+                        "<class>org.apache.james.modules.mailbox.NoopMailboxListener</class>" +
+                        "<group>Avengers</group>" +
+                    "</listener>" +
+                "</listeners>");
+
+        testee.configure(configuration);
+
+        assertThat(eventBus.registeredGroups()).containsExactly(new GenericGroup("Avengers"));
+    }
+
+    @Test
+    public void aListenerCanBeRegisteredOnSeveralGroups() throws ConfigurationException {
+        DefaultConfigurationBuilder configuration = toConfigutation("<listeners>" +
+                    "<listener>" +
+                        "<class>org.apache.james.modules.mailbox.NoopMailboxListener</class>" +
+                        "<group>Avengers</group>" +
+                    "</listener>" +
+                    "<listener>" +
+                        "<class>org.apache.james.modules.mailbox.NoopMailboxListener</class>" +
+                        "<group>Fantastic 4</group>" +
+                    "</listener>" +
+                "</listeners>");
+
+        testee.configure(configuration);
+
+        assertThat(eventBus.registeredGroups()).containsExactlyInAnyOrder(new GenericGroup("Avengers"), new GenericGroup("Fantastic 4"));
+    }
+
     private DefaultConfigurationBuilder toConfigutation(String configurationString) throws ConfigurationException {
         DefaultConfigurationBuilder configuration = new DefaultConfigurationBuilder();
         configuration.load(new ByteArrayInputStream(configurationString.getBytes(StandardCharsets.UTF_8)));

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/listeners.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/listeners.xml b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/listeners.xml
index 7227803..9d0f61b 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/listeners.xml
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/listeners.xml
@@ -30,6 +30,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-lower-threshold</group>
     <configuration>
       <thresholds>
         <threshold>
@@ -41,6 +42,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-upper-threshold</group>
     <configuration>
       <thresholds>
         <threshold>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/listeners.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/listeners.xml b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/listeners.xml
index cd9acd6..2145b25 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/listeners.xml
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/listeners.xml
@@ -27,6 +27,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-lower-threshold</group>
     <configuration>
       <thresholds>
         <threshold>
@@ -38,6 +39,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-upper-threshold</group>
     <configuration>
       <thresholds>
         <threshold>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/resources/listeners.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/resources/listeners.xml b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/resources/listeners.xml
index 7227803..9d0f61b 100644
--- a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/resources/listeners.xml
+++ b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/resources/listeners.xml
@@ -30,6 +30,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-lower-threshold</group>
     <configuration>
       <thresholds>
         <threshold>
@@ -41,6 +42,7 @@
   </listener>
   <listener>
     <class>org.apache.james.mailbox.quota.mailing.listeners.QuotaThresholdCrossingListener</class>
+    <group>QuotaThresholdCrossingListener-upper-threshold</group>
     <configuration>
       <thresholds>
         <threshold>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8d66bb11/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
index 4f6dc0c..2ab0273 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -54,7 +54,7 @@ public class PropagateLookupRightListener implements MailboxListener.GroupMailbo
     }
 
     @Override
-    public Group getGroup() {
+    public Group getDefaultGroup() {
         return GROUP;
     }
 


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