JAMES-2525 renames ObjectStore to BlobStore This aligns the interface name with the corresponding module. It also frees the name `ObjectStore` for use by the blob-objectstorage module
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2dec9cf3 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2dec9cf3 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2dec9cf3 Branch: refs/heads/master Commit: 2dec9cf37e68ff59617f50f97019776a02020cb8 Parents: 8443ade Author: Jean Helou <[email protected]> Authored: Tue Aug 28 16:03:29 2018 +0200 Committer: Jean Helou <[email protected]> Committed: Wed Aug 29 15:41:52 2018 +0200 ---------------------------------------------------------------------- .../CassandraMailboxSessionMapperFactory.java | 10 +- .../mail/CassandraAttachmentMapper.java | 14 +- .../cassandra/mail/CassandraMessageDAO.java | 18 +-- .../mail/migration/AttachmentV2Migration.java | 10 +- .../CassandraSubscriptionManagerTest.java | 6 +- .../cassandra/mail/utils/GuiceUtils.java | 4 +- .../org/apache/james/blob/api/BlobStore.java | 33 ++++ .../org/apache/james/blob/api/ObjectStore.java | 33 ---- .../james/blob/api/BlobStoreContract.java | 162 +++++++++++++++++++ .../james/blob/api/ObjectStoreContract.java | 162 ------------------- .../james/blob/cassandra/CassandraBlobsDAO.java | 4 +- .../blob/cassandra/CassandraBlobsDAOTest.java | 8 +- .../mailbox/CassandraObjectStoreModule.java | 4 +- .../cassandra/CassandraMailRepository.java | 16 +- .../CassandraMailRepositoryProvider.java | 10 +- 15 files changed, 247 insertions(+), 247 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java index 0eda3c3..1015608 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java @@ -23,7 +23,7 @@ import javax.inject.Inject; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.utils.CassandraUtils; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper; import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper; @@ -87,7 +87,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa private final CassandraAttachmentDAO attachmentDAO; private final CassandraAttachmentDAOV2 attachmentDAOV2; private final CassandraDeletedMessageDAO deletedMessageDAO; - private final ObjectStore objectStore; + private final BlobStore blobStore; private final CassandraAttachmentMessageIdDAO attachmentMessageIdDAO; private final CassandraAttachmentOwnerDAO ownerDAO; private final CassandraACLMapper aclMapper; @@ -102,7 +102,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathDAOImpl mailboxPathDAO, CassandraMailboxPathV2DAO mailboxPathV2DAO, CassandraFirstUnseenDAO firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO, CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, CassandraDeletedMessageDAO deletedMessageDAO, - ObjectStore objectStore, CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, + BlobStore blobStore, CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraAttachmentOwnerDAO ownerDAO, CassandraACLMapper aclMapper, CassandraUserMailboxRightsDAO userMailboxRightsDAO, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) { @@ -122,7 +122,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa this.attachmentDAOV2 = attachmentDAOV2; this.deletedMessageDAO = deletedMessageDAO; this.applicableFlagDAO = applicableFlagDAO; - this.objectStore = objectStore; + this.blobStore = blobStore; this.attachmentMessageIdDAO = attachmentMessageIdDAO; this.aclMapper = aclMapper; this.userMailboxRightsDAO = userMailboxRightsDAO; @@ -171,7 +171,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa @Override public CassandraAttachmentMapper createAttachmentMapper(MailboxSession mailboxSession) { - return new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2, objectStore, attachmentMessageIdDAO, ownerDAO); + return new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2, blobStore, attachmentMessageIdDAO, ownerDAO); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java index 75023e5..7975b35 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java @@ -28,7 +28,7 @@ import java.util.stream.Stream; import javax.inject.Inject; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment; import org.apache.james.mailbox.exception.AttachmentNotFoundException; import org.apache.james.mailbox.exception.MailboxException; @@ -50,15 +50,15 @@ public class CassandraAttachmentMapper implements AttachmentMapper { private final CassandraAttachmentDAO attachmentDAO; private final CassandraAttachmentDAOV2 attachmentDAOV2; - private final ObjectStore objectStore; + private final BlobStore blobStore; private final CassandraAttachmentMessageIdDAO attachmentMessageIdDAO; private final CassandraAttachmentOwnerDAO ownerDAO; @Inject - public CassandraAttachmentMapper(CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, ObjectStore objectStore, CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraAttachmentOwnerDAO ownerDAO) { + public CassandraAttachmentMapper(CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, BlobStore blobStore, CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraAttachmentOwnerDAO ownerDAO) { this.attachmentDAO = attachmentDAO; this.attachmentDAOV2 = attachmentDAOV2; - this.objectStore = objectStore; + this.blobStore = blobStore; this.attachmentMessageIdDAO = attachmentMessageIdDAO; this.ownerDAO = ownerDAO; } @@ -85,7 +85,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper { return CompletableFuture.completedFuture(Optional.empty()); } DAOAttachment daoAttachment = daoAttachmentOptional.get(); - return objectStore.readBytes(daoAttachment.getBlobId()) + return blobStore.readBytes(daoAttachment.getBlobId()) .thenApply(bytes -> Optional.of(daoAttachment.toAttachment(bytes))); } @@ -124,7 +124,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper { @Override public void storeAttachmentForOwner(Attachment attachment, Username owner) throws MailboxException { ownerDAO.addOwner(attachment.getAttachmentId(), owner) - .thenCompose(any -> objectStore.save(attachment.getBytes())) + .thenCompose(any -> blobStore.save(attachment.getBytes())) .thenApply(blobId -> CassandraAttachmentDAOV2.from(attachment, blobId)) .thenCompose(attachmentDAOV2::storeAttachment) .join(); @@ -150,7 +150,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper { } public CompletableFuture<Void> storeAttachmentAsync(Attachment attachment, MessageId ownerMessageId) { - return objectStore.save(attachment.getBytes()) + return blobStore.save(attachment.getBytes()) .thenApply(blobId -> CassandraAttachmentDAOV2.from(attachment, blobId)) .thenCompose(daoAttachment -> storeAttachmentWithIndex(daoAttachment, ownerMessageId)); } http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java index a451adb..1a06cd9 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java @@ -60,7 +60,7 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfigura import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.backends.cassandra.utils.CassandraUtils; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table; import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Attachments; @@ -102,7 +102,7 @@ public class CassandraMessageDAO { private final CassandraAsyncExecutor cassandraAsyncExecutor; private final CassandraTypesProvider typesProvider; - private final ObjectStore objectStore; + private final BlobStore blobStore; private final BlobId.Factory blobIdFactory; private final CassandraConfiguration configuration; private final CassandraUtils cassandraUtils; @@ -117,12 +117,12 @@ public class CassandraMessageDAO { private final Cid.CidParser cidParser; @Inject - public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, ObjectStore objectStore, + public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, BlobStore blobStore, BlobId.Factory blobIdFactory, CassandraConfiguration cassandraConfiguration, CassandraUtils cassandraUtils, CassandraMessageId.Factory messageIdFactory) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.typesProvider = typesProvider; - this.objectStore = objectStore; + this.blobStore = blobStore; this.blobIdFactory = blobIdFactory; this.configuration = cassandraConfiguration; this.cassandraUtils = cassandraUtils; @@ -139,9 +139,9 @@ public class CassandraMessageDAO { } @VisibleForTesting - public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, ObjectStore objectStore, + public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, BlobStore blobStore, BlobId.Factory blobIdFactory, CassandraUtils cassandraUtils, CassandraMessageId.Factory messageIdFactory) { - this(session, typesProvider, objectStore, blobIdFactory, CassandraConfiguration.DEFAULT_CONFIGURATION, cassandraUtils, messageIdFactory); + this(session, typesProvider, blobStore, blobIdFactory, CassandraConfiguration.DEFAULT_CONFIGURATION, cassandraUtils, messageIdFactory); } private PreparedStatement prepareSelect(Session session, String[] fields) { @@ -185,8 +185,8 @@ public class CassandraMessageDAO { byte[] headerContent = IOUtils.toByteArray(message.getHeaderContent()); byte[] bodyContent = IOUtils.toByteArray(message.getBodyContent()); return CompletableFutureUtil.combine( - objectStore.save(headerContent), - objectStore.save(bodyContent), + blobStore.save(headerContent), + blobStore.save(bodyContent), Pair::of); } catch (IOException e) { throw new MailboxException("Error saving mail content", e); @@ -372,7 +372,7 @@ public class CassandraMessageDAO { } private CompletableFuture<byte[]> getFieldContent(String field, Row row) { - return objectStore.readBytes(blobIdFactory.from(row.getString(field))); + return blobStore.readBytes(blobIdFactory.from(row.getString(field))); } public static MessageResult notFound(ComposedMessageIdWithMetaData id) { http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java index 0e074f4..148d395 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java @@ -22,7 +22,7 @@ package org.apache.james.mailbox.cassandra.mail.migration; import javax.inject.Inject; import org.apache.james.backends.cassandra.migration.Migration; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2; import org.apache.james.mailbox.model.Attachment; @@ -34,15 +34,15 @@ public class AttachmentV2Migration implements Migration { private static final Logger LOGGER = LoggerFactory.getLogger(AttachmentV2Migration.class); private final CassandraAttachmentDAO attachmentDAOV1; private final CassandraAttachmentDAOV2 attachmentDAOV2; - private final ObjectStore objectStore; + private final BlobStore blobStore; @Inject public AttachmentV2Migration(CassandraAttachmentDAO attachmentDAOV1, CassandraAttachmentDAOV2 attachmentDAOV2, - ObjectStore objectStore) { + BlobStore blobStore) { this.attachmentDAOV1 = attachmentDAOV1; this.attachmentDAOV2 = attachmentDAOV2; - this.objectStore = objectStore; + this.blobStore = blobStore; } @Override @@ -59,7 +59,7 @@ public class AttachmentV2Migration implements Migration { private Result migrateAttachment(Attachment attachment) { try { - objectStore.save(attachment.getBytes()) + blobStore.save(attachment.getBytes()) .thenApply(blobId -> CassandraAttachmentDAOV2.from(attachment, blobId)) .thenCompose(attachmentDAOV2::storeAttachment) .thenCompose(any -> attachmentDAOV1.deleteAttachment(attachment.getAttachmentId())) http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java index 736dcdc..517b85e 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java @@ -23,7 +23,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.utils.CassandraUtils; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailbox.AbstractSubscriptionManagerTest; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper; @@ -102,7 +102,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage CassandraAttachmentOwnerDAO ownerDAO = null; CassandraACLMapper aclMapper = null; CassandraUserMailboxRightsDAO userMailboxRightsDAO = null; - ObjectStore objectStore = null; + BlobStore blobStore = null; CassandraUidProvider uidProvider = null; CassandraModSeqProvider modSeqProvider = null; return new CassandraSubscriptionManager( @@ -123,7 +123,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage attachmentDAO, attachmentDAOV2, deletedMessageDAO, - objectStore, + blobStore, attachmentMessageIdDAO, ownerDAO, aclMapper, http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java index 8da3d92..795552c 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java @@ -23,7 +23,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; @@ -49,7 +49,7 @@ public class GuiceUtils { Modules.combine( binder -> binder.bind(MessageId.Factory.class).toInstance(messageIdFactory), binder -> binder.bind(BlobId.Factory.class).toInstance(new HashBlobId.Factory()), - binder -> binder.bind(ObjectStore.class).to(CassandraBlobsDAO.class), + binder -> binder.bind(BlobStore.class).to(CassandraBlobsDAO.class), binder -> binder.bind(Session.class).toInstance(session), binder -> binder.bind(CassandraTypesProvider.class).toInstance(typesProvider), binder -> binder.bind(CassandraConfiguration.class).toInstance(configuration))); http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java new file mode 100644 index 0000000..55527da --- /dev/null +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java @@ -0,0 +1,33 @@ +/**************************************************************** + * 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.blob.api; + +import java.io.InputStream; +import java.util.concurrent.CompletableFuture; + +public interface BlobStore { + + CompletableFuture<BlobId> save(byte[] data); + + CompletableFuture<BlobId> save(InputStream data); + + CompletableFuture<byte[]> readBytes(BlobId blobId); + + InputStream read(BlobId blobId); +} http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java deleted file mode 100644 index 8b22d55..0000000 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************** - * 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.blob.api; - -import java.io.InputStream; -import java.util.concurrent.CompletableFuture; - -public interface ObjectStore { - - CompletableFuture<BlobId> save(byte[] data); - - CompletableFuture<BlobId> save(InputStream data); - - CompletableFuture<byte[]> readBytes(BlobId blobId); - - InputStream read(BlobId blobId); -} http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java new file mode 100644 index 0000000..40376a1 --- /dev/null +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java @@ -0,0 +1,162 @@ +/**************************************************************** + * 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.blob.api; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +import com.google.common.base.Strings; + +public interface BlobStoreContract { + + BlobStore testee(); + + BlobId.Factory blobIdFactory(); + + @Test + default void saveShouldReturnEmptyWhenNullData() throws Exception { + assertThatThrownBy(() -> testee().save((byte[]) null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void saveShouldReturnEmptyWhenNullInputStream() throws Exception { + assertThatThrownBy(() -> testee().save((InputStream) null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void saveShouldSaveEmptyData() throws Exception { + BlobId blobId = testee().save(new byte[]{}).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); + } + + @Test + default void saveShouldSaveEmptyInputStream() throws Exception { + BlobId blobId = testee().save(new ByteArrayInputStream(new byte[]{})).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); + } + + @Test + default void saveShouldReturnBlobId() throws Exception { + BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } + + @Test + default void saveShouldReturnBlobIdOfInputStream() throws Exception { + BlobId blobId = + testee().save(new ByteArrayInputStream("toto".getBytes(StandardCharsets.UTF_8))).join(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } + + @Test + default void readBytesShouldBeEmptyWhenNoExisting() throws IOException { + byte[] bytes = testee().readBytes(blobIdFactory().from("unknown")).join(); + + assertThat(bytes).isEmpty(); + } + + @Test + default void readBytesShouldReturnSavedData() throws IOException { + BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo("toto"); + } + + @Test + default void readBytesShouldReturnLongSavedData() throws IOException { + String longString = Strings.repeat("0123456789\n", 1000); + BlobId blobId = testee().save(longString.getBytes(StandardCharsets.UTF_8)).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(longString); + } + + @Test + default void readBytesShouldReturnBigSavedData() throws IOException { + // 12 MB of text + String bigString = Strings.repeat("0123456789\r\n", 1024 * 1024); + BlobId blobId = testee().save(bigString.getBytes(StandardCharsets.UTF_8)).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(bigString); + } + + @Test + default void readShouldBeEmptyWhenNoExistingStream() throws IOException { + InputStream stream = testee().read(blobIdFactory().from("unknown")); + + assertThat(stream.read()).isEqualTo(IOUtils.EOF); + } + + @Test + default void readShouldReturnSavedData() throws IOException { + byte[] bytes = "toto".getBytes(StandardCharsets.UTF_8); + BlobId blobId = testee().save(bytes).join(); + + InputStream read = testee().read(blobId); + + assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); + } + + @Test + default void readShouldReturnLongSavedData() throws IOException { + String longString = Strings.repeat("0123456789\n", 1000); + byte[] bytes = longString.getBytes(StandardCharsets.UTF_8); + BlobId blobId = testee().save(bytes).join(); + + InputStream read = testee().read(blobId); + + assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); + } + + @Test + default void readShouldReturnBigSavedData() throws IOException { + // 12 MB of text + String bigString = Strings.repeat("0123456789\r\n", 1024 * 1024); + byte[] bytes = bigString.getBytes(StandardCharsets.UTF_8); + BlobId blobId = testee().save(bytes).join(); + + InputStream read = testee().read(blobId); + + assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java deleted file mode 100644 index dfd7038..0000000 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java +++ /dev/null @@ -1,162 +0,0 @@ -/**************************************************************** - * 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.blob.api; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Test; - -import com.google.common.base.Strings; - -public interface ObjectStoreContract { - - ObjectStore testee(); - - BlobId.Factory blobIdFactory(); - - @Test - default void saveShouldReturnEmptyWhenNullData() throws Exception { - assertThatThrownBy(() -> testee().save((byte[]) null)) - .isInstanceOf(NullPointerException.class); - } - - @Test - default void saveShouldReturnEmptyWhenNullInputStream() throws Exception { - assertThatThrownBy(() -> testee().save((InputStream) null)) - .isInstanceOf(NullPointerException.class); - } - - @Test - default void saveShouldSaveEmptyData() throws Exception { - BlobId blobId = testee().save(new byte[]{}).join(); - - byte[] bytes = testee().readBytes(blobId).join(); - - assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); - } - - @Test - default void saveShouldSaveEmptyInputStream() throws Exception { - BlobId blobId = testee().save(new ByteArrayInputStream(new byte[]{})).join(); - - byte[] bytes = testee().readBytes(blobId).join(); - - assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); - } - - @Test - default void saveShouldReturnBlobId() throws Exception { - BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); - - assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); - } - - @Test - default void saveShouldReturnBlobIdOfInputStream() throws Exception { - BlobId blobId = - testee().save(new ByteArrayInputStream("toto".getBytes(StandardCharsets.UTF_8))).join(); - - assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); - } - - @Test - default void readBytesShouldBeEmptyWhenNoExisting() throws IOException { - byte[] bytes = testee().readBytes(blobIdFactory().from("unknown")).join(); - - assertThat(bytes).isEmpty(); - } - - @Test - default void readBytesShouldReturnSavedData() throws IOException { - BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); - - byte[] bytes = testee().readBytes(blobId).join(); - - assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo("toto"); - } - - @Test - default void readBytesShouldReturnLongSavedData() throws IOException { - String longString = Strings.repeat("0123456789\n", 1000); - BlobId blobId = testee().save(longString.getBytes(StandardCharsets.UTF_8)).join(); - - byte[] bytes = testee().readBytes(blobId).join(); - - assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(longString); - } - - @Test - default void readBytesShouldReturnBigSavedData() throws IOException { - // 12 MB of text - String bigString = Strings.repeat("0123456789\r\n", 1024 * 1024); - BlobId blobId = testee().save(bigString.getBytes(StandardCharsets.UTF_8)).join(); - - byte[] bytes = testee().readBytes(blobId).join(); - - assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(bigString); - } - - @Test - default void readShouldBeEmptyWhenNoExistingStream() throws IOException { - InputStream stream = testee().read(blobIdFactory().from("unknown")); - - assertThat(stream.read()).isEqualTo(IOUtils.EOF); - } - - @Test - default void readShouldReturnSavedData() throws IOException { - byte[] bytes = "toto".getBytes(StandardCharsets.UTF_8); - BlobId blobId = testee().save(bytes).join(); - - InputStream read = testee().read(blobId); - - assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); - } - - @Test - default void readShouldReturnLongSavedData() throws IOException { - String longString = Strings.repeat("0123456789\n", 1000); - byte[] bytes = longString.getBytes(StandardCharsets.UTF_8); - BlobId blobId = testee().save(bytes).join(); - - InputStream read = testee().read(blobId); - - assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); - } - - @Test - default void readShouldReturnBigSavedData() throws IOException { - // 12 MB of text - String bigString = Strings.repeat("0123456789\r\n", 1024 * 1024); - byte[] bytes = bigString.getBytes(StandardCharsets.UTF_8); - BlobId blobId = testee().save(bytes).join(); - - InputStream read = testee().read(blobId); - - assertThat(read).hasSameContentAs(new ByteArrayInputStream(bytes)); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java index ec47e4a..557e927 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java @@ -41,8 +41,8 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.HashBlobId; -import org.apache.james.blob.api.ObjectStore; import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.blob.cassandra.BlobTable.BlobParts; import org.apache.james.blob.cassandra.utils.DataChunker; @@ -62,7 +62,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Bytes; -public class CassandraBlobsDAO implements ObjectStore { +public class CassandraBlobsDAO implements BlobStore { private static final Logger LOGGER = LoggerFactory.getLogger(CassandraBlobsDAO.class); private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement insert; http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java index 98e4e6e..b50794c 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java @@ -30,8 +30,8 @@ import org.apache.james.backends.cassandra.DockerCassandraExtension.DockerCassan import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.HashBlobId; -import org.apache.james.blob.api.ObjectStore; -import org.apache.james.blob.api.ObjectStoreContract; +import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BlobStoreContract; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -42,7 +42,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import com.google.common.base.Strings; @ExtendWith(DockerCassandraExtension.class) -public class CassandraBlobsDAOTest implements ObjectStoreContract { +public class CassandraBlobsDAOTest implements BlobStoreContract { private static final int CHUNK_SIZE = 10240; private static final int MULTIPLE_CHUNK_SIZE = 3; @@ -75,7 +75,7 @@ public class CassandraBlobsDAOTest implements ObjectStoreContract { } @Override - public ObjectStore testee() { + public BlobStore testee() { return testee; } http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java index ea715f8..671b86e 100644 --- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java +++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java @@ -21,8 +21,8 @@ package org.apache.james.modules.mailbox; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.HashBlobId; -import org.apache.james.blob.api.ObjectStore; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; @@ -36,7 +36,7 @@ public class CassandraObjectStoreModule extends AbstractModule { bind(CassandraBlobsDAO.class).in(Scopes.SINGLETON); bind(HashBlobId.Factory.class).in(Scopes.SINGLETON); - bind(ObjectStore.class).to(CassandraBlobsDAO.class); + bind(BlobStore.class).to(CassandraBlobsDAO.class); bind(BlobId.Factory.class).to(HashBlobId.Factory.class); Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java index 9074481..dc2db90 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java +++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java @@ -38,7 +38,7 @@ import javax.mail.internet.MimeMessage; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryUrl; @@ -56,14 +56,14 @@ public class CassandraMailRepository implements MailRepository { private final CassandraMailRepositoryKeysDAO keysDAO; private final CassandraMailRepositoryCountDAO countDAO; private final CassandraMailRepositoryMailDAO mailDAO; - private final ObjectStore objectStore; + private final BlobStore blobStore; - public CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO, ObjectStore objectStore) { + public CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO, BlobStore blobStore) { this.url = url; this.keysDAO = keysDAO; this.countDAO = countDAO; this.mailDAO = mailDAO; - this.objectStore = objectStore; + this.blobStore = blobStore; } @Override @@ -73,8 +73,8 @@ public class CassandraMailRepository implements MailRepository { Pair<byte[], byte[]> splitHeaderBody = splitHeaderBody(mail.getMessage()); CompletableFuture<Pair<BlobId, BlobId>> blobIds = CompletableFutureUtil.combine( - objectStore.save(splitHeaderBody.getLeft()), - objectStore.save(splitHeaderBody.getRight()), + blobStore.save(splitHeaderBody.getLeft()), + blobStore.save(splitHeaderBody.getRight()), Pair::of); blobIds.thenCompose(Throwing.function(pair -> @@ -158,8 +158,8 @@ public class CassandraMailRepository implements MailRepository { public CompletableFuture<Mail> toMail(CassandraMailRepositoryMailDAO.MailDTO mailDTO) { return CompletableFutureUtil.combine( - objectStore.readBytes(mailDTO.getHeaderBlobId()), - objectStore.readBytes(mailDTO.getBodyBlobId()), + blobStore.readBytes(mailDTO.getHeaderBlobId()), + blobStore.readBytes(mailDTO.getBodyBlobId()), Bytes::concat) .thenApply(this::toMimeMessage) .thenApply(mimeMessage -> mailDTO.getMailBuilder() http://git-wip-us.apache.org/repos/asf/james-project/blob/2dec9cf3/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java index ddbd1ba..1eb71bb 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java +++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java @@ -21,7 +21,7 @@ package org.apache.james.mailrepository.cassandra; import javax.inject.Inject; -import org.apache.james.blob.api.ObjectStore; +import org.apache.james.blob.api.BlobStore; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryUrl; @@ -30,14 +30,14 @@ public class CassandraMailRepositoryProvider implements MailRepositoryProvider { private final CassandraMailRepositoryKeysDAO keysDAO; private final CassandraMailRepositoryCountDAO countDAO; private final CassandraMailRepositoryMailDAO mailDAO; - private final ObjectStore objectStore; + private final BlobStore blobStore; @Inject - public CassandraMailRepositoryProvider(CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO, ObjectStore objectStore) { + public CassandraMailRepositoryProvider(CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDAO mailDAO, BlobStore blobStore) { this.keysDAO = keysDAO; this.countDAO = countDAO; this.mailDAO = mailDAO; - this.objectStore = objectStore; + this.blobStore = blobStore; } @Override @@ -47,6 +47,6 @@ public class CassandraMailRepositoryProvider implements MailRepositoryProvider { @Override public MailRepository provide(MailRepositoryUrl url) { - return new CassandraMailRepository(url, keysDAO, countDAO, mailDAO, objectStore); + return new CassandraMailRepository(url, keysDAO, countDAO, mailDAO, blobStore); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
