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 bt...@apache.org on 2020/04/03 10:27:36 UTC

[james-project] branch master updated (4900a05 -> aff1d11)

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

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


    from 4900a05  JAMES-3130 MessageIdMapper::setFlags should return all results
     new 2beeaf0  JAMES-2302:SMTP configuration documentation refers to servername which does not exist anymore
     new 0f513dd  [Performance] Rely on reactor for Cassandra max quota definition
     new 0aa76bb  [Refactoring] instanceof is always false for null, remove duplicate checks
     new 7255a1a  [Refactoring] avoid manual implementation of Math.min
     new cc4467a  [Refactoring] avoid creating Arrays to call varargs methods
     new 55b4e8c  [Refactoring] simplify Collections operator where possible
     new bb5f0e7  [Refactoring] remove useless String operations
     new aff1d11  JAMES-3072 Add Progress Tracking for MailboxesExport Task

The 8 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/model/MessageRange.java   |  6 +-
 .../java/org/apache/james/mailbox/model/Quota.java |  2 +-
 .../quota/CassandraGlobalMaxQuotaDao.java          | 52 +++++++--------
 .../quota/CassandraPerDomainMaxQuotaDao.java       | 49 ++++++--------
 .../quota/CassandraPerUserMaxQuotaDao.java         | 49 ++++++--------
 .../quota/CassandraPerUserMaxQuotaManager.java     | 76 ++++++++++++----------
 .../search/ElasticSearchSearcher.java              |  2 +-
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   |  2 +-
 .../james/mailbox/maildir/MaildirFolder.java       | 10 +--
 .../james/mailbox/maildir/MaildirMessageName.java  |  2 +-
 .../james/mailbox/store/LazyMimeDescriptor.java    |  2 +-
 .../org/apache/mailet/base/FlowedMessageUtils.java |  2 +-
 .../james/transport/mailets/AbstractSign.java      |  4 +-
 .../matcher/IsX509CertificateSubject.java          |  2 +-
 .../apache/james/transport/mailets/AddFooter.java  |  4 +-
 .../imap/api/message/response/StatusResponse.java  |  6 +-
 .../james/imap/decode/parser/UidCommandParser.java |  2 +-
 .../imap/processor/AbstractMailboxProcessor.java   |  2 +-
 .../protocols/smtp/AbstractSMTPServerTest.java     |  2 +-
 .../apache/james/blob/api/BlobStoreContract.java   |  2 +-
 .../apache/james/blob/mail/MimeMessagePartsId.java |  4 +-
 .../james/util/mime/MessageContentExtractor.java   |  2 +-
 .../org/apache/james/rrt/lib/MappingSource.java    |  2 +-
 .../sieverepository/file/SieveFileRepository.java  |  2 +-
 .../apache/james/jmap/api/access/AccessToken.java  |  3 +-
 .../library/inetnetwork/model/Inet4Network.java    |  2 +-
 .../library/inetnetwork/model/Inet6Network.java    |  2 +-
 .../james/smtpserver/fastfail/URIScanner.java      |  8 +--
 .../james/webadmin/service/ExportService.java      | 42 ++++++++++--
 .../webadmin/service/MailboxesExportTask.java      | 18 +++--
 ...ailboxesExportTaskAdditionalInformationDTO.java | 13 +++-
 .../james/webadmin/service/ExportServiceTest.java  | 57 ++++++++++++----
 .../service/MailboxesExportRequestToTaskTest.java  |  3 +
 ...oxesExportTaskAdditionalInformationDTOTest.java |  2 +-
 .../mailboxesExport.additionalInformation.json     |  3 +-
 .../queue/activemq/ActiveMQCacheableMailQueue.java |  2 +-
 src/site/xdoc/server/config-smtp-lmtp.xml          |  3 +-
 37 files changed, 252 insertions(+), 194 deletions(-)


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


[james-project] 08/08: JAMES-3072 Add Progress Tracking for MailboxesExport Task

Posted by bt...@apache.org.
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

commit aff1d11fcd53e6f19a32c270e8db496a4bfa745d
Author: LanKhuat <kh...@gmail.com>
AuthorDate: Thu Mar 12 09:35:00 2020 +0700

    JAMES-3072 Add Progress Tracking for MailboxesExport Task
---
 .../james/webadmin/service/ExportService.java      | 42 +++++++++++++---
 .../webadmin/service/MailboxesExportTask.java      | 18 +++++--
 ...ailboxesExportTaskAdditionalInformationDTO.java | 13 ++++-
 .../james/webadmin/service/ExportServiceTest.java  | 57 ++++++++++++++++------
 .../service/MailboxesExportRequestToTaskTest.java  |  3 ++
 ...oxesExportTaskAdditionalInformationDTOTest.java |  2 +-
 .../mailboxesExport.additionalInformation.json     |  3 +-
 7 files changed, 108 insertions(+), 30 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
index e2f96ee..a982fd9 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
+import java.util.concurrent.ConcurrentLinkedDeque;
 
 import javax.inject.Inject;
 
@@ -39,12 +40,36 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
+import com.google.common.collect.Lists;
 
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
 public class ExportService {
 
+    public enum Stage {
+        STARTING,
+        ZIPPING,
+        EXPORTING,
+        COMPLETED,
+    }
+
+    public static class Progress {
+        private final ConcurrentLinkedDeque<Stage> stages;
+
+        public Progress() {
+            this.stages = new ConcurrentLinkedDeque<>(Lists.newArrayList(Stage.STARTING));
+        }
+
+        public Stage getStage() {
+            return stages.getLast();
+        }
+
+        public void setStage(Stage stage) {
+            this.stages.add(stage);
+        }
+    }
+
     private static final Logger LOGGER = LoggerFactory.getLogger(ExportService.class);
     private static final String EXPLANATION = "The backup of your mailboxes has been exported to you";
     private static final String FILE_PREFIX = "mailbox-backup-";
@@ -62,17 +87,18 @@ public class ExportService {
         this.usersRepository = usersRepository;
     }
 
-    public Mono<Task.Result> export(Username username) {
+    public Mono<Task.Result> export(Progress progress, Username username) {
         return Mono.usingWhen(
-            Mono.fromCallable(() -> zipMailboxesContent(username)),
-            inputStream -> export(username, inputStream),
+            Mono.fromCallable(() -> zipMailboxesContent(progress, username)),
+            inputStream -> export(progress, username, inputStream),
             this::closeResource,
             (inputStream, throwable) -> closeResource(inputStream),
             this::closeResource
         );
     }
 
-    private InputStream zipMailboxesContent(Username username) throws IOException {
+    InputStream zipMailboxesContent(Progress progress, Username username) throws IOException {
+        progress.setStage(Stage.ZIPPING);
         PipedOutputStream out = new PipedOutputStream();
         PipedInputStream in = new PipedInputStream(out);
 
@@ -83,16 +109,18 @@ public class ExportService {
         return in;
     }
 
-    private Mono<Task.Result> export(Username username, InputStream inputStream) {
-        return Mono.usingWhen(
+    Mono<Task.Result> export(Progress progress, Username username, InputStream inputStream) {
+        return Mono.fromRunnable(() -> progress.setStage(Stage.EXPORTING))
+            .then(Mono.usingWhen(
                 blobStore.save(blobStore.getDefaultBucketName(), inputStream, BlobStore.StoragePolicy.LOW_COST),
                 blobId -> export(username, blobId),
                 this::deleteBlob)
+            .doOnSuccess(any -> progress.setStage(Stage.COMPLETED))
             .thenReturn(Task.Result.COMPLETED)
             .onErrorResume(e -> {
                 LOGGER.error("Error exporting mailboxes of user: {}", username.asString(), e);
                 return Mono.just(Task.Result.PARTIAL);
-            });
+            }));
     }
 
     private Mono<Void> export(Username username, BlobId blobId) {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTask.java
index 42b0c53..fde9e53 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTask.java
@@ -39,15 +39,17 @@ public class MailboxesExportTask implements Task {
     static final TaskType TASK_TYPE = TaskType.of("MailboxesExportTask");
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private static AdditionalInformation from(Username username) {
-            return new AdditionalInformation(username, Clock.systemUTC().instant());
+        private static AdditionalInformation from(ExportService.Progress progress, Username username) {
+            return new AdditionalInformation(username, progress.getStage(), Clock.systemUTC().instant());
         }
 
         private final Username username;
+        private final ExportService.Stage stage;
         private final Instant timestamp;
 
-        public AdditionalInformation(Username username, Instant timestamp) {
+        public AdditionalInformation(Username username, ExportService.Stage stage, Instant timestamp) {
             this.username = username;
+            this.stage = stage;
             this.timestamp = timestamp;
         }
 
@@ -55,6 +57,10 @@ public class MailboxesExportTask implements Task {
             return username.asString();
         }
 
+        public ExportService.Stage getStage() {
+            return stage;
+        }
+
         @Override
         public Instant timestamp() {
             return timestamp;
@@ -93,15 +99,17 @@ public class MailboxesExportTask implements Task {
 
     private final Username username;
     private final ExportService service;
+    private final ExportService.Progress progress;
 
     MailboxesExportTask(ExportService service, Username username) {
         this.username = username;
         this.service = service;
+        this.progress = new ExportService.Progress();
     }
 
     @Override
     public Result run() {
-        return service.export(username)
+        return service.export(progress, username)
             .subscribeOn(Schedulers.elastic())
             .block();
     }
@@ -113,6 +121,6 @@ public class MailboxesExportTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(username));
+        return Optional.of(AdditionalInformation.from(progress, username));
     }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTO.java
index 3050117..40cb06f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTO.java
@@ -35,24 +35,29 @@ public class MailboxesExportTaskAdditionalInformationDTO implements AdditionalIn
             .convertToDTO(MailboxesExportTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new MailboxesExportTask.AdditionalInformation(
                 Username.of(dto.username),
+                dto.getStage(),
                 dto.timestamp))
             .toDTOConverter((details, type) -> new MailboxesExportTaskAdditionalInformationDTO(
                 type,
                 details.timestamp(),
-                details.getUsername()))
+                details.getUsername(),
+                details.getStage()))
             .typeName(MailboxesExportTask.TASK_TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
     private final String username;
     private final Instant timestamp;
     private final String type;
+    private final ExportService.Stage stage;
 
     private MailboxesExportTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                         @JsonProperty("timestamp") Instant timestamp,
-                                                        @JsonProperty("username") String username) {
+                                                        @JsonProperty("username") String username,
+                                                        @JsonProperty("stage") ExportService.Stage stage) {
         this.type = type;
         this.timestamp = timestamp;
         this.username = username;
+        this.stage = stage;
     }
 
     @Override
@@ -68,4 +73,8 @@ public class MailboxesExportTaskAdditionalInformationDTO implements AdditionalIn
     public String getUsername() {
         return username;
     }
+
+    public ExportService.Stage getStage() {
+        return stage;
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java
index acf02a2..ea86287 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java
@@ -26,8 +26,11 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 
 import javax.mail.MessagingException;
 
@@ -49,6 +52,7 @@ import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mockito;
 
 import com.google.common.base.Strings;
 import com.google.common.io.Files;
@@ -58,10 +62,8 @@ import reactor.core.publisher.Mono;
 @ExtendWith(FileSystemExtension.class)
 class ExportServiceTest {
 
-    private static final String JAMES_HOST = "james-host";
     private static final Domain DOMAIN = Domain.of("domain.tld");
     private static final Username UNKNOWN_USER = Username.fromLocalPartWithDomain("unknown", DOMAIN);
-    private static final String PASSWORD = "password";
     private static final String CORRESPONDING_FILE_HEADER = "corresponding-file";
     private static final String MESSAGE_CONTENT = "MIME-Version: 1.0\r\n" +
         "Subject: test\r\n" +
@@ -74,11 +76,13 @@ class ExportServiceTest {
 
     private ExportService testee;
     private ExportServiceTestSystem testSystem;
+    private ExportService.Progress progress;
 
     @BeforeEach
     void setUp(FileSystem fileSystem) throws Exception {
         testSystem = new ExportServiceTestSystem(fileSystem);
-        testee = new ExportService(testSystem.backup, testSystem.blobStore, testSystem.blobExport, testSystem.usersRepository);
+        testee = Mockito.spy(new ExportService(testSystem.backup, testSystem.blobStore, testSystem.blobExport, testSystem.usersRepository));
+        progress = new ExportService.Progress();
     }
 
     private String getFileUrl() throws MessagingException {
@@ -87,13 +91,13 @@ class ExportServiceTest {
 
     @Test
     void exportUserMailboxesDataShouldReturnCompletedWhenUserDoesNotExist() {
-        assertThat(testee.export(UNKNOWN_USER).block())
+        assertThat(testee.export(progress, UNKNOWN_USER).block())
             .isEqualTo(Task.Result.COMPLETED);
     }
 
     @Test
     void exportUserMailboxesDataShouldReturnCompletedWhenExistingUserWithoutMailboxes() {
-        assertThat(testee.export(BOB).block())
+        assertThat(testee.export(progress, BOB).block())
             .isEqualTo(Task.Result.COMPLETED);
     }
 
@@ -101,7 +105,7 @@ class ExportServiceTest {
     void exportUserMailboxesDataShouldReturnCompletedWhenExistingUser() throws Exception {
         createAMailboxWithAMail(MESSAGE_CONTENT);
 
-        assertThat(testee.export(BOB).block())
+        assertThat(testee.export(progress, BOB).block())
             .isEqualTo(Task.Result.COMPLETED);
     }
 
@@ -116,7 +120,7 @@ class ExportServiceTest {
 
     @Test
     void exportUserMailboxesDataShouldProduceAnEmptyZipWhenUserDoesNotExist() throws Exception {
-        testee.export(UNKNOWN_USER).block();
+        testee.export(progress, UNKNOWN_USER).block();
 
         ZipAssert.assertThatZip(new FileInputStream(getFileUrl()))
             .hasNoEntry();
@@ -124,7 +128,7 @@ class ExportServiceTest {
 
     @Test
     void exportUserMailboxesDataShouldProduceAnEmptyZipWhenExistingUserWithoutAnyMailboxes() throws Exception {
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         ZipAssert.assertThatZip(new FileInputStream(getFileUrl()))
             .hasNoEntry();
@@ -134,7 +138,7 @@ class ExportServiceTest {
     void exportUserMailboxesDataShouldProduceAZipWithEntry() throws Exception {
         ComposedMessageId id = createAMailboxWithAMail(MESSAGE_CONTENT);
 
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         ZipAssert.assertThatZip(new FileInputStream(getFileUrl()))
             .containsOnlyEntriesMatching(
@@ -146,7 +150,7 @@ class ExportServiceTest {
     void exportUserMailboxesDataShouldProduceAFileWithExpectedExtension() throws Exception {
         createAMailboxWithAMail(MESSAGE_CONTENT);
 
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         assertThat(Files.getFileExtension(getFileUrl())).isEqualTo(FileExtension.ZIP.getExtension());
     }
@@ -155,7 +159,7 @@ class ExportServiceTest {
     void exportUserMailboxesDataShouldProduceAFileWithExpectedName() throws Exception {
         createAMailboxWithAMail(MESSAGE_CONTENT);
 
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         File file = new File(getFileUrl());
 
@@ -166,7 +170,7 @@ class ExportServiceTest {
     void exportUserMailboxesWithSizableDataShouldProduceAFile() throws Exception {
         ComposedMessageId id = createAMailboxWithAMail(TWELVE_MEGABYTES_STRING);
 
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         ZipAssert.assertThatZip(new FileInputStream(getFileUrl()))
             .containsOnlyEntriesMatching(
@@ -178,7 +182,7 @@ class ExportServiceTest {
     void exportUserMailboxesDataShouldDeleteBlobAfterCompletion() throws Exception {
         createAMailboxWithAMail(MESSAGE_CONTENT);
 
-        testee.export(BOB).block();
+        testee.export(progress, BOB).block();
 
         String fileName = Files.getNameWithoutExtension(getFileUrl());
         String blobId = fileName.substring(fileName.lastIndexOf("-") + 1);
@@ -199,7 +203,7 @@ class ExportServiceTest {
             .when(testSystem.blobStore)
             .delete(any(), any());
 
-        Task.Result result = testee.export(BOB).block();
+        Task.Result result = testee.export(progress, BOB).block();
 
         String fileName = Files.getNameWithoutExtension(getFileUrl());
         String blobId = fileName.substring(fileName.lastIndexOf("-") + 1);
@@ -208,4 +212,29 @@ class ExportServiceTest {
 
         assertThat(result).isEqualTo(Task.Result.COMPLETED);
     }
+
+    @Test
+    void exportUserMailboxesDataShouldUpdateProgressWhenZipping() throws IOException {
+        testee.zipMailboxesContent(progress, BOB);
+
+        assertThat(progress.getStage()).isEqualTo(ExportService.Stage.ZIPPING);
+    }
+
+    @Test
+    void exportUserMailboxesDataShouldUpdateProgressWhenExporting() {
+        doReturn(Mono.error(new RuntimeException()))
+            .when(testSystem.blobStore)
+            .save(any(), any(InputStream.class), any());
+
+        testee.export(progress, BOB, new ByteArrayInputStream(MESSAGE_CONTENT.getBytes())).block();
+
+        assertThat(progress.getStage()).isEqualTo(ExportService.Stage.EXPORTING);
+    }
+
+    @Test
+    void exportUserMailboxesDataShouldUpdateProgressWhenComplete() {
+        testee.export(progress, BOB).block();
+
+        assertThat(progress.getStage()).isEqualTo(ExportService.Stage.COMPLETED);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
index 6887eba..949bd4a 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
@@ -221,6 +221,7 @@ class MailboxesExportRequestToTaskTest {
             .body("taskId", is(taskId))
             .body("type", is("MailboxesExportTask"))
             .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.stage", is(ExportService.Stage.COMPLETED.toString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -258,6 +259,7 @@ class MailboxesExportRequestToTaskTest {
             .body("taskId", is(taskId))
             .body("type", is("MailboxesExportTask"))
             .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.stage", is(ExportService.Stage.COMPLETED.toString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -333,6 +335,7 @@ class MailboxesExportRequestToTaskTest {
             .body("taskId", is(taskId))
             .body("type", is("MailboxesExportTask"))
             .body("additionalInformation.username", is(BOB.asString()))
+            .body("additionalInformation.stage", is(ExportService.Stage.COMPLETED.toString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTOTest.java
index 7102633..711219e 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTOTest.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.Test;
 class MailboxesExportTaskAdditionalInformationDTOTest {
     private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final MailboxesExportTask.AdditionalInformation DOMAIN_OBJECT = new MailboxesExportTask.AdditionalInformation(
-        Username.of("bob"), INSTANT);
+        Username.of("bob"), ExportService.Stage.STARTING, INSTANT);
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.additionalInformation.json b/server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.additionalInformation.json
index 181a96c..ac16f5c 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.additionalInformation.json
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.additionalInformation.json
@@ -1,5 +1,6 @@
 {
   "type":"MailboxesExportTask",
   "timestamp":"2007-12-03T10:15:30Z",
-  "username": "bob"
+  "username": "bob",
+  "stage": "STARTING"
 }
\ No newline at end of file


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


[james-project] 01/08: JAMES-2302:SMTP configuration documentation refers to servername which does not exist anymore

Posted by bt...@apache.org.
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

commit 2beeaf00704fc915e3c0505c7d58839c64e468d3
Author: Daniel Dias <da...@gmail.com>
AuthorDate: Sat Nov 10 04:51:51 2018 -0200

    JAMES-2302:SMTP configuration documentation refers to servername which does not exist anymore
---
 src/site/xdoc/server/config-smtp-lmtp.xml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/site/xdoc/server/config-smtp-lmtp.xml b/src/site/xdoc/server/config-smtp-lmtp.xml
index 97f1471..f746960 100644
--- a/src/site/xdoc/server/config-smtp-lmtp.xml
+++ b/src/site/xdoc/server/config-smtp-lmtp.xml
@@ -152,8 +152,7 @@
       
         <li>As mentioned above, SMTP AUTH requires that Apache James Server be able to distinguish between mail intended 
             for local delivery and mail intended for remote delivery.  Apache James Server makes this determination by matching the 
-            domain to which the mail was sent against the &lt;servernames&gt; element of the Apache James Server configuration block.  Any 
-            local domains should be explicitly listed as &lt;servername&gt; elements in this section.</li>
+            domain to which the mail was sent against the &lt;DomainList&gt; component, configured by <a href="/server/config-domainlist.html">Domain List Configuration</a>.</li>
 <!-- 
 Correct this.
       <li>Apache James Server is configured out of the box so as to not serve as an open relay for spammers.  This is done 


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


[james-project] 07/08: [Refactoring] remove useless String operations

Posted by bt...@apache.org.
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

commit bb5f0e7f47dc63d1b817cf09a333b5569d5c8d2b
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Mar 25 12:12:13 2020 +0100

    [Refactoring] remove useless String operations
---
 .../java/org/apache/james/mailbox/maildir/MaildirFolder.java   | 10 +++++-----
 .../org/apache/james/mailbox/maildir/MaildirMessageName.java   |  2 +-
 .../main/java/org/apache/mailet/base/FlowedMessageUtils.java   |  2 +-
 .../java/org/apache/james/transport/mailets/AbstractSign.java  |  2 +-
 .../james/transport/matcher/IsX509CertificateSubject.java      |  2 +-
 .../java/org/apache/james/transport/mailets/AddFooter.java     |  4 ++--
 .../apache/james/imap/processor/AbstractMailboxProcessor.java  |  2 +-
 .../test/java/org/apache/james/blob/api/BlobStoreContract.java |  2 +-
 .../src/main/java/org/apache/james/rrt/lib/MappingSource.java  |  2 +-
 9 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index 6475c3e..e4f56bb 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -541,7 +541,7 @@ public class MaildirFolder {
                         }
 
                         MessageUid uid = MessageUid.of(Long.parseLong(line.substring(0, gap)));
-                        String name = line.substring(gap + 1, line.length());
+                        String name = line.substring(gap + 1);
                         for (String recentFile : recentFiles) {
                             if (recentFile.equals(name)) {
                                 recentMessages.put(uid, newMaildirMessageName(MaildirFolder.this, recentFile));
@@ -615,7 +615,7 @@ public class MaildirFolder {
                         throw new MailboxException("Corrupted entry in uid-file " + uidList + " line " + lineNumber);
                     }
                     MessageUid uid = MessageUid.of(Long.parseLong(line.substring(0, gap)));
-                    String name = line.substring(gap + 1, line.length());
+                    String name = line.substring(gap + 1);
                     reverseUidMap.put(stripMetaFromName(name), uid);
                 }
             }
@@ -670,7 +670,7 @@ public class MaildirFolder {
                         if (to != null && uid.compareTo(to) > 0) {
                             break;
                         }
-                        String name = line.substring(gap + 1, line.length());
+                        String name = line.substring(gap + 1);
                         uidMap.put(uid, newMaildirMessageName(MaildirFolder.this, name));
                     }
                 }
@@ -724,7 +724,7 @@ public class MaildirFolder {
         }
         int gap2 = line.indexOf(" ", gap1 + 1);
         lastUid = Optional.of(MessageUid.of(Long.parseLong(line.substring(gap1 + 1, gap2))));
-        messageCount = Integer.parseInt(line.substring(gap2 + 1, line.length()));
+        messageCount = Integer.parseInt(line.substring(gap2 + 1));
     }
     
     /**
@@ -884,7 +884,7 @@ public class MaildirFolder {
                     }
 
                     if (uid.equals(MessageUid.of(Long.parseLong(line.substring(0, line.indexOf(" ")))))) {
-                        deletedMessage = newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1, line.length()));
+                        deletedMessage = newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1));
                         messageCount--;
                     } else {
                         lines.add(line);
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java
index 313edf9..37c38e5 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageName.java
@@ -249,7 +249,7 @@ public class MaildirMessageName {
         int secondEnd = fullName.indexOf('.', firstEnd + 1);
         timestamp = fullName.substring(0, firstEnd);
         uniqueString = fullName.substring(firstEnd + 1, secondEnd);
-        hostnameAndMeta = fullName.substring(secondEnd + 1, fullName.length());
+        hostnameAndMeta = fullName.substring(secondEnd + 1);
     }
     
     /**
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/FlowedMessageUtils.java b/mailet/base/src/main/java/org/apache/mailet/base/FlowedMessageUtils.java
index 85327c1..4568908 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/FlowedMessageUtils.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/FlowedMessageUtils.java
@@ -251,7 +251,7 @@ public final class FlowedMessageUtils {
                     }
                 }
                 
-                result.append(line.substring(0, j + 1));
+                result.append(line, 0, j + 1);
                 if (j < line.length() - 1) { 
                     if (delSp) {
                         result.append(RFC2646_SPACE);
diff --git a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
index 99f60c8..6de0ef5 100644
--- a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
+++ b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
@@ -713,7 +713,7 @@ public abstract class AbstractSign extends GenericMailet {
             int fromIndex = 0;
             int index;
             while ((index = template.indexOf(pattern, fromIndex)) >= 0) {
-                sb.append(template.substring(fromIndex, index));
+                sb.append(template, fromIndex, index);
                 sb.append(actual);
                 fromIndex = index + pattern.length();
             }
diff --git a/mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsX509CertificateSubject.java b/mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsX509CertificateSubject.java
index cfebc6c..2bf5823 100644
--- a/mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsX509CertificateSubject.java
+++ b/mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsX509CertificateSubject.java
@@ -63,7 +63,7 @@ public class IsX509CertificateSubject extends GenericMatcher {
         
         int pos = condition.indexOf(";");
         sourceAttribute = AttributeName.of(condition.substring(0,pos).trim());
-        check = condition.substring(pos + 1, condition.length());
+        check = condition.substring(pos + 1);
     }
     
     @Override
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/AddFooter.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/AddFooter.java
index 44ef5c7..9ce6c45 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/AddFooter.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/AddFooter.java
@@ -147,9 +147,9 @@ public class AddFooter extends GenericMailet {
         }
         int insertionIndex = matcher.start(matcher.groupCount() - 1);
         return new StringBuilder()
-                .append(content.substring(0, insertionIndex))
+                .append(content, 0, insertionIndex)
                 .append(getFooterHTML())
-                .append(content.substring(insertionIndex, content.length()))
+                .append(content.substring(insertionIndex))
                 .toString();
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 12c7733..f094609 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -360,7 +360,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
      * Joins the elements of a mailboxPath together and returns them as a string
      */
     private String joinMailboxPath(MailboxPath mailboxPath, char delimiter) {
-        StringBuilder sb = new StringBuilder("");
+        StringBuilder sb = new StringBuilder();
         if (mailboxPath.getNamespace() != null && !mailboxPath.getNamespace().equals("")) {
             sb.append(mailboxPath.getNamespace());
         }
diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java
index c01e480..dc49969 100644
--- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java
+++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java
@@ -107,7 +107,7 @@ public interface BlobStoreContract extends DeleteBlobStoreContract, BucketBlobSt
         BlobStore store = testee();
         BucketName defaultBucketName = store.getDefaultBucketName();
 
-        BlobId blobId = Mono.from(store.save(defaultBucketName, new String(), storagePolicy)).block();
+        BlobId blobId = Mono.from(store.save(defaultBucketName, "", storagePolicy)).block();
 
         byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block();
 
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
index 8bf6cd4..c512248 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
@@ -78,7 +78,7 @@ public class MappingSource implements Serializable {
                 return wildCard();
             default:
                 if (mappingSource.startsWith(WILDCARD + "@")) {
-                    return fromDomain(Domain.of(mappingSource.substring(2, mappingSource.length())));
+                    return fromDomain(Domain.of(mappingSource.substring(2)));
                 }
                 return fromUser(Username.of(mappingSource));
         }


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


[james-project] 05/08: [Refactoring] avoid creating Arrays to call varargs methods

Posted by bt...@apache.org.
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

commit cc4467afef5ca0fa481bf3397712a0aecb6a3bfe
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Mar 25 12:07:01 2020 +0100

    [Refactoring] avoid creating Arrays to call varargs methods
---
 .../main/java/org/apache/james/transport/mailets/AbstractSign.java  | 2 +-
 .../org/apache/james/imap/api/message/response/StatusResponse.java  | 6 +++---
 .../org/apache/james/protocols/smtp/AbstractSMTPServerTest.java     | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
index e19cc89..99f60c8 100644
--- a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
+++ b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
@@ -259,7 +259,7 @@ public abstract class AbstractSign extends GenericMailet {
     protected void initKeyHolder() throws Exception {
         Constructor<?> keyHolderConstructor;
         try {
-            keyHolderConstructor = keyHolderClass.getConstructor(new Class[] {String.class, String.class, String.class, String.class, String.class});
+            keyHolderConstructor = keyHolderClass.getConstructor(String.class, String.class, String.class, String.class, String.class);
         } catch (NoSuchMethodException nsme) {
             throw new MessagingException("The needed constructor does not exist: "
                     + keyHolderClass + "(String, String, String, String, String)");
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
index 71eaf13..39ecc29 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
@@ -161,21 +161,21 @@ public interface StatusResponse extends ImapResponseMessage {
             String source = formatRanges(sourceRanges);
             String target = formatRanges(targetRanges);
 
-            return new ResponseCode("COPYUID", Arrays.asList(new String[] { source, target }), uidValidity.asLong(), false);
+            return new ResponseCode("COPYUID", Arrays.asList(source, target), uidValidity.asLong(), false);
         }
 
         /** RFC4551 <code>Conditional STORE</code> response code */
         public static ResponseCode condStore(IdRange[] failedRanges) {
             String failed = formatRanges(failedRanges);
 
-            return new ResponseCode("MODIFIED", Arrays.asList(new String[] { failed}), 0, false);
+            return new ResponseCode("MODIFIED", Arrays.asList(failed), 0, false);
         }
         
         /** RFC4551 <code>Conditional STORE</code> response code */
         public static ResponseCode condStore(UidRange[] failedRanges) {
             String failed = formatRanges(failedRanges);
 
-            return new ResponseCode("MODIFIED", Arrays.asList(new String[] { failed}), 0, false);
+            return new ResponseCode("MODIFIED", Arrays.asList(failed), 0, false);
         }
         
         private static String formatRanges(IdRange[] ranges) {
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
index 19d084f..97203ec 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
@@ -731,7 +731,7 @@ public abstract class AbstractSMTPServerTest {
     public void testNullSender() throws Exception {
         ProtocolServer server = null;
         try {
-            server = createServer(createProtocol(new ProtocolHandler[0]));
+            server = createServer(createProtocol());
             server.bind();
             
             SMTPClient client = createClient();


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


[james-project] 06/08: [Refactoring] simplify Collections operator where possible

Posted by bt...@apache.org.
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

commit 55b4e8caab47e72c857c655850c4e4038201ce4d
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Mar 25 12:08:32 2020 +0100

    [Refactoring] simplify Collections operator where possible
---
 .../james/mailbox/elasticsearch/search/ElasticSearchSearcher.java | 2 +-
 .../java/org/apache/james/mailbox/store/LazyMimeDescriptor.java   | 2 +-
 .../main/java/org/apache/james/blob/mail/MimeMessagePartsId.java  | 4 ++--
 .../java/org/apache/james/smtpserver/fastfail/URIScanner.java     | 8 ++------
 4 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index dc84cf9..85cceb1 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -140,7 +140,7 @@ public class ElasticSearchSearcher {
     }
 
     private Optional<DocumentField> retrieveMessageIdField(SearchHit hit) {
-        if (hit.getFields().keySet().contains(JsonMessageConstants.MESSAGE_ID)) {
+        if (hit.getFields().containsKey(JsonMessageConstants.MESSAGE_ID)) {
             return Optional.ofNullable(hit.field(JsonMessageConstants.MESSAGE_ID));
         }
         return Optional.empty();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/LazyMimeDescriptor.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/LazyMimeDescriptor.java
index aad4f90..f4fc8c4 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/LazyMimeDescriptor.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/LazyMimeDescriptor.java
@@ -136,7 +136,7 @@ public class LazyMimeDescriptor implements MimeDescriptor {
 
     @Override
     public Iterator<MimeDescriptor> parts() {
-        return Collections.<MimeDescriptor>emptyList().iterator();
+        return Collections.emptyIterator();
     }
 
     @Override
diff --git a/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessagePartsId.java b/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessagePartsId.java
index 5981be8..936efe5 100644
--- a/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessagePartsId.java
+++ b/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessagePartsId.java
@@ -64,8 +64,8 @@ public class MimeMessagePartsId implements BlobPartsId {
     public static class Factory implements BlobPartsId.Factory<MimeMessagePartsId> {
         @Override
         public MimeMessagePartsId generate(Map<BlobType, BlobId> map) {
-            Preconditions.checkArgument(map.keySet().contains(HEADER_BLOB_TYPE), "Expecting 'mailHeader' blobId to be specified");
-            Preconditions.checkArgument(map.keySet().contains(BODY_BLOB_TYPE), "Expecting 'mailBody' blobId to be specified");
+            Preconditions.checkArgument(map.containsKey(HEADER_BLOB_TYPE), "Expecting 'mailHeader' blobId to be specified");
+            Preconditions.checkArgument(map.containsKey(BODY_BLOB_TYPE), "Expecting 'mailBody' blobId to be specified");
             Preconditions.checkArgument(map.size() == 2, "blobId other than 'mailHeader' or 'mailBody' are not supported");
 
             return builder()
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIScanner.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIScanner.java
index e0464b5..e4b9c5e 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIScanner.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIScanner.java
@@ -241,9 +241,7 @@ public class URIScanner {
             String host = hostFromUriStr(found);
             if (null != host) {
                 host = host.toLowerCase(Locale.US);
-                if (!set.contains(host)) {
-                    set.add(host);
-                }
+                set.add(host);
             }
         }
 
@@ -259,9 +257,7 @@ public class URIScanner {
             if (null != host) {
 
                 host = host.toLowerCase(Locale.US);
-                if (!set.contains(host)) {
-                    set.add(host);
-                }
+                set.add(host);
             }
         }
         return set;


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


[james-project] 04/08: [Refactoring] avoid manual implementation of Math.min

Posted by bt...@apache.org.
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

commit 7255a1a82e53d04e6fe4407c3d3c275d8f1a9c2e
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Mar 25 12:05:41 2020 +0100

    [Refactoring] avoid manual implementation of Math.min
---
 .../src/main/java/org/apache/james/mailbox/model/MessageRange.java  | 6 +-----
 .../org/apache/james/sieverepository/file/SieveFileRepository.java  | 2 +-
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageRange.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageRange.java
index 18b0eb3..f0d0835 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageRange.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageRange.java
@@ -249,11 +249,7 @@ public class MessageRange implements Iterable<MessageUid> {
             long to = getUidTo().asLong();
             long realTo = to;
             while (from <= realTo) {
-                if (from + maxItems - 1 < realTo) {
-                    to = from + maxItems - 1;
-                } else {
-                    to = realTo;
-                }
+                to = Math.min(from + maxItems - 1, realTo);
                 if (from == to) {
                     ranges.add(MessageUid.of(from).toRange());
                 } else {
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index 7c67504..b774270 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -93,7 +93,7 @@ public class SieveFileRepository implements SieveRepository {
 
     protected static void toFile(File file, String content) throws StorageException {
         // Create a temporary file
-        int bufferSize = content.length() > MAX_BUFF_SIZE ? MAX_BUFF_SIZE : content.length();
+        int bufferSize = Math.min(content.length(), MAX_BUFF_SIZE);
         File tmpFile = null;
 
         try {


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


[james-project] 03/08: [Refactoring] instanceof is always false for null, remove duplicate checks

Posted by bt...@apache.org.
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

commit 0aa76bb21c5a168411f7eb91d67ef9bd4f83c05a
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Mar 25 12:04:02 2020 +0100

    [Refactoring] instanceof is always false for null, remove duplicate checks
---
 mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java    | 2 +-
 .../main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java  | 2 +-
 .../java/org/apache/james/imap/decode/parser/UidCommandParser.java     | 2 +-
 .../main/java/org/apache/james/util/mime/MessageContentExtractor.java  | 2 +-
 .../src/main/java/org/apache/james/jmap/api/access/AccessToken.java    | 3 +--
 .../james/dnsservice/library/inetnetwork/model/Inet4Network.java       | 2 +-
 .../james/dnsservice/library/inetnetwork/model/Inet6Network.java       | 2 +-
 .../org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java    | 2 +-
 8 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
index 0a2c75c..5d1ed44 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
@@ -137,7 +137,7 @@ public class Quota<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>
 
     @Override
     public boolean equals(Object o) {
-        if (o == null || ! (o instanceof  Quota)) {
+        if (!(o instanceof Quota)) {
             return false;
         }
         Quota<?, ?> other = (Quota<?, ?>) o;
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index 1601631..777edf3 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -78,7 +78,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
             }
             if (e instanceof RollbackException) {
                 Throwable t = e.getCause();
-                if (t != null && t instanceof EntityExistsException) {
+                if (t instanceof EntityExistsException) {
                     throw new MailboxExistsException(lastMailboxName);
                 }
             }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
index abfb501..fda9287 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
@@ -55,7 +55,7 @@ public class UidCommandParser extends AbstractImapCommandParser {
         String commandName = request.atom();
         ImapCommandParser helperCommand = parserFactory.getParser(commandName);
         // TODO: replace abstract class with interface
-        if (helperCommand == null || !(helperCommand instanceof AbstractUidCommandParser)) {
+        if (!(helperCommand instanceof AbstractUidCommandParser)) {
             throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid UID command: '" + commandName + "'");
         }
         LOGGER.debug("Got <command>: UID {}", commandName);
diff --git a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
index 32b436a..454d3d0 100644
--- a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
+++ b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
@@ -231,7 +231,7 @@ public class MessageContentExtractor {
 
         @Override
         public boolean equals(Object other) {
-            if (other == null || !(other instanceof MessageContent)) {
+            if (!(other instanceof MessageContent)) {
                 return false;
             }
             MessageContent otherMessageContent = (MessageContent)other;
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessToken.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessToken.java
index 6021bc1..aeb699b 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessToken.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessToken.java
@@ -54,8 +54,7 @@ public class AccessToken {
 
     @Override
     public boolean equals(Object o) {
-        return o != null
-            && o instanceof AccessToken
+        return o instanceof AccessToken
             && Objects.equals(this.token, ((AccessToken)o).token);
     }
 
diff --git a/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet4Network.java b/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet4Network.java
index 857aa37..72a0f35 100644
--- a/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet4Network.java
+++ b/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet4Network.java
@@ -75,7 +75,7 @@ public class Inet4Network implements InetNetwork {
 
     @Override
     public boolean equals(Object obj) {
-        return (obj != null) && (obj instanceof InetNetwork) && ((((Inet4Network) obj).network.equals(network)) && (((Inet4Network) obj).netmask.equals(netmask)));
+        return (obj instanceof InetNetwork) && ((((Inet4Network) obj).network.equals(network)) && (((Inet4Network) obj).netmask.equals(netmask)));
     }
 
     private static InetAddress maskIP(InetAddress ip, InetAddress mask) {
diff --git a/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet6Network.java b/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet6Network.java
index c046a67..addc3db 100644
--- a/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet6Network.java
+++ b/server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet6Network.java
@@ -73,7 +73,7 @@ public class Inet6Network implements InetNetwork {
 
     @Override
     public boolean equals(Object obj) {
-        return (obj != null) && (obj instanceof InetNetwork) && ((((Inet6Network) obj).network.equals(network)) && (((Inet6Network) obj).netmask.equals(netmask)));
+        return (obj instanceof InetNetwork) && ((((Inet6Network) obj).network.equals(network)) && (((Inet6Network) obj).netmask.equals(netmask)));
     }
 
     private static InetAddress maskIP(InetAddress ip, Integer mask) {
diff --git a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
index 5d7bf03..2a5e58a 100644
--- a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
+++ b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
@@ -207,7 +207,7 @@ public class ActiveMQCacheableMailQueue extends JMSCacheableMailQueue implements
                 super.produceMail(props, msgPrio, mail);
             }
         } catch (JMSException e) {
-            if (!reuse && blobMessage != null && blobMessage instanceof ActiveMQBlobMessage) {
+            if (!reuse && blobMessage instanceof ActiveMQBlobMessage) {
                 ((ActiveMQBlobMessage) blobMessage).deleteFile();
             }
             throw e;


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


[james-project] 02/08: [Performance] Rely on reactor for Cassandra max quota definition

Posted by bt...@apache.org.
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

commit 0f513dd32611a815b332227ba6521f1d2a4f8247
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Apr 1 17:03:39 2020 +0700

    [Performance] Rely on reactor for Cassandra max quota definition
---
 .../quota/CassandraGlobalMaxQuotaDao.java          | 52 +++++++--------
 .../quota/CassandraPerDomainMaxQuotaDao.java       | 49 ++++++--------
 .../quota/CassandraPerUserMaxQuotaDao.java         | 49 ++++++--------
 .../quota/CassandraPerUserMaxQuotaManager.java     | 76 ++++++++++++----------
 4 files changed, 108 insertions(+), 118 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
index fba2c52..74fd9bf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
@@ -25,24 +25,24 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 
-import java.util.Optional;
-
 import javax.inject.Inject;
 
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.core.quota.QuotaCountLimit;
 import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
 
 import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.querybuilder.Delete;
 import com.datastax.driver.core.querybuilder.Insert;
 import com.datastax.driver.core.querybuilder.Select;
 
+import reactor.core.publisher.Mono;
+
 public class CassandraGlobalMaxQuotaDao {
 
-    private final Session session;
+    private final CassandraAsyncExecutor queryExecutor;
     private final PreparedStatement setGlobalMaxStorageStatement;
     private final PreparedStatement setGlobalMaxMessageStatement;
     private final PreparedStatement getGlobalMaxStatement;
@@ -50,7 +50,7 @@ public class CassandraGlobalMaxQuotaDao {
 
     @Inject
     public CassandraGlobalMaxQuotaDao(Session session) {
-        this.session = session;
+        this.queryExecutor = new CassandraAsyncExecutor(session);
         this.getGlobalMaxStatement = session.prepare(getGlobalMaxStatement());
         this.setGlobalMaxMessageStatement = session.prepare(setGlobalMaxMessageStatement());
         this.setGlobalMaxStorageStatement = session.prepare(setGlobalMaxStorageStatement());
@@ -81,39 +81,33 @@ public class CassandraGlobalMaxQuotaDao {
             .where(eq(CassandraGlobalMaxQuota.TYPE, bindMarker(CassandraGlobalMaxQuota.TYPE)));
     }
 
-    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
-        session.execute(setGlobalMaxStorageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxStorage)));
+    Mono<Void> setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
+        return queryExecutor.executeVoid(setGlobalMaxStorageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxStorage)));
     }
 
-    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
-        session.execute(setGlobalMaxMessageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxMessageCount)));
+    Mono<Void> setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
+        return queryExecutor.executeVoid(setGlobalMaxMessageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxMessageCount)));
     }
 
-    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
-        ResultSet resultSet = session.execute(getGlobalMaxStatement.bind()
-            .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.STORAGE));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxStorage = resultSet.one().get(CassandraGlobalMaxQuota.VALUE, Long.class);
-        return QuotaCodec.longToQuotaSize(maxStorage);
+    Mono<QuotaSizeLimit> getGlobalMaxStorage() {
+        return queryExecutor.executeSingleRow(getGlobalMaxStatement.bind()
+                .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.STORAGE))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraGlobalMaxQuota.VALUE, Long.class)))
+            .flatMap(maxStorage -> Mono.justOrEmpty(QuotaCodec.longToQuotaSize(maxStorage)));
     }
 
-    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
-        ResultSet resultSet = session.execute(getGlobalMaxStatement.bind()
-            .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.MESSAGE));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxMessages = resultSet.one().get(CassandraGlobalMaxQuota.VALUE, Long.class);
-        return QuotaCodec.longToQuotaCount(maxMessages);
+    Mono<QuotaCountLimit> getGlobalMaxMessage() {
+        return queryExecutor.executeSingleRow(getGlobalMaxStatement.bind()
+            .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.MESSAGE))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraGlobalMaxQuota.VALUE, Long.class)))
+            .flatMap(maxMessages -> Mono.justOrEmpty(QuotaCodec.longToQuotaCount(maxMessages)));
     }
 
-    public void removeGlobaltMaxStorage() {
-        session.execute(removeGlobalMaxQuotaStatement.bind(CassandraGlobalMaxQuota.STORAGE));
+    Mono<Void> removeGlobaltMaxStorage() {
+        return queryExecutor.executeVoid(removeGlobalMaxQuotaStatement.bind(CassandraGlobalMaxQuota.STORAGE));
     }
 
-    public void removeGlobalMaxMessage() {
-        session.execute(removeGlobalMaxQuotaStatement.bind(CassandraGlobalMaxQuota.MESSAGE));
+    Mono<Void> removeGlobalMaxMessage() {
+        return queryExecutor.executeVoid(removeGlobalMaxQuotaStatement.bind(CassandraGlobalMaxQuota.MESSAGE));
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
index cccbdc2..cb49d3a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
@@ -25,25 +25,25 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 
-import java.util.Optional;
-
 import javax.inject.Inject;
 
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.core.Domain;
 import org.apache.james.core.quota.QuotaCountLimit;
 import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
 
 import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.querybuilder.Delete;
 import com.datastax.driver.core.querybuilder.Insert;
 import com.datastax.driver.core.querybuilder.Select;
 
+import reactor.core.publisher.Mono;
+
 public class CassandraPerDomainMaxQuotaDao {
 
-    private final Session session;
+    private final CassandraAsyncExecutor queryExecutor;
     private final PreparedStatement setMaxStorageStatement;
     private final PreparedStatement setMaxMessageStatement;
     private final PreparedStatement getMaxStorageStatement;
@@ -53,7 +53,7 @@ public class CassandraPerDomainMaxQuotaDao {
 
     @Inject
     public CassandraPerDomainMaxQuotaDao(Session session) {
-        this.session = session;
+        this.queryExecutor = new CassandraAsyncExecutor(session);
         this.setMaxStorageStatement = session.prepare(setMaxStorageStatement());
         this.setMaxMessageStatement = session.prepare(setMaxMessageStatement());
         this.getMaxStorageStatement = session.prepare(getMaxStorageStatement());
@@ -98,38 +98,31 @@ public class CassandraPerDomainMaxQuotaDao {
             .value(CassandraDomainMaxQuota.STORAGE, bindMarker());
     }
 
-    public void setMaxStorage(Domain domain, QuotaSizeLimit maxStorageQuota) {
-        session.execute(setMaxStorageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
+    Mono<Void> setMaxStorage(Domain domain, QuotaSizeLimit maxStorageQuota) {
+        return queryExecutor.executeVoid(setMaxStorageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
     }
 
-    public void setMaxMessage(Domain domain, QuotaCountLimit maxMessageCount) {
-        session.execute(setMaxMessageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxMessageCount)));
+    Mono<Void> setMaxMessage(Domain domain, QuotaCountLimit maxMessageCount) {
+        return queryExecutor.executeVoid(setMaxMessageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxMessageCount)));
     }
 
-    public Optional<QuotaSizeLimit> getMaxStorage(Domain domain) {
-        ResultSet resultSet = session.execute(getMaxStorageStatement.bind(domain.asString()));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxStorage = resultSet.one().get(CassandraDomainMaxQuota.STORAGE, Long.class);
-        return QuotaCodec.longToQuotaSize(maxStorage);
+    Mono<QuotaSizeLimit> getMaxStorage(Domain domain) {
+        return queryExecutor.executeSingleRow(getMaxStorageStatement.bind(domain.asString()))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraDomainMaxQuota.STORAGE, Long.class)))
+            .flatMap(maxStorage -> Mono.justOrEmpty(QuotaCodec.longToQuotaSize(maxStorage)));
     }
 
-    public Optional<QuotaCountLimit> getMaxMessage(Domain domain) {
-        ResultSet resultSet = session.execute(getMaxMessageStatement.bind(domain.asString()));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxMessages = resultSet.one().get(CassandraDomainMaxQuota.MESSAGE_COUNT, Long.class);
-        return QuotaCodec.longToQuotaCount(maxMessages);
+    Mono<QuotaCountLimit> getMaxMessage(Domain domain) {
+        return queryExecutor.executeSingleRow(getMaxMessageStatement.bind(domain.asString()))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraDomainMaxQuota.MESSAGE_COUNT, Long.class)))
+            .flatMap(maxMessages -> Mono.justOrEmpty(QuotaCodec.longToQuotaCount(maxMessages)));
     }
 
-    public void removeMaxMessage(Domain domain) {
-        session.execute(removeMaxMessageStatement.bind(domain.asString()));
+    Mono<Void> removeMaxMessage(Domain domain) {
+        return queryExecutor.executeVoid(removeMaxMessageStatement.bind(domain.asString()));
     }
 
-    public void removeMaxStorage(Domain domain) {
-        session.execute(removeMaxStorageStatement.bind(domain.asString()));
+    Mono<Void> removeMaxStorage(Domain domain) {
+        return queryExecutor.executeVoid(removeMaxStorageStatement.bind(domain.asString()));
     }
-
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
index 52beb42..cff560d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
@@ -25,25 +25,25 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 
-import java.util.Optional;
-
 import javax.inject.Inject;
 
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.core.quota.QuotaCountLimit;
 import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
 import org.apache.james.mailbox.model.QuotaRoot;
 
 import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.querybuilder.Delete;
 import com.datastax.driver.core.querybuilder.Insert;
 import com.datastax.driver.core.querybuilder.Select;
 
+import reactor.core.publisher.Mono;
+
 public class CassandraPerUserMaxQuotaDao {
 
-    private final Session session;
+    private final CassandraAsyncExecutor queryExecutor;
     private final PreparedStatement setMaxStorageStatement;
     private final PreparedStatement setMaxMessageStatement;
     private final PreparedStatement getMaxStorageStatement;
@@ -53,7 +53,7 @@ public class CassandraPerUserMaxQuotaDao {
 
     @Inject
     public CassandraPerUserMaxQuotaDao(Session session) {
-        this.session = session;
+        this.queryExecutor = new CassandraAsyncExecutor(session);
         this.setMaxStorageStatement = session.prepare(setMaxStorageStatement());
         this.setMaxMessageStatement = session.prepare(setMaxMessageStatement());
         this.getMaxStorageStatement = session.prepare(getMaxStorageStatement());
@@ -98,38 +98,31 @@ public class CassandraPerUserMaxQuotaDao {
             .value(CassandraMaxQuota.STORAGE, bindMarker());
     }
 
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
-        session.execute(setMaxStorageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
+    Mono<Void> setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
+        return queryExecutor.executeVoid(setMaxStorageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
     }
 
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
-        session.execute(setMaxMessageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxMessageCount)));
+    Mono<Void> setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
+        return queryExecutor.executeVoid(setMaxMessageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxMessageCount)));
     }
 
-    public Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
-        ResultSet resultSet = session.execute(getMaxStorageStatement.bind(quotaRoot.getValue()));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxStorage = resultSet.one().get(CassandraMaxQuota.STORAGE, Long.class);
-        return QuotaCodec.longToQuotaSize(maxStorage);
+    Mono<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
+        return queryExecutor.executeSingleRow(getMaxStorageStatement.bind(quotaRoot.getValue()))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraMaxQuota.STORAGE, Long.class)))
+            .flatMap(maxStorage -> Mono.justOrEmpty(QuotaCodec.longToQuotaSize(maxStorage)));
     }
 
-    public Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
-        ResultSet resultSet = session.execute(getMaxMessageStatement.bind(quotaRoot.getValue()));
-        if (resultSet.isExhausted()) {
-            return Optional.empty();
-        }
-        Long maxMessages = resultSet.one().get(CassandraMaxQuota.MESSAGE_COUNT, Long.class);
-        return QuotaCodec.longToQuotaCount(maxMessages);
+    Mono<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
+        return queryExecutor.executeSingleRow(getMaxMessageStatement.bind(quotaRoot.getValue()))
+            .flatMap(row -> Mono.justOrEmpty(row.get(CassandraMaxQuota.MESSAGE_COUNT, Long.class)))
+            .flatMap(maxMessages -> Mono.justOrEmpty(QuotaCodec.longToQuotaCount(maxMessages)));
     }
 
-    public void removeMaxMessage(QuotaRoot quotaRoot) {
-        session.execute(removeMaxMessageStatement.bind(quotaRoot.getValue()));
+    Mono<Void> removeMaxMessage(QuotaRoot quotaRoot) {
+        return queryExecutor.executeVoid(removeMaxMessageStatement.bind(quotaRoot.getValue()));
     }
 
-    public void removeMaxStorage(QuotaRoot quotaRoot) {
-        session.execute(removeMaxStorageStatement.bind(quotaRoot.getValue()));
+    Mono<Void> removeMaxStorage(QuotaRoot quotaRoot) {
+        return queryExecutor.executeVoid(removeMaxStorageStatement.bind(quotaRoot.getValue()));
     }
-
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
index 671e707..12d90c1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
@@ -21,8 +21,6 @@ package org.apache.james.mailbox.cassandra.quota;
 
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
@@ -34,9 +32,11 @@ import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 
-import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
 public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
 
     private final CassandraPerUserMaxQuotaDao perUserQuota;
@@ -54,103 +54,113 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
 
     @Override
     public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
-        perUserQuota.setMaxStorage(quotaRoot, maxStorageQuota);
+        perUserQuota.setMaxStorage(quotaRoot, maxStorageQuota).block();
     }
 
     @Override
     public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
-        perUserQuota.setMaxMessage(quotaRoot, maxMessageCount);
+        perUserQuota.setMaxMessage(quotaRoot, maxMessageCount).block();
     }
 
     @Override
     public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) {
-        perDomainQuota.setMaxMessage(domain, count);
+        perDomainQuota.setMaxMessage(domain, count).block();
     }
 
     @Override
     public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) {
-        perDomainQuota.setMaxStorage(domain, size);
+        perDomainQuota.setMaxStorage(domain, size).block();
     }
 
     @Override
     public void removeDomainMaxMessage(Domain domain) {
-        perDomainQuota.removeMaxMessage(domain);
+        perDomainQuota.removeMaxMessage(domain).block();
     }
 
     @Override
     public void removeDomainMaxStorage(Domain domain) {
-        perDomainQuota.removeMaxStorage(domain);
+        perDomainQuota.removeMaxStorage(domain).block();
     }
 
     @Override
     public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
-        return perDomainQuota.getMaxMessage(domain);
+        return perDomainQuota.getMaxMessage(domain).blockOptional();
     }
 
     @Override
     public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
-        return perDomainQuota.getMaxStorage(domain);
+        return perDomainQuota.getMaxStorage(domain).blockOptional();
     }
 
     @Override
     public void removeMaxMessage(QuotaRoot quotaRoot) {
-        perUserQuota.removeMaxMessage(quotaRoot);
+        perUserQuota.removeMaxMessage(quotaRoot).block();
     }
 
     @Override
     public void removeMaxStorage(QuotaRoot quotaRoot) {
-        perUserQuota.removeMaxStorage(quotaRoot);
+        perUserQuota.removeMaxStorage(quotaRoot).block();
     }
 
     @Override
     public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
-        globalQuota.setGlobalMaxStorage(globalMaxStorage);
+        globalQuota.setGlobalMaxStorage(globalMaxStorage).block();
     }
 
     @Override
     public void removeGlobalMaxStorage() {
-        globalQuota.removeGlobaltMaxStorage();
+        globalQuota.removeGlobaltMaxStorage().block();
     }
 
     @Override
     public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
-        globalQuota.setGlobalMaxMessage(globalMaxMessageCount);
+        globalQuota.setGlobalMaxMessage(globalMaxMessageCount).block();
     }
 
     @Override
     public void removeGlobalMaxMessage() {
-        globalQuota.removeGlobalMaxMessage();
+        globalQuota.removeGlobalMaxMessage().block();
     }
 
     @Override
     public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
-        return globalQuota.getGlobalMaxStorage();
+        return globalQuota.getGlobalMaxStorage().blockOptional();
     }
 
     @Override
     public Optional<QuotaCountLimit> getGlobalMaxMessage() {
-        return globalQuota.getGlobalMaxMessage();
+        return globalQuota.getGlobalMaxMessage().blockOptional();
     }
 
     @Override
     public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaCountLimit>> domainQuotaSupplier = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
-        return Stream.of(
-                Pair.of(Quota.Scope.User, perUserQuota.getMaxMessage(quotaRoot)),
-                Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaSupplier)),
-                Pair.of(Quota.Scope.Global, globalQuota.getGlobalMaxMessage()))
-            .filter(pair -> pair.getValue().isPresent())
-            .collect(Guavate.toImmutableMap(Pair::getKey, value -> value.getValue().get()));
+        return Flux.merge(
+                perUserQuota.getMaxMessage(quotaRoot)
+                    .map(limit -> Pair.of(Quota.Scope.User, limit)),
+                Mono.justOrEmpty(quotaRoot.getDomain())
+                    .flatMap(perDomainQuota::getMaxMessage)
+                    .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
+                globalQuota.getGlobalMaxMessage()
+                    .map(limit -> Pair.of(Quota.Scope.Global, limit)))
+            .collect(Guavate.toImmutableMap(
+                Pair::getKey,
+                Pair::getValue))
+            .block();
     }
 
     @Override
     public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaSizeLimit>> domainQuotaSupplier = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
-        return Stream.of(
-                Pair.of(Quota.Scope.User, perUserQuota.getMaxStorage(quotaRoot)),
-                Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaSupplier)),
-                Pair.of(Quota.Scope.Global, globalQuota.getGlobalMaxStorage()))
-            .filter(pair -> pair.getValue().isPresent())
-            .collect(Guavate.toImmutableMap(Pair::getKey, value -> value.getValue().get()));
+        return Flux.merge(
+                perUserQuota.getMaxStorage(quotaRoot)
+                    .map(limit -> Pair.of(Quota.Scope.User, limit)),
+                Mono.justOrEmpty(quotaRoot.getDomain())
+                    .flatMap(perDomainQuota::getMaxStorage)
+                    .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
+                globalQuota.getGlobalMaxStorage()
+                    .map(limit -> Pair.of(Quota.Scope.Global, limit)))
+            .collect(Guavate.toImmutableMap(
+                Pair::getKey,
+                Pair::getValue))
+            .block();
     }
 }


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