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 <btell...@linagora.com> Authored: Mon Jan 14 10:44:20 2019 +0700 Committer: Benoit Tellier <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org