You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2020/07/07 16:02:38 UTC

[james-project] branch master updated (ca0ddd3 -> 05c5ebe)

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from ca0ddd3  Merge pull request #204 from dleangen/docs/server/demo
     new 0604136  [REFACTORING] Relocate LDAP retrying logic from server-utils into data-ldap
     new 36cba62  [REFACTORING] Remove unused class
     new 147aded  JAMES-3299 RabbitMQ EventBus key registration should not hang
     new e1a4ab8  JAMES-3265 Flags updates should not infinite loop on denormalization issues
     new 05c5ebe  JAMES-3167 Correct NullPointerExceptions when reading rights

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/james/mailbox/MailboxManagerTest.java   | 78 ++++++++++++++++++++++
 .../cassandra/mail/CassandraMessageMapper.java     |  9 +--
 .../mail/utils/FlagsUpdateStageResult.java         | 14 ++--
 .../cassandra/mail/CassandraMessageMapperTest.java | 26 ++++++++
 .../mail/utils/FlagsUpdateStageResultTest.java     | 20 ++++--
 .../mailbox/events/KeyRegistrationHandler.java     | 17 +++--
 .../james/mailbox/store/StoreRightManager.java     | 14 ++--
 .../org/apache/james/util/retry/FaultyService.java | 24 -------
 .../james/user/ldap/ReadOnlyLDAPUsersDAO.java      |  6 +-
 .../user/ldap}/retry/DoublingRetrySchedule.java    |  4 +-
 .../user/ldap}/retry/ExceptionRetryHandler.java    | 10 +--
 .../ldap}/retry/api/ExceptionRetryingProxy.java    |  2 +-
 .../james/user/ldap}/retry/api/RetryHandler.java   |  2 +-
 .../james/user/ldap}/retry/api/RetrySchedule.java  |  2 +-
 .../ldap}/retry/naming/LoggingRetryHandler.java    |  6 +-
 .../retry/naming/NamingExceptionRetryHandler.java  | 10 +--
 .../user/ldap}/retry/naming/RetryingContext.java   | 11 +--
 .../retry/naming/directory/RetryingDirContext.java | 13 ++--
 .../retry/naming/ldap/RetryingLdapContext.java     | 13 ++--
 .../ldap}/retry/DoublingRetryScheduleTest.java     |  4 +-
 .../ldap}/retry/ExceptionRetryHandlerTest.java     |  8 +--
 .../naming/NamingExceptionRetryHandlerTest.java    |  8 +--
 22 files changed, 203 insertions(+), 98 deletions(-)
 delete mode 100644 server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/DoublingRetrySchedule.java (96%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/ExceptionRetryHandler.java (93%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/api/ExceptionRetryingProxy.java (97%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/api/RetryHandler.java (97%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/api/RetrySchedule.java (95%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/naming/LoggingRetryHandler.java (91%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/naming/NamingExceptionRetryHandler.java (87%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/naming/RetryingContext.java (97%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/naming/directory/RetryingDirContext.java (97%)
 rename server/{container/util/src/main/java/org/apache/james/util => data/data-ldap/src/main/java/org/apache/james/user/ldap}/retry/naming/ldap/RetryingLdapContext.java (91%)
 rename server/{container/util/src/test/java/org/apache/james/util => data/data-ldap/src/test/java/org/apache/james/user/ldap}/retry/DoublingRetryScheduleTest.java (97%)
 rename server/{container/util/src/test/java/org/apache/james/util => data/data-ldap/src/test/java/org/apache/james/user/ldap}/retry/ExceptionRetryHandlerTest.java (94%)
 rename server/{container/util/src/test/java/org/apache/james/util => data/data-ldap/src/test/java/org/apache/james/user/ldap}/retry/naming/NamingExceptionRetryHandlerTest.java (92%)


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 01/05: [REFACTORING] Relocate LDAP retrying logic from server-utils into data-ldap

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 060413635d4d5044fca8eaf4dad833f2f1fbdfd8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 7 10:58:02 2020 +0700

    [REFACTORING] Relocate LDAP retrying logic from server-utils into data-ldap
---
 .../org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java    |  6 +++---
 .../james/user/ldap}/retry/DoublingRetrySchedule.java       |  4 ++--
 .../james/user/ldap}/retry/ExceptionRetryHandler.java       | 10 +++++-----
 .../org/apache/james/user/ldap}/retry/FaultyService.java    |  2 +-
 .../james/user/ldap}/retry/api/ExceptionRetryingProxy.java  |  2 +-
 .../org/apache/james/user/ldap}/retry/api/RetryHandler.java |  2 +-
 .../apache/james/user/ldap}/retry/api/RetrySchedule.java    |  2 +-
 .../james/user/ldap}/retry/naming/LoggingRetryHandler.java  |  6 +++---
 .../ldap}/retry/naming/NamingExceptionRetryHandler.java     | 10 +++++-----
 .../james/user/ldap}/retry/naming/RetryingContext.java      | 11 ++++++-----
 .../ldap}/retry/naming/directory/RetryingDirContext.java    | 13 +++++++------
 .../user/ldap}/retry/naming/ldap/RetryingLdapContext.java   | 13 +++++++------
 .../james/user/ldap}/retry/DoublingRetryScheduleTest.java   |  4 ++--
 .../james/user/ldap}/retry/ExceptionRetryHandlerTest.java   |  8 ++++----
 .../ldap}/retry/naming/NamingExceptionRetryHandlerTest.java |  8 ++++----
 15 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
index e618774..f85b3f6 100644
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
@@ -50,10 +50,10 @@ import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.api.model.User;
 import org.apache.james.user.ldap.api.LdapConstants;
+import org.apache.james.user.ldap.retry.DoublingRetrySchedule;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.naming.ldap.RetryingLdapContext;
 import org.apache.james.user.lib.UsersDAO;
-import org.apache.james.util.retry.DoublingRetrySchedule;
-import org.apache.james.util.retry.api.RetrySchedule;
-import org.apache.james.util.retry.naming.ldap.RetryingLdapContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/DoublingRetrySchedule.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/DoublingRetrySchedule.java
similarity index 96%
rename from server/container/util/src/main/java/org/apache/james/util/retry/DoublingRetrySchedule.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/DoublingRetrySchedule.java
index 2c8d4fe..f9e435e 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/DoublingRetrySchedule.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/DoublingRetrySchedule.java
@@ -18,9 +18,9 @@
  *
  */
 
-package org.apache.james.util.retry;
+package org.apache.james.user.ldap.retry;
 
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 
 
 /**
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/ExceptionRetryHandler.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/ExceptionRetryHandler.java
similarity index 93%
rename from server/container/util/src/main/java/org/apache/james/util/retry/ExceptionRetryHandler.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/ExceptionRetryHandler.java
index 1b4f53b..218048b 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/ExceptionRetryHandler.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/ExceptionRetryHandler.java
@@ -18,11 +18,11 @@
  *
  */
 
-package org.apache.james.util.retry;
+package org.apache.james.user.ldap.retry;
 
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetryHandler;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetryHandler;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 
 /**
  * Abstract class <code>ExceptionRetryHandler</code> retries the behaviour defined in abstract method 
@@ -36,7 +36,7 @@ import org.apache.james.util.retry.api.RetrySchedule;
  * The method stubs required to perform the proxy call via <code>operation()</code> may be generated by many means,
  * including explicit code, a <code>DynamicProxy</code> and compile time aspect injection.
  *
- * @see org.apache.james.util.retry.naming.RetryingContext
+ * @see org.apache.james.user.ldap.retry.naming.RetryingContext
  */
 public abstract class ExceptionRetryHandler implements RetryHandler {
 
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java
similarity index 96%
rename from server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java
index f8c85e6..b7b32b5 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/FaultyService.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.util.retry;
+package org.apache.james.user.ldap.retry;
 
 public interface FaultyService {
     String faultyService();
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/api/ExceptionRetryingProxy.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/ExceptionRetryingProxy.java
similarity index 97%
rename from server/container/util/src/main/java/org/apache/james/util/retry/api/ExceptionRetryingProxy.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/ExceptionRetryingProxy.java
index fd67316..fb41fe9 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/api/ExceptionRetryingProxy.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/ExceptionRetryingProxy.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.api;
+package org.apache.james.user.ldap.retry.api;
 
 
 /**
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/api/RetryHandler.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetryHandler.java
similarity index 97%
rename from server/container/util/src/main/java/org/apache/james/util/retry/api/RetryHandler.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetryHandler.java
index e67496d..77f7e56 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/api/RetryHandler.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetryHandler.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.api;
+package org.apache.james.user.ldap.retry.api;
 
 
 /**
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/api/RetrySchedule.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetrySchedule.java
similarity index 95%
rename from server/container/util/src/main/java/org/apache/james/util/retry/api/RetrySchedule.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetrySchedule.java
index 5ad6c83..6607925 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/api/RetrySchedule.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/api/RetrySchedule.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.api;
+package org.apache.james.user.ldap.retry.api;
 
 /**
  * <code>RetrySchedule</code>
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/naming/LoggingRetryHandler.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/LoggingRetryHandler.java
similarity index 91%
rename from server/container/util/src/main/java/org/apache/james/util/retry/naming/LoggingRetryHandler.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/LoggingRetryHandler.java
index 2c8ff64..e9af6f4 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/naming/LoggingRetryHandler.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/LoggingRetryHandler.java
@@ -18,12 +18,12 @@
  *
  */
 
-package org.apache.james.util.retry.naming;
+package org.apache.james.user.ldap.retry.naming;
 
 import javax.naming.NamingException;
 
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandler.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandler.java
similarity index 87%
rename from server/container/util/src/main/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandler.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandler.java
index 5395b43..368b5d2 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandler.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandler.java
@@ -18,20 +18,20 @@
  *
  */
 
-package org.apache.james.util.retry.naming;
+package org.apache.james.user.ldap.retry.naming;
 
 import javax.naming.NamingException;
 
-import org.apache.james.util.retry.ExceptionRetryHandler;
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.ExceptionRetryHandler;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 
 /**
  * Abstract class <code>NamingExceptionRetryHandler</code> narrows the set of Exceptions throwable 
  * by <code>perform</code> to <code>NamingException</code> and its subclasses.
  * <p><code>RuntimeException</code>s are <strong>not</strong> retried.
  * 
- * @see org.apache.james.user.ldap.ExceptionRetryHandler
+ * @see org.apache.james.user.ldap.retry.ExceptionRetryHandler
  * 
  */
 public abstract class NamingExceptionRetryHandler extends ExceptionRetryHandler {
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/naming/RetryingContext.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/RetryingContext.java
similarity index 97%
rename from server/container/util/src/main/java/org/apache/james/util/retry/naming/RetryingContext.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/RetryingContext.java
index 37fc065..65bbd1a 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/naming/RetryingContext.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/RetryingContext.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.naming;
+package org.apache.james.user.ldap.retry.naming;
 
 import java.util.Hashtable;
 
@@ -33,15 +33,16 @@ import javax.naming.NamingException;
 import javax.naming.NoInitialContextException;
 import javax.naming.ServiceUnavailableException;
 
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.ExceptionRetryHandler;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 
 /**
  * <code>RetryingContext</code> retries the methods defined by <code>javax.naming.Context</code>
  * according to the specified schedule. 
  * 
- * @see org.apache.james.util.retry.ExceptionRetryHandler
- * @see org.apache.james.util.retry.api.ExceptionRetryingProxy
+ * @see ExceptionRetryHandler
+ * @see org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy
  * @see javax.naming.Context
  */
 public abstract class RetryingContext implements Context, ExceptionRetryingProxy {
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/naming/directory/RetryingDirContext.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/directory/RetryingDirContext.java
similarity index 97%
rename from server/container/util/src/main/java/org/apache/james/util/retry/naming/directory/RetryingDirContext.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/directory/RetryingDirContext.java
index d630a8c..72c1679 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/naming/directory/RetryingDirContext.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/directory/RetryingDirContext.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.naming.directory;
+package org.apache.james.user.ldap.retry.naming.directory;
 
 import javax.naming.Context;
 import javax.naming.Name;
@@ -30,16 +30,17 @@ import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 
-import org.apache.james.util.retry.api.RetrySchedule;
-import org.apache.james.util.retry.naming.LoggingRetryHandler;
-import org.apache.james.util.retry.naming.RetryingContext;
+import org.apache.james.user.ldap.retry.ExceptionRetryHandler;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.naming.LoggingRetryHandler;
+import org.apache.james.user.ldap.retry.naming.RetryingContext;
 
 /**
  * <code>RetryingDirContext</code> retries the methods defined by <code>javax.naming.directory.DirContext</code>
  * according to the specified schedule. 
  * 
- * @see org.apache.james.util.retry.ExceptionRetryHandler
- * @see org.apache.james.util.retry.api.ExceptionRetryingProxy
+ * @see ExceptionRetryHandler
+ * @see org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy
  * @see javax.naming.directory.DirContext
  */
 public abstract class RetryingDirContext extends RetryingContext implements DirContext {
diff --git a/server/container/util/src/main/java/org/apache/james/util/retry/naming/ldap/RetryingLdapContext.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/ldap/RetryingLdapContext.java
similarity index 91%
rename from server/container/util/src/main/java/org/apache/james/util/retry/naming/ldap/RetryingLdapContext.java
rename to server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/ldap/RetryingLdapContext.java
index c144132..0355c09 100644
--- a/server/container/util/src/main/java/org/apache/james/util/retry/naming/ldap/RetryingLdapContext.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/naming/ldap/RetryingLdapContext.java
@@ -18,7 +18,7 @@
  *
  */
 
-package org.apache.james.util.retry.naming.ldap;
+package org.apache.james.user.ldap.retry.naming.ldap;
 
 import javax.naming.Context;
 import javax.naming.NamingException;
@@ -27,16 +27,17 @@ import javax.naming.ldap.ExtendedRequest;
 import javax.naming.ldap.ExtendedResponse;
 import javax.naming.ldap.LdapContext;
 
-import org.apache.james.util.retry.api.RetrySchedule;
-import org.apache.james.util.retry.naming.LoggingRetryHandler;
-import org.apache.james.util.retry.naming.directory.RetryingDirContext;
+import org.apache.james.user.ldap.retry.ExceptionRetryHandler;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.naming.LoggingRetryHandler;
+import org.apache.james.user.ldap.retry.naming.directory.RetryingDirContext;
 
 /**
  * <code>RetryingLdapContext</code> retries the methods defined by <code>javax.naming.ldap.LdapContext</code>
  * according to the specified schedule. 
  * 
- * @see org.apache.james.util.retry.ExceptionRetryHandler
- * @see org.apache.james.util.retry.api.ExceptionRetryingProxy
+ * @see ExceptionRetryHandler
+ * @see org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy
  * @see javax.naming.ldap.LdapContext
  */
 public abstract class RetryingLdapContext extends RetryingDirContext implements LdapContext {
diff --git a/server/container/util/src/test/java/org/apache/james/util/retry/DoublingRetryScheduleTest.java b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/DoublingRetryScheduleTest.java
similarity index 97%
rename from server/container/util/src/test/java/org/apache/james/util/retry/DoublingRetryScheduleTest.java
rename to server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/DoublingRetryScheduleTest.java
index 60f348f..7ec732c 100644
--- a/server/container/util/src/test/java/org/apache/james/util/retry/DoublingRetryScheduleTest.java
+++ b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/DoublingRetryScheduleTest.java
@@ -17,11 +17,11 @@
  *   under the License.
  *
  */
-package org.apache.james.util.retry;
+package org.apache.james.user.ldap.retry;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 import org.junit.jupiter.api.Test;
 
 class DoublingRetryScheduleTest {
diff --git a/server/container/util/src/test/java/org/apache/james/util/retry/ExceptionRetryHandlerTest.java b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/ExceptionRetryHandlerTest.java
similarity index 94%
rename from server/container/util/src/test/java/org/apache/james/util/retry/ExceptionRetryHandlerTest.java
rename to server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/ExceptionRetryHandlerTest.java
index 6e96018..f3d921d 100644
--- a/server/container/util/src/test/java/org/apache/james/util/retry/ExceptionRetryHandlerTest.java
+++ b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/ExceptionRetryHandlerTest.java
@@ -17,7 +17,7 @@
  *   under the License.
  *
  */
-package org.apache.james.util.retry;
+package org.apache.james.user.ldap.retry;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -26,9 +26,9 @@ import java.util.List;
 
 import javax.naming.Context;
 
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetryHandler;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetryHandler;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/server/container/util/src/test/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandlerTest.java b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandlerTest.java
similarity index 92%
rename from server/container/util/src/test/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandlerTest.java
rename to server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandlerTest.java
index 60ef0ad..59c8fb8 100644
--- a/server/container/util/src/test/java/org/apache/james/util/retry/naming/NamingExceptionRetryHandlerTest.java
+++ b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/retry/naming/NamingExceptionRetryHandlerTest.java
@@ -17,16 +17,16 @@
  *   under the License.
  *
  */
-package org.apache.james.util.retry.naming;
+package org.apache.james.user.ldap.retry.naming;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 import javax.naming.Context;
 import javax.naming.NamingException;
 
-import org.apache.james.util.retry.api.ExceptionRetryingProxy;
-import org.apache.james.util.retry.api.RetryHandler;
-import org.apache.james.util.retry.api.RetrySchedule;
+import org.apache.james.user.ldap.retry.api.ExceptionRetryingProxy;
+import org.apache.james.user.ldap.retry.api.RetryHandler;
+import org.apache.james.user.ldap.retry.api.RetrySchedule;
 import org.junit.jupiter.api.Test;
 
 class NamingExceptionRetryHandlerTest {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 03/05: JAMES-3299 RabbitMQ EventBus key registration should not hang

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 147aded8fac341ecdcd86026eb8654dc85b56561
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 7 08:30:41 2020 +0700

    JAMES-3299 RabbitMQ EventBus key registration should not hang
    
    Debugging proved bind / unbind operation can hang. Upon such hangs,
    timing out will allow to retry the given operation.
---
 .../james/mailbox/events/KeyRegistrationHandler.java    | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
index 5add858..8b79d06 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
@@ -58,6 +58,8 @@ class KeyRegistrationHandler {
     private static final Duration EXPIRATION_TIMEOUT = Duration.ofMinutes(30);
     private static final Map<String, Object> QUEUE_ARGUMENTS = ImmutableMap.of("x-expires", EXPIRATION_TIMEOUT.toMillis());
 
+    private static final Duration TOPOLOGY_CHANGES_TIMEOUT = Duration.ofMinutes(1);
+
     private final EventBusId eventBusId;
     private final LocalListenerRegistry localListenerRegistry;
     private final EventSerializer eventSerializer;
@@ -100,11 +102,13 @@ class KeyRegistrationHandler {
 
     @VisibleForTesting
     void declareQueue() {
-        sender.declareQueue(QueueSpecification.queue(EVENTBUS_QUEUE_NAME_PREFIX + eventBusId.asString())
-            .durable(DURABLE)
-            .exclusive(!EXCLUSIVE)
-            .autoDelete(AUTO_DELETE)
-            .arguments(QUEUE_ARGUMENTS))
+        sender.declareQueue(
+            QueueSpecification.queue(EVENTBUS_QUEUE_NAME_PREFIX + eventBusId.asString())
+                .durable(DURABLE)
+                .exclusive(!EXCLUSIVE)
+                .autoDelete(AUTO_DELETE)
+                .arguments(QUEUE_ARGUMENTS))
+            .timeout(TOPOLOGY_CHANGES_TIMEOUT)
             .map(AMQP.Queue.DeclareOk::getQueue)
             .retryWhen(Retry.backoff(retryBackoff.getMaxRetries(), retryBackoff.getFirstBackoff()).jitter(retryBackoff.getJitterFactor()))
             .doOnSuccess(queueName -> {
@@ -121,6 +125,7 @@ class KeyRegistrationHandler {
             .ifPresent(Disposable::dispose);
         receiver.close();
         sender.delete(QueueSpecification.queue(registrationQueue.asString()))
+            .timeout(TOPOLOGY_CHANGES_TIMEOUT)
             .retryWhen(Retry.backoff(retryBackoff.getMaxRetries(), retryBackoff.getFirstBackoff()).jitter(retryBackoff.getJitterFactor()).scheduler(Schedulers.elastic()))
             .block();
     }
@@ -132,6 +137,7 @@ class KeyRegistrationHandler {
             .thenReturn(new KeyRegistration(() -> {
                 if (registration.unregister().lastListenerRemoved()) {
                     registrationBinder.unbind(key)
+                        .timeout(TOPOLOGY_CHANGES_TIMEOUT)
                         .retryWhen(Retry.backoff(retryBackoff.getMaxRetries(), retryBackoff.getFirstBackoff()).jitter(retryBackoff.getJitterFactor()).scheduler(Schedulers.elastic()))
                         .subscribeOn(Schedulers.elastic())
                         .block();
@@ -142,6 +148,7 @@ class KeyRegistrationHandler {
     private Mono<Void> registerIfNeeded(RegistrationKey key, LocalListenerRegistry.LocalRegistration registration) {
         if (registration.isFirstListener()) {
             return registrationBinder.bind(key)
+                .timeout(TOPOLOGY_CHANGES_TIMEOUT)
                 .retryWhen(Retry.backoff(retryBackoff.getMaxRetries(), retryBackoff.getFirstBackoff()).jitter(retryBackoff.getJitterFactor()).scheduler(Schedulers.elastic()));
         }
         return Mono.empty();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 05/05: JAMES-3167 Correct NullPointerExceptions when reading rights

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 05c5ebe86bb7af1e0c7b9b0c0495a8d05a04d5d0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 7 08:55:35 2020 +0700

    JAMES-3167 Correct NullPointerExceptions when reading rights
---
 .../apache/james/mailbox/MailboxManagerTest.java   | 78 ++++++++++++++++++++++
 .../james/mailbox/store/StoreRightManager.java     | 14 ++--
 2 files changed, 88 insertions(+), 4 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 09069fe..7a8dbe5 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -2692,4 +2692,82 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .satisfies(Throwing.consumer(messageResult -> assertThat(messageResult.hasAttachments()).isFalse()));
         }
     }
+
+    @Nested
+    class RightTests {
+        @BeforeEach
+        void setUp() {
+            session = mailboxManager.createSystemSession(USER_1);
+        }
+
+        @Test
+        void hasRightShouldThrowOnUnknownMailbox() {
+            assertThatThrownBy(() -> mailboxManager.hasRight(
+                    MailboxPath.forUser(USER_1, "notFound"),
+                    MailboxACL.Right.Administer,
+                    session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void listRightsShouldThrowOnUnknownMailbox() {
+            assertThatThrownBy(() -> mailboxManager.listRights(
+                    MailboxPath.forUser(USER_1, "notFound"),
+                    session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void myRightsShouldThrowOnUnknownMailbox() {
+            assertThatThrownBy(() -> mailboxManager.myRights(
+                    MailboxPath.forUser(USER_1, "notFound"),
+                    session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void listRightsForEntryShouldThrowOnUnknownMailbox() {
+            assertThatThrownBy(() -> mailboxManager.listRights(
+                    MailboxPath.forUser(USER_1, "notFound"),
+                    MailboxACL.EntryKey.createUserEntryKey(USER_2),
+                    session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void setRightsShouldNotThrowOnUnknownMailbox() {
+            assertThatCode(() -> mailboxManager.setRights(
+                    MailboxPath.forUser(USER_1, "notFound"),
+                    MailboxACL.EMPTY,
+                    session))
+                .doesNotThrowAnyException();
+        }
+
+        @Test
+        void hasRightShouldThrowOnDeletedMailbox() throws Exception {
+            MailboxId id = mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "deleted"), session).get();
+            mailboxManager.deleteMailbox(id, session);
+
+            assertThatThrownBy(() -> mailboxManager.hasRight(id, MailboxACL.Right.Administer, session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void myRightsShouldThrowOnDeletedMailbox() throws Exception {
+            MailboxId id = mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "deleted"), session).get();
+            mailboxManager.deleteMailbox(id, session);
+
+            assertThatThrownBy(() -> Mono.from(mailboxManager.myRights(id, session)).blockOptional())
+                .hasCauseInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void setRightsShouldThrowOnDeletedMailbox() throws Exception {
+            MailboxId id = mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "deleted"), session).get();
+            mailboxManager.deleteMailbox(id, session);
+
+            assertThatThrownBy(() -> mailboxManager.setRights(id, MailboxACL.EMPTY, session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+    }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
index b9cde36..ddb5e6d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store;
 
 import static org.apache.james.mailbox.store.MailboxReactorUtils.block;
+import static org.apache.james.mailbox.store.MailboxReactorUtils.blockOptional;
 
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,7 @@ import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.DifferentDomainException;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -93,7 +95,8 @@ public class StoreRightManager implements RightManager {
     @Override
     public Rfc4314Rights myRights(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
         MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        Mailbox mailbox = block(mapper.findMailboxByPath(mailboxPath));
+        Mailbox mailbox = blockOptional(mapper.findMailboxByPath(mailboxPath))
+            .orElseThrow(() -> new MailboxNotFoundException(mailboxPath));
         return myRights(mailbox, session);
     }
 
@@ -123,7 +126,8 @@ public class StoreRightManager implements RightManager {
     @Override
     public List<Rfc4314Rights> listRights(MailboxPath mailboxPath, EntryKey key, MailboxSession session) throws MailboxException {
         MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        Mailbox mailbox = block(mapper.findMailboxByPath(mailboxPath));
+        Mailbox mailbox = blockOptional(mapper.findMailboxByPath(mailboxPath))
+            .orElseThrow(() -> new MailboxNotFoundException(mailboxPath));
 
         return aclResolver.listRights(key,
             groupMembershipResolver,
@@ -134,7 +138,8 @@ public class StoreRightManager implements RightManager {
     @Override
     public MailboxACL listRights(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
         MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        Mailbox mailbox = block(mapper.findMailboxByPath(mailboxPath));
+        Mailbox mailbox = blockOptional(mapper.findMailboxByPath(mailboxPath))
+            .orElseThrow(() -> new MailboxNotFoundException(mailboxPath));
         return mailbox.getACL();
     }
 
@@ -194,7 +199,8 @@ public class StoreRightManager implements RightManager {
     @Override
     public void setRights(MailboxId mailboxId, MailboxACL mailboxACL, MailboxSession session) throws MailboxException {
         MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        Mailbox mailbox = block(mapper.findMailboxById(mailboxId));
+        Mailbox mailbox = blockOptional(mapper.findMailboxById(mailboxId))
+            .orElseThrow(() -> new MailboxNotFoundException(mailboxId));
 
         setRights(mailbox.generateAssociatedPath(), mailboxACL, session);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 02/05: [REFACTORING] Remove unused class

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 36cba622c1a0c3b2837ae00fba1b4c7bad6d6b9d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 7 10:58:30 2020 +0700

    [REFACTORING] Remove unused class
---
 .../james/user/ldap/retry/FaultyService.java       | 24 ----------------------
 1 file changed, 24 deletions(-)

diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java
deleted file mode 100644
index b7b32b5..0000000
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/retry/FaultyService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/****************************************************************
- * 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.user.ldap.retry;
-
-public interface FaultyService {
-    String faultyService();
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 04/05: JAMES-3265 Flags updates should not infinite loop on denormalization issues

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e1a4ab80a0144bb3cf4abd6ba50ed932ca6fc4d1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jul 7 12:38:24 2020 +0700

    JAMES-3265 Flags updates should not infinite loop on denormalization issues
    
    Use table of truth upon retries, this avoids the flags operation to keep failing.
    
    Note that initial operation uses the projection to fasten range reads.
---
 .../cassandra/mail/CassandraMessageMapper.java     |  9 +++-----
 .../mail/utils/FlagsUpdateStageResult.java         | 14 ++++++------
 .../cassandra/mail/CassandraMessageMapperTest.java | 26 ++++++++++++++++++++++
 .../mail/utils/FlagsUpdateStageResultTest.java     | 20 +++++++++++++----
 4 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 9fbf32c..fb94eff 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -19,8 +19,6 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import static org.apache.james.util.ReactorUtils.publishIfPresent;
-
 import java.time.Duration;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -333,11 +331,10 @@ public class CassandraMessageMapper implements MessageMapper {
         return globalResult;
     }
 
-    private Mono<FlagsUpdateStageResult> retryUpdatesStage(CassandraId mailboxId, FlagsUpdateCalculator flagsUpdateCalculator, List<MessageUid> failed) {
+    private Mono<FlagsUpdateStageResult> retryUpdatesStage(CassandraId mailboxId, FlagsUpdateCalculator flagsUpdateCalculator, List<ComposedMessageId> failed) {
         if (!failed.isEmpty()) {
             Flux<ComposedMessageIdWithMetaData> toUpdate = Flux.fromIterable(failed)
-                .flatMap(uid -> messageIdDAO.retrieve(mailboxId, uid))
-                .handle(publishIfPresent());
+                .flatMap(ids -> imapUidDAO.retrieve((CassandraMessageId) ids.getMessageId(), Optional.of((CassandraId) ids.getMailboxId())));
             return runUpdateStage(mailboxId, toUpdate, flagsUpdateCalculator);
         } else {
             return Mono.empty();
@@ -443,7 +440,7 @@ public class CassandraMessageMapper implements MessageMapper {
                         .newFlags(newFlags)
                         .build());
                 } else {
-                    return FlagsUpdateStageResult.fail(oldMetaData.getComposedMessageId().getUid());
+                    return FlagsUpdateStageResult.fail(oldMetaData.getComposedMessageId());
                 }
             });
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResult.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResult.java
index df2858f..ba3eafa 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResult.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResult.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.cassandra.mail.utils;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -33,24 +33,24 @@ public class FlagsUpdateStageResult {
         return new FlagsUpdateStageResult(ImmutableList.of(), ImmutableList.of(updatedFlags));
     }
 
-    public static FlagsUpdateStageResult fail(MessageUid uid) {
-        return new FlagsUpdateStageResult(ImmutableList.of(uid), ImmutableList.of());
+    public static FlagsUpdateStageResult fail(ComposedMessageId ids) {
+        return new FlagsUpdateStageResult(ImmutableList.of(ids), ImmutableList.of());
     }
 
     public static FlagsUpdateStageResult none() {
         return new FlagsUpdateStageResult(ImmutableList.of(), ImmutableList.of());
     }
 
-    private final ImmutableList<MessageUid> failed;
+    private final ImmutableList<ComposedMessageId> failed;
     private final ImmutableList<UpdatedFlags> succeeded;
 
     @VisibleForTesting
-    FlagsUpdateStageResult(ImmutableList<MessageUid> failed, ImmutableList<UpdatedFlags> succeeded) {
+    FlagsUpdateStageResult(ImmutableList<ComposedMessageId> failed, ImmutableList<UpdatedFlags> succeeded) {
         this.failed = failed;
         this.succeeded = succeeded;
     }
 
-    public List<MessageUid> getFailed() {
+    public List<ComposedMessageId> getFailed() {
         return failed;
     }
 
@@ -60,7 +60,7 @@ public class FlagsUpdateStageResult {
 
     public FlagsUpdateStageResult merge(FlagsUpdateStageResult other) {
         return new FlagsUpdateStageResult(
-            ImmutableList.<MessageUid>builder()
+            ImmutableList.<ComposedMessageId>builder()
                 .addAll(this.failed)
                 .addAll(other.failed)
                 .build(),
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 0e17312..75e9146 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -64,6 +64,32 @@ class CassandraMessageMapperTest extends MessageMapperTest {
     @Nested
     class StatementLimitationTests {
         @Test
+        void updateFlagsShouldNotRetryOnDeletedMessages(CassandraCluster cassandra) throws MailboxException {
+            saveMessages();
+
+            cassandra.getConf().printStatements();
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .forever()
+                    .whenQueryStartsWith("DELETE FROM messageIdTable WHERE mailboxId=:mailboxId AND uid=:uid;"));
+            try {
+                messageMapper.deleteMessages(benwaInboxMailbox, ImmutableList.of(message1.getUid(), message2.getUid(), message3.getUid()));
+            } catch (Exception e) {
+                // expected
+            }
+
+            StatementRecorder statementRecorder = new StatementRecorder();
+            cassandra.getConf().recordStatements(statementRecorder);
+
+            FlagsUpdateCalculator markAsRead = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), MessageManager.FlagsUpdateMode.ADD);
+            messageMapper.updateFlags(benwaInboxMailbox, markAsRead, MessageRange.all());
+
+            assertThat(statementRecorder.listExecutedStatements(Selector.preparedStatement(
+                "UPDATE modseq SET nextModseq=:nextModseq WHERE mailboxId=:mailboxId IF nextModseq=:modSeqCondition;")))
+                .hasSize(2);
+        }
+
+        @Test
         void deleteMessagesShouldGroupMessageReads(CassandraCluster cassandra) throws MailboxException {
             saveMessages();
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
index 3317b6b..923a9a1 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
@@ -21,29 +21,41 @@ package org.apache.james.mailbox.cassandra.mail.utils;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.UUID;
+
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
+import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.junit.jupiter.api.Test;
 
+import com.datastax.driver.core.utils.UUIDs;
 import com.google.common.collect.ImmutableList;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class FlagsUpdateStageResultTest {
 
-    private static final MessageUid UID = MessageUid.of(1L);
-    private static final MessageUid OTHER_UID = MessageUid.of(2L);
+    private static final ComposedMessageId UID = new ComposedMessageId(
+        CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b")),
+        new CassandraMessageId.Factory().of(UUIDs.timeBased()),
+        MessageUid.of(1L));
+    private static final ComposedMessageId OTHER_UID = new ComposedMessageId(
+        CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b")),
+        new CassandraMessageId.Factory().of(UUIDs.timeBased()),
+        MessageUid.of(2L));
     private static final UpdatedFlags UPDATED_FLAGS = UpdatedFlags.builder()
-        .uid(UID)
+        .uid(UID.getUid())
         .modSeq(ModSeq.of(18))
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.SEEN))
         .build();
     private static final UpdatedFlags OTHER_UPDATED_FLAGS = UpdatedFlags.builder()
-        .uid(OTHER_UID)
+        .uid(OTHER_UID.getUid())
         .modSeq(ModSeq.of(18))
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.SEEN))


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org