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/06/12 00:03:32 UTC
[13/17] james-project git commit: JAMES-2414 MailboxListeners should
be fully final
JAMES-2414 MailboxListeners should be fully final
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f3127d87
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f3127d87
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f3127d87
Branch: refs/heads/master
Commit: f3127d870b3555cbfdc955d379ede001875a2edb
Parents: e9de12e
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 8 09:43:04 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jun 12 07:01:45 2018 +0700
----------------------------------------------------------------------
.../apache/james/mailbox/MailboxListener.java | 4 --
.../QuotaThresholdCrossingListener.java | 35 ++++--------
.../QuotaThresholdListenersTestSystem.java | 4 +-
.../spamassassin/SpamAssassinListener.java | 17 ++----
.../spamassassin/SpamAssassinListenerTest.java | 3 +-
.../SpamAssassinListenerModule.java | 4 +-
.../modules/mailbox/MailboxListenerFactory.java | 57 +++++++++++++++++++-
.../mailbox/MailboxListenersLoaderImpl.java | 29 +++-------
8 files changed, 82 insertions(+), 71 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/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 d1aeb7d..9021aa9 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
@@ -40,10 +40,6 @@ import org.apache.james.mailbox.quota.QuotaSize;
*/
public interface MailboxListener {
- interface ConfigurableExecutionMode {
- void setExecutionMode(ExecutionMode executionMode);
- }
-
enum ListenerType {
ONCE,
EACH_NODE,
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/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 526679c..d669cba 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
@@ -28,7 +28,6 @@ import org.apache.james.eventsourcing.EventSourcingSystem;
import org.apache.james.eventsourcing.Subscriber;
import org.apache.james.eventsourcing.eventstore.EventStore;
import org.apache.james.filesystem.api.FileSystem;
-import org.apache.james.lifecycle.api.Configurable;
import org.apache.james.mailbox.Event;
import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.quota.mailing.QuotaMailingListenerConfiguration;
@@ -42,35 +41,23 @@ import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableSet;
-public class QuotaThresholdCrossingListener implements MailboxListener, Configurable {
+public class QuotaThresholdCrossingListener implements MailboxListener {
private static final Logger LOGGER = LoggerFactory.getLogger(QuotaThresholdCrossingListener.class);
- private final EventStore eventStore;
- private final MailetContext mailetContext;
- private final UsersRepository usersRepository;
- private final FileSystem fileSystem;
- private EventSourcingSystem eventSourcingSystem;
+ private final EventSourcingSystem eventSourcingSystem;
@Inject
- public QuotaThresholdCrossingListener(MailetContext mailetContext,
- UsersRepository usersRepository,
- FileSystem fileSystem,
- EventStore eventStore) {
- this.eventStore = eventStore;
- this.mailetContext = mailetContext;
- this.usersRepository = usersRepository;
- this.fileSystem = fileSystem;
+ public QuotaThresholdCrossingListener(MailetContext mailetContext, UsersRepository usersRepository,
+ FileSystem fileSystem, EventStore eventStore,
+ HierarchicalConfiguration config) {
+ this(mailetContext, usersRepository, fileSystem, eventStore, QuotaMailingListenerConfiguration.from(config));
}
- @Override
- public void configure(HierarchicalConfiguration config) {
- QuotaMailingListenerConfiguration configuration = QuotaMailingListenerConfiguration.from(config);
- configure(configuration);
- }
-
- public void configure(QuotaMailingListenerConfiguration configuration) {
- ImmutableSet<CommandHandler<?>> handlers = ImmutableSet.of(new DetectThresholdCrossingHandler(eventStore, configuration));
- ImmutableSet<Subscriber> subscribers = ImmutableSet.of(new QuotaThresholdMailer(mailetContext, usersRepository, fileSystem, configuration));
+ public QuotaThresholdCrossingListener(MailetContext mailetContext, UsersRepository usersRepository,
+ FileSystem fileSystem, EventStore eventStore,
+ QuotaMailingListenerConfiguration config) {
+ ImmutableSet<CommandHandler<?>> handlers = ImmutableSet.of(new DetectThresholdCrossingHandler(eventStore, config));
+ ImmutableSet<Subscriber> subscribers = ImmutableSet.of(new QuotaThresholdMailer(mailetContext, usersRepository, fileSystem, config));
eventSourcingSystem = new EventSourcingSystem(handlers, subscribers, eventStore);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
index f6be2c0..32f19e3 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
@@ -41,9 +41,7 @@ public class QuotaThresholdListenersTestSystem {
FileSystem fileSystem = new FileSystemImpl(new JamesServerResourceLoader("."));
QuotaThresholdCrossingListener thresholdCrossingListener =
- new QuotaThresholdCrossingListener(mailetContext, MemoryUsersRepository.withVirtualHosting(), fileSystem, eventStore);
-
- thresholdCrossingListener.configure(configuration);
+ new QuotaThresholdCrossingListener(mailetContext, MemoryUsersRepository.withVirtualHosting(), fileSystem, eventStore, configuration);
MockMailboxSession mailboxSession = new MockMailboxSession("system");
delegatingListener.addGlobalListener(thresholdCrossingListener, mailboxSession);
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/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 6bfb91b..3f3f73a 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
@@ -20,12 +20,10 @@ package org.apache.james.mailbox.spamassassin;
import java.io.InputStream;
import java.util.List;
-import java.util.Optional;
import javax.inject.Inject;
import org.apache.james.mailbox.Event;
-import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.Role;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxId;
@@ -44,24 +42,19 @@ import com.github.steveash.guavate.Guavate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
-public class SpamAssassinListener implements SpamEventListener, MailboxListener.ConfigurableExecutionMode {
+public class SpamAssassinListener implements SpamEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinListener.class);
private final SpamAssassin spamAssassin;
private final MailboxSessionMapperFactory mapperFactory;
- private Optional<ExecutionMode> executionMode;
+ private final ExecutionMode executionMode;
@Inject
- public SpamAssassinListener(SpamAssassin spamAssassin, MailboxSessionMapperFactory mapperFactory) {
+ public SpamAssassinListener(SpamAssassin spamAssassin, MailboxSessionMapperFactory mapperFactory, ExecutionMode executionMode) {
this.spamAssassin = spamAssassin;
this.mapperFactory = mapperFactory;
- this.executionMode = Optional.empty();
- }
-
- @Override
- public void setExecutionMode(ExecutionMode executionMode) {
- this.executionMode = Optional.of(executionMode);
+ this.executionMode = executionMode;
}
@Override
@@ -71,7 +64,7 @@ public class SpamAssassinListener implements SpamEventListener, MailboxListener.
@Override
public ExecutionMode getExecutionMode() {
- return executionMode.orElse(ExecutionMode.ASYNCHRONOUS);
+ return executionMode;
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
index f7b3ba3..a384c4b 100644
--- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -31,6 +31,7 @@ import javax.mail.Flags;
import javax.mail.util.SharedByteArrayInputStream;
import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -86,7 +87,7 @@ public class SpamAssassinListenerTest {
spamCapitalMailboxId = mailboxMapper.save(new SimpleMailbox(MailboxPath.forUser(USER, "SPAM"), UID_VALIDITY));
trashMailboxId = mailboxMapper.save(new SimpleMailbox(MailboxPath.forUser(USER, "Trash"), UID_VALIDITY));
- listener = new SpamAssassinListener(spamAssassin, mapperFactory);
+ listener = new SpamAssassinListener(spamAssassin, mapperFactory, MailboxListener.ExecutionMode.SYNCHRONOUS);
}
@After
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/server/container/guice/mailbox-plugin-spamassassin/src/main/java/org/apache/james/modules/spamassassin/SpamAssassinListenerModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox-plugin-spamassassin/src/main/java/org/apache/james/modules/spamassassin/SpamAssassinListenerModule.java b/server/container/guice/mailbox-plugin-spamassassin/src/main/java/org/apache/james/modules/spamassassin/SpamAssassinListenerModule.java
index 9a96618..862696e 100644
--- a/server/container/guice/mailbox-plugin-spamassassin/src/main/java/org/apache/james/modules/spamassassin/SpamAssassinListenerModule.java
+++ b/server/container/guice/mailbox-plugin-spamassassin/src/main/java/org/apache/james/modules/spamassassin/SpamAssassinListenerModule.java
@@ -26,14 +26,12 @@ import javax.inject.Singleton;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.james.mailbox.spamassassin.SpamAssassinConfiguration;
-import org.apache.james.mailbox.spamassassin.SpamAssassinListener;
import org.apache.james.utils.PropertiesProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
-import com.google.inject.Scopes;
public class SpamAssassinListenerModule extends AbstractModule {
private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinListenerModule.class);
@@ -42,7 +40,7 @@ public class SpamAssassinListenerModule extends AbstractModule {
@Override
protected void configure() {
- bind(SpamAssassinListener.class).in(Scopes.SINGLETON);
+
}
@Provides
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/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 500517b..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
@@ -18,14 +18,67 @@
****************************************************************/
package org.apache.james.modules.mailbox;
+import java.util.Optional;
+
import javax.inject.Inject;
+import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.james.mailbox.MailboxListener;
+import com.google.common.base.Preconditions;
import com.google.inject.Injector;
public class MailboxListenerFactory {
+ public static class MailboxListenerBuilder {
+ private final Injector injector;
+ private Optional<Class<MailboxListener>> clazz;
+ private Optional<MailboxListener.ExecutionMode> executionMode;
+ private Optional<HierarchicalConfiguration> configuration;
+
+ public MailboxListenerBuilder(Injector injector) {
+ this.injector = injector;
+ this.clazz = Optional.empty();
+ this.executionMode = Optional.empty();
+ this.configuration = Optional.empty();
+ }
+
+ public MailboxListenerBuilder withExecutionMode(MailboxListener.ExecutionMode executionMode) {
+ this.executionMode = Optional.of(executionMode);
+ return this;
+ }
+
+ public MailboxListenerBuilder withConfiguration(HierarchicalConfiguration configuration) {
+ this.configuration = Optional.of(configuration);
+ return this;
+ }
+
+ public MailboxListenerBuilder withExecutionMode(Optional<MailboxListener.ExecutionMode> executionMode) {
+ executionMode.ifPresent(this::withExecutionMode);
+ return this;
+ }
+
+ public MailboxListenerBuilder withConfiguration(Optional<HierarchicalConfiguration> configuration) {
+ configuration.ifPresent(this::withConfiguration);
+ return this;
+ }
+
+ public MailboxListenerBuilder clazz(Class<MailboxListener> clazz) {
+ this.clazz = Optional.of(clazz);
+ return this;
+ }
+
+ public MailboxListener build() {
+ Preconditions.checkState(clazz.isPresent(), "'clazz' is mandatory");
+ return injector.createChildInjector(
+ binder -> binder.bind(MailboxListener.ExecutionMode.class)
+ .toInstance(executionMode.orElse(MailboxListener.ExecutionMode.SYNCHRONOUS)),
+ binder -> binder.bind(HierarchicalConfiguration.class)
+ .toInstance(configuration.orElse(new HierarchicalConfiguration())))
+ .getInstance(clazz.get());
+ }
+ }
+
private final Injector injector;
@Inject
@@ -33,7 +86,7 @@ public class MailboxListenerFactory {
this.injector = injector;
}
- public MailboxListener createInstance(Class<MailboxListener> clazz) {
- return injector.getInstance(clazz);
+ public MailboxListenerBuilder newInstance() {
+ return new MailboxListenerBuilder(injector);
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f3127d87/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 fced6be..866553c 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
@@ -20,7 +20,6 @@ package org.apache.james.modules.mailbox;
import java.util.Set;
-import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.james.lifecycle.api.Configurable;
import org.apache.james.mailbox.MailboxListener;
@@ -30,7 +29,6 @@ import org.apache.james.utils.ExtendedClassLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.github.fge.lambdas.Throwing;
import com.google.inject.Inject;
public class MailboxListenersLoaderImpl implements Configurable, MailboxListenersLoader {
@@ -79,31 +77,18 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
String listenerClass = configuration.getClazz();
try {
LOGGER.info("Loading user registered mailbox listener {}", listenerClass);
- Class<MailboxListener> clazz = classLoader.locateClass(listenerClass);
- MailboxListener listener = mailboxListenerFactory.createInstance(clazz);
- if (listener instanceof Configurable) {
- configureListener(configuration, (Configurable) listener);
- }
- if (listener instanceof MailboxListener.ConfigurableExecutionMode) {
- MailboxListener.ConfigurableExecutionMode configurableExecutionMode = (MailboxListener.ConfigurableExecutionMode) listener;
- configuration.isAsync()
- .map(this::getExecutionMode)
- .ifPresent(configurableExecutionMode::setExecutionMode);
- }
- return listener;
- } catch (ClassNotFoundException | ConfigurationException e) {
+ return mailboxListenerFactory.newInstance()
+ .withConfiguration(configuration.getConfiguration())
+ .withExecutionMode(configuration.isAsync().map(this::getExecutionMode))
+ .clazz(classLoader.locateClass(listenerClass))
+ .build();
+ } catch (ClassNotFoundException e) {
LOGGER.error("Error while loading user registered global listener {}", listenerClass, e);
throw new RuntimeException(e);
}
}
- private void configureListener(ListenerConfiguration configuration, Configurable configurableListener) throws ConfigurationException {
- configuration.getConfiguration()
- .ifPresent(Throwing.consumer(configurableListener::configure).sneakyThrow());
- }
-
-
- MailboxListener.ExecutionMode getExecutionMode(boolean isAsync) {
+ private MailboxListener.ExecutionMode getExecutionMode(boolean isAsync) {
if (isAsync) {
return MailboxListener.ExecutionMode.ASYNCHRONOUS;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org