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 dd8983af0893d6cf51db23247141519165b081e0
Author: RĂ©mi Kowalski <rkowal...@linagora.com>
AuthorDate: Mon Sep 2 16:35:24 2019 +0200

    JAMES-2813 serialize MessageIdReindexingTask
---
 .../tools/indexer/MessageIdReIndexerImpl.java      | 15 ++---
 .../tools/indexer/MessageIdReIndexingTask.java     | 68 +++++++++-------------
 .../tools/indexer/MessageIdReindexingTaskDTO.java  | 60 +++++++++++++++++++
 .../mailbox/tools/indexer/ReIndexerPerformer.java  | 31 ++++++++++
 .../tools/indexer/MessageIdReIndexerImplTest.java  |  4 +-
 .../MessageIdReindexingTaskSerializationTest.java  | 68 ++++++++++++++++++++++
 .../webadmin/routes/ReindexingRoutesTest.java      | 11 ++--
 7 files changed, 198 insertions(+), 59 deletions(-)

diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
index 1a95358..a3c08cb 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
@@ -21,28 +21,21 @@ package org.apache.mailbox.tools.indexer;
 
 import javax.inject.Inject;
 
-import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.indexer.MessageIdReIndexer;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.task.Task;
 
 public class MessageIdReIndexerImpl implements MessageIdReIndexer {
 
-    private final MailboxManager mailboxManager;
-    private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
-    private final ListeningMessageSearchIndex index;
+    private final ReIndexerPerformer reIndexerPerformer;
 
     @Inject
-    public MessageIdReIndexerImpl(MailboxManager mailboxManager, 
MailboxSessionMapperFactory mailboxSessionMapperFactory, 
ListeningMessageSearchIndex index) {
-        this.mailboxManager = mailboxManager;
-        this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
-        this.index = index;
+    public MessageIdReIndexerImpl(ReIndexerPerformer reIndexerPerformer) {
+        this.reIndexerPerformer = reIndexerPerformer;
     }
 
     @Override
     public Task reIndex(MessageId messageId) {
-        return new MessageIdReIndexingTask(mailboxManager, 
mailboxSessionMapperFactory, index, messageId);
+        return new MessageIdReIndexingTask(reIndexerPerformer, messageId);
     }
 }
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
index 0baec22..64435b8 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
@@ -20,28 +20,35 @@ package org.apache.mailbox.tools.indexer;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.model.Mailbox;
+import javax.inject.Inject;
+
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.MailboxMapper;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableList;
-
 public class MessageIdReIndexingTask implements Task {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MessageIdReIndexingTask.class);
 
     public static final TaskType TYPE = TaskType.of("MessageIdReIndexingTask");
 
+    public static class Factory {
+        private ReIndexerPerformer reIndexerPerformer;
+        private final MessageId.Factory messageIdFactory;
+
+        @Inject
+        public Factory(ReIndexerPerformer reIndexerPerformer, 
MessageId.Factory messageIdFactory) {
+            this.messageIdFactory = messageIdFactory;
+        }
+
+        public MessageIdReIndexingTask create(MessageIdReindexingTaskDTO dto) {
+            MessageId messageId = 
messageIdFactory.fromString(dto.getMessageId());
+            return new MessageIdReIndexingTask(reIndexerPerformer, messageId);
+        }
+    }
+
     public final class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final MessageId messageId;
 
@@ -54,47 +61,20 @@ public class MessageIdReIndexingTask implements Task {
         }
     }
 
-    private final MailboxManager mailboxManager;
-    private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
-    private final ListeningMessageSearchIndex index;
+
+    private ReIndexerPerformer reIndexerPerformer;
     private final MessageId messageId;
     private final AdditionalInformation additionalInformation;
 
-    MessageIdReIndexingTask(MailboxManager mailboxManager, 
MailboxSessionMapperFactory mailboxSessionMapperFactory, 
ListeningMessageSearchIndex index, MessageId messageId) {
-        this.mailboxManager = mailboxManager;
-        this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
-        this.index = index;
+    MessageIdReIndexingTask(ReIndexerPerformer reIndexerPerformer, MessageId 
messageId) {
+        this.reIndexerPerformer = reIndexerPerformer;
         this.messageId = messageId;
         this.additionalInformation = new AdditionalInformation(messageId);
     }
 
     @Override
     public Result run() {
-        try {
-            MailboxSession session = 
mailboxManager.createSystemSession("MessageIdReIndexerImpl");
-
-            return mailboxSessionMapperFactory.getMessageIdMapper(session)
-                .find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Full)
-                .stream()
-                .map(mailboxMessage -> reIndex(mailboxMessage, session))
-                .reduce(Task::combine)
-                .orElse(Result.COMPLETED);
-        } catch (Exception e) {
-            LOGGER.warn("Failed to re-index {}", messageId, e);
-            return Result.PARTIAL;
-        }
-    }
-
-    public Result reIndex(MailboxMessage mailboxMessage, MailboxSession 
session) {
-        try {
-            MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(session);
-            Mailbox mailbox = 
mailboxMapper.findMailboxById(mailboxMessage.getMailboxId());
-            index.add(session, mailbox, mailboxMessage);
-            return Result.COMPLETED;
-        } catch (Exception e) {
-            LOGGER.warn("Failed to re-index {} in {}", messageId, 
mailboxMessage.getMailboxId(), e);
-            return Result.PARTIAL;
-        }
+        return reIndexerPerformer.handleMessageIdReindexing(messageId);
     }
 
     @Override
@@ -102,6 +82,10 @@ public class MessageIdReIndexingTask implements Task {
         return TYPE;
     }
 
+    MessageId getMessageId() {
+        return messageId;
+    }
+
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
         return Optional.of(additionalInformation);
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskDTO.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskDTO.java
new file mode 100644
index 0000000..1ba8fb4
--- /dev/null
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskDTO.java
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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.mailbox.tools.indexer;
+
+import java.util.function.Function;
+
+import org.apache.james.json.DTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class MessageIdReindexingTaskDTO implements TaskDTO {
+
+    public static final Function<MessageIdReIndexingTask.Factory, 
TaskDTOModule<MessageIdReIndexingTask, MessageIdReindexingTaskDTO>> MODULE = 
(factory) ->
+        DTOModule
+            .forDomainObject(MessageIdReIndexingTask.class)
+            .convertToDTO(MessageIdReindexingTaskDTO.class)
+            .toDomainObjectConverter(factory::create)
+            .toDTOConverter(MessageIdReindexingTaskDTO::of)
+            .typeName(MessageIdReIndexingTask.TYPE.asString())
+            .withFactory(TaskDTOModule::new);
+
+    private final String type;
+    private final String messageId;
+
+    private MessageIdReindexingTaskDTO(@JsonProperty("type") String type, 
@JsonProperty("messageId") String messageId) {
+        this.type = type;
+        this.messageId = messageId;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public static MessageIdReindexingTaskDTO of(MessageIdReIndexingTask task, 
String type) {
+        return new MessageIdReindexingTaskDTO(type, 
task.getMessageId().serialize());
+    }
+}
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
index 03d2d2c..5a1dbf4 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
@@ -33,9 +33,11 @@ import 
org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
@@ -45,6 +47,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
+import com.google.common.collect.ImmutableList;
 
 public class ReIndexerPerformer {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ReIndexerPerformer.class);
@@ -140,6 +143,34 @@ public class ReIndexerPerformer {
         return handleMessageReIndexing(mailboxSession, mailbox, uid, 
reprocessingContext);
     }
 
+    Task.Result handleMessageIdReindexing(MessageId messageId) {
+        try {
+            MailboxSession session = 
mailboxManager.createSystemSession("MessageIdReIndexerImpl");
+
+            return mailboxSessionMapperFactory.getMessageIdMapper(session)
+                .find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Full)
+                .stream()
+                .map(mailboxMessage -> reIndex(mailboxMessage, session))
+                .reduce(Task::combine)
+                .orElse(Task.Result.COMPLETED);
+        } catch (Exception e) {
+            LOGGER.warn("Failed to re-index {}", messageId, e);
+            return Task.Result.PARTIAL;
+        }
+    }
+
+    private Task.Result reIndex(MailboxMessage mailboxMessage, MailboxSession 
session) {
+        try {
+            MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(session);
+            Mailbox mailbox = 
mailboxMapper.findMailboxById(mailboxMessage.getMailboxId());
+            messageSearchIndex.add(session, mailbox, mailboxMessage);
+            return Task.Result.COMPLETED;
+        } catch (Exception e) {
+            LOGGER.warn("Failed to re-index {} in {}", 
mailboxMessage.getUid(), mailboxMessage.getMailboxId(), e);
+            return Task.Result.PARTIAL;
+        }
+    }
+
     private Task.Result reIndex(Stream<MailboxId> mailboxIds, 
ReprocessingContext reprocessingContext) {
         return mailboxIds
             .map(mailboxId -> {
diff --git 
a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
 
b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
index 155d359..8263a93 100644
--- 
a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
+++ 
b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
@@ -48,13 +48,15 @@ public class MessageIdReIndexerImplTest {
     private ListeningMessageSearchIndex messageSearchIndex;
 
     private MessageIdReIndexerImpl reIndexer;
+    private ReIndexerPerformer reindexerPerformer;
 
     @BeforeEach
     void setUp() {
         mailboxManager = 
InMemoryIntegrationResources.defaultResources().getMailboxManager();
         MailboxSessionMapperFactory mailboxSessionMapperFactory = 
mailboxManager.getMapperFactory();
         messageSearchIndex = mock(ListeningMessageSearchIndex.class);
-        reIndexer = new MessageIdReIndexerImpl(mailboxManager, 
mailboxSessionMapperFactory, messageSearchIndex);
+        reindexerPerformer = new ReIndexerPerformer(mailboxManager, 
messageSearchIndex, mailboxSessionMapperFactory);
+        reIndexer = new MessageIdReIndexerImpl(reindexerPerformer);
     }
 
     @Test
diff --git 
a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
 
b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
new file mode 100644
index 0000000..bfd7293
--- /dev/null
+++ 
b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
@@ -0,0 +1,68 @@
+/****************************************************************
+ * 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.mailbox.tools.indexer;
+
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+
+import java.io.IOException;
+
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.server.task.json.JsonTaskSerializer;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+class MessageIdReindexingTaskSerializationTest {
+
+    private ReIndexerPerformer reIndexerPerformer;
+    private MessageId.Factory messageIdFactory;
+    private JsonTaskSerializer taskSerializer;
+    private final String serializedMessageIdReIndexingTask = "{\"type\": 
\"MessageIdReIndexingTask\", \"messageId\": \"1\"}";
+
+    @BeforeEach
+    void setUp() {
+        messageIdFactory = new TestMessageId.Factory();
+        reIndexerPerformer = mock(ReIndexerPerformer.class);
+        MessageIdReIndexingTask.Factory factory = new 
MessageIdReIndexingTask.Factory(reIndexerPerformer, messageIdFactory);
+        taskSerializer = new 
JsonTaskSerializer(MessageIdReindexingTaskDTO.MODULE.apply(factory));
+    }
+
+    @Test
+    void messageIdReindexingShouldBeSerializable() throws 
JsonProcessingException {
+        MessageId messageId = messageIdFactory.fromString("1");
+        MessageIdReIndexingTask task = new 
MessageIdReIndexingTask(reIndexerPerformer, messageId);
+
+        assertThatJson(taskSerializer.serialize(task))
+            .isEqualTo(serializedMessageIdReIndexingTask);
+    }
+
+    @Test
+    void messageIdReindexingShouldBeDeserializable() throws IOException {
+        MessageId messageId = messageIdFactory.fromString("1");
+        MessageIdReIndexingTask task = new 
MessageIdReIndexingTask(reIndexerPerformer, messageId);
+
+        
assertThat(taskSerializer.deserialize(serializedMessageIdReIndexingTask))
+            .isEqualToComparingOnlyGivenFields(task, "messageId");
+    }
+}
+
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/ReindexingRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/ReindexingRoutesTest.java
index b0cf840..b1c9e86 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/ReindexingRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/ReindexingRoutesTest.java
@@ -84,11 +84,12 @@ class ReindexingRoutesTest {
         MemoryTaskManager taskManager = new MemoryTaskManager(new 
Hostname("foo"));
         InMemoryId.Factory mailboxIdFactory = new InMemoryId.Factory();
         searchIndex = mock(ListeningMessageSearchIndex.class);
+        ReIndexerPerformer reIndexerPerformer = new ReIndexerPerformer(
+            mailboxManager,
+            searchIndex,
+            mailboxManager.getMapperFactory());
         ReIndexer reIndexer = new ReIndexerImpl(
-            new ReIndexerPerformer(
-                mailboxManager,
-                searchIndex,
-                mailboxManager.getMapperFactory()),
+            reIndexerPerformer,
             mailboxManager,
             mailboxManager.getMapperFactory());
         JsonTransformer jsonTransformer = new JsonTransformer();
@@ -103,7 +104,7 @@ class ReindexingRoutesTest {
                     jsonTransformer),
                 new MessageIdReindexingRoutes(taskManager,
                     new InMemoryMessageId.Factory(),
-                    new MessageIdReIndexerImpl(mailboxManager, 
mailboxManager.getMapperFactory(), searchIndex),
+                    new MessageIdReIndexerImpl(reIndexerPerformer),
                     jsonTransformer))
             .start();
 


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

Reply via email to