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 376052071a7a740baf5363f9db1c37ab5f422677 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Thu Jul 11 16:00:58 2019 +0200 JAMES-2810 Extract JSON serialization concern to its own class --- .../apache/james/vault/metadata/MetadataDAO.java | 29 ++-------- .../james/vault/metadata/MetadataSerializer.java | 66 ++++++++++++++++++++++ .../CassandraDeletedMessageMetadataVaultTest.java | 2 +- .../james/vault/metadata/MetadataDAOTest.java | 3 +- 4 files changed, 74 insertions(+), 26 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java index 34f77f5..4669a5e 100644 --- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java +++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java @@ -34,24 +34,14 @@ import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.blob.api.BucketName; import org.apache.james.core.User; import org.apache.james.mailbox.model.MessageId; -import org.apache.james.vault.dto.DeletedMessageWithStorageInformationConverter; -import org.apache.james.vault.dto.DeletedMessageWithStorageInformationDTO; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.github.fge.lambdas.Throwing; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; class MetadataDAO { - private static final Logger LOGGER = LoggerFactory.getLogger(MetadataDAO.class); - private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement addStatement; private final PreparedStatement removeStatement; @@ -59,11 +49,9 @@ class MetadataDAO { private final PreparedStatement readStatement; private final PreparedStatement readMessageIdStatement; private final MessageId.Factory messageIdFactory; - private final ObjectMapper objectMapper; - private final DeletedMessageWithStorageInformationConverter dtoConverter; - + private final MetadataSerializer metadataSerializer; - MetadataDAO(Session session, MessageId.Factory messageIdFactory, DeletedMessageWithStorageInformationConverter dtoConverter) { + MetadataDAO(Session session, MessageId.Factory messageIdFactory, MetadataSerializer metadataSerializer) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.addStatement = prepareAdd(session); this.removeStatement = prepareRemove(session); @@ -71,10 +59,7 @@ class MetadataDAO { this.readStatement = prepareRead(session, PAYLOAD); this.readMessageIdStatement = prepareRead(session, MESSAGE_ID); this.messageIdFactory = messageIdFactory; - this.dtoConverter = dtoConverter; - this.objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .setSerializationInclusion(JsonInclude.Include.NON_ABSENT); + this.metadataSerializer = metadataSerializer; } private PreparedStatement prepareRead(Session session, String fieldName) { @@ -107,8 +92,7 @@ class MetadataDAO { Mono<Void> store(DeletedMessageWithStorageInformation metadata) { return Mono.just(metadata) - .map(DeletedMessageWithStorageInformationDTO::toDTO) - .map(Throwing.function(objectMapper::writeValueAsString)) + .map(metadataSerializer::serialize) .flatMap(payload -> cassandraAsyncExecutor.executeVoid(addStatement.bind() .setString(BUCKET_NAME, metadata.getStorageInformation().getBucketName().asString()) .setString(OWNER, metadata.getDeletedMessage().getOwner().asString()) @@ -122,10 +106,7 @@ class MetadataDAO { .setString(BUCKET_NAME, bucketName.asString()) .setString(OWNER, user.asString())) .map(row -> row.getString(PAYLOAD)) - .flatMap(string -> Mono.fromCallable(() -> objectMapper.readValue(string, DeletedMessageWithStorageInformationDTO.class)) - .onErrorResume(e -> Mono.fromRunnable(() -> LOGGER.error("Error deserializing JSON metadata", e)))) - .flatMap(dto -> Mono.fromCallable(() -> dtoConverter.toDomainObject(dto)) - .onErrorResume(e -> Mono.fromRunnable(() -> LOGGER.error("Error deserializing DTO", e)))); + .flatMap(metadataSerializer::deserialize); } Flux<MessageId> retrieveMessageIds(BucketName bucketName, User user) { diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataSerializer.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataSerializer.java new file mode 100644 index 0000000..7f62f96 --- /dev/null +++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataSerializer.java @@ -0,0 +1,66 @@ +/**************************************************************** + * 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.vault.metadata; + +import org.apache.james.vault.dto.DeletedMessageWithStorageInformationConverter; +import org.apache.james.vault.dto.DeletedMessageWithStorageInformationDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; + +import reactor.core.publisher.Mono; + +class MetadataSerializer { + private static final Logger LOGGER = LoggerFactory.getLogger(MetadataSerializer.class); + + + private final ObjectMapper objectMapper; + private final DeletedMessageWithStorageInformationConverter dtoConverter; + + MetadataSerializer(DeletedMessageWithStorageInformationConverter dtoConverter) { + this.dtoConverter = dtoConverter; + this.objectMapper = new ObjectMapper() + .registerModule(new Jdk8Module()) + .setSerializationInclusion(JsonInclude.Include.NON_ABSENT); + } + + Mono<DeletedMessageWithStorageInformation> deserialize(String payload) { + return Mono.just(payload) + .flatMap(string -> Mono.fromCallable(() -> objectMapper.readValue(string, DeletedMessageWithStorageInformationDTO.class)) + .onErrorResume(e -> Mono.fromRunnable(() -> LOGGER.error("Error deserializing JSON metadata", e)))) + .flatMap(dto -> Mono.fromCallable(() -> dtoConverter.toDomainObject(dto)) + .onErrorResume(e -> Mono.fromRunnable(() -> LOGGER.error("Error deserializing DTO", e)))); + + } + + String serialize(DeletedMessageWithStorageInformation message) { + DeletedMessageWithStorageInformationDTO dto = DeletedMessageWithStorageInformationDTO.toDTO(message); + + try { + return objectMapper.writeValueAsString(dto); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java index b823d75..bb4cd53 100644 --- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java +++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java @@ -63,7 +63,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM InMemoryMessageId.Factory messageIdFactory = new InMemoryMessageId.Factory(); DeletedMessageWithStorageInformationConverter dtoConverter = new DeletedMessageWithStorageInformationConverter(blobIdFactory, messageIdFactory, new InMemoryId.Factory()); - metadataDAO = spy(new MetadataDAO(cassandra.getConf(), messageIdFactory, dtoConverter)); + metadataDAO = spy(new MetadataDAO(cassandra.getConf(), messageIdFactory, new MetadataSerializer(dtoConverter))); storageInformationDAO = spy(new StorageInformationDAO(cassandra.getConf(), blobIdFactory)); userPerBucketDAO = spy(new UserPerBucketDAO(cassandra.getConf())); diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java index 956d4e1..c333ff6 100644 --- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java +++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java @@ -51,7 +51,8 @@ class MetadataDAOTest { DeletedMessageWithStorageInformationConverter dtoConverter = new DeletedMessageWithStorageInformationConverter( new HashBlobId.Factory(), new InMemoryMessageId.Factory(), new InMemoryId.Factory()); - testee = new MetadataDAO(cassandra.getConf(), new InMemoryMessageId.Factory(), dtoConverter); + testee = new MetadataDAO(cassandra.getConf(), new InMemoryMessageId.Factory(), + new MetadataSerializer(dtoConverter)); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org