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
The following commit(s) were added to refs/heads/master by this push: new f4dc8e3b7a [CNB] JAMES-4088 Ensure IMAP SELECT EXIST response is up to date (#2507) f4dc8e3b7a is described below commit f4dc8e3b7a6acf063260fe9afc43e82e9c60f5c4 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Mon Nov 18 13:12:46 2024 +0700 [CNB] JAMES-4088 Ensure IMAP SELECT EXIST response is up to date (#2507) This is critical for Mail User Agent like Apple mail relying on MSN FETCH for resynchronisation. Outdated counters, meant to be expected with Cassandra implementation would lead to terminal errors aborting mail resynchronisation. Instead, use the content of the just loaded selected mailbox, accurate and piggyback counter asynchronous correction as needed. --- .../james/mailbox/MailboxCounterCorrector.java | 29 +++++++++++++ .../task/CassandraMailboxCounterCorrector.java | 49 ++++++++++++++++++++++ .../imap/processor/AbstractSelectionProcessor.java | 25 ++++++++--- .../james/imap/processor/DefaultProcessor.java | 6 ++- .../james/imap/processor/ExamineProcessor.java | 5 ++- .../james/imap/processor/SelectProcessor.java | 5 ++- .../main/DefaultImapProcessorFactory.java | 3 +- .../processor/AbstractSelectionProcessorTest.java | 4 +- .../james/imap/processor/SelectProcessorTest.java | 5 ++- .../modules/mailbox/CassandraMailboxModule.java | 4 ++ .../james/modules/mailbox/JPAMailboxModule.java | 2 + .../james/modules/mailbox/MemoryMailboxModule.java | 2 + 12 files changed, 124 insertions(+), 15 deletions(-) diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java new file mode 100644 index 0000000000..c1362dd4b9 --- /dev/null +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java @@ -0,0 +1,29 @@ +/**************************************************************** + * 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.mailbox; + +import reactor.core.publisher.Mono; + +public interface MailboxCounterCorrector { + + MailboxCounterCorrector DEFAULT = id -> Mono.empty(); + + Mono<Void> fixCountersFor(MessageManager mailbox); +} diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java new file mode 100644 index 0000000000..8e5ded7589 --- /dev/null +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java @@ -0,0 +1,49 @@ +/**************************************************************** + * 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.mailbox.cassandra.mail.task; + +import jakarta.inject.Inject; + +import org.apache.james.mailbox.MailboxCounterCorrector; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.exception.MailboxException; + +import reactor.core.publisher.Mono; + +public class CassandraMailboxCounterCorrector implements MailboxCounterCorrector { + private final RecomputeMailboxCountersService service; + + @Inject + public CassandraMailboxCounterCorrector(RecomputeMailboxCountersService service) { + this.service = service; + } + + @Override + public Mono<Void> fixCountersFor(MessageManager mailbox) { + try { + return service.recomputeMailboxCounter(new RecomputeMailboxCountersService.Context(), + mailbox.getMailboxEntity(), + RecomputeMailboxCountersService.Options.trustMessageProjection()) + .then(); + } catch (MailboxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java index 1ca548e699..520f083659 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java @@ -52,6 +52,7 @@ import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest.Cli import org.apache.james.imap.message.response.ExistsResponse; import org.apache.james.imap.message.response.RecentResponse; import org.apache.james.imap.processor.base.SelectedMailboxImpl; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; @@ -78,6 +79,7 @@ import com.google.common.collect.ImmutableList; import io.vavr.Tuple; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequest> extends AbstractMailboxProcessor<R> implements PermitEnableCapabilityProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSelectionProcessor.class); @@ -88,15 +90,17 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ private final PathConverter.Factory pathConverterFactory; private final boolean openReadOnly; private final EventBus eventBus; + private final MailboxCounterCorrector mailboxCounterCorrector; public AbstractSelectionProcessor(Class<R> acceptableClass, MailboxManager mailboxManager, StatusResponseFactory statusResponseFactory, PathConverter.Factory pathConverterFactory, boolean openReadOnly, - MetricFactory metricFactory, EventBus eventBus) { + MetricFactory metricFactory, EventBus eventBus, MailboxCounterCorrector mailboxCounterCorrector) { super(acceptableClass, mailboxManager, statusResponseFactory, metricFactory); this.statusResponseFactory = statusResponseFactory; this.pathConverterFactory = pathConverterFactory; this.openReadOnly = openReadOnly; this.eventBus = eventBus; + this.mailboxCounterCorrector = mailboxCounterCorrector; } @Override @@ -140,7 +144,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ mailboxId(responder, selected.getMailboxId()); flags(responder, selected); - exists(responder, metaData); + exists(responder, metaData, selected); recent(responder, selected); uidValidity(responder, metaData); }) @@ -384,10 +388,19 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ responder.respond(recentResponse); } - private void exists(Responder responder, MailboxMetaData metaData) { - final long messageCount = metaData.getMessageCount(); - final ExistsResponse existsResponse = new ExistsResponse(messageCount); - responder.respond(existsResponse); + private void exists(Responder responder, MailboxMetaData metaData, SelectedMailbox selectedMailbox) { + long messageCount = metaData.getMessageCount(); + long realMessageCount = selectedMailbox.existsCount(); + + responder.respond(new ExistsResponse(realMessageCount)); + + if (messageCount != realMessageCount) { + LOGGER.warn("Invalid counter for {}, was {} and should have been {}", selectedMailbox.getMessageManager().getId().serialize(), + messageCount, realMessageCount); + mailboxCounterCorrector.fixCountersFor(selectedMailbox.getMessageManager()) + .subscribeOn(Schedulers.parallel()) + .subscribe(); + } } private void mailboxId(Responder responder, MailboxId mailboxId) { diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java index c47c7a2eac..2ce7f03091 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java @@ -34,6 +34,7 @@ import org.apache.james.imap.main.PathConverter; import org.apache.james.imap.processor.base.AbstractProcessor; import org.apache.james.imap.processor.base.ImapResponseMessageProcessor; import org.apache.james.imap.processor.fetch.FetchProcessor; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.quota.QuotaManager; @@ -55,6 +56,7 @@ public class DefaultProcessor implements ImapProcessor { MailboxTyper mailboxTyper, QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, + MailboxCounterCorrector mailboxCounterCorrector, MetricFactory metricFactory) { PathConverter.Factory pathConverterFactory = PathConverter.Factory.DEFAULT; @@ -76,7 +78,7 @@ public class DefaultProcessor implements ImapProcessor { builder.add(new AuthenticateProcessor(mailboxManager, statusResponseFactory, metricFactory, pathConverterFactory)); builder.add(new ExpungeProcessor(mailboxManager, statusResponseFactory, metricFactory)); builder.add(new ReplaceProcessor(mailboxManager, statusResponseFactory, metricFactory, pathConverterFactory)); - builder.add(new ExamineProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, pathConverterFactory)); + builder.add(new ExamineProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, pathConverterFactory, mailboxCounterCorrector)); builder.add(new AppendProcessor(mailboxManager, statusResponseFactory, metricFactory, pathConverterFactory)); builder.add(new StoreProcessor(mailboxManager, statusResponseFactory, metricFactory)); builder.add(new NoopProcessor(mailboxManager, statusResponseFactory, metricFactory)); @@ -87,7 +89,7 @@ public class DefaultProcessor implements ImapProcessor { builder.add(new XListProcessor(mailboxManager, statusResponseFactory, mailboxTyper, metricFactory, subscriptionManager, pathConverterFactory)); builder.add(new ListProcessor<>(mailboxManager, statusResponseFactory, metricFactory, subscriptionManager, statusProcessor, mailboxTyper, pathConverterFactory)); builder.add(new SearchProcessor(mailboxManager, statusResponseFactory, metricFactory)); - builder.add(new SelectProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, pathConverterFactory)); + builder.add(new SelectProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, pathConverterFactory, mailboxCounterCorrector)); builder.add(new NamespaceProcessor(mailboxManager, statusResponseFactory, metricFactory, new NamespaceSupplier.Default())); builder.add(new FetchProcessor(mailboxManager, statusResponseFactory, metricFactory)); builder.add(new StartTLSProcessor(statusResponseFactory)); diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java index 6a03f55db8..6ea665c8c4 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java @@ -30,6 +30,7 @@ import org.apache.james.imap.api.message.UidRange; import org.apache.james.imap.api.message.response.StatusResponseFactory; import org.apache.james.imap.main.PathConverter; import org.apache.james.imap.message.request.ExamineRequest; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.util.MDCBuilder; @@ -38,8 +39,8 @@ public class ExamineProcessor extends AbstractSelectionProcessor<ExamineRequest> @Inject public ExamineProcessor(MailboxManager mailboxManager, EventBus eventBus, StatusResponseFactory statusResponseFactory, - MetricFactory metricFactory, PathConverter.Factory pathConverterFactory) { - super(ExamineRequest.class, mailboxManager, statusResponseFactory, pathConverterFactory, true, metricFactory, eventBus); + MetricFactory metricFactory, PathConverter.Factory pathConverterFactory, MailboxCounterCorrector mailboxCounterCorrector) { + super(ExamineRequest.class, mailboxManager, statusResponseFactory, pathConverterFactory, true, metricFactory, eventBus, mailboxCounterCorrector); } @Override diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java index fdfd4960e6..8cca1a1dbe 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java @@ -30,6 +30,7 @@ import org.apache.james.imap.api.message.UidRange; import org.apache.james.imap.api.message.response.StatusResponseFactory; import org.apache.james.imap.main.PathConverter; import org.apache.james.imap.message.request.SelectRequest; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.util.MDCBuilder; @@ -38,8 +39,8 @@ public class SelectProcessor extends AbstractSelectionProcessor<SelectRequest> { @Inject public SelectProcessor(MailboxManager mailboxManager, EventBus eventBus, StatusResponseFactory statusResponseFactory, - MetricFactory metricFactory, PathConverter.Factory pathConverterFactory) { - super(SelectRequest.class, mailboxManager, statusResponseFactory, pathConverterFactory, false, metricFactory, eventBus); + MetricFactory metricFactory, PathConverter.Factory pathConverterFactory, MailboxCounterCorrector mailboxCounterCorrector) { + super(SelectRequest.class, mailboxManager, statusResponseFactory, pathConverterFactory, false, metricFactory, eventBus, mailboxCounterCorrector); } @Override diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java index 20d94041ce..95513bfc4e 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java @@ -27,6 +27,7 @@ import org.apache.james.imap.api.process.MailboxTyper; import org.apache.james.imap.message.response.UnpooledStatusResponseFactory; import org.apache.james.imap.processor.DefaultProcessor; import org.apache.james.imap.processor.base.UnknownRequestProcessor; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.quota.QuotaManager; @@ -48,7 +49,7 @@ public class DefaultImapProcessorFactory { UnknownRequestProcessor unknownRequestImapProcessor = new UnknownRequestProcessor(statusResponseFactory); return DefaultProcessor.createDefaultProcessor(unknownRequestImapProcessor, mailboxManager, - eventBus, subscriptionManager, statusResponseFactory, mailboxTyper, quotaManager, quotaRootResolver, metricFactory); + eventBus, subscriptionManager, statusResponseFactory, mailboxTyper, quotaManager, quotaRootResolver, MailboxCounterCorrector.DEFAULT, metricFactory); } } diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java index 67f886a2fe..03d9b759be 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java @@ -31,6 +31,7 @@ import org.apache.james.imap.api.message.UidRange; import org.apache.james.imap.api.message.response.StatusResponseFactory; import org.apache.james.imap.api.process.SelectedMailbox; import org.apache.james.imap.main.PathConverter; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.metrics.api.MetricFactory; @@ -46,7 +47,8 @@ public class AbstractSelectionProcessorTest { EventBus eventBus = null; StatusResponseFactory statusResponseFactory = null; MetricFactory metricFactory = null; - testee = new SelectProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, PathConverter.Factory.DEFAULT); + MailboxCounterCorrector mailboxCounterCorrector = null; + testee = new SelectProcessor(mailboxManager, eventBus, statusResponseFactory, metricFactory, PathConverter.Factory.DEFAULT, mailboxCounterCorrector); } @Test diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java index a0e339baf0..386f652d7c 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java @@ -41,6 +41,7 @@ import org.apache.james.imap.main.ResponseEncoder; import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest; import org.apache.james.imap.message.request.SelectRequest; import org.apache.james.imap.message.response.UnpooledStatusResponseFactory; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.inmemory.InMemoryMailboxManager; @@ -66,11 +67,13 @@ class SelectProcessorTest { InMemoryIntegrationResources integrationResources = InMemoryIntegrationResources.defaultResources(); mailboxManager = integrationResources.getMailboxManager(); + MailboxCounterCorrector mailboxCounterCorrector = null; testee = new SelectProcessor(mailboxManager, integrationResources.getEventBus(), new UnpooledStatusResponseFactory(), new RecordingMetricFactory(), - PathConverter.Factory.DEFAULT); + PathConverter.Factory.DEFAULT, + mailboxCounterCorrector); mailboxSession = mailboxManager.createSystemSession(Username.of("bob")); mailboxManager.createMailbox(MailboxPath.inbox(BOB), mailboxSession); diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java index e9a03a74aa..f0f93b5908 100644 --- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java +++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java @@ -55,6 +55,7 @@ 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.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MessageIdManager; @@ -89,6 +90,7 @@ 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.mail.task.CassandraMailboxCounterCorrector; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule; @@ -180,6 +182,7 @@ public class CassandraMailboxModule extends AbstractModule { bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON); bind(EmailChangeRepositoryDAO.class).in(Scopes.SINGLETON); bind(MailboxChangeRepositoryDAO.class).in(Scopes.SINGLETON); + bind(CassandraMailboxCounterCorrector.class).in(Scopes.SINGLETON); bind(ReIndexerImpl.class).in(Scopes.SINGLETON); bind(MessageIdReIndexerImpl.class).in(Scopes.SINGLETON); @@ -211,6 +214,7 @@ public class CassandraMailboxModule extends AbstractModule { bind(RightManager.class).to(StoreRightManager.class); bind(SessionProvider.class).to(SessionProviderImpl.class); bind(AttachmentContentLoader.class).to(AttachmentManager.class); + bind(MailboxCounterCorrector.class).to(CassandraMailboxCounterCorrector.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)); diff --git a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java index 0a872673ed..f9150f564d 100644 --- a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java +++ b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java @@ -33,6 +33,7 @@ import org.apache.james.mailbox.AttachmentContentLoader; import org.apache.james.mailbox.AttachmentIdFactory; import org.apache.james.mailbox.Authenticator; import org.apache.james.mailbox.Authorizator; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.SessionProvider; @@ -120,6 +121,7 @@ public class JPAMailboxModule extends AbstractModule { bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class); bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class); bind(AttachmentContentLoader.class).to(JPAAttachmentContentLoader.class); + bind(MailboxCounterCorrector.class).toInstance(MailboxCounterCorrector.DEFAULT); bind(ReIndexer.class).to(ReIndexerImpl.class); diff --git a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java index 09746e8e9b..5fbb80e4ce 100644 --- a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java +++ b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java @@ -41,6 +41,7 @@ import org.apache.james.mailbox.AttachmentIdFactory; import org.apache.james.mailbox.AttachmentManager; import org.apache.james.mailbox.Authenticator; import org.apache.james.mailbox.Authorizator; +import org.apache.james.mailbox.MailboxCounterCorrector; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MessageIdManager; @@ -131,6 +132,7 @@ public class MemoryMailboxModule extends AbstractModule { bind(AttachmentContentLoader.class).to(AttachmentManager.class); bind(DeletedMessageMetadataVault.class).to(MemoryDeletedMessageMetadataVault.class); + bind(MailboxCounterCorrector.class).toInstance(MailboxCounterCorrector.DEFAULT); bind(InMemoryMailboxSessionMapperFactory.class).in(Scopes.SINGLETON); bind(InMemoryModSeqProvider.class).in(Scopes.SINGLETON); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org