Author: matthieu Date: Tue Nov 3 16:46:53 2015 New Revision: 1712328 URL: http://svn.apache.org/viewvc?rev=1712328&view=rev Log: JAMES-1626 bootstrap guice-based application with Cassandra IMAP server
Added: james/project/trunk/server/container/cassandra-guice/src/ james/project/trunk/server/container/cassandra-guice/src/main/ james/project/trunk/server/container/cassandra-guice/src/main/java/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServer.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java - copied, changed from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java - copied, changed from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java - copied, changed from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/DNSServiceModule.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/SimpleMessageSearchModule.java james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/PropertiesReader.java james/project/trunk/server/container/cassandra-guice/src/test/ james/project/trunk/server/container/cassandra-guice/src/test/java/ james/project/trunk/server/container/cassandra-guice/src/test/java/org/ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/PropertiesReadTest.java james/project/trunk/server/container/cassandra-guice/src/test/resources/ james/project/trunk/server/container/cassandra-guice/src/test/resources/cassandra.properties james/project/trunk/server/container/cassandra-guice/src/test/resources/test.properties Modified: james/project/trunk/backends-common/cassandra/pom.xml james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java james/project/trunk/backends-common/pom.xml james/project/trunk/server/container/cassandra-guice/pom.xml james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java james/project/trunk/server/pom.xml Modified: james/project/trunk/backends-common/cassandra/pom.xml URL: http://svn.apache.org/viewvc/james/project/trunk/backends-common/cassandra/pom.xml?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/cassandra/pom.xml (original) +++ james/project/trunk/backends-common/cassandra/pom.xml Tue Nov 3 16:46:53 2015 @@ -140,6 +140,10 @@ <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> Modified: james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java URL: http://svn.apache.org/viewvc/james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java (original) +++ james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java Tue Nov 3 16:46:53 2015 @@ -21,6 +21,8 @@ package org.apache.james.backends.cassan import java.util.Optional; +import javax.inject.Inject; + import com.datastax.driver.core.Session; import com.datastax.driver.core.UserType; import com.google.common.collect.ImmutableMap; @@ -31,6 +33,7 @@ import org.apache.james.backends.cassand public class CassandraTypesProvider { private final ImmutableMap<String, UserType> userTypes; + @Inject public CassandraTypesProvider(CassandraModule module, Session session) { userTypes = module.moduleTypes() .stream() Modified: james/project/trunk/backends-common/pom.xml URL: http://svn.apache.org/viewvc/james/project/trunk/backends-common/pom.xml?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/pom.xml (original) +++ james/project/trunk/backends-common/pom.xml Tue Nov 3 16:46:53 2015 @@ -45,6 +45,11 @@ <version>16.0</version> </dependency> <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> + <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.0.0</version> Modified: james/project/trunk/server/container/cassandra-guice/pom.xml URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/pom.xml?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/server/container/cassandra-guice/pom.xml (original) +++ james/project/trunk/server/container/cassandra-guice/pom.xml Tue Nov 3 16:46:53 2015 @@ -168,11 +168,22 @@ </build> <dependencies> <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-backends-cassandra</artifactId> + <type>test-jar</type> + </dependency> + <dependency> <groupId>${project.groupId}</groupId> <artifactId>apache-james-mailbox-cassandra</artifactId> </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>apache-james-mailbox-cassandra</artifactId> + <scope>test</scope> + <type>test-jar</type> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>apache-james-mailbox-elasticsearch</artifactId> </dependency> <dependency> @@ -213,6 +224,11 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>james-server-data-cassandra</artifactId> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>james-server-data-library</artifactId> </dependency> <dependency> Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServer.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServer.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServer.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServer.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,39 @@ +/**************************************************************** + * 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; + +import com.google.inject.Guice; +import com.google.inject.Module; + +public class CassandraJamesServer { + + private final Module serverModule; + + public CassandraJamesServer(Module serverModule) { + this.serverModule = serverModule; + } + + public void start() { + Guice.createInjector(serverModule); + } + + public void stop() { + } + +} Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,48 @@ +/**************************************************************** + * 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; + +import org.apache.james.modules.data.CassandraDomainListModule; +import org.apache.james.modules.data.CassandraRecipientRewriteTableModule; +import org.apache.james.modules.data.CassandraUsersRepositoryModule; +import org.apache.james.modules.mailbox.CassandraMailboxModule; +import org.apache.james.modules.mailbox.CassandraSessionModule; +import org.apache.james.modules.server.DNSServiceModule; +import org.apache.james.modules.server.SimpleMessageSearchModule; + +import com.google.inject.Module; +import com.google.inject.util.Modules; + +public class CassandraJamesServerMain { + + public static final Module defaultModule = Modules.combine(new CassandraMailboxModule(), + new CassandraSessionModule(), + new SimpleMessageSearchModule(), + new CassandraUsersRepositoryModule(), + new CassandraDomainListModule(), + new CassandraRecipientRewriteTableModule(), + new DNSServiceModule()); + + public static void main(String[] args) throws Exception { + CassandraJamesServer server = new CassandraJamesServer(defaultModule); + server.start(); + } + +} Copied: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java (from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java) URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java?p2=james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java&p1=james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java&r1=1712327&r2=1712328&rev=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java (original) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java Tue Nov 3 16:46:53 2015 @@ -16,39 +16,22 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ +package org.apache.james.modules.data; -package org.apache.james.backends.cassandra.init; - -import java.util.Optional; - -import com.datastax.driver.core.Session; -import com.datastax.driver.core.UserType; -import com.google.common.collect.ImmutableMap; import org.apache.james.backends.cassandra.components.CassandraModule; -import org.apache.james.backends.cassandra.components.CassandraType; -import org.apache.james.backends.cassandra.utils.Collectors; +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.domainlist.cassandra.CassandraDomainList; -public class CassandraTypesProvider { - private final ImmutableMap<String, UserType> userTypes; +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; - public CassandraTypesProvider(CassandraModule module, Session session) { - userTypes = module.moduleTypes() - .stream() - .collect(Collectors.toImmutableMap( - CassandraType::getName, - type -> getSessionType(session, type))); - } - - private UserType getSessionType(Session session, CassandraType type) { - return session.getCluster() - .getMetadata() - .getKeyspace(session.getLoggedKeyspace()) - .getUserType(type.getName()); - } +public class CassandraDomainListModule extends AbstractModule { - public UserType getDefinedUserType(String typeName) { - return Optional.ofNullable(userTypes.get(typeName)) - .orElseThrow(() -> new RuntimeException("Cassandra UDT " + typeName + " can not be retrieved")); + @Override + public void configure() { + bind(DomainList.class).to(CassandraDomainList.class); + Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); + cassandraDataDefinitions.addBinding().to(org.apache.james.domainlist.cassandra.CassandraDomainListModule.class); } } Copied: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java (from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java) URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java?p2=james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java&p1=james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java&r1=1712327&r2=1712328&rev=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java (original) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java Tue Nov 3 16:46:53 2015 @@ -16,39 +16,23 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ +package org.apache.james.modules.data; -package org.apache.james.backends.cassandra.init; - -import java.util.Optional; - -import com.datastax.driver.core.Session; -import com.datastax.driver.core.UserType; -import com.google.common.collect.ImmutableMap; import org.apache.james.backends.cassandra.components.CassandraModule; -import org.apache.james.backends.cassandra.components.CassandraType; -import org.apache.james.backends.cassandra.utils.Collectors; - -public class CassandraTypesProvider { - private final ImmutableMap<String, UserType> userTypes; - - public CassandraTypesProvider(CassandraModule module, Session session) { - userTypes = module.moduleTypes() - .stream() - .collect(Collectors.toImmutableMap( - CassandraType::getName, - type -> getSessionType(session, type))); - } - - private UserType getSessionType(Session session, CassandraType type) { - return session.getCluster() - .getMetadata() - .getKeyspace(session.getLoggedKeyspace()) - .getUserType(type.getName()); - } - - public UserType getDefinedUserType(String typeName) { - return Optional.ofNullable(userTypes.get(typeName)) - .orElseThrow(() -> new RuntimeException("Cassandra UDT " + typeName + " can not be retrieved")); +import org.apache.james.rrt.api.RecipientRewriteTable; +import org.apache.james.rrt.cassandra.CassandraRRTModule; +import org.apache.james.rrt.cassandra.CassandraRecipientRewriteTable; + +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; + +public class CassandraRecipientRewriteTableModule extends AbstractModule { + + @Override + public void configure() { + bind(RecipientRewriteTable.class).to(CassandraRecipientRewriteTable.class); + Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); + cassandraDataDefinitions.addBinding().to(CassandraRRTModule.class); } } Copied: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java (from r1712327, james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java) URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java?p2=james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java&p1=james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java&r1=1712327&r2=1712328&rev=1712328&view=diff ============================================================================== --- james/project/trunk/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java (original) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java Tue Nov 3 16:46:53 2015 @@ -16,39 +16,23 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ +package org.apache.james.modules.data; -package org.apache.james.backends.cassandra.init; - -import java.util.Optional; - -import com.datastax.driver.core.Session; -import com.datastax.driver.core.UserType; -import com.google.common.collect.ImmutableMap; import org.apache.james.backends.cassandra.components.CassandraModule; -import org.apache.james.backends.cassandra.components.CassandraType; -import org.apache.james.backends.cassandra.utils.Collectors; +import org.apache.james.user.api.UsersRepository; +import org.apache.james.user.cassandra.CassandraUsersRepository; -public class CassandraTypesProvider { - private final ImmutableMap<String, UserType> userTypes; +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; - public CassandraTypesProvider(CassandraModule module, Session session) { - userTypes = module.moduleTypes() - .stream() - .collect(Collectors.toImmutableMap( - CassandraType::getName, - type -> getSessionType(session, type))); - } +public class CassandraUsersRepositoryModule extends AbstractModule { - private UserType getSessionType(Session session, CassandraType type) { - return session.getCluster() - .getMetadata() - .getKeyspace(session.getLoggedKeyspace()) - .getUserType(type.getName()); - } + @Override + public void configure() { + bind(UsersRepository.class).to(CassandraUsersRepository.class); + Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); + cassandraDataDefinitions.addBinding().to(org.apache.james.user.cassandra.CassandraUsersRepositoryModule.class); - public UserType getDefinedUserType(String typeName) { - return Optional.ofNullable(userTypes.get(typeName)) - .orElseThrow(() -> new RuntimeException("Cassandra UDT " + typeName + " can not be retrieved")); } } Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,70 @@ +/**************************************************************** + * 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 javax.inject.Singleton; + +import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator; +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxPathLocker; +import org.apache.james.mailbox.SubscriptionManager; +import org.apache.james.mailbox.cassandra.CassandraId; +import org.apache.james.mailbox.cassandra.CassandraMailboxManager; +import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory; +import org.apache.james.mailbox.cassandra.CassandraSubscriptionManager; +import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider; +import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.store.Authenticator; +import org.apache.james.mailbox.store.NoMailboxPathLocker; +import org.apache.james.mailbox.store.mail.MessageMapperFactory; +import org.apache.james.mailbox.store.mail.ModSeqProvider; +import org.apache.james.mailbox.store.mail.UidProvider; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.TypeLiteral; +import com.google.inject.multibindings.Multibinder; +import com.google.inject.name.Named; + +public class CassandraMailboxModule extends AbstractModule { + + public static final String MAILBOXMANAGER_NAME = "mailboxmanager"; + + @Override + protected void configure() { + bind(SubscriptionManager.class).to(CassandraSubscriptionManager.class); + bind(new TypeLiteral<MessageMapperFactory<CassandraId>>(){}).to(CassandraMailboxSessionMapperFactory.class); + + bind(MailboxPathLocker.class).to(NoMailboxPathLocker.class); + bind(Authenticator.class).to(UserRepositoryAuthenticator.class); + + bind(new TypeLiteral<ModSeqProvider<CassandraId>>(){}).to(new TypeLiteral<CassandraModSeqProvider>(){}); + bind(new TypeLiteral<UidProvider<CassandraId>>(){}).to(new TypeLiteral<CassandraUidProvider>(){}); + Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); + cassandraDataDefinitions.addBinding().to(org.apache.james.mailbox.cassandra.CassandraMailboxModule.class); + } + + @Provides @Named(MAILBOXMANAGER_NAME) @Singleton + public MailboxManager provideMailboxManager(CassandraMailboxManager cassandraMailboxManager) throws MailboxException { + cassandraMailboxManager.init(); + return cassandraMailboxManager; + } +} \ No newline at end of file Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,75 @@ +/**************************************************************** + * 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 com.google.inject.Provides; +import com.google.inject.Singleton; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Session; +import com.google.inject.AbstractModule; + +import java.util.Set; + +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.apache.james.backends.cassandra.init.CassandraModuleComposite; +import org.apache.james.backends.cassandra.init.ClusterFactory; +import org.apache.james.backends.cassandra.init.ClusterWithKeyspaceCreatedFactory; +import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory; +import org.apache.james.utils.PropertiesReader; + +public class CassandraSessionModule extends AbstractModule { + + private final PropertiesReader propertiesReader; + private final String keyspace; + + public CassandraSessionModule() { + propertiesReader = new PropertiesReader("cassandra.properties"); + keyspace = propertiesReader.getProperty("cassandra.keyspace"); + } + + @Override + protected void configure() { + + } + + @Provides + @Singleton + CassandraModule composeDataDefinitions(Set<CassandraModule> modules) { + return new CassandraModuleComposite(modules.toArray(new CassandraModule[0])); + } + + @Provides + @Singleton + Session provideSession(Cluster cluster, CassandraModule cassandraModule) { + return new SessionWithInitializedTablesFactory(cassandraModule).createSession(cluster, keyspace); + } + + @Provides + @Singleton + Cluster provideCluster() { + return ClusterWithKeyspaceCreatedFactory.clusterWithInitializedKeyspace( + ClusterFactory.createClusterForSingleServerWithoutPassWord( + propertiesReader.getProperty("cassandra.ip"), + Integer.parseInt(propertiesReader.getProperty("cassandra.port"))), + keyspace, + Integer.parseInt(propertiesReader.getProperty("cassandra.replication.factor"))); + } + +} \ No newline at end of file Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/DNSServiceModule.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/DNSServiceModule.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/DNSServiceModule.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/DNSServiceModule.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,40 @@ +/**************************************************************** + * 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.server; + +import com.google.inject.Provides; +import com.google.inject.Singleton; +import org.apache.james.dnsservice.api.DNSService; +import org.apache.james.dnsservice.dnsjava.DNSJavaService; + +import com.google.inject.AbstractModule; + +public class DNSServiceModule extends AbstractModule { + + @Override + protected void configure() { + + } + + @Provides + @Singleton + private DNSService provideDNSService() { + return new DNSJavaService(); + } +} \ No newline at end of file Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/SimpleMessageSearchModule.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/SimpleMessageSearchModule.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/SimpleMessageSearchModule.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/SimpleMessageSearchModule.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,17 @@ +package org.apache.james.modules.server; + +import org.apache.james.mailbox.cassandra.CassandraId; +import org.apache.james.mailbox.store.search.MessageSearchIndex; +import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex; + +import com.google.inject.AbstractModule; +import com.google.inject.TypeLiteral; + +public class SimpleMessageSearchModule extends AbstractModule { + + @Override + protected void configure() { + bind(new TypeLiteral<MessageSearchIndex<CassandraId>>(){}).to(new TypeLiteral<SimpleMessageSearchIndex<CassandraId>>(){}); + } + +} Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/PropertiesReader.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/PropertiesReader.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/PropertiesReader.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/utils/PropertiesReader.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,43 @@ +/**************************************************************** + * 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.utils; + +import com.google.common.base.Throwables; + +import java.io.IOException; +import java.util.Properties; + +public class PropertiesReader { + + private final Properties properties; + + public PropertiesReader(String fileName) { + properties = new Properties(); + try { + properties.load(ClassLoader.getSystemResourceAsStream(fileName)); + } catch (IOException e) { + throw Throwables.propagate(e); + } + } + + public String getProperty(String key) { + return properties.getProperty(key); + } +} Added: james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,83 @@ +/**************************************************************** + * 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; + +import java.util.Properties; + +import javax.mail.AuthenticationFailedException; +import javax.mail.NoSuchProviderException; +import javax.mail.Session; +import javax.mail.Store; + +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import com.google.inject.util.Modules; + +public class CassandraJamesServerTest { + + private static final int IMAP_PORT = 1143; // You need to be root (superuser) to bind to ports under 1024. + + private CassandraJamesServer server; + + @Before + public void setup() throws Exception { + server = new CassandraJamesServer(Modules.override(CassandraJamesServerMain.defaultModule) + .with(new AbstractModule() { + + @Override + protected void configure() { + } + + @Provides + @Singleton + com.datastax.driver.core.Session provideSession(CassandraModule cassandraModule) { + CassandraCluster cassandra = CassandraCluster.create(cassandraModule); + return cassandra.getConf(); + } + + })); + server.start(); + } + + @After + public void tearDown() throws Exception { + server.stop(); + } + + @Test (expected = AuthenticationFailedException.class) + public void connectShouldThrowWhenNoCrendentials() throws Exception { + store().connect(); + } + + private Store store() throws NoSuchProviderException { + Properties properties = new Properties(); + properties.put("mail.imap.host", "localhost"); + properties.put("mail.imap.port", String.valueOf(IMAP_PORT)); + Session session = Session.getDefaultInstance(properties); + session.setDebug(true); + return session.getStore("imap"); + } +} Added: james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/PropertiesReadTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/PropertiesReadTest.java?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/PropertiesReadTest.java (added) +++ james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/utils/PropertiesReadTest.java Tue Nov 3 16:46:53 2015 @@ -0,0 +1,44 @@ +/**************************************************************** + * 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.utils; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class PropertiesReadTest { + + @Test + public void getPropertyShouldWork() throws Exception { + PropertiesReader propertiesReader = new PropertiesReader("test.properties"); + assertThat(propertiesReader.getProperty("cassandra.ip")).isEqualTo("127.0.0.1"); + } + + @Test + public void getAbsentPropertyShouldReturnNull() throws Exception { + PropertiesReader propertiesReader = new PropertiesReader("test.properties"); + assertThat(propertiesReader.getProperty("cassandra.isslow")).isNull(); + } + + @Test(expected = RuntimeException.class) + public void buildingAPropertiesReaderOnNonExistingValuesShouldThrow() throws Exception { + new PropertiesReader("fake.properties"); + } +} Added: james/project/trunk/server/container/cassandra-guice/src/test/resources/cassandra.properties URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/resources/cassandra.properties?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/test/resources/cassandra.properties (added) +++ james/project/trunk/server/container/cassandra-guice/src/test/resources/cassandra.properties Tue Nov 3 16:46:53 2015 @@ -0,0 +1,6 @@ +# Configuration file for cassandra mailbox + +cassandra.ip=127.0.0.1 +cassandra.port=9142 +cassandra.keyspace=apache_james +cassandra.replication.factor=1 \ No newline at end of file Added: james/project/trunk/server/container/cassandra-guice/src/test/resources/test.properties URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/resources/test.properties?rev=1712328&view=auto ============================================================================== --- james/project/trunk/server/container/cassandra-guice/src/test/resources/test.properties (added) +++ james/project/trunk/server/container/cassandra-guice/src/test/resources/test.properties Tue Nov 3 16:46:53 2015 @@ -0,0 +1,6 @@ +# Configuration file for cassandra mailbox + +cassandra.ip=127.0.0.1 +cassandra.port=9142 +cassandra.keyspace=apache_james +cassandra.replication.factor=1 \ No newline at end of file Modified: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java (original) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java Tue Nov 3 16:46:53 2015 @@ -29,7 +29,6 @@ import java.util.stream.Collectors; import javax.annotation.Resource; import javax.inject.Inject; -import javax.inject.Named; import org.apache.james.backends.cassandra.utils.CassandraConstants; import org.apache.james.backends.cassandra.utils.CassandraUtils; @@ -46,7 +45,7 @@ public class CassandraDomainList extends @Inject @Resource - public void setSession(@Named("cassandra-session") Session session) { + public void setSession(Session session) { this.session = session; } Modified: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java (original) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java Tue Nov 3 16:46:53 2015 @@ -33,7 +33,6 @@ import java.util.stream.Collectors; import javax.annotation.Resource; import javax.inject.Inject; -import javax.inject.Named; import org.apache.james.rrt.api.RecipientRewriteTableException; import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; @@ -49,7 +48,7 @@ public class CassandraRecipientRewriteTa @Inject @Resource - public void setSession(@Named("cassandra-session") Session session) { + public void setSession(Session session) { this.session = session; } Modified: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java (original) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java Tue Nov 3 16:46:53 2015 @@ -36,7 +36,6 @@ import java.util.Optional; import javax.annotation.Resource; import javax.inject.Inject; -import javax.inject.Named; import org.apache.james.backends.cassandra.utils.CassandraConstants; import org.apache.james.backends.cassandra.utils.CassandraUtils; @@ -58,11 +57,16 @@ public class CassandraUsersRepository ex @Inject @Resource - public void setSession(@Named("cassandra-session") Session session) { + public void setSession(Session session) { this.session = session; } @Override + public boolean supportVirtualHosting() { + return true; + } + + @Override public User getUserByName(String name){ ResultSet result = session.execute( select(REALNAME, PASSWORD, ALGORITHM) Modified: james/project/trunk/server/pom.xml URL: http://svn.apache.org/viewvc/james/project/trunk/server/pom.xml?rev=1712328&r1=1712327&r2=1712328&view=diff ============================================================================== --- james/project/trunk/server/pom.xml (original) +++ james/project/trunk/server/pom.xml Tue Nov 3 16:46:53 2015 @@ -534,7 +534,7 @@ <groupId>org.apache.james</groupId> <artifactId>apache-james-mailbox-cassandra</artifactId> <version>${mailbox.version}</version> - <scope>test</scope> + <type>test-jar</type> </dependency> <dependency> <groupId>org.apache.james</groupId> @@ -545,13 +545,11 @@ <groupId>org.apache.james</groupId> <artifactId>apache-james-mailbox-elasticsearch</artifactId> <version>${mailbox.version}</version> - <scope>test</scope> </dependency> <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-james-mailbox-tika</artifactId> <version>${mailbox.version}</version> - <scope>test</scope> </dependency> <dependency> <groupId>org.apache.james</groupId> @@ -903,8 +901,6 @@ <version>${mockito-core.version}</version> <scope>test</scope> </dependency> - - <dependency> <groupId>concurrent</groupId> <artifactId>concurrent</artifactId> --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org