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 2019/09/11 10:01:01 UTC
[james-project] 11/38: JAMES-2813 serialize MessageIdReindexingTask
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 <rk...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org