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

Reply via email to