You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2019/07/25 15:34:52 UTC

[james-project] 05/05: JAMES-2813 serialization of task ErrorRecoveryIndexationTask

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

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

commit d6a7893ee3e587c84e505bed488cb4ffa81aa658
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Wed Jul 24 10:20:23 2019 +0200

    JAMES-2813 serialization of task ErrorRecoveryIndexationTask
---
 .../indexer/ReIndexingExecutionFailures.java       |  34 +++++++
 .../indexer/ReindexingExecutionFailuresTest.java}  |  37 ++-----
 .../mailbox/indexer/ReindexingFailureTest.java}    |  37 ++-----
 .../tools/indexer/ErrorRecoveryIndexationTask.java | 110 +++++++++++++++++++++
 ...rorRecoveryIndexationTaskSerializationTest.java |  83 ++++++++++++++++
 5 files changed, 239 insertions(+), 62 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java b/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
index 9e9a987..429c9a4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.indexer;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxId;
@@ -43,6 +44,23 @@ public class ReIndexingExecutionFailures {
         public MessageUid getUid() {
             return uid;
         }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof ReIndexingFailure) {
+                ReIndexingFailure that = (ReIndexingFailure) o;
+
+                return Objects.equals(this.mailboxId, that.mailboxId)
+                    && Objects.equals(this.uid, that.uid);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(mailboxId, uid);
+        }
+
     }
 
     private final List<ReIndexingFailure> failures;
@@ -54,4 +72,20 @@ public class ReIndexingExecutionFailures {
     public List<ReIndexingFailure> failures() {
         return ImmutableList.copyOf(failures);
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof ReIndexingExecutionFailures) {
+            ReIndexingExecutionFailures that = (ReIndexingExecutionFailures) o;
+
+            return Objects.equals(this.failures, that.failures);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(failures);
+    }
+
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java b/mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingExecutionFailuresTest.java
similarity index 57%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
copy to mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingExecutionFailuresTest.java
index 9e9a987..30e60c7 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingExecutionFailuresTest.java
@@ -16,42 +16,17 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-
 package org.apache.james.mailbox.indexer;
 
-import java.util.List;
-
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.MailboxId;
-
-import com.google.common.collect.ImmutableList;
-
-public class ReIndexingExecutionFailures {
-    public static class ReIndexingFailure {
-        private final MailboxId mailboxId;
-        private final MessageUid uid;
+import org.junit.jupiter.api.Test;
 
-        public ReIndexingFailure(MailboxId mailboxId, MessageUid uid) {
-            this.mailboxId = mailboxId;
-            this.uid = uid;
-        }
+import nl.jqno.equalsverifier.EqualsVerifier;
 
-        public MailboxId getMailboxId() {
-            return mailboxId;
-        }
+public class ReindexingExecutionFailuresTest {
 
-        public MessageUid getUid() {
-            return uid;
-        }
+    @Test
+    void shouldRespectBeanContract() {
+        EqualsVerifier.forClass(ReIndexingExecutionFailures.class).verify();
     }
 
-    private final List<ReIndexingFailure> failures;
-
-    public ReIndexingExecutionFailures(List<ReIndexingFailure> failures) {
-        this.failures = failures;
-    }
-
-    public List<ReIndexingFailure> failures() {
-        return ImmutableList.copyOf(failures);
-    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java b/mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingFailureTest.java
similarity index 57%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
copy to mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingFailureTest.java
index 9e9a987..4efb0f0 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingFailureTest.java
@@ -16,42 +16,17 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-
 package org.apache.james.mailbox.indexer;
 
-import java.util.List;
-
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.MailboxId;
-
-import com.google.common.collect.ImmutableList;
-
-public class ReIndexingExecutionFailures {
-    public static class ReIndexingFailure {
-        private final MailboxId mailboxId;
-        private final MessageUid uid;
+import org.junit.jupiter.api.Test;
 
-        public ReIndexingFailure(MailboxId mailboxId, MessageUid uid) {
-            this.mailboxId = mailboxId;
-            this.uid = uid;
-        }
+import nl.jqno.equalsverifier.EqualsVerifier;
 
-        public MailboxId getMailboxId() {
-            return mailboxId;
-        }
+public class ReindexingFailureTest {
 
-        public MessageUid getUid() {
-            return uid;
-        }
+    @Test
+    void shouldRespectBeanContract() {
+        EqualsVerifier.forClass(ReIndexingExecutionFailures.ReIndexingFailure.class).verify();
     }
 
-    private final List<ReIndexingFailure> failures;
-
-    public ReIndexingExecutionFailures(List<ReIndexingFailure> failures) {
-        this.failures = failures;
-    }
-
-    public List<ReIndexingFailure> failures() {
-        return ImmutableList.copyOf(failures);
-    }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
index cc6fb16..08d6d4e 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
@@ -19,15 +19,125 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 
+import javax.inject.Inject;
+
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.Multimap;
+
 public class ErrorRecoveryIndexationTask implements Task {
     private static final String PREVIOUS_FAILURES_INDEXING = "ErrorRecoveryIndexation";
 
+    public static final Function<ErrorRecoveryIndexationTask.Factory, TaskDTOModule> MODULE = (factory) ->
+        DTOModule
+            .forDomainObject(ErrorRecoveryIndexationTask.class)
+            .convertToDTO(ErrorRecoveryIndexationTask.ErrorRecoveryIndexationTaskDTO.class)
+            .toDomainObjectConverter(factory::create)
+            .toDTOConverter(ErrorRecoveryIndexationTask.ErrorRecoveryIndexationTaskDTO::of)
+            .typeName(PREVIOUS_FAILURES_INDEXING)
+            .withFactory(TaskDTOModule::new);
+
+    public static class ErrorRecoveryIndexationTaskDTO implements TaskDTO {
+
+        public static ErrorRecoveryIndexationTaskDTO of(ErrorRecoveryIndexationTask task, String type) {
+            Multimap<MailboxId, ReIndexingExecutionFailures.ReIndexingFailure> failuresByMailboxId = task.previousFailures
+                .failures()
+                .stream()
+                .collect(Guavate.toImmutableListMultimap(ReIndexingExecutionFailures.ReIndexingFailure::getMailboxId, Function.identity()));
+
+            List<ReindexingFailureDTO> failureDTOs = failuresByMailboxId.asMap()
+                .entrySet().stream()
+                .map(ErrorRecoveryIndexationTaskDTO::failuresByMailboxToReindexingFailureDTO).collect(Guavate.toImmutableList());
+            return new ErrorRecoveryIndexationTaskDTO(type, failureDTOs);
+        }
+
+        private static ReindexingFailureDTO failuresByMailboxToReindexingFailureDTO(Map.Entry<MailboxId,
+            Collection<ReIndexingExecutionFailures.ReIndexingFailure>> entry) {
+            List<Long> uids = entry.getValue().stream()
+                .map(ReIndexingExecutionFailures.ReIndexingFailure::getUid)
+                .map(MessageUid::asLong)
+                .collect(Guavate.toImmutableList());
+            return new ReindexingFailureDTO(entry.getKey().serialize(), uids);
+        }
+
+        public static class ReindexingFailureDTO {
+
+            private final String mailboxId;
+            private final List<Long> uids;
+
+            private ReindexingFailureDTO(@JsonProperty("mailboxId") String mailboxId, @JsonProperty("uids") List<Long> uids) {
+                this.mailboxId = mailboxId;
+                this.uids = uids;
+            }
+
+            public String getMailboxId() {
+                return mailboxId;
+            }
+
+            public List<Long> getUids() {
+                return uids;
+            }
+        }
+
+        private final String type;
+        private final List<ReindexingFailureDTO> previousFailures;
+
+        private ErrorRecoveryIndexationTaskDTO(@JsonProperty("type") String type, @JsonProperty("previousFailures") List<ReindexingFailureDTO> previousFailures) {
+            this.type = type;
+            this.previousFailures = previousFailures;
+        }
+
+        @Override
+        public String getType() {
+            return type;
+        }
+
+        public List<ReindexingFailureDTO> getPreviousFailures() {
+            return previousFailures;
+        }
+
+    }
+
+    public static class Factory {
+
+        private final ReIndexerPerformer reIndexerPerformer;
+        private final MailboxId.Factory mailboxIdFactory;
+
+        @Inject
+        public Factory(ReIndexerPerformer reIndexerPerformer, MailboxId.Factory mailboxIdFactory) {
+            this.reIndexerPerformer = reIndexerPerformer;
+            this.mailboxIdFactory = mailboxIdFactory;
+        }
+
+        private List<ReIndexingExecutionFailures.ReIndexingFailure> failuresFromDTO(List<ErrorRecoveryIndexationTaskDTO.ReindexingFailureDTO> failureDTOs) {
+            return failureDTOs
+                .stream()
+                .flatMap(dto -> dto.getUids()
+                    .stream()
+                    .map(uid -> new ReIndexingExecutionFailures.ReIndexingFailure(mailboxIdFactory.fromString(dto.getMailboxId()), MessageUid.of(uid))))
+                .collect(Guavate.toImmutableList());
+        }
+
+        public ErrorRecoveryIndexationTask create(ErrorRecoveryIndexationTaskDTO dto) {
+            return new ErrorRecoveryIndexationTask(reIndexerPerformer, new ReIndexingExecutionFailures(failuresFromDTO(dto.getPreviousFailures())));
+        }
+    }
+
     private final ReIndexerPerformer reIndexerPerformer;
     private final ReprocessingContextInformation additionalInformation;
     private final ReprocessingContext reprocessingContext;
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
new file mode 100644
index 0000000..415db36
--- /dev/null
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
@@ -0,0 +1,83 @@
+/****************************************************************
+ * 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 java.util.List;
+
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.server.task.json.JsonTaskSerializer;
+import org.apache.james.task.Task;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.common.collect.ImmutableList;
+
+class ErrorRecoveryIndexationTaskSerializationTest {
+
+    private ReIndexerPerformer reIndexerPerformer;
+    private JsonTaskSerializer taskSerializer;
+    private final String serializedErrorRecoveryReindexingTask = "{\"type\": \"ErrorRecoveryIndexation\"," +
+        " \"previousFailures\" : [{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}]}";
+
+    private final TestId mailboxId = TestId.of(1L);
+    private final MessageUid messageUid = MessageUid.of(10L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId, messageUid);
+
+    private final TestId mailboxId2 = TestId.of(2L);
+    private final MessageUid messageUid2 = MessageUid.of(20L);
+
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+
+    @BeforeEach
+    void setUp() {
+        reIndexerPerformer = mock(ReIndexerPerformer.class);
+        ErrorRecoveryIndexationTask.Factory factory = new ErrorRecoveryIndexationTask.Factory(reIndexerPerformer, new TestId.Factory());
+        taskSerializer = new JsonTaskSerializer(ErrorRecoveryIndexationTask.MODULE.apply(factory));
+    }
+
+    @Test
+    void errorRecoveryReindexingShouldBeSerializable() throws JsonProcessingException {
+        ErrorRecoveryIndexationTask task = new ErrorRecoveryIndexationTask(reIndexerPerformer, executionFailures);
+
+        assertThatJson(taskSerializer.serialize(task))
+            .isEqualTo(serializedErrorRecoveryReindexingTask);
+    }
+
+    @Test
+    void errorRecoveryReindexingShouldBeDeserializable() throws IOException {
+        ErrorRecoveryIndexationTask task = new ErrorRecoveryIndexationTask(reIndexerPerformer, executionFailures);
+
+        Task deserializedTask = taskSerializer.deserialize(serializedErrorRecoveryReindexingTask);
+        assertThat(task instanceof ErrorRecoveryIndexationTask);
+        assertThat(deserializedTask)
+            .isEqualToComparingOnlyGivenFields(task, "reIndexerPerformer", "previousFailures");
+    }
+
+}
+


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