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 2020/04/17 00:32:16 UTC
[james-project] 24/39: JAMES-3137 Move Cassandra cache session
initialization to its own module
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 41035e157dae8d54213e8cd648f4593ca4d9f0ac
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Apr 9 09:55:35 2020 +0700
JAMES-3137 Move Cassandra cache session initialization to its own module
---
.../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java | 8 +++
.../mpt/smtp/CassandraSmtpTestRuleFactory.java | 8 +++
.../mailbox/CassandraCacheSessionModule.java | 84 ++++++++++++++++++++++
.../modules/mailbox/CassandraSessionModule.java | 51 +++----------
.../java/org/apache/james/CacheSessionTest.java | 5 +-
5 files changed, 110 insertions(+), 46 deletions(-)
diff --git a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
index fe02a02..01c82b4 100644
--- a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
@@ -29,6 +29,7 @@ import org.apache.james.dnsservice.api.DNSService;
import org.apache.james.modules.TestAwsS3BlobStoreModule;
import org.apache.james.modules.TestRabbitMQModule;
import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.mailbox.KeyspacesConfiguration;
import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
import org.apache.james.modules.rabbitmq.RabbitMQModule;
@@ -64,6 +65,13 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
.overrideWith(
new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON),
new TestAwsS3BlobStoreModule(awsS3TestRule),
+ binder -> binder.bind(KeyspacesConfiguration.class)
+ .toInstance(KeyspacesConfiguration.builder()
+ .keyspace(DockerCassandra.KEYSPACE)
+ .cacheKeyspace(DockerCassandra.CACHE_KEYSPACE)
+ .replicationFactor(1)
+ .disableDurableWrites()
+ .build()),
binder -> binder.bind(ClusterConfiguration.class).toInstance(
DockerCassandra.configurationBuilder(cassandraHost)
.build()),
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index e8d85c8..98cb9c4 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -24,6 +24,7 @@ import org.apache.james.GuiceJamesServer;
import org.apache.james.backends.cassandra.DockerCassandra;
import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.modules.mailbox.KeyspacesConfiguration;
import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
import org.apache.james.modules.server.CamelMailetContainerModule;
import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
@@ -55,6 +56,13 @@ public final class CassandraSmtpTestRuleFactory {
binder -> binder.bind(ClusterConfiguration.class).toInstance(
DockerCassandra.configurationBuilder(cassandraHost)
.build()),
+ binder -> binder.bind(KeyspacesConfiguration.class)
+ .toInstance(KeyspacesConfiguration.builder()
+ .keyspace(DockerCassandra.KEYSPACE)
+ .cacheKeyspace(DockerCassandra.CACHE_KEYSPACE)
+ .replicationFactor(1)
+ .disableDurableWrites()
+ .build()),
binder -> binder.bind(DNSService.class).toInstance(dnsService));
}
}
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java
new file mode 100644
index 0000000..71796b1
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java
@@ -0,0 +1,84 @@
+/****************************************************************
+ * 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.modules.mailbox;
+
+import java.util.Set;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.KeyspaceFactory;
+import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
+import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
+import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
+import org.apache.james.backends.cassandra.init.configuration.KeyspaceConfiguration;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+
+public class CassandraCacheSessionModule extends AbstractModule {
+ @Override
+ protected void configure() {
+ bind(InitializedCacheCluster.class).in(Scopes.SINGLETON);
+ Multibinder.newSetBinder(binder(), CassandraModule.class, Names.named(InjectionNames.CACHE));
+ }
+
+ @Named(InjectionNames.CACHE)
+ @Provides
+ @Singleton
+ KeyspaceConfiguration provideCacheKeyspaceConfiguration(KeyspacesConfiguration keyspacesConfiguration) {
+ return keyspacesConfiguration.cacheKeyspaceConfiguration();
+ }
+
+ @Singleton
+ @Named(InjectionNames.CACHE)
+ @Provides
+ Session provideSession(@Named(InjectionNames.CACHE) KeyspaceConfiguration keyspaceConfiguration,
+ InitializedCacheCluster cluster,
+ @Named(InjectionNames.CACHE) CassandraModule module) {
+ return new SessionWithInitializedTablesFactory(keyspaceConfiguration, cluster.cluster, module).get();
+ }
+
+ @Named(InjectionNames.CACHE)
+ @Provides
+ @Singleton
+ CassandraModule composeCacheDefinitions(@Named(InjectionNames.CACHE) Set<CassandraModule> modules) {
+ return CassandraModule.aggregateModules(modules);
+ }
+
+ static class InitializedCacheCluster {
+ private final Cluster cluster;
+
+ @Inject
+ private InitializedCacheCluster(Cluster cluster, ClusterConfiguration clusterConfiguration, KeyspacesConfiguration keyspacesConfiguration) {
+ this.cluster = cluster;
+
+ if (clusterConfiguration.shouldCreateKeyspace()) {
+ KeyspaceFactory.createKeyspace(keyspacesConfiguration.cacheKeyspaceConfiguration(), cluster);
+ }
+ }
+ }
+}
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
index e68713e..d8004f2 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
@@ -30,7 +30,6 @@ import org.apache.james.backends.cassandra.init.ResilientClusterProvider;
import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
-import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
import org.apache.james.backends.cassandra.init.configuration.KeyspaceConfiguration;
import org.apache.james.backends.cassandra.utils.CassandraHealthCheck;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -39,7 +38,6 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
import org.apache.james.core.healthcheck.HealthCheck;
import org.apache.james.lifecycle.api.StartUpCheck;
-import org.apache.james.lifecycle.api.Startable;
import org.apache.james.mailbox.store.BatchSizes;
import org.apache.james.server.CassandraProbe;
import org.apache.james.util.Host;
@@ -57,8 +55,6 @@ import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
public class CassandraSessionModule extends AbstractModule {
@@ -75,19 +71,13 @@ public class CassandraSessionModule extends AbstractModule {
bind(Cluster.class).toProvider(ResilientClusterProvider.class);
bind(InitializedCluster.class).in(Scopes.SINGLETON);
- bind(MainSessionWithInitializedTablesFactory.class).in(Scopes.SINGLETON);
- bind(CacheSessionWithInitializedTablesFactory.class).in(Scopes.SINGLETON);
- bind(Session.class).toProvider(MainSessionWithInitializedTablesFactory.class);
- bind(Session.class).annotatedWith(Names.named(InjectionNames.CACHE))
- .toProvider(CacheSessionWithInitializedTablesFactory.class);
+ bind(Session.class).toProvider(SessionWithInitializedTablesFactory.class);
Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
cassandraDataDefinitions.addBinding().toInstance(CassandraZonedDateTimeModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraSchemaVersionModule.MODULE);
- Multibinder.newSetBinder(binder(), CassandraModule.class, Names.named(InjectionNames.CACHE));
-
bind(CassandraSchemaVersionManager.class).in(Scopes.SINGLETON);
bind(CassandraSchemaVersionDAO.class).in(Scopes.SINGLETON);
@@ -99,16 +89,17 @@ public class CassandraSessionModule extends AbstractModule {
Multibinder.newSetBinder(binder(), HealthCheck.class).addBinding().to(CassandraHealthCheck.class);
}
- @Provides
@Singleton
- CassandraModule composeDataDefinitions(Set<CassandraModule> modules) {
- return CassandraModule.aggregateModules(modules);
+ @Provides
+ SessionWithInitializedTablesFactory provideSessionFactory(KeyspaceConfiguration keyspaceConfiguration,
+ InitializedCluster cluster,
+ CassandraModule module) {
+ return new SessionWithInitializedTablesFactory(keyspaceConfiguration, cluster.cluster, module);
}
- @Named(InjectionNames.CACHE)
@Provides
@Singleton
- CassandraModule composeCacheDefinitions(@Named(InjectionNames.CACHE) Set<CassandraModule> modules) {
+ CassandraModule composeDataDefinitions(Set<CassandraModule> modules) {
return CassandraModule.aggregateModules(modules);
}
@@ -174,32 +165,7 @@ public class CassandraSessionModule extends AbstractModule {
return keyspacesConfiguration.mainKeyspaceConfiguration();
}
- @Named(InjectionNames.CACHE)
- @Provides
- @Singleton
- KeyspaceConfiguration provideCacheKeyspaceConfiguration(KeyspacesConfiguration keyspacesConfiguration) {
- return keyspacesConfiguration.cacheKeyspaceConfiguration();
- }
-
- private static class MainSessionWithInitializedTablesFactory extends SessionWithInitializedTablesFactory {
- @Inject
- public MainSessionWithInitializedTablesFactory(KeyspaceConfiguration keyspaceConfiguration,
- InitializedCluster cluster,
- CassandraModule module) {
- super(keyspaceConfiguration, cluster.cluster, module);
- }
- }
-
- private static class CacheSessionWithInitializedTablesFactory extends SessionWithInitializedTablesFactory {
- @Inject
- public CacheSessionWithInitializedTablesFactory(@Named(InjectionNames.CACHE) KeyspaceConfiguration keyspaceConfiguration,
- InitializedCluster cluster,
- @Named(InjectionNames.CACHE) CassandraModule module) {
- super(keyspaceConfiguration, cluster.cluster, module);
- }
- }
-
- private static class InitializedCluster implements Startable {
+ static class InitializedCluster {
private final Cluster cluster;
@Inject
@@ -208,7 +174,6 @@ public class CassandraSessionModule extends AbstractModule {
if (clusterConfiguration.shouldCreateKeyspace()) {
KeyspaceFactory.createKeyspace(keyspacesConfiguration.mainKeyspaceConfiguration(), cluster);
- KeyspaceFactory.createKeyspace(keyspacesConfiguration.cacheKeyspaceConfiguration(), cluster);
}
}
}
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
index ca6f9a7..d689285 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
@@ -21,14 +21,13 @@ package org.apache.james;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static org.apache.james.CassandraJamesServerMain.ALL_BUT_JMX_CASSANDRA_MODULE;
-import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import org.apache.james.backends.cassandra.components.CassandraModule;
import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
import org.apache.james.lifecycle.api.StartUpCheck;
-import org.apache.james.modules.ConfigurationProbe;
import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.mailbox.CassandraCacheSessionModule;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -79,7 +78,7 @@ class CacheSessionTest {
.extension(new DockerElasticSearchExtension())
.extension(new CassandraExtension())
.server(configuration -> GuiceJamesServer.forConfiguration(configuration)
- .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE)
+ .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE, new CassandraCacheSessionModule())
.overrideWith(TestJMAPServerModule.limitToTenMessages()))
.overrideServerModule(binder -> Multibinder.newSetBinder(binder, CassandraModule.class, Names.named(InjectionNames.CACHE))
.addBinding()
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org