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