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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
