You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2026/04/10 01:22:34 UTC
(james-project) 03/03: JAMES-4197 Add a SerializationResult interface for serialization results in EventSerializer
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d010001b6325bef3a1a3933299591686fd61c030
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Apr 7 14:37:49 2026 +0700
JAMES-4197 Add a SerializationResult interface for serialization results in EventSerializer
---
.../org/apache/james/events/EventSerializer.java | 13 ++--
.../james/events/EventSerializersAggregator.java | 15 ++--
.../apache/james/events/SerializationResult.java | 79 ++++++++++++++++++++++
.../apache/james/events/EventBusTestFixture.java | 18 ++---
.../james/events/CassandraEventDeadLettersDAO.java | 2 +-
.../org/apache/james/events/EventDispatcher.java | 4 +-
.../apache/james/events/GroupConsumerRetry.java | 2 +-
.../james/events/PostgresEventDeadLetters.java | 2 +-
.../james/event/json/MailboxEventSerializer.scala | 36 ++++++++--
.../james/event/json/AddedSerializationTest.java | 6 +-
.../event/json/ExpungedSerializationTest.java | 6 +-
.../event/json/FlagsUpdatedSerializationTest.java | 6 +-
.../MailboxACLUpdatedEventSerializationTest.java | 2 +-
.../event/json/MailboxAddedSerializationTest.java | 2 +-
.../json/MailboxDeletionSerializationTest.java | 4 +-
.../json/MailboxRenamedSerializationTest.java | 2 +-
.../MessageContentDeletionSerializationTest.java | 6 +-
.../json/MessageMoveEventSerializationTest.java | 8 +--
.../QuotaUsageUpdatedEventSerializationTest.java | 2 +-
.../james/jmap/change/JmapEventSerializer.scala | 14 ++--
.../webadmin/routes/EventDeadLettersRoutes.java | 7 +-
21 files changed, 173 insertions(+), 63 deletions(-)
diff --git a/event-bus/api/src/main/java/org/apache/james/events/EventSerializer.java b/event-bus/api/src/main/java/org/apache/james/events/EventSerializer.java
index 59b5d54a6a..462b2c2b82 100644
--- a/event-bus/api/src/main/java/org/apache/james/events/EventSerializer.java
+++ b/event-bus/api/src/main/java/org/apache/james/events/EventSerializer.java
@@ -21,19 +21,18 @@ package org.apache.james.events;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
-import java.util.Optional;
public interface EventSerializer {
- Optional<String> toJson(Event event);
+ SerializationResult toJson(Event event);
- Optional<String> toJson(Collection<Event> event);
+ SerializationResult toJson(Collection<Event> event);
- default Optional<byte[]> toJsonBytes(Event event) {
- return toJson(event).map(json -> json.getBytes(StandardCharsets.UTF_8));
+ default SerializationResult toJsonBytes(Event event) {
+ return toJson(event);
}
- default Optional<byte[]> toJsonBytes(Collection<Event> event) {
- return toJson(event).map(json -> json.getBytes(StandardCharsets.UTF_8));
+ default SerializationResult toJsonBytes(Collection<Event> event) {
+ return toJson(event);
}
DeserializationResult asEvent(String serialized);
diff --git a/event-bus/api/src/main/java/org/apache/james/events/EventSerializersAggregator.java b/event-bus/api/src/main/java/org/apache/james/events/EventSerializersAggregator.java
index f663567f16..e55bd93bf9 100644
--- a/event-bus/api/src/main/java/org/apache/james/events/EventSerializersAggregator.java
+++ b/event-bus/api/src/main/java/org/apache/james/events/EventSerializersAggregator.java
@@ -20,7 +20,6 @@
package org.apache.james.events;
import java.util.Collection;
-import java.util.Optional;
import java.util.Set;
import jakarta.inject.Inject;
@@ -36,11 +35,12 @@ public class EventSerializersAggregator implements EventSerializer {
}
@Override
- public Optional<String> toJson(Event event) {
+ public SerializationResult toJson(Event event) {
return allEventSerializers.stream()
.map(eventSerializer -> eventSerializer.toJson(event))
- .flatMap(Optional::stream)
- .findFirst();
+ .filter(SerializationResult::isSuccess)
+ .findFirst()
+ .orElse(new SerializationResult.Failure("Could not serialize event: " + event));
}
@Override
@@ -53,11 +53,12 @@ public class EventSerializersAggregator implements EventSerializer {
}
@Override
- public Optional<String> toJson(Collection<Event> events) {
+ public SerializationResult toJson(Collection<Event> events) {
return allEventSerializers.stream()
.map(eventSerializer -> eventSerializer.toJson(events))
- .flatMap(Optional::stream)
- .findFirst();
+ .filter(SerializationResult::isSuccess)
+ .findFirst()
+ .orElse(new SerializationResult.Failure("Could not serialize events: " + events));
}
@Override
diff --git a/event-bus/api/src/main/java/org/apache/james/events/SerializationResult.java b/event-bus/api/src/main/java/org/apache/james/events/SerializationResult.java
new file mode 100644
index 0000000000..e8d436f067
--- /dev/null
+++ b/event-bus/api/src/main/java/org/apache/james/events/SerializationResult.java
@@ -0,0 +1,79 @@
+/****************************************************************
+ * 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.james.events;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Optional;
+
+public sealed interface SerializationResult permits SerializationResult.Success, SerializationResult.SuccessBytes, SerializationResult.Failure {
+ static SerializationResult of(Optional<String> maybeJson, String throwingMessage) {
+ return maybeJson.<SerializationResult>map(Success::new)
+ .orElse(new Failure(throwingMessage));
+ }
+
+ static SerializationResult ofBytes(Optional<byte[]> maybeJsonBytes, String throwingMessage) {
+ return maybeJsonBytes.<SerializationResult>map(SerializationResult.SuccessBytes::new)
+ .orElse(new SerializationResult.Failure(throwingMessage));
+ }
+
+ String json();
+
+ byte[] jsonBytes();
+
+ default boolean isSuccess() {
+ return this instanceof Success;
+ }
+
+ record Success(String json) implements SerializationResult {
+ @Override
+ public String json() {
+ return json;
+ }
+
+ @Override
+ public byte[] jsonBytes() {
+ return json.getBytes(StandardCharsets.UTF_8);
+ }
+ }
+
+ record SuccessBytes(byte[] jsonBytes) implements SerializationResult {
+ @Override
+ public String json() {
+ return new String(jsonBytes, StandardCharsets.UTF_8);
+ }
+
+ @Override
+ public byte[] jsonBytes() {
+ return jsonBytes;
+ }
+ }
+
+ record Failure(String throwingMessage) implements SerializationResult {
+ @Override
+ public String json() {
+ throw new RuntimeException(throwingMessage);
+ }
+
+ @Override
+ public byte[] jsonBytes() {
+ throw new RuntimeException(throwingMessage);
+ }
+ }
+}
diff --git a/event-bus/api/src/test/java/org/apache/james/events/EventBusTestFixture.java b/event-bus/api/src/test/java/org/apache/james/events/EventBusTestFixture.java
index af0d419193..fcd8e25e5a 100644
--- a/event-bus/api/src/test/java/org/apache/james/events/EventBusTestFixture.java
+++ b/event-bus/api/src/test/java/org/apache/james/events/EventBusTestFixture.java
@@ -178,11 +178,11 @@ public interface EventBusTestFixture {
static final String ARRAY_SEPARATOR = "^";
@Override
- public Optional<String> toJson(Event event) {
+ public SerializationResult toJson(Event event) {
if (!(event instanceof TestEvent || event instanceof UnsupportedEvent)) {
- return Optional.empty();
+ return new SerializationResult.Failure("Unknown event type: " + event);
}
- return Optional.of(event.getClass().getCanonicalName() + "&" + event.getEventId().getId().toString() + "&" + event.getUsername().asString());
+ return new SerializationResult.Success(event.getClass().getCanonicalName() + "&" + event.getEventId().getId().toString() + "&" + event.getUsername().asString());
}
@Override
@@ -201,11 +201,13 @@ public interface EventBusTestFixture {
}
@Override
- public Optional<String> toJson(Collection<Event> event) {
- return Optional.of(event.stream()
- .map(this::toJson)
- .map(Optional::get)
- .collect(Collectors.joining(ARRAY_SEPARATOR)));
+ public SerializationResult toJson(Collection<Event> event) {
+ return SerializationResult.of(
+ Optional.of(event.stream()
+ .map(this::toJson)
+ .map(SerializationResult::json)
+ .collect(Collectors.joining(ARRAY_SEPARATOR))),
+ "Could not serialize events");
}
@Override
diff --git a/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersDAO.java b/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersDAO.java
index 183a3a733e..7dcf3e4df5 100644
--- a/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersDAO.java
+++ b/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersDAO.java
@@ -105,7 +105,7 @@ public class CassandraEventDeadLettersDAO {
Mono<Void> store(Group group, Event failedEvent, EventDeadLetters.InsertionId insertionId) {
String serializedEvent = eventSerializer.toJson(failedEvent)
- .orElseThrow(() -> new RuntimeException("Could not serialize event: " + failedEvent));
+ .json();
return executor.executeVoid(insertStatement.bind()
.setString(GROUP, group.asString())
diff --git a/event-bus/distributed/src/main/java/org/apache/james/events/EventDispatcher.java b/event-bus/distributed/src/main/java/org/apache/james/events/EventDispatcher.java
index ef74ebce34..92864f705a 100644
--- a/event-bus/distributed/src/main/java/org/apache/james/events/EventDispatcher.java
+++ b/event-bus/distributed/src/main/java/org/apache/james/events/EventDispatcher.java
@@ -259,11 +259,11 @@ public class EventDispatcher {
private byte[] serializeEvent(Event event) {
return eventSerializer.toJsonBytes(event)
- .orElseThrow(() -> new RuntimeException("Could not serialize event: " + event));
+ .jsonBytes();
}
private byte[] serializeEvents(Collection<Event> event) {
return eventSerializer.toJsonBytes(event)
- .orElseThrow(() -> new RuntimeException("Could not serialize events"));
+ .jsonBytes();
}
}
diff --git a/event-bus/distributed/src/main/java/org/apache/james/events/GroupConsumerRetry.java b/event-bus/distributed/src/main/java/org/apache/james/events/GroupConsumerRetry.java
index 9b03c9171d..00d3c552cd 100644
--- a/event-bus/distributed/src/main/java/org/apache/james/events/GroupConsumerRetry.java
+++ b/event-bus/distributed/src/main/java/org/apache/james/events/GroupConsumerRetry.java
@@ -101,7 +101,7 @@ class GroupConsumerRetry {
private Mono<Void> sendRetryMessage(Event event, int currentRetryCount) {
byte[] eventAsBytes = eventSerializer.toJsonBytes(event)
- .orElseThrow(() -> new RuntimeException("Could not serialize event: " + event));
+ .jsonBytes();
Mono<OutboundMessage> retryMessage = Mono.just(new OutboundMessage(
retryExchangeName.asString(),
diff --git a/event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLetters.java b/event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLetters.java
index 871b1f34e9..de967e62b9 100644
--- a/event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLetters.java
+++ b/event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLetters.java
@@ -51,7 +51,7 @@ public class PostgresEventDeadLetters implements EventDeadLetters {
Preconditions.checkArgument(failDeliveredEvent != null, FAIL_DELIVERED_EVENT_CANNOT_BE_NULL);
String serializedEvent = eventSerializer.toJson(failDeliveredEvent)
- .orElseThrow(() -> new RuntimeException("Could not serialize event: " + failDeliveredEvent));
+ .json();
InsertionId insertionId = InsertionId.random();
return postgresExecutor.executeVoid(dslContext -> Mono.from(dslContext.insertInto(TABLE_NAME)
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/MailboxEventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/MailboxEventSerializer.scala
index 6a21ed08a9..72ff46bb6d 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/MailboxEventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/MailboxEventSerializer.scala
@@ -21,7 +21,7 @@ package org.apache.james.event.json
import java.time.Instant
import java.util
-import java.util.{Optional, TreeMap => JavaTreeMap}
+import java.util.{TreeMap => JavaTreeMap}
import jakarta.inject.Inject
import julienrf.json.derived
@@ -30,7 +30,7 @@ import org.apache.james.core.quota.{QuotaCountLimit, QuotaCountUsage, QuotaSizeL
import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
import org.apache.james.event.json.DTOs._
import org.apache.james.events.Event.EventId
-import org.apache.james.events.{DeserializationResult, EventSerializer, Event => JavaEvent}
+import org.apache.james.events.{DeserializationResult, EventSerializer, SerializationResult, Event => JavaEvent}
import org.apache.james.mailbox.MailboxSession.SessionId
import org.apache.james.mailbox.events.MailboxEvents.Added.IS_APPENDED
import org.apache.james.mailbox.events.MailboxEvents.{Added => JavaAdded, Expunged => JavaExpunged, FlagsUpdated => JavaFlagsUpdated, MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, MailboxSubscribedEvent => JavaMailboxSubscribedEvent, MailboxUnsubscribedEvent => JavaMailboxUnsubscribedEvent, MessageContentDeletionEvent => JavaMessageContentDeletionEvent, QuotaUsageUpdatedEvent => [...]
@@ -456,15 +456,39 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
class MailboxEventSerializer @Inject()(mailboxIdFactory: MailboxId.Factory, messageIdFactory: MessageId.Factory, quotaRootDeserializer: QuotaRootDeserializer) extends EventSerializer {
private val jsonSerialize = new JsonSerialize(mailboxIdFactory, messageIdFactory, quotaRootDeserializer)
- override def toJson(event: JavaEvent): Optional[String] = Optional.of(jsonSerialize.toJson(event))
+ override def toJson(event: JavaEvent): SerializationResult =
+ try {
+ val serializedEvent: String = jsonSerialize.toJson(event)
+ new SerializationResult.Success(serializedEvent)
+ } catch {
+ case exception: Exception => new SerializationResult.Failure(exception.getMessage)
+ }
- override def toJsonBytes(event: JavaEvent): Optional[Array[Byte]] = Optional.of(jsonSerialize.toJsonBytes(event))
+ override def toJsonBytes(event: JavaEvent): SerializationResult =
+ try {
+ val serializedBytesEvent: Array[Byte] = jsonSerialize.toJsonBytes(event)
+ new SerializationResult.SuccessBytes(serializedBytesEvent)
+ } catch {
+ case exception: Exception => new SerializationResult.Failure(exception.getMessage)
+ }
- override def toJsonBytes(event: util.Collection[JavaEvent]): Optional[Array[Byte]] = Optional.of(jsonSerialize.toJsonBytes(event))
+ override def toJsonBytes(event: util.Collection[JavaEvent]): SerializationResult =
+ try {
+ val serializedBytesEvents: Array[Byte] = jsonSerialize.toJsonBytes(event)
+ new SerializationResult.SuccessBytes(serializedBytesEvents)
+ } catch {
+ case exception: Exception => new SerializationResult.Failure(exception.getMessage)
+ }
def fromJson(json: String): JsResult[JavaEvent] = jsonSerialize.fromJson(json)
- override def toJson(event: util.Collection[JavaEvent]): Optional[String] = Optional.of(jsonSerialize.toJson(event))
+ override def toJson(event: util.Collection[JavaEvent]): SerializationResult =
+ try {
+ val serializedEvents: String = jsonSerialize.toJson(event)
+ new SerializationResult.Success(serializedEvents)
+ } catch {
+ case exception: Exception => new SerializationResult.Failure(exception.getMessage)
+ }
override def asEvents(serialized: String): DeserializationResult = {
val result = jsonSerialize.fromJsonAsEvents(serialized)
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
index d5eb72a30a..3d5c63ffd5 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
@@ -172,13 +172,13 @@ class AddedSerializationTest {
@Test
void addedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_ADDED_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_ADDED_EVENT).json())
.isEqualTo(DEFAULT_ADDED_EVENT_JSON);
}
@Test
void addedWithDistinctMessageIdAndThreadIdShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(ADDED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(ADDED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT).json())
.isEqualTo(ADDED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT_JSON);
}
@@ -252,7 +252,7 @@ class AddedSerializationTest {
@Test
void addedShouldBeWellSerializedWhenMapKeyIsEmpty() {
- assertThatJson(EVENT_SERIALIZER.toJson(emptyAddedEvent).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(emptyAddedEvent).json())
.isEqualTo(emptyAddedEventJson);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
index e9f4550322..be145e6bfd 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
@@ -166,13 +166,13 @@ class ExpungedSerializationTest {
@Test
void expungedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_EXPUNGED_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_EXPUNGED_EVENT).json())
.isEqualTo(DEFAULT_EXPUNGED_EVENT_JSON);
}
@Test
void expungedWithDistinctMessageIdAndThreadIdShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EXPUNGED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(EXPUNGED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT).json())
.isEqualTo(EXPUNGED_WITH_DISTINCT_MESSAGE_ID_AND_THREAD_ID_EVENT_JSON);
}
@@ -242,7 +242,7 @@ class ExpungedSerializationTest {
@Test
void expungedShouldBeWellSerializedWhenMapKeyIsEmpty() {
- assertThatJson(EVENT_SERIALIZER.toJson(emptyExpungedEvent).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(emptyExpungedEvent).json())
.isEqualTo(emptyExpungedEventJson);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
index 3ffa626bf5..d6d579b533 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
@@ -129,7 +129,7 @@ class FlagsUpdatedSerializationTest {
@Test
void flagsUpdatedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_EVENT).json())
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo(DEFAULT_EVENT_JSON);
}
@@ -164,7 +164,7 @@ class FlagsUpdatedSerializationTest {
@Test
void flagsUpdatedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(emptyUpdatedFlagsEvent).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(emptyUpdatedFlagsEvent).json())
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo(EVENT_JSON_WITH_EMPTY_UPDATED_FLAGS);
}
@@ -272,7 +272,7 @@ class FlagsUpdatedSerializationTest {
@Test
void flagsUpdatedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(eventWithMessageIds).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(eventWithMessageIds).json())
.when(Option.IGNORING_ARRAY_ORDER)
.isEqualTo(EVENT_WITH_MESSAGE_IDS_JSON);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
index 405a596f1f..479d13844b 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
@@ -75,7 +75,7 @@ class MailboxACLUpdatedEventSerializationTest {
@Test
void mailboxACLUpdatedShouldBeSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(MAILBOX_ACL_UPDATED).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(MAILBOX_ACL_UPDATED).json())
.isEqualTo(MAILBOX_ACL_UPDATED_JSON);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
index d80f32b19f..18ad97db27 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
@@ -60,7 +60,7 @@ class MailboxAddedSerializationTest {
@Test
void mailboxAddedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EVENT_1).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(EVENT_1).json())
.isEqualTo(JSON_1);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
index 264959a83c..a40e14aa7d 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
@@ -139,7 +139,7 @@ class MailboxDeletionSerializationTest {
@Test
void mailboxDeletionShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_MAILBOX_DELETION_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_MAILBOX_DELETION_EVENT).json())
.isEqualTo(DEFAULT_EVENT_JSON);
}
@@ -151,7 +151,7 @@ class MailboxDeletionSerializationTest {
@Test
void mailboxDeletionWithEmptyACLShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EMPTY_ACL_MAILBOX_DELETION_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(EMPTY_ACL_MAILBOX_DELETION_EVENT).json())
.isEqualTo(EVENT_WITH_EMPTY_ACL_JSON);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
index 9158755962..f0b96d2568 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
@@ -76,7 +76,7 @@ class MailboxRenamedSerializationTest {
@Test
void mailboxRenamedShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_MAILBOX_RENAMED_EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(DEFAULT_MAILBOX_RENAMED_EVENT).json())
.isEqualTo(DEFAULT_MAILBOX_RENAMED_EVENT_JSON);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageContentDeletionSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageContentDeletionSerializationTest.java
index 23749b7760..61b8d879f4 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageContentDeletionSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageContentDeletionSerializationTest.java
@@ -234,8 +234,8 @@ class MessageContentDeletionSerializationTest {
@Test
void messageContentDeletionEventShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EVENT).get()).isEqualTo(JSON);
- assertThatJson(EVENT_SERIALIZER.toJson(EVENT_WITHOUT_HEADER_CONTENT).get()).isEqualTo(JSON_WITHOUT_HEADER_CONTENT);
+ assertThatJson(EVENT_SERIALIZER.toJson(EVENT).json()).isEqualTo(JSON);
+ assertThatJson(EVENT_SERIALIZER.toJson(EVENT_WITHOUT_HEADER_CONTENT).json()).isEqualTo(JSON_WITHOUT_HEADER_CONTENT);
}
@Test
@@ -246,7 +246,7 @@ class MessageContentDeletionSerializationTest {
@Test
void messageContentDeletionEventWithMailboxPathShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EVENT_WITH_MAILBOX_PATH).get()).isEqualTo(JSON_WITH_MAILBOX_PATH);
+ assertThatJson(EVENT_SERIALIZER.toJson(EVENT_WITH_MAILBOX_PATH).json()).isEqualTo(JSON_WITH_MAILBOX_PATH);
}
@Test
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
index 9e2067a75f..e2661cdecc 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
@@ -59,7 +59,7 @@ class MessageMoveEventSerializationTest {
@Test
void messageMoveEventShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(EVENT).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(EVENT).json())
.isEqualTo(JSON);
}
@@ -94,7 +94,7 @@ class MessageMoveEventSerializationTest {
@Test
void messageMoveEventShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(event).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(event).json())
.isEqualTo(json);
}
@@ -128,7 +128,7 @@ class MessageMoveEventSerializationTest {
@Test
void messageMoveEventShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(event).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(event).json())
.isEqualTo(json);
}
@@ -162,7 +162,7 @@ class MessageMoveEventSerializationTest {
@Test
void messageMoveEventShouldBeWellSerialized() {
- assertThatJson(EVENT_SERIALIZER.toJson(event).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(event).json())
.isEqualTo(json);
}
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
index f1703a787e..79f42c2560 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
@@ -77,7 +77,7 @@ class QuotaUsageUpdatedEventSerializationTest {
@Test
void toJsonShouldReturnQuotaEventJson() {
- assertThatJson(EVENT_SERIALIZER.toJson(eventWithUserContainsUsername).get())
+ assertThatJson(EVENT_SERIALIZER.toJson(eventWithUserContainsUsername).json())
.isEqualTo(quotaUsageUpdatedEvent);
}
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
index 65eb6c33e9..85217a574c 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
@@ -26,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonProperty
import jakarta.inject.Inject
import org.apache.james.core.Username
import org.apache.james.events.Event.EventId
-import org.apache.james.events.{DeserializationResult, Event, EventSerializer}
+import org.apache.james.events.{DeserializationResult, Event, EventSerializer, SerializationResult}
import org.apache.james.jmap.api.change.TypeStateFactory
import org.apache.james.jmap.api.model.{State, TypeName}
import org.apache.james.jmap.core.UuidState
@@ -84,21 +84,25 @@ case class JmapEventSerializer @Inject()(stateChangeEventDTOFactory: StateChange
.forModules(stateChangeEventDTOFactory.dtoModule.asInstanceOf[EventDTOModule[Event, EventDTO]])
.withoutNestedType()
- override def toJson(event: Event): Optional[String] = genericSerializer.maybeSerialize(event)
+ override def toJson(event: Event): SerializationResult = SerializationResult.of(
+ genericSerializer.maybeSerialize(event),
+ "Could not serialize event " + event)
override def asEvent(serialized: String): DeserializationResult = DeserializationResult.of(
genericSerializer.maybeDeserialize(serialized),
"Could not deserialize event " + serialized)
- override def toJsonBytes(event: Event): Optional[Array[Byte]] = genericSerializer.maybeSerializeToBytes(event)
+ override def toJsonBytes(event: Event): SerializationResult = SerializationResult.ofBytes(
+ genericSerializer.maybeSerializeToBytes(event),
+ "Could not serialize event " + event)
override def fromBytes(serialized: Array[Byte]): DeserializationResult = DeserializationResult.of(
genericSerializer.maybeDeserializeFromBytes(serialized),
"Could not deserialize event " + serialized.map(_.toChar).mkString)
- override def toJson(event: util.Collection[Event]): Optional[String] = {
+ override def toJson(event: util.Collection[Event]): SerializationResult = {
if (event.size() != 1) {
- Optional.empty()
+ new SerializationResult.Failure("Not supported for multiple events, please serialize separately")
}
toJson(event.iterator().next())
}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
index 74a7751ca4..3809171135 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java
@@ -26,6 +26,7 @@ import jakarta.inject.Inject;
import org.apache.james.events.EventDeadLetters;
import org.apache.james.events.EventSerializer;
import org.apache.james.events.Group;
+import org.apache.james.events.SerializationResult;
import org.apache.james.task.TaskManager;
import org.apache.james.util.streams.Limit;
import org.apache.james.webadmin.Routes;
@@ -106,9 +107,9 @@ public class EventDeadLettersRoutes implements Routes {
EventDeadLetters.InsertionId insertionId = parseInsertionId(request);
return eventDeadLettersService.getEvent(group, insertionId)
- .flatMap(event -> eventSerializer.toJson(event)
- .map(Mono::just)
- .orElseGet(Mono::empty))
+ .map(eventSerializer::toJson)
+ .filter(SerializationResult::isSuccess)
+ .map(SerializationResult::json)
.switchIfEmpty(Mono.fromRunnable(() -> response.status(HttpStatus.NOT_FOUND_404)))
.block();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org