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:26 UTC
[07/17] james-project git commit: JAMES-2414 Allow to potentially
configure execution mode on custom mailbox listener
JAMES-2414 Allow to potentially configure execution mode on custom mailbox listener
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/aa4de6a9
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/aa4de6a9
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/aa4de6a9
Branch: refs/heads/master
Commit: aa4de6a94ca9c28e462fa6ad2e694154c29a000f
Parents: bfb5d14
Author: benwa <bt...@linagora.com>
Authored: Thu Jun 7 16:21:18 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jun 12 07:01:28 2018 +0700
----------------------------------------------------------------------
.../apache/james/mailbox/MailboxListener.java | 4 ++++
.../spamassassin/SpamAssassinListener.java | 13 +++++++++--
.../modules/mailbox/ListenerConfiguration.java | 13 ++++++++---
.../mailbox/MailboxListenersLoaderImpl.java | 24 ++++++++++++++++++--
.../mailbox/ListenerConfigurationTest.java | 12 ++++++++++
5 files changed, 59 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/aa4de6a9/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 664a107..fc248d6 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,6 +40,10 @@ import org.apache.james.mailbox.quota.QuotaSize;
*/
public interface MailboxListener {
+ interface ConfigurableExecutionMode {
+ void set(ExecutionMode executionMode);
+ }
+
enum ListenerType {
ONCE,
EACH_NODE,
http://git-wip-us.apache.org/repos/asf/james-project/blob/aa4de6a9/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 7160625..b25fd08 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,10 +20,12 @@ 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;
@@ -42,17 +44,24 @@ import com.github.steveash.guavate.Guavate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
-public class SpamAssassinListener implements SpamEventListener {
+public class SpamAssassinListener implements SpamEventListener, MailboxListener.ConfigurableExecutionMode {
private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinListener.class);
private final SpamAssassin spamAssassin;
private final MailboxSessionMapperFactory mapperFactory;
+ private Optional<ExecutionMode> executionMode;
@Inject
public SpamAssassinListener(SpamAssassin spamAssassin, MailboxSessionMapperFactory mapperFactory) {
this.spamAssassin = spamAssassin;
this.mapperFactory = mapperFactory;
+ this.executionMode = Optional.empty();
+ }
+
+ @Override
+ public void set(ExecutionMode executionMode) {
+ this.executionMode = Optional.of(executionMode);
}
@Override
@@ -62,7 +71,7 @@ public class SpamAssassinListener implements SpamEventListener {
@Override
public ExecutionMode getExecutionMode() {
- return ExecutionMode.ASYNCHRONOUS;
+ return executionMode.orElse(ExecutionMode.ASYNCHRONOUS);
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/aa4de6a9/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 f2d5ea3..ec99546 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
@@ -30,11 +30,12 @@ public class ListenerConfiguration {
public static ListenerConfiguration from(HierarchicalConfiguration configuration) {
String listenerClass = configuration.getString("class");
Preconditions.checkState(!Strings.isNullOrEmpty(listenerClass), "class name is mandatory");
- return new ListenerConfiguration(listenerClass, extractSubconfiguration(configuration));
+ Optional<Boolean> isAsync = Optional.ofNullable(configuration.getBoolean("async", null));
+ return new ListenerConfiguration(listenerClass, extractSubconfiguration(configuration), isAsync);
}
public static ListenerConfiguration forClass(String clazz) {
- return new ListenerConfiguration(clazz, Optional.empty());
+ return new ListenerConfiguration(clazz, Optional.empty(), Optional.empty());
}
private static Optional<HierarchicalConfiguration> extractSubconfiguration(HierarchicalConfiguration configuration) {
@@ -45,10 +46,12 @@ public class ListenerConfiguration {
private final String clazz;
private final Optional<HierarchicalConfiguration> configuration;
+ private final Optional<Boolean> isAsync;
- private ListenerConfiguration(String clazz, Optional<HierarchicalConfiguration> configuration) {
+ private ListenerConfiguration(String clazz, Optional<HierarchicalConfiguration> configuration, Optional<Boolean> isAsync) {
this.clazz = clazz;
this.configuration = configuration;
+ this.isAsync = isAsync;
}
public String getClazz() {
@@ -58,4 +61,8 @@ public class ListenerConfiguration {
public Optional<HierarchicalConfiguration> getConfiguration() {
return configuration;
}
+
+ public Optional<Boolean> isAsync() {
+ return isAsync;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/aa4de6a9/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 68a8643..3e59a78 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
@@ -30,6 +30,7 @@ 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 {
@@ -80,8 +81,14 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
LOGGER.info("Loading user registered mailbox listener {}", listenerClass);
Class<MailboxListener> clazz = classLoader.locateClass(listenerClass);
MailboxListener listener = mailboxListenerFactory.createInstance(clazz);
- if (listener instanceof Configurable && configuration.getConfiguration().isPresent()) {
- ((Configurable)listener).configure(configuration.getConfiguration().get());
+ 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::set);
}
return listener;
} catch (ClassNotFoundException | ConfigurationException e) {
@@ -89,4 +96,17 @@ public class MailboxListenersLoaderImpl implements Configurable, MailboxListener
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) {
+ if (isAsync) {
+ return MailboxListener.ExecutionMode.ASYNCHRONOUS;
+ }
+ return MailboxListener.ExecutionMode.SYNCHRONOUS;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/aa4de6a9/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 011f3ec..b2db84c 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
@@ -53,4 +53,16 @@ public class ListenerConfigurationTest {
assertThat(listenerConfiguration.getClazz()).isEqualTo(expectedClazz);
}
+
+ @Test
+ public void isAsyncShouldReturnConfiguredValue() {
+ DefaultConfigurationBuilder configuration = new DefaultConfigurationBuilder();
+ String expectedClazz = "MyClassName";
+ configuration.addProperty("class", expectedClazz);
+ configuration.addProperty("async", "false");
+
+ ListenerConfiguration listenerConfiguration = ListenerConfiguration.from(configuration);
+
+ assertThat(listenerConfiguration.isAsync()).contains(false);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org