blob: e9a03a74aab8a6b1e790c4900f5845ed70ce14ef [file] [log] [blame]
/****************************************************************
* 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 static org.apache.james.modules.Names.MAILBOXMANAGER_NAME;
import java.io.FileNotFoundException;
import jakarta.inject.Singleton;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.adapter.mailbox.ACLUsernameChangeTaskStep;
import org.apache.james.adapter.mailbox.MailboxUserDeletionTaskStep;
import org.apache.james.adapter.mailbox.MailboxUsernameChangeTaskStep;
import org.apache.james.adapter.mailbox.QuotaUsernameChangeTaskStep;
import org.apache.james.adapter.mailbox.UserRepositoryAuthenticator;
import org.apache.james.backends.cassandra.components.CassandraModule;
import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
import org.apache.james.blob.api.BlobReferenceSource;
import org.apache.james.events.EventListener;
import org.apache.james.eventsourcing.Event;
import org.apache.james.eventsourcing.eventstore.JsonEventSerializer;
import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStore;
import org.apache.james.eventsourcing.eventstore.cassandra.EventStoreDao;
import org.apache.james.eventsourcing.eventstore.dto.EventDTO;
import org.apache.james.eventsourcing.eventstore.dto.EventDTOModule;
import org.apache.james.jmap.api.change.EmailChangeRepository;
import org.apache.james.jmap.api.change.Limit;
import org.apache.james.jmap.api.change.MailboxChangeRepository;
import org.apache.james.jmap.api.change.State;
import org.apache.james.jmap.cassandra.change.CassandraChangesConfiguration;
import org.apache.james.jmap.cassandra.change.CassandraEmailChangeRepository;
import org.apache.james.jmap.cassandra.change.CassandraMailboxChangeRepository;
import org.apache.james.jmap.cassandra.change.CassandraStateFactory;
import org.apache.james.jmap.cassandra.change.EmailChangeRepositoryDAO;
import org.apache.james.jmap.cassandra.change.MailboxChangeRepositoryDAO;
import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.AttachmentIdFactory;
import org.apache.james.mailbox.AttachmentManager;
import org.apache.james.mailbox.Authenticator;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.RightManager;
import org.apache.james.mailbox.SessionProvider;
import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
import org.apache.james.mailbox.cassandra.CassandraThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.cassandra.DeleteMessageListener;
import org.apache.james.mailbox.cassandra.ids.CassandraId;
import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
import org.apache.james.mailbox.cassandra.mail.ACLMapper;
import org.apache.james.mailbox.cassandra.mail.AttachmentBlobReferenceSource;
import org.apache.james.mailbox.cassandra.mail.CassandraACLDAOV2;
import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV3DAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV3;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
import org.apache.james.mailbox.cassandra.mail.MessageBlobReferenceSource;
import org.apache.james.mailbox.cassandra.mail.eventsourcing.acl.ACLModule;
import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
import org.apache.james.mailbox.indexer.MessageIdReIndexer;
import org.apache.james.mailbox.indexer.ReIndexer;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
import org.apache.james.mailbox.store.NoMailboxPathLocker;
import org.apache.james.mailbox.store.SessionProviderImpl;
import org.apache.james.mailbox.store.StoreAttachmentManager;
import org.apache.james.mailbox.store.StoreMailboxManager;
import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.StoreSubscriptionManager;
import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.event.MailboxSubscriptionListener;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
import org.apache.james.mailbox.store.mail.MessageMapperFactory;
import org.apache.james.mailbox.store.mail.ModSeqProvider;
import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.UidProvider;
import org.apache.james.mailbox.store.user.SubscriptionMapperFactory;
import org.apache.james.user.api.DeleteUserDataTaskStep;
import org.apache.james.user.api.UsernameChangeTaskStep;
import org.apache.james.utils.MailboxManagerDefinition;
import org.apache.james.utils.PropertiesProvider;
import org.apache.mailbox.tools.indexer.MessageIdReIndexerImpl;
import org.apache.mailbox.tools.indexer.ReIndexerImpl;
import com.datastax.oss.driver.api.core.CqlSession;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
public class CassandraMailboxModule extends AbstractModule {
@Override
protected void configure() {
install(new DefaultEventModule());
install(new CassandraQuotaModule());
install(new CassandraDeadLetterModule());
install(new CassandraThreadIdGuessingModule());
bind(CassandraApplicableFlagDAO.class).in(Scopes.SINGLETON);
bind(CassandraAttachmentDAOV2.class).in(Scopes.SINGLETON);
bind(CassandraDeletedMessageDAO.class).in(Scopes.SINGLETON);
bind(CassandraFirstUnseenDAO.class).in(Scopes.SINGLETON);
bind(CassandraMailboxCounterDAO.class).in(Scopes.SINGLETON);
bind(CassandraMailboxDAO.class).in(Scopes.SINGLETON);
bind(CassandraACLDAOV2.class).in(Scopes.SINGLETON);
bind(CassandraMailboxPathV3DAO.class).in(Scopes.SINGLETON);
bind(CassandraMailboxRecentsDAO.class).in(Scopes.SINGLETON);
bind(CassandraMessageDAOV3.class).in(Scopes.SINGLETON);
bind(CassandraMessageIdDAO.class).in(Scopes.SINGLETON);
bind(CassandraMessageIdToImapUidDAO.class).in(Scopes.SINGLETON);
bind(CassandraUserMailboxRightsDAO.class).in(Scopes.SINGLETON);
bind(CassandraMailboxManager.class).in(Scopes.SINGLETON);
bind(StoreSubscriptionManager.class).in(Scopes.SINGLETON);
bind(StoreAttachmentManager.class).in(Scopes.SINGLETON);
bind(StoreMessageIdManager.class).in(Scopes.SINGLETON);
bind(StoreRightManager.class).in(Scopes.SINGLETON);
bind(SessionProviderImpl.class).in(Scopes.SINGLETON);
bind(CassandraMailboxMapper.class).in(Scopes.SINGLETON);
bind(CassandraId.Factory.class).in(Scopes.SINGLETON);
bind(CassandraMailboxSessionMapperFactory.class).in(Scopes.SINGLETON);
bind(CassandraMessageId.Factory.class).in(Scopes.SINGLETON);
bind(CassandraThreadIdGuessingAlgorithm.class).in(Scopes.SINGLETON);
bind(CassandraModSeqProvider.class).in(Scopes.SINGLETON);
bind(CassandraUidProvider.class).in(Scopes.SINGLETON);
bind(NoMailboxPathLocker.class).in(Scopes.SINGLETON);
bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON);
bind(EmailChangeRepositoryDAO.class).in(Scopes.SINGLETON);
bind(MailboxChangeRepositoryDAO.class).in(Scopes.SINGLETON);
bind(ReIndexerImpl.class).in(Scopes.SINGLETON);
bind(MessageIdReIndexerImpl.class).in(Scopes.SINGLETON);
bind(MessageMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
bind(MailboxMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
bind(AttachmentMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
bind(MailboxSessionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
bind(SubscriptionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
bind(ACLMapper.class).to(CassandraACLMapper.class);
bind(ModSeqProvider.class).to(CassandraModSeqProvider.class);
bind(UidProvider.class).to(CassandraUidProvider.class);
bind(SubscriptionManager.class).to(StoreSubscriptionManager.class);
bind(MailboxPathLocker.class).to(NoMailboxPathLocker.class);
bind(Authenticator.class).to(UserRepositoryAuthenticator.class);
bind(MailboxManager.class).to(CassandraMailboxManager.class);
bind(StoreMailboxManager.class).to(CassandraMailboxManager.class);
bind(MailboxChangeRepository.class).to(CassandraMailboxChangeRepository.class);
bind(EmailChangeRepository.class).to(CassandraEmailChangeRepository.class);
bind(State.Factory.class).to(CassandraStateFactory.class);
bind(MailboxId.Factory.class).to(CassandraId.Factory.class);
bind(State.Factory.class).to(CassandraStateFactory.class);
bind(MessageId.Factory.class).to(CassandraMessageId.Factory.class);
bind(ThreadIdGuessingAlgorithm.class).to(CassandraThreadIdGuessingAlgorithm.class);
bind(MessageIdManager.class).to(StoreMessageIdManager.class);
bind(AttachmentManager.class).to(StoreAttachmentManager.class);
bind(RightManager.class).to(StoreRightManager.class);
bind(SessionProvider.class).to(SessionProviderImpl.class);
bind(AttachmentContentLoader.class).to(AttachmentManager.class);
bind(Limit.class).annotatedWith(Names.named(CassandraEmailChangeRepository.LIMIT_NAME)).toInstance(Limit.of(256));
bind(Limit.class).annotatedWith(Names.named(CassandraMailboxChangeRepository.LIMIT_NAME)).toInstance(Limit.of(256));
bind(ReIndexer.class).to(ReIndexerImpl.class);
bind(MessageIdReIndexer.class).to(MessageIdReIndexerImpl.class);
Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
cassandraDataDefinitions.addBinding().toInstance(CassandraAclModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraAttachmentModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraMessageModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraMailboxCounterModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraAnnotationModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraApplicableFlagsModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraDeletedMessageModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraFirstUnseenModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraMailboxRecentsModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraModSeqModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraSubscriptionModule.MODULE);
cassandraDataDefinitions.addBinding().toInstance(CassandraUidModule.MODULE);
Multibinder.newSetBinder(binder(), MailboxManagerDefinition.class).addBinding().to(CassandraMailboxManagerDefinition.class);
Multibinder.newSetBinder(binder(), EventListener.GroupEventListener.class)
.addBinding().to(MailboxAnnotationListener.class);
Multibinder.newSetBinder(binder(), EventListener.GroupEventListener.class)
.addBinding().to(MailboxSubscriptionListener.class);
Multibinder.newSetBinder(binder(), EventListener.ReactiveGroupEventListener.class)
.addBinding().to(DeleteMessageListener.class);
Multibinder.newSetBinder(binder(), DeleteMessageListener.DeletionCallback.class);
bind(MailboxManager.class).annotatedWith(Names.named(MAILBOXMANAGER_NAME)).to(MailboxManager.class);
Multibinder.newSetBinder(binder(), new TypeLiteral<EventDTOModule<? extends Event, ? extends EventDTO>>() {})
.addBinding().toInstance(ACLModule.ACL_UPDATE);
Multibinder.newSetBinder(binder(), BlobReferenceSource.class)
.addBinding().to(AttachmentBlobReferenceSource.class);
Multibinder.newSetBinder(binder(), BlobReferenceSource.class)
.addBinding().to(MessageBlobReferenceSource.class);
Multibinder<UsernameChangeTaskStep> usernameChangeTaskStepMultibinder = Multibinder.newSetBinder(binder(), UsernameChangeTaskStep.class);
usernameChangeTaskStepMultibinder.addBinding().to(MailboxUsernameChangeTaskStep.class);
usernameChangeTaskStepMultibinder.addBinding().to(ACLUsernameChangeTaskStep.class);
usernameChangeTaskStepMultibinder.addBinding().to(QuotaUsernameChangeTaskStep.class);
Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskStepMultibinder = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
deleteUserDataTaskStepMultibinder.addBinding().to(MailboxUserDeletionTaskStep.class);
}
@Provides
@Singleton
CassandraACLMapper aclMapper(CassandraUserMailboxRightsDAO userMailboxRightsDAO,
CassandraACLDAOV2 cassandraACLDAOV2,
CqlSession session,
CassandraConfiguration cassandraConfiguration) {
return new CassandraACLMapper(
new CassandraACLMapper.StoreV2(userMailboxRightsDAO, cassandraACLDAOV2,
new CassandraEventStore(new EventStoreDao(session, JsonEventSerializer.forModules(ACLModule.ACL_UPDATE).withoutNestedType()))),
cassandraConfiguration);
}
@Singleton
private static class CassandraMailboxManagerDefinition extends MailboxManagerDefinition {
@Inject
private CassandraMailboxManagerDefinition(CassandraMailboxManager manager) {
super("cassandra-mailboxmanager", manager);
}
}
@Provides
@Singleton
CassandraChangesConfiguration providesCassandraChangesConfiguration(PropertiesProvider propertiesProvider) throws ConfigurationException {
try {
Configuration configuration = propertiesProvider.getConfiguration("cassandra");
return CassandraChangesConfiguration.from(configuration);
} catch (FileNotFoundException e) {
return CassandraChangesConfiguration.DEFAULT;
}
}
}