From 2309992eeab2ff543ca128ef49a88bb1c6e9ccfc Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Wed, 7 Jan 2026 23:20:34 +0100 Subject: [PATCH 1/6] [NO_REVIEW] #2904 [ENHANCEMENT] Default bucket is actually static --- .../cassandra/DeleteMessageListener.java | 7 +- .../mail/CassandraAttachmentMapper.java | 7 +- .../cassandra/mail/CassandraMessageDAOV3.java | 7 +- .../mail/CassandraMessageIdMapper.java | 3 +- .../mail/CassandraMessageMapper.java | 3 +- .../DeletedMessageVaultDeletionListener.java | 5 +- .../vault/DeletedMessageVaultHookTest.java | 1 - .../BlobStoreDeletedMessageVaultTest.java | 1 - .../postgres/DeleteMessageListener.java | 5 +- .../mail/PostgresAttachmentMapper.java | 5 +- .../mail/PostgresMessageIdMapper.java | 3 +- .../postgres/mail/PostgresMessageMapper.java | 3 +- .../mail/PostgresMessageRetriever.java | 3 +- .../DeleteMessageListenerContract.java | 9 +- .../postgres/DeleteMessageListenerTest.java | 3 +- .../DeleteMessageListenerWithRLSTest.java | 3 +- .../PostgresMailboxManagerAttachmentTest.java | 3 +- .../PostgresMailboxManagerProvider.java | 5 +- .../postgres/PostgresTestSystemFixture.java | 3 +- ...sAnnotationMapperRowLevelSecurityTest.java | 5 +- .../mail/PostgresAttachmentMapperTest.java | 3 +- .../postgres/mail/PostgresMapperProvider.java | 3 +- ...gresMessageMapperRowLevelSecurityTest.java | 5 +- ...LSSupportPostgresMailboxMapperACLTest.java | 3 +- .../postgres/host/PostgresHostSystem.java | 3 +- .../james/NamespaceConfigurationTest.java | 10 +-- .../org/apache/james/blob/api/BlobStore.java | 6 -- .../apache/james/blob/api/BlobStoreDAO.java | 20 ----- .../james/blob/api/MetricableBlobStore.java | 10 --- .../blob/api/ObjectStorageHealthCheck.java | 5 +- .../james/blob/api/BlobStoreContract.java | 83 +++++++------------ .../blob/api/BucketBlobStoreContract.java | 30 ------- .../api/DeduplicationBlobStoreContract.java | 9 +- .../blob/api/DeleteBlobStoreContract.java | 55 +++++------- .../blob/api/MetricableBlobStoreContract.java | 28 +++---- .../blob/cassandra/CassandraBlobStoreDAO.java | 7 +- .../cassandra/CassandraBlobStoreFactory.java | 6 +- .../blob/cassandra/cache/CachedBlobStore.java | 20 ++--- .../CassandraBlobStoreClOneTest.java | 47 +++++------ .../cassandra/CassandraBlobStoreContract.java | 19 +++-- .../cassandra/CassandraBlobStoreDAOTest.java | 2 - .../cassandra/CassandraBlobStoreTest.java | 4 +- .../CassandraPassTroughBlobStoreTest.java | 4 +- .../java/org/apache/james/blob/api/Store.java | 10 +-- .../file/LocalFileBlobExportMechanism.java | 3 +- .../LocalFileBlobExportMechanismTest.java | 14 ++-- .../file/FileBlobStorePassThroughTest.java | 1 - .../james/blob/file/FileBlobStoreTest.java | 1 - .../MemoryBlobStorePassThroughTest.java | 1 - .../blob/memory/MemoryBlobStoreTest.java | 1 - .../objectstorage/aws/BucketNameResolver.java | 12 ++- .../aws/BucketNameResolverTest.java | 10 +-- .../aws/S3DeDuplicationBlobStoreTest.java | 1 - .../objectstorage/aws/S3NamespaceTest.java | 1 - .../aws/S3PassThroughBlobStoreTest.java | 1 - .../aws/S3PrefixAndNamespaceTest.java | 1 - .../blob/objectstorage/aws/S3PrefixTest.java | 1 - .../S3WithMinIOGenerationAwareBlobIdTest.java | 28 +++---- .../blob/deduplication/BlobStoreFactory.java | 18 +--- .../DeDuplicationBlobStore.scala | 7 +- .../deduplication/PassThroughBlobStore.scala | 16 ++-- .../BloomFilterGCAlgorithmContract.java | 2 +- .../james/blob/mail/MimeMessageStore.java | 9 +- .../james/blob/mail/MimeMessageStoreTest.java | 6 +- .../james/modules/BlobMemoryModule.java | 6 -- .../modules/mailbox/DefaultBucketModule.java | 35 -------- .../blobstore/BlobStoreModulesChooser.java | 4 - .../BlobstoreMailRepositoryModule.java | 9 +- ...MailRepositoryBlobReferenceSourceTest.java | 3 +- .../postgres/PostgresMailRepositoryTest.java | 1 - .../blob/BlobMailRepository.scala | 9 +- .../blob/BlobMailRepositoryFactory.scala | 22 ++--- .../blob/BlobMailRepositoryTest.java | 16 +--- .../james/webadmin/routes/BlobRoutes.java | 7 +- .../james/webadmin/routes/BlobRoutesTest.java | 3 +- .../data/jmap/JmapUploadRoutesTest.java | 5 +- .../webadmin/vault/routes/ExportService.java | 3 +- .../DeletedMessagesVaultRoutesTest.java | 3 +- .../james/webadmin/service/ExportService.java | 5 +- .../webadmin/service/ExportServiceTest.java | 7 +- .../service/ExportServiceTestSystem.java | 1 - .../pulsar/PulsarMailQueueFactoryTest.java | 3 +- .../queue/pulsar/PulsarMailQueueTest.java | 2 +- 83 files changed, 253 insertions(+), 501 deletions(-) delete mode 100644 server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/DefaultBucketModule.java diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java index 59278aad9b2..d2f4d1d9460 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java @@ -31,6 +31,7 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.core.Username; import org.apache.james.events.Event; import org.apache.james.events.EventBus; @@ -239,8 +240,8 @@ private Mono handleMessageDeletionAsPartOfMailboxDeletion(CassandraMessage private Mono deleteMessageBlobs(MessageRepresentation message) { return Flux.merge( - blobStore.delete(blobStore.getDefaultBucketName(), message.getHeaderId()), - blobStore.delete(blobStore.getDefaultBucketName(), message.getBodyId())) + blobStore.delete(BucketName.DEFAULT, message.getHeaderId()), + blobStore.delete(BucketName.DEFAULT, message.getBodyId())) .then() .thenReturn(message); } @@ -253,7 +254,7 @@ private Mono deleteUnreferencedAttachments(MessageRepresentation message) return Flux.fromIterable(message.getAttachments()) .concatMap(attachment -> attachmentDAO.getAttachment(attachment.getAttachmentId()) .map(CassandraAttachmentDAOV2.DAOAttachment::getBlobId) - .flatMap(blobId -> Mono.from(blobStore.delete(blobStore.getDefaultBucketName(), blobId))) + .flatMap(blobId -> Mono.from(blobStore.delete(BucketName.DEFAULT, blobId))) .then(attachmentDAO.delete(attachment.getAttachmentId()))) .then(); } 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 07c0b1363ec..1b6e937f9d8 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 @@ -31,6 +31,7 @@ import jakarta.inject.Inject; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment; import org.apache.james.mailbox.exception.AttachmentNotFoundException; import org.apache.james.mailbox.model.AttachmentId; @@ -92,7 +93,7 @@ public List getAttachments(Collection attachme @Override public InputStream loadAttachmentContent(AttachmentId attachmentId) throws AttachmentNotFoundException { return attachmentDAOV2.getAttachment(attachmentId) - .map(daoAttachment -> blobStore.read(blobStore.getDefaultBucketName(), daoAttachment.getBlobId(), LOW_COST)) + .map(daoAttachment -> blobStore.read(BucketName.DEFAULT, daoAttachment.getBlobId(), LOW_COST)) .blockOptional() .orElseThrow(() -> new AttachmentNotFoundException(attachmentId.toString())); } @@ -100,7 +101,7 @@ public InputStream loadAttachmentContent(AttachmentId attachmentId) throws Attac @Override public Mono loadAttachmentContentReactive(AttachmentId attachmentId) { return attachmentDAOV2.getAttachment(attachmentId) - .flatMap(daoAttachment -> Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), daoAttachment.getBlobId(), LOW_COST))) + .flatMap(daoAttachment -> Mono.from(blobStore.readReactive(BucketName.DEFAULT, daoAttachment.getBlobId(), LOW_COST))) .switchIfEmpty(Mono.error(() -> new AttachmentNotFoundException(attachmentId.toString()))); } @@ -133,7 +134,7 @@ private Mono storeAttachmentAsync(ParsedAttachment pa AttachmentId attachmentId = attachmentIdAssignationStrategy.assign(parsedAttachment, ownerMessageId); ByteSource content = parsedAttachment.getContent(); long size = content.size(); - return Mono.from(blobStore.save(blobStore.getDefaultBucketName(), content, LOW_COST)) + return Mono.from(blobStore.save(BucketName.DEFAULT, content, LOW_COST)) .map(blobId -> new DAOAttachment(ownerMessageId, attachmentId, blobId, parsedAttachment.getContentType(), size)) .flatMap(this::storeAttachmentWithIndex) .thenReturn(parsedAttachment.asMessageAttachment(attachmentId, size, ownerMessageId)); diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java index a9221f0c5f4..a4efc774309 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java @@ -68,6 +68,7 @@ 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.BucketName; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Attachments; import org.apache.james.mailbox.model.ByteContent; @@ -234,8 +235,8 @@ public long size() { } }; - Mono headerFuture = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), headerContent, SIZE_BASED)); - Mono bodyFuture = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), bodyByteSource, LOW_COST)); + Mono headerFuture = Mono.from(blobStore.save(BucketName.DEFAULT, headerContent, SIZE_BASED)); + Mono bodyFuture = Mono.from(blobStore.save(BucketName.DEFAULT, bodyByteSource, LOW_COST)); return headerFuture.zipWith(bodyFuture); }); @@ -413,7 +414,7 @@ private Mono getFullContent(BlobId headerId, BlobId bodyId) { } private Mono getContent(BlobId blobId, BlobStore.StoragePolicy storagePolicy) { - return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), blobId, storagePolicy)); + return Mono.from(blobStore.readBytes(BucketName.DEFAULT, blobId, storagePolicy)); } private BlobId retrieveBlobId(CqlIdentifier field, Row row) { diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java index efd8b2da859..89bed1e2d0d 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java @@ -38,6 +38,7 @@ import org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.ModSeq; import org.apache.james.mailbox.cassandra.ids.CassandraId; @@ -135,7 +136,7 @@ private Mono toMailboxMessage(CassandraMessageMetadata metadata, return Mono.just(metadata.asMailboxMessage(EMPTY_BYTE_ARRAY)); } if (fetchType == FetchType.HEADERS && metadata.isComplete()) { - return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), metadata.getHeaderContent().get(), SIZE_BASED)) + return Mono.from(blobStore.readBytes(BucketName.DEFAULT, metadata.getHeaderContent().get(), SIZE_BASED)) .map(metadata::asMailboxMessage); } return messageDAOV3.retrieveMessage(metadata.getComposedMessageId(), fetchType) diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index 2ded9ae3ab2..e84f05fde7a 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -43,6 +43,7 @@ import org.apache.james.backends.cassandra.init.configuration.JamesExecutionProfiles; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.ApplicableFlagBuilder; import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.MessageManager.FlagsUpdateMode; @@ -267,7 +268,7 @@ private Mono toMailboxMessage(CassandraMessageMetadata metadata, return Mono.just(metadata.asMailboxMessage(EMPTY_BYTE_ARRAY)); } if (fetchType == FetchType.HEADERS && metadata.isComplete()) { - return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), metadata.getHeaderContent().get(), SIZE_BASED)) + return Mono.from(blobStore.readBytes(BucketName.DEFAULT, metadata.getHeaderContent().get(), SIZE_BASED)) .map(metadata::asMailboxMessage); } return messageDAOV3.retrieveMessage(metadata.getComposedMessageId(), fetchType) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultDeletionListener.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultDeletionListener.java index bfdc1cc9e06..936d2070e65 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultDeletionListener.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultDeletionListener.java @@ -34,6 +34,7 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; import org.apache.james.events.Event; @@ -114,7 +115,7 @@ public Mono forMessage(MessageContentDeletionEvent messageContentDeletionE .subject(mimeMessage.map(Message::getSubject)) .build(); - return Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), blobIdFactory.parse(messageContentDeletionEvent.bodyBlobId()), BlobStore.StoragePolicy.LOW_COST)) + return Mono.from(blobStore.readReactive(BucketName.DEFAULT, blobIdFactory.parse(messageContentDeletionEvent.bodyBlobId()), BlobStore.StoragePolicy.LOW_COST)) .map(bodyStream -> new SequenceInputStream(new ByteArrayInputStream(bytes), bodyStream)) .flatMap(bodyStream -> Mono.from(deletedMessageVault.append(deletedMessage, bodyStream))); }); @@ -122,7 +123,7 @@ public Mono forMessage(MessageContentDeletionEvent messageContentDeletionE private Mono fetchMessageHeaderBytes(MessageContentDeletionEvent messageContentDeletionEvent) { return Mono.justOrEmpty(messageContentDeletionEvent.headerBlobId()) - .flatMap(headerBlobId -> Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), blobIdFactory.parse(headerBlobId), BlobStore.StoragePolicy.LOW_COST))) + .flatMap(headerBlobId -> Mono.from(blobStore.readBytes(BucketName.DEFAULT, blobIdFactory.parse(headerBlobId), BlobStore.StoragePolicy.LOW_COST))) .switchIfEmpty(Mono.justOrEmpty(messageContentDeletionEvent.headerContent()) .map(headerContent -> headerContent.getBytes(StandardCharsets.UTF_8)) .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("No header content nor header blob id provided")))); diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java index 9149599fbaf..72e8333db0e 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java @@ -119,7 +119,6 @@ void setUp() throws Exception { BlobStoreFactory.builder() .blobStoreDAO(blobStoreDAO) .blobIdFactory(new PlainBlobId.Factory()) - .defaultBucketName() .passthrough(), blobStoreDAO, new BucketNameGenerator(clock), clock, VaultConfiguration.ENABLED_DEFAULT); diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java index 328a5206607..fd4b7969b73 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java @@ -69,7 +69,6 @@ void setUp() { BlobStoreFactory.builder() .blobStoreDAO(blobStoreDAO) .blobIdFactory(new PlainBlobId.Factory()) - .defaultBucketName() .passthrough(), blobStoreDAO, new BucketNameGenerator(clock), clock, VaultConfiguration.ENABLED_DEFAULT); } diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/DeleteMessageListener.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/DeleteMessageListener.java index 5f31c3ba9b7..673b7c4bfa5 100644 --- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/DeleteMessageListener.java +++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/DeleteMessageListener.java @@ -26,6 +26,7 @@ import org.apache.commons.io.IOUtils; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.core.Username; import org.apache.james.events.Event; import org.apache.james.events.EventBus; @@ -169,7 +170,7 @@ private MailboxEvents.MessageContentDeletionEvent messageContentDeletionEvent(Ma private Mono deleteBodyBlob(PostgresMessageId id, PostgresMessageDAO postgresMessageDAO) { return postgresMessageDAO.getBodyBlobId(id) - .flatMap(blobId -> Mono.from(blobStore.delete(blobStore.getDefaultBucketName(), blobId)) + .flatMap(blobId -> Mono.from(blobStore.delete(BucketName.DEFAULT, blobId)) .then()); } @@ -185,7 +186,7 @@ private Mono deleteAttachment(PostgresMessageId messageId, PostgresAttachm private Mono deleteAttachmentBlobs(PostgresMessageId messageId, PostgresAttachmentDAO attachmentDAO) { return attachmentDAO.listBlobsByMessageId(messageId) - .flatMap(blobId -> Mono.from(blobStore.delete(blobStore.getDefaultBucketName(), blobId)), ReactorUtils.DEFAULT_CONCURRENCY) + .flatMap(blobId -> Mono.from(blobStore.delete(BucketName.DEFAULT, blobId)), ReactorUtils.DEFAULT_CONCURRENCY) .then(); } } diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java index 1392c7a49aa..18e852849b4 100644 --- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java +++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java @@ -27,6 +27,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.exception.AttachmentNotFoundException; import org.apache.james.mailbox.model.AttachmentId; import org.apache.james.mailbox.model.AttachmentMetadata; @@ -64,7 +65,7 @@ public InputStream loadAttachmentContent(AttachmentId attachmentId) { @Override public Mono loadAttachmentContentReactive(AttachmentId attachmentId) { return postgresAttachmentDAO.getAttachment(attachmentId) - .flatMap(pair -> Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), pair.getRight(), LOW_COST))) + .flatMap(pair -> Mono.from(blobStore.readReactive(BucketName.DEFAULT, pair.getRight(), LOW_COST))) .switchIfEmpty(Mono.error(() -> new AttachmentNotFoundException(attachmentId.toString()))); } @@ -112,7 +113,7 @@ public Mono> storeAttachmentsReactive(Collection private Mono storeAttachmentAsync(ParsedAttachment parsedAttachment, MessageId ownerMessageId) { return Mono.fromCallable(parsedAttachment::getContent) - .flatMap(content -> Mono.from(blobStore.save(blobStore.getDefaultBucketName(), parsedAttachment.getContent(), BlobStore.StoragePolicy.LOW_COST)) + .flatMap(content -> Mono.from(blobStore.save(BucketName.DEFAULT, parsedAttachment.getContent(), BlobStore.StoragePolicy.LOW_COST)) .flatMap(blobId -> { AttachmentId attachmentId = attachmentIdAssignationStrategy.assign(parsedAttachment, ownerMessageId); return postgresAttachmentDAO.storeAttachment(AttachmentMetadata.builder() diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapper.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapper.java index 961b51fb53b..208f5541454 100644 --- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapper.java +++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapper.java @@ -35,6 +35,7 @@ import org.apache.james.backends.postgres.utils.PostgresUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.ModSeq; @@ -252,6 +253,6 @@ private boolean identicalFlags(ComposedMessageIdWithMetaData oldComposedId, Flag private Mono saveBodyContent(MailboxMessage message) { return Mono.fromCallable(() -> MESSAGE_BODY_CONTENT_LOADER.apply(message)) - .flatMap(bodyByteSource -> Mono.from(blobStore.save(blobStore.getDefaultBucketName(), bodyByteSource, LOW_COST))); + .flatMap(bodyByteSource -> Mono.from(blobStore.save(BucketName.DEFAULT, bodyByteSource, LOW_COST))); } } diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapper.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapper.java index f824b8bdcf2..31fe7a9eaa7 100644 --- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapper.java +++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapper.java @@ -39,6 +39,7 @@ import org.apache.james.backends.postgres.utils.PostgresUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.ApplicableFlagBuilder; import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.MessageUid; @@ -266,7 +267,7 @@ public Mono addReactive(Mailbox mailbox, MailboxMessage message private Mono saveBodyContent(MailboxMessage message) { return Mono.fromCallable(() -> MESSAGE_BODY_CONTENT_LOADER.apply(message)) - .flatMap(bodyByteSource -> Mono.from(blobStore.save(blobStore.getDefaultBucketName(), bodyByteSource, LOW_COST))); + .flatMap(bodyByteSource -> Mono.from(blobStore.save(BucketName.DEFAULT, bodyByteSource, LOW_COST))); } @Override diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageRetriever.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageRetriever.java index 731405a4169..dbf8fbe7eac 100644 --- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageRetriever.java +++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageRetriever.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.mailbox.model.AttachmentId; import org.apache.james.mailbox.model.AttachmentMetadata; import org.apache.james.mailbox.model.Content; @@ -112,7 +113,7 @@ public Flux> doRetrieve(Flux retrieveFullContent(Record messageRecord) { - return Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), + return Mono.from(blobStore.readBytes(BucketName.DEFAULT, blobIdFactory.parse(messageRecord.get(BODY_BLOB_ID)), SIZE_BASED)) .map(bodyBytes -> new HeaderAndBodyByteContent(messageRecord.get(HEADER_CONTENT), bodyBytes)); diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerContract.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerContract.java index 719f47a732d..d176638116c 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerContract.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerContract.java @@ -33,6 +33,7 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.ObjectNotFoundException; import org.apache.james.core.Username; import org.apache.james.mailbox.MailboxSession; @@ -214,9 +215,9 @@ void deleteMessageListenerShouldDeleteUnreferencedBlob() throws Exception { inboxManager.delete(ImmutableList.of(appendResult.getId().getUid()), session); assertSoftly(softly -> { - softly.assertThatThrownBy(() -> Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), attachmentBlobId)).block()) + softly.assertThatThrownBy(() -> Mono.from(blobStore.readReactive(BucketName.DEFAULT, attachmentBlobId)).block()) .isInstanceOf(ObjectNotFoundException.class); - softly.assertThatThrownBy(() -> Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), messageBodyBlobId)).block()) + softly.assertThatThrownBy(() -> Mono.from(blobStore.readReactive(BucketName.DEFAULT, messageBodyBlobId)).block()) .isInstanceOf(ObjectNotFoundException.class); }); } @@ -236,9 +237,9 @@ void deleteMessageListenerShouldNotDeleteReferencedBlob() throws Exception { inboxManager.delete(ImmutableList.of(appendResult.getId().getUid()), session); assertSoftly(softly -> { - assertThat(Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), attachmentBlobId)).blockOptional()) + assertThat(Mono.from(blobStore.readReactive(BucketName.DEFAULT, attachmentBlobId)).blockOptional()) .isNotEmpty(); - assertThat(Mono.from(blobStore.readReactive(blobStore.getDefaultBucketName(), messageBodyBlobId)).blockOptional()) + assertThat(Mono.from(blobStore.readReactive(BucketName.DEFAULT, messageBodyBlobId)).blockOptional()) .isNotEmpty(); }); } diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerTest.java index 8534477fb92..0b671524f3e 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerTest.java @@ -26,7 +26,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.events.EventBusTestFixture; import org.apache.james.events.InVMEventBus; @@ -64,7 +63,7 @@ public class DeleteMessageListenerTest extends DeleteMessageListenerContract { @BeforeAll static void beforeAll() { - blobStore = new PassThroughBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, BLOB_ID_FACTORY); + blobStore = new PassThroughBlobStore(new MemoryBlobStoreDAO(), BLOB_ID_FACTORY); PostgresMailboxSessionMapperFactory mapperFactory = new PostgresMailboxSessionMapperFactory( postgresExtension.getExecutorFactory(), diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerWithRLSTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerWithRLSTest.java index be1fd7b721e..52cd9f926e5 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerWithRLSTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerWithRLSTest.java @@ -28,7 +28,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.core.Username; @@ -69,7 +68,7 @@ public class DeleteMessageListenerWithRLSTest extends DeleteMessageListenerContr @BeforeAll static void beforeAll() { - blobStore = new PassThroughBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, BLOB_ID_FACTORY); + blobStore = new PassThroughBlobStore(new MemoryBlobStoreDAO(), BLOB_ID_FACTORY); BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); PostgresMailboxSessionMapperFactory mapperFactory = new PostgresMailboxSessionMapperFactory( diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerAttachmentTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerAttachmentTest.java index a3dbc27696b..345d7ee75ed 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerAttachmentTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerAttachmentTest.java @@ -29,7 +29,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.events.EventBusTestFixture; @@ -81,7 +80,7 @@ public class PostgresMailboxManagerAttachmentTest extends AbstractMailboxManager @BeforeEach void beforeAll() throws Exception { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); - DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory); + DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory); mapperFactory = new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), Clock.systemUTC(), blobStore, blobIdFactory, postgresExtension.getPostgresConfiguration(), new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory())); diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerProvider.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerProvider.java index 3f466d365c9..23e7f96f030 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerProvider.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerProvider.java @@ -24,7 +24,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.events.EventBusTestFixture; @@ -59,7 +58,7 @@ public class PostgresMailboxManagerProvider { public static final BlobId.Factory BLOB_ID_FACTORY = new PlainBlobId.Factory(); public static PostgresMailboxManager provideMailboxManager(PostgresExtension postgresExtension, PreDeletionHooks preDeletionHooks) { - DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, BLOB_ID_FACTORY); + DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BLOB_ID_FACTORY); PostgresMailboxSessionMapperFactory mapperFactory = provideMailboxSessionMapperFactory(postgresExtension, BLOB_ID_FACTORY, blobStore); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); @@ -87,7 +86,7 @@ storeRightManager, quotaComponents, index, new NaiveThreadIdGuessingAlgorithm(), public static PostgresMailboxSessionMapperFactory provideMailboxSessionMapperFactory(PostgresExtension postgresExtension) { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); - DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory); + DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory); return provideMailboxSessionMapperFactory(postgresExtension, blobIdFactory, blobStore); } diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresTestSystemFixture.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresTestSystemFixture.java index 1f2b556813d..32761531307 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresTestSystemFixture.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresTestSystemFixture.java @@ -28,7 +28,6 @@ import org.apache.james.backends.postgres.quota.PostgresQuotaCurrentValueDAO; import org.apache.james.backends.postgres.quota.PostgresQuotaLimitDAO; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.events.EventBus; @@ -68,7 +67,7 @@ public class PostgresTestSystemFixture { public static PostgresMailboxSessionMapperFactory createMapperFactory(PostgresExtension postgresExtension) { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); - DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory); + DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory); return new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), Clock.systemUTC(), blobStore, blobIdFactory, postgresExtension.getPostgresConfiguration(), diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperRowLevelSecurityTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperRowLevelSecurityTest.java index 14e97a85d65..7e7becd4596 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperRowLevelSecurityTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperRowLevelSecurityTest.java @@ -25,7 +25,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.core.Username; @@ -47,7 +46,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -public class PostgresAnnotationMapperRowLevelSecurityTest { +class PostgresAnnotationMapperRowLevelSecurityTest { private static final UidValidity UID_VALIDITY = UidValidity.of(42); private static final Username BENWA = Username.of("benwa@localhost"); protected static final MailboxPath benwaInboxPath = MailboxPath.forUser(BENWA, "INBOX"); @@ -73,7 +72,7 @@ public void setUp() { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); postgresMailboxSessionMapperFactory = new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), new UpdatableTickingClock(Instant.now()), - new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory), + new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory), blobIdFactory, postgresExtension.getPostgresConfiguration(), new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory())); diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapperTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapperTest.java index 18e8ce6c1cd..70a90060fa2 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapperTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapperTest.java @@ -22,7 +22,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.mailbox.StringBackedAttachmentIdFactory; @@ -45,7 +44,7 @@ class PostgresAttachmentMapperTest extends AttachmentMapperTest { @Override protected AttachmentMapper createAttachmentMapper() { PostgresAttachmentDAO postgresAttachmentDAO = new PostgresAttachmentDAO(postgresExtension.getDefaultPostgresExecutor(), BLOB_ID_FACTORY); - BlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, BLOB_ID_FACTORY); + BlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BLOB_ID_FACTORY); return new PostgresAttachmentMapper(postgresAttachmentDAO, blobStore, new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory())); } diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMapperProvider.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMapperProvider.java index 137b882b789..658f10be120 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMapperProvider.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMapperProvider.java @@ -26,7 +26,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.mailbox.MessageUid; @@ -69,7 +68,7 @@ public PostgresMapperProvider(PostgresExtension postgresExtension) { this.updatableTickingClock = new UpdatableTickingClock(Instant.now()); this.messageIdFactory = new PostgresMessageId.Factory(); this.blobIdFactory = new PlainBlobId.Factory(); - this.blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory); + this.blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory); this.messageUidProvider = new PostgresUidProvider(new PostgresMailboxDAO(postgresExtension.getDefaultPostgresExecutor())); this.attachmentIdAssignationStrategy = new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory()); } diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperRowLevelSecurityTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperRowLevelSecurityTest.java index 8f038aa1ecd..aa1300b646b 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperRowLevelSecurityTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperRowLevelSecurityTest.java @@ -28,7 +28,6 @@ import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.core.Username; @@ -55,7 +54,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -public class PostgresMessageMapperRowLevelSecurityTest { +class PostgresMessageMapperRowLevelSecurityTest { private static final int BODY_START = 16; private static final UidValidity UID_VALIDITY = UidValidity.of(42); private static final Username BENWA = Username.of("benwa@domain.org"); @@ -80,7 +79,7 @@ public void setUp() { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); postgresMailboxSessionMapperFactory = new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), new UpdatableTickingClock(Instant.now()), - new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory), + new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory), blobIdFactory, postgresExtension.getPostgresConfiguration(), new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory())); diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapperACLTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapperACLTest.java index 01497a8220d..260d84f7cc6 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapperACLTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapperACLTest.java @@ -25,7 +25,6 @@ import org.apache.james.backends.postgres.PostgresDataDefinition; import org.apache.james.backends.postgres.PostgresExtension; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.mailbox.MailboxSessionUtil; @@ -48,7 +47,7 @@ protected MailboxMapper createMailboxMapper() { BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); PostgresMailboxSessionMapperFactory postgresMailboxSessionMapperFactory = new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), new UpdatableTickingClock(Instant.now()), - new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory), + new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory), blobIdFactory, PostgresConfiguration.builder().username("a").password("a").rowLevelSecurityEnabled().byPassRLSUser("b").byPassRLSPassword("b").build(), new AttachmentIdAssignationStrategy.Default(new StringBackedAttachmentIdFactory())); diff --git a/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java b/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java index bfcf7eee91f..70302029c87 100644 --- a/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java +++ b/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java @@ -26,7 +26,6 @@ import org.apache.james.backends.postgres.quota.PostgresQuotaCurrentValueDAO; import org.apache.james.backends.postgres.quota.PostgresQuotaLimitDAO; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.core.quota.QuotaCountLimit; @@ -110,7 +109,7 @@ public void beforeTest() throws Exception { super.beforeTest(); BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); - DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory); + DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), blobIdFactory); PostgresMailboxSessionMapperFactory mapperFactory = new PostgresMailboxSessionMapperFactory(postgresExtension.getExecutorFactory(), Clock.systemUTC(), blobStore, blobIdFactory, postgresExtension.getPostgresConfiguration(), diff --git a/server/apps/distributed-app/src/test/java/org/apache/james/NamespaceConfigurationTest.java b/server/apps/distributed-app/src/test/java/org/apache/james/NamespaceConfigurationTest.java index 82330cd6382..074a42110e2 100644 --- a/server/apps/distributed-app/src/test/java/org/apache/james/NamespaceConfigurationTest.java +++ b/server/apps/distributed-app/src/test/java/org/apache/james/NamespaceConfigurationTest.java @@ -23,8 +23,8 @@ import jakarta.inject.Inject; -import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; +import org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration; import org.apache.james.modules.AwsS3BlobStoreExtension; import org.apache.james.modules.RabbitMQExtension; import org.apache.james.modules.TestJMAPServerModule; @@ -37,15 +37,15 @@ class NamespaceConfigurationTest { static class DefaultBucketProbe implements GuiceProbe { - private final BlobStore blobStore; + private final S3BlobStoreConfiguration configuration; @Inject - DefaultBucketProbe(BlobStore blobStore) { - this.blobStore = blobStore; + DefaultBucketProbe(S3BlobStoreConfiguration configuration) { + this.configuration = configuration; } public BucketName getDefaultBucket() { - return blobStore.getDefaultBucketName(); + return configuration.getNamespace().get(); } } 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 index 8d5101e0db7..bea35f64cfd 100644 --- 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 @@ -28,8 +28,6 @@ import reactor.util.function.Tuple2; public interface BlobStore { - String DEFAULT_BUCKET_NAME_QUALIFIER = "defaultBucket"; - enum StoragePolicy { SIZE_BASED, LOW_COST, @@ -75,10 +73,6 @@ default Publisher readReactive(BucketName bucketName, BlobId blobId return readReactive(bucketName, blobId); } - BucketName getDefaultBucketName(); - - Publisher listBuckets(); - Publisher deleteBucket(BucketName bucketName); Publisher delete(BucketName bucketName, BlobId blobId); diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java index 1e11679953c..6d110c49b91 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java @@ -20,7 +20,6 @@ package org.apache.james.blob.api; import java.io.InputStream; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Collection; @@ -29,25 +28,6 @@ import com.google.common.io.ByteSource; public interface BlobStoreDAO { - class ReactiveByteSource { - private final long size; - private final Publisher content; - - public ReactiveByteSource(long size, Publisher content) { - this.size = size; - this.content = content; - } - - public long getSize() { - return size; - } - - public Publisher getContent() { - return content; - } - } - - /** * Reads a Blob based on its BucketName and its BlobId. * diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java index 0d60274937b..821115d9822 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java @@ -112,21 +112,11 @@ public Publisher deleteBucket(BucketName bucketName) { return metricFactory.decoratePublisherWithTimerMetric(DELETE_BUCKET_TIMER_NAME, blobStoreImpl.deleteBucket(bucketName)); } - @Override - public BucketName getDefaultBucketName() { - return blobStoreImpl.getDefaultBucketName(); - } - @Override public Publisher delete(BucketName bucketName, BlobId blobId) { return metricFactory.decoratePublisherWithTimerMetric(DELETE_TIMER_NAME, blobStoreImpl.delete(bucketName, blobId)); } - @Override - public Publisher listBuckets() { - return blobStoreImpl.listBuckets(); - } - @Override public Publisher listBlobs(BucketName bucketName) { return blobStoreImpl.listBlobs(bucketName); diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java index 266b4f14ce1..ccd606d8379 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java @@ -31,8 +31,7 @@ import reactor.core.publisher.Mono; public class ObjectStorageHealthCheck implements HealthCheck { - - private static final Integer HEALTH_CHECK_TIMEOUT = 10; + private static final Duration HEALTH_CHECK_TIMEOUT = Duration.ofSeconds(10); private static final ComponentName COMPONENT_NAME = new ComponentName("ObjectStorage"); @@ -51,7 +50,7 @@ public ComponentName componentName() { @Override public Mono check() { return Flux.from(blobStoreDAO.listBuckets()) - .timeout(Duration.ofSeconds(HEALTH_CHECK_TIMEOUT)) + .timeout(HEALTH_CHECK_TIMEOUT) .next() .thenReturn(Result.healthy(COMPONENT_NAME)) .onErrorResume(e -> Mono.just(Result.unhealthy(COMPONENT_NAME, "Error checking ObjectSotrage", e))); 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 index bfc10d33611..5d5b5f08d00 100644 --- 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 @@ -63,9 +63,8 @@ static Stream storagePolicies() { @MethodSource("storagePolicies") default void saveShouldThrowWhenNullData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> Mono.from(store.save(defaultBucketName, (byte[]) null, storagePolicy)).block()) + assertThatThrownBy(() -> Mono.from(store.save(BucketName.DEFAULT, (byte[]) null, storagePolicy)).block()) .isInstanceOf(NullPointerException.class); } @@ -73,9 +72,8 @@ default void saveShouldThrowWhenNullData(BlobStore.StoragePolicy storagePolicy) @MethodSource("storagePolicies") default void saveShouldThrowWhenNullString(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> Mono.from(store.save(defaultBucketName, (String) null, storagePolicy)).block()) + assertThatThrownBy(() -> Mono.from(store.save(BucketName.DEFAULT, (String) null, storagePolicy)).block()) .isInstanceOf(NullPointerException.class); } @@ -83,9 +81,8 @@ default void saveShouldThrowWhenNullString(BlobStore.StoragePolicy storagePolicy @MethodSource("storagePolicies") default void saveShouldThrowWhenNullByteSource(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> Mono.from(store.save(defaultBucketName, (ByteSource) null, storagePolicy)).block()) + assertThatThrownBy(() -> Mono.from(store.save(BucketName.DEFAULT, (ByteSource) null, storagePolicy)).block()) .isInstanceOf(NullPointerException.class); } @@ -93,9 +90,8 @@ default void saveShouldThrowWhenNullByteSource(BlobStore.StoragePolicy storagePo @MethodSource("storagePolicies") default void saveShouldThrowWhenNullInputStream(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> Mono.from(store.save(defaultBucketName, (InputStream) null, storagePolicy)).block()) + assertThatThrownBy(() -> Mono.from(store.save(BucketName.DEFAULT, (InputStream) null, storagePolicy)).block()) .isInstanceOf(NullPointerException.class); } @@ -103,11 +99,10 @@ default void saveShouldThrowWhenNullInputStream(BlobStore.StoragePolicy storageP @MethodSource("storagePolicies") default void saveShouldSaveEmptyData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, EMPTY_BYTEARRAY, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, EMPTY_BYTEARRAY, storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); } @@ -116,11 +111,10 @@ default void saveShouldSaveEmptyData(BlobStore.StoragePolicy storagePolicy) { @MethodSource("storagePolicies") default void saveShouldSaveEmptyByteSource(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ByteSource.wrap(EMPTY_BYTEARRAY), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ByteSource.wrap(EMPTY_BYTEARRAY), storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); } @@ -129,11 +123,10 @@ default void saveShouldSaveEmptyByteSource(BlobStore.StoragePolicy storagePolicy @MethodSource("storagePolicies") default void saveShouldSaveEmptyString(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, "", storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, "", storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); } @@ -142,11 +135,10 @@ default void saveShouldSaveEmptyString(BlobStore.StoragePolicy storagePolicy) { @MethodSource("storagePolicies") default void saveShouldSaveEmptyInputStream(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, new ByteArrayInputStream(EMPTY_BYTEARRAY), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, new ByteArrayInputStream(EMPTY_BYTEARRAY), storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); } @@ -154,9 +146,8 @@ default void saveShouldSaveEmptyInputStream(BlobStore.StoragePolicy storagePolic @Test default void readBytesShouldThrowWhenNoExisting() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> Mono.from(store.readBytes(defaultBucketName, blobIdFactory().parse("unknown"))).block()) + assertThatThrownBy(() -> Mono.from(store.readBytes(BucketName.DEFAULT, blobIdFactory().parse("unknown"))).block()) .isExactlyInstanceOf(ObjectNotFoundException.class); } @@ -164,11 +155,10 @@ default void readBytesShouldThrowWhenNoExisting() { @MethodSource("storagePolicies") default void readBytesShouldReturnSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(SHORT_BYTEARRAY); } @@ -177,11 +167,10 @@ default void readBytesShouldReturnSavedData(BlobStore.StoragePolicy storagePolic @MethodSource("storagePolicies") default void readBytesShouldReturnSavedByteSource(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ByteSource.wrap(SHORT_BYTEARRAY), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ByteSource.wrap(SHORT_BYTEARRAY), storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(SHORT_BYTEARRAY); } @@ -190,11 +179,10 @@ default void readBytesShouldReturnSavedByteSource(BlobStore.StoragePolicy storag @MethodSource("storagePolicies") default void readBytesShouldReturnLongSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ELEVEN_KILOBYTES, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ELEVEN_KILOBYTES, storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(ELEVEN_KILOBYTES); } @@ -203,11 +191,10 @@ default void readBytesShouldReturnLongSavedData(BlobStore.StoragePolicy storageP @MethodSource("storagePolicies") default void readBytesShouldReturnLongSavedByteSource(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ByteSource.wrap(ELEVEN_KILOBYTES), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ByteSource.wrap(ELEVEN_KILOBYTES), storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(ELEVEN_KILOBYTES); } @@ -216,11 +203,10 @@ default void readBytesShouldReturnLongSavedByteSource(BlobStore.StoragePolicy st @MethodSource("storagePolicies") default void readBytesShouldReturnBigSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, TWELVE_MEGABYTES, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, TWELVE_MEGABYTES, storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(TWELVE_MEGABYTES); } @@ -229,11 +215,10 @@ default void readBytesShouldReturnBigSavedData(BlobStore.StoragePolicy storagePo @MethodSource("storagePolicies") default void readBytesShouldReturnBigSavedByteSource(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ByteSource.wrap(TWELVE_MEGABYTES), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ByteSource.wrap(TWELVE_MEGABYTES), storagePolicy)).block(); - byte[] bytes = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] bytes = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(bytes).isEqualTo(TWELVE_MEGABYTES); } @@ -241,9 +226,8 @@ default void readBytesShouldReturnBigSavedByteSource(BlobStore.StoragePolicy sto @Test default void readShouldThrowWhenNoExistingStream() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatThrownBy(() -> store.read(defaultBucketName, blobIdFactory().parse("unknown")).read()) + assertThatThrownBy(() -> store.read(BucketName.DEFAULT, blobIdFactory().parse("unknown")).read()) .isInstanceOf(ObjectNotFoundException.class); } @@ -251,11 +235,10 @@ default void readShouldThrowWhenNoExistingStream() { @MethodSource("storagePolicies") default void readShouldReturnSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, storagePolicy)).block(); - InputStream read = store.read(defaultBucketName, blobId); + InputStream read = store.read(BucketName.DEFAULT, blobId); assertThat(read).hasSameContentAs(new ByteArrayInputStream(SHORT_BYTEARRAY)); } @@ -264,11 +247,10 @@ default void readShouldReturnSavedData(BlobStore.StoragePolicy storagePolicy) { @MethodSource("storagePolicies") default void readShouldReturnLongSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, ELEVEN_KILOBYTES, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, ELEVEN_KILOBYTES, storagePolicy)).block(); - InputStream read = store.read(defaultBucketName, blobId); + InputStream read = store.read(BucketName.DEFAULT, blobId); assertThat(read).hasSameContentAs(new ByteArrayInputStream(ELEVEN_KILOBYTES)); } @@ -277,12 +259,11 @@ default void readShouldReturnLongSavedData(BlobStore.StoragePolicy storagePolicy @MethodSource("storagePolicies") default void readShouldReturnBigSavedData(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); // 12 MB of text - BlobId blobId = Mono.from(store.save(defaultBucketName, TWELVE_MEGABYTES, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, TWELVE_MEGABYTES, storagePolicy)).block(); - InputStream read = store.read(defaultBucketName, blobId); + InputStream read = store.read(BucketName.DEFAULT, blobId); assertThat(read).hasSameContentAs(new ByteArrayInputStream(TWELVE_MEGABYTES)); } diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java index e616ee2d2f0..75b0706f873 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java @@ -31,7 +31,6 @@ import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.junit.jupiter.api.Test; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public interface BucketBlobStoreContract { @@ -169,33 +168,4 @@ default void deleteBucketConcurrentlyShouldNotFail() throws Exception { .operationCount(10) .runSuccessfullyWithin(Duration.ofMinutes(1)); } - - @Test - default void listBucketsShouldReturnDefaultBucket() { - BlobStore store = testee(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(store.getDefaultBucketName()); - } - - @Test - default void listBucketsShouldReturnACustomBucket() { - BlobStore store = testee(); - - Mono.from(store.save(CUSTOM, SHORT_BYTEARRAY, LOW_COST)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(store.getDefaultBucketName(), CUSTOM); - } - - @Test - default void listBucketsShouldNotReturnADeletedBucket() { - BlobStore store = testee(); - - Mono.from(store.save(CUSTOM, SHORT_BYTEARRAY, LOW_COST)).block(); - Mono.from(store.deleteBucket(CUSTOM)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(store.getDefaultBucketName()); - } } diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java index cd4fd2ee588..b2f91325f61 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java @@ -77,9 +77,8 @@ default void deduplicationBlobstoreCreationShouldFailOnInvalidProperty() { @MethodSource("storagePolicies") default void saveShouldReturnBlobIdOfString(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_STRING, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_STRING, storagePolicy)).block(); assertThat(blobId).isEqualTo(blobIdFactory().parse("MfemXjFVhqwZi9eYtmKc5JA9CJlHbVdBqfMuLlIbamY=")); } @@ -88,9 +87,8 @@ default void saveShouldReturnBlobIdOfString(BlobStore.StoragePolicy storagePolic @MethodSource("storagePolicies") default void saveShouldReturnBlobId(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, storagePolicy)).block(); assertThat(blobId).isEqualTo(blobIdFactory().parse("MfemXjFVhqwZi9eYtmKc5JA9CJlHbVdBqfMuLlIbamY=")); } @@ -99,9 +97,8 @@ default void saveShouldReturnBlobId(BlobStore.StoragePolicy storagePolicy) { @MethodSource("storagePolicies") default void saveShouldReturnBlobIdOfInputStream(BlobStore.StoragePolicy storagePolicy) { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, new ByteArrayInputStream(SHORT_BYTEARRAY), storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, new ByteArrayInputStream(SHORT_BYTEARRAY), storagePolicy)).block(); // This fix is ok because it will only affect deduplication, after this change the same content might be assigned a different blobid // and thus might be duplicated in the store. No data can be lost since no api allows for externally deterministic blob id construction // before this change. diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java index 618ed2d5dbc..d68632aaf81 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java @@ -53,47 +53,43 @@ public interface DeleteBlobStoreContract { @Test default void deleteShouldNotThrowWhenBlobDoesNotExist() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - assertThatCode(() -> Mono.from(store.delete(defaultBucketName, blobIdFactory().of("NOT_EXISTING_BLOB_ID"))).block()) + assertThatCode(() -> Mono.from(store.delete(BucketName.DEFAULT, blobIdFactory().of("NOT_EXISTING_BLOB_ID"))).block()) .doesNotThrowAnyException(); } @Test default void deleteShouldDeleteExistingBlobData() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); - Mono.from(store.delete(defaultBucketName, blobId)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, LOW_COST)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobId)).block(); - assertThatThrownBy(() -> store.read(defaultBucketName, blobId).read()) + assertThatThrownBy(() -> store.read(BucketName.DEFAULT, blobId).read()) .isInstanceOf(ObjectStoreException.class); } @Test default void deleteShouldBeIdempotent() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); - Mono.from(store.delete(defaultBucketName, blobId)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, LOW_COST)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobId)).block(); - assertThatCode(() -> Mono.from(store.delete(defaultBucketName, blobId)).block()) + assertThatCode(() -> Mono.from(store.delete(BucketName.DEFAULT, blobId)).block()) .doesNotThrowAnyException(); } @Test default void deleteShouldNotDeleteOtherBlobs() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobIdToDelete = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); - BlobId otherBlobId = Mono.from(store.save(defaultBucketName, ELEVEN_KILOBYTES, LOW_COST)).block(); + BlobId blobIdToDelete = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, LOW_COST)).block(); + BlobId otherBlobId = Mono.from(store.save(BucketName.DEFAULT, ELEVEN_KILOBYTES, LOW_COST)).block(); - Mono.from(store.delete(defaultBucketName, blobIdToDelete)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobIdToDelete)).block(); - InputStream read = store.read(defaultBucketName, otherBlobId); + InputStream read = store.read(BucketName.DEFAULT, otherBlobId); assertThat(read).hasSameContentAs(new ByteArrayInputStream(ELEVEN_KILOBYTES)); } @@ -101,12 +97,11 @@ default void deleteShouldNotDeleteOtherBlobs() { @Test default void deleteConcurrentlyShouldNotFail() throws Exception { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, TWELVE_MEGABYTES, LOW_COST)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, TWELVE_MEGABYTES, LOW_COST)).block(); ConcurrentTestRunner.builder() - .operation(((threadNumber, step) -> Mono.from(store.delete(defaultBucketName, blobId)).block())) + .operation(((threadNumber, step) -> Mono.from(store.delete(BucketName.DEFAULT, blobId)).block())) .threadCount(10) .operationCount(10) .runSuccessfullyWithin(Duration.ofMinutes(1)); @@ -122,14 +117,13 @@ default void deleteShouldThrowWhenNullBucketName() { @Test default void deleteShouldNotDeleteFromOtherBucket() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); BlobId customBlobId = Mono.from(store.save(CUSTOM, "custom_string", LOW_COST)).block(); - BlobId defaultBlobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); + BlobId defaultBlobId = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, LOW_COST)).block(); Mono.from(store.delete(CUSTOM, customBlobId)).block(); - InputStream read = store.read(defaultBucketName, defaultBlobId); + InputStream read = store.read(BucketName.DEFAULT, defaultBlobId); assertThat(read).hasSameContentAs(new ByteArrayInputStream(SHORT_BYTEARRAY)); } @@ -137,12 +131,11 @@ default void deleteShouldNotDeleteFromOtherBucket() { @Test default void deleteShouldNotDeleteFromOtherBucketWhenSameBlobId() { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); BlobId blobIdInCustomBucket = Mono.from(store.save(CUSTOM, SHORT_BYTEARRAY, LOW_COST)).block(); - BlobId blobIdInDefaultBucket = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); + BlobId blobIdInDefaultBucket = Mono.from(store.save(BucketName.DEFAULT, SHORT_BYTEARRAY, LOW_COST)).block(); - Mono.from(store.delete(defaultBucketName, blobIdInDefaultBucket)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobIdInDefaultBucket)).block(); InputStream read = store.read(CUSTOM, blobIdInCustomBucket); @@ -152,14 +145,13 @@ default void deleteShouldNotDeleteFromOtherBucketWhenSameBlobId() { @Test default void readShouldNotReadPartiallyWhenDeletingConcurrentlyBigBlob() throws Exception { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, TWELVE_MEGABYTES, LOW_COST)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, TWELVE_MEGABYTES, LOW_COST)).block(); ConcurrentTestRunner.builder() .operation(((threadNumber, step) -> { try { - InputStream read = store.read(defaultBucketName, blobId); + InputStream read = store.read(BucketName.DEFAULT, blobId); String string = IOUtils.toString(read, StandardCharsets.UTF_8); if (!string.equals(TWELVE_MEGABYTES_STRING)) { @@ -169,7 +161,7 @@ default void readShouldNotReadPartiallyWhenDeletingConcurrentlyBigBlob() throws // normal behavior here } - Mono.from(store.delete(defaultBucketName, blobId)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobId)).block(); })) .threadCount(10) .operationCount(10) @@ -179,14 +171,13 @@ default void readShouldNotReadPartiallyWhenDeletingConcurrentlyBigBlob() throws @Test default void readBytesShouldNotReadPartiallyWhenDeletingConcurrentlyBigBlob() throws Exception { BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - BlobId blobId = Mono.from(store.save(defaultBucketName, TWELVE_MEGABYTES, LOW_COST)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, TWELVE_MEGABYTES, LOW_COST)).block(); ConcurrentTestRunner.builder() .operation(((threadNumber, step) -> { try { - byte[] read = Mono.from(store.readBytes(defaultBucketName, blobId)).block(); + byte[] read = Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); String string = IOUtils.toString(read, StandardCharsets.UTF_8.displayName()); if (!string.equals(TWELVE_MEGABYTES_STRING)) { throw new RuntimeException("Should not read partial blob when an other thread is deleting it. Size : " + string.length()); @@ -195,7 +186,7 @@ default void readBytesShouldNotReadPartiallyWhenDeletingConcurrentlyBigBlob() th // normal behavior here } - Mono.from(store.delete(defaultBucketName, blobId)).block(); + Mono.from(store.delete(BucketName.DEFAULT, blobId)).block(); })) .threadCount(10) .operationCount(10) diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java index 6b473680994..076e5e16770 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java @@ -66,8 +66,8 @@ public RecordingMetricFactory getMetricFactory() { default void saveBytesShouldPublishSaveBytesTimerMetrics() { BlobStore store = testee(); - Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().executionTimesFor(SAVE_BYTES_TIMER_NAME)) @@ -78,8 +78,8 @@ default void saveBytesShouldPublishSaveBytesTimerMetrics() { default void saveStringShouldPublishSaveBytesTimerMetrics() { BlobStore store = testee(); - Mono.from(store.save(store.getDefaultBucketName(), STRING_CONTENT, LOW_COST)).block(); - Mono.from(store.save(store.getDefaultBucketName(), STRING_CONTENT, LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, STRING_CONTENT, LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, STRING_CONTENT, LOW_COST)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().executionTimesFor(SAVE_BYTES_TIMER_NAME)) @@ -90,8 +90,8 @@ default void saveStringShouldPublishSaveBytesTimerMetrics() { default void saveInputStreamShouldPublishSaveInputStreamTimerMetrics() { BlobStore store = testee(); - Mono.from(store.save(store.getDefaultBucketName(), new ByteArrayInputStream(BYTES_CONTENT), LOW_COST)).block(); - Mono.from(store.save(store.getDefaultBucketName(), new ByteArrayInputStream(BYTES_CONTENT), LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, new ByteArrayInputStream(BYTES_CONTENT), LOW_COST)).block(); + Mono.from(store.save(BucketName.DEFAULT, new ByteArrayInputStream(BYTES_CONTENT), LOW_COST)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().executionTimesFor(SAVE_INPUT_STREAM_TIMER_NAME)) @@ -102,9 +102,9 @@ default void saveInputStreamShouldPublishSaveInputStreamTimerMetrics() { default void readBytesShouldPublishReadBytesTimerMetrics() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - Mono.from(store.readBytes(store.getDefaultBucketName(), blobId)).block(); - Mono.from(store.readBytes(store.getDefaultBucketName(), blobId)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); + Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().executionTimesFor(READ_BYTES_TIMER_NAME)) @@ -115,9 +115,9 @@ default void readBytesShouldPublishReadBytesTimerMetrics() { default void readShouldPublishReadTimerMetrics() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - store.read(store.getDefaultBucketName(), blobId); - store.read(store.getDefaultBucketName(), blobId); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + store.read(BucketName.DEFAULT, blobId); + store.read(BucketName.DEFAULT, blobId); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().executionTimesFor(READ_TIMER_NAME)) @@ -143,8 +143,8 @@ default void deleteBucketShouldPublishDeleteBucketTimerMetrics() { default void deleteShouldPublishDeleteTimerMetrics() { BlobStore store = testee(); - BlobId blobId1 = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - BlobId blobId2 = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); + BlobId blobId1 = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + BlobId blobId2 = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); Mono.from(store.delete(BucketName.DEFAULT, blobId1)).block(); Mono.from(store.delete(BucketName.DEFAULT, blobId2)).block(); diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java index 193e2c4dda6..48b13e385d5 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java @@ -29,12 +29,10 @@ import java.util.Objects; import jakarta.inject.Inject; -import jakarta.inject.Named; import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.ObjectNotFoundException; @@ -70,7 +68,6 @@ public class CassandraBlobStoreDAO implements BlobStoreDAO { private final CassandraDefaultBucketDAO defaultBucketDAO; private final CassandraBucketDAO bucketDAO; private final CassandraConfiguration configuration; - private final BucketName defaultBucket; private final Metric metricClOneHitCount; private final Metric metricClOneMissCount; @@ -80,12 +77,10 @@ public class CassandraBlobStoreDAO implements BlobStoreDAO { public CassandraBlobStoreDAO(CassandraDefaultBucketDAO defaultBucketDAO, CassandraBucketDAO bucketDAO, CassandraConfiguration cassandraConfiguration, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) BucketName defaultBucket, MetricFactory metricFactory) { this.defaultBucketDAO = defaultBucketDAO; this.bucketDAO = bucketDAO; this.configuration = cassandraConfiguration; - this.defaultBucket = defaultBucket; this.metricClOneMissCount = metricFactory.generate(CASSANDRA_BLOBSTORE_CL_ONE_MISS_COUNT_METRIC_NAME); this.metricClOneHitCount = metricFactory.generate(CASSANDRA_BLOBSTORE_CL_ONE_HIT_COUNT_METRIC_NAME); @@ -173,7 +168,7 @@ private Mono saveBlobPartReference(BucketName bucketName, BlobId blobId, I } private boolean isDefaultBucket(BucketName bucketName) { - return bucketName.equals(defaultBucket); + return bucketName.equals(BucketName.DEFAULT); } @Override diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java index 59d98f27fa2..bc9e4109d9e 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java @@ -20,7 +20,6 @@ package org.apache.james.blob.cassandra; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.server.blob.deduplication.BlobStoreFactory; @@ -32,10 +31,9 @@ public static BlobStoreFactory.RequireStoringStrategy forTesting(CqlSession sess PlainBlobId.Factory blobIdFactory = new PlainBlobId.Factory(); CassandraBucketDAO bucketDAO = new CassandraBucketDAO(blobIdFactory, session); CassandraDefaultBucketDAO defaultBucketDAO = new CassandraDefaultBucketDAO(session, blobIdFactory); - CassandraBlobStoreDAO blobStoreDAO = new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, CassandraConfiguration.DEFAULT_CONFIGURATION, BucketName.DEFAULT, metricFactory); + CassandraBlobStoreDAO blobStoreDAO = new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, CassandraConfiguration.DEFAULT_CONFIGURATION, metricFactory); return BlobStoreFactory.builder() .blobStoreDAO(blobStoreDAO) - .blobIdFactory(blobIdFactory) - .defaultBucketName(); + .blobIdFactory(blobIdFactory); } } diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java index e3c95f7dceb..577c80ad0bd 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java @@ -154,7 +154,7 @@ public Publisher readReactive(BucketName bucketName, BlobId blobId, } private Mono readInputStream(BucketName bucketName, BlobId blobId) { - if (bucketName.equals(getDefaultBucketName())) { + if (bucketName.equals(BucketName.DEFAULT)) { return readInDefaultBucket(bucketName, blobId); } return readFromBackend(bucketName, blobId); @@ -176,7 +176,7 @@ public Mono readBytes(BucketName bucketName, BlobId blobId, StoragePolic if (storagePolicy == LOW_COST) { return readBytesFromBackend(bucketName, blobId); } - if (getDefaultBucketName().equals(bucketName)) { + if (BucketName.DEFAULT.equals(bucketName)) { return readBytesInDefaultBucket(bucketName, blobId); } return readBytesFromBackend(bucketName, blobId); @@ -309,16 +309,11 @@ private Mono saveInCache(ByteSource byteSource, ByteSourceBackendSaver b .orElse(Mono.just(blobId)))); } - @Override - public BucketName getDefaultBucketName() { - return backend.getDefaultBucketName(); - } - @Override public Mono delete(BucketName bucketName, BlobId blobId) { return Mono.from(backend.delete(bucketName, blobId)) .flatMap(deleted -> { - if (backend.getDefaultBucketName().equals(bucketName) && deleted) { + if (BucketName.DEFAULT.equals(bucketName) && deleted) { return Mono.from(cache.remove(blobId)).thenReturn(deleted); } return Mono.just(deleted); @@ -370,11 +365,11 @@ private boolean isAbleToCache(BucketName bucketName, ReadAheadInputStream readAh } private boolean isAbleToCache(BucketName bucketName, StoragePolicy storagePolicy) { - return backend.getDefaultBucketName().equals(bucketName) && !storagePolicy.equals(LOW_COST); + return BucketName.DEFAULT.equals(bucketName) && !storagePolicy.equals(LOW_COST); } private boolean isAbleToCache(ReadAheadInputStream readAhead, BucketName bucketName) { - return !readAhead.hasMore && backend.getDefaultBucketName().equals(bucketName); + return !readAhead.hasMore && BucketName.DEFAULT.equals(bucketName); } private boolean isAbleToCache(byte[] bytes) { @@ -396,11 +391,6 @@ private Mono readBytesFromBackend(BucketName bucketName, BlobId blobId) backend.readBytes(bucketName, blobId))); } - @Override - public Publisher listBuckets() { - return backend.listBuckets(); - } - @Override public Publisher listBlobs(BucketName bucketName) { return backend.listBlobs(bucketName); diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreClOneTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreClOneTest.java index cc58a313d1e..6c4bb65566d 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreClOneTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreClOneTest.java @@ -80,9 +80,8 @@ public MetricableBlobStore createBlobStore() { return new MetricableBlobStore( metricFactory, BlobStoreFactory.builder() - .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, BucketName.DEFAULT, metricFactory)) + .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, metricFactory)) .blobIdFactory(blobIdFactory) - .defaultBucketName() .deduplication()); } @@ -106,12 +105,12 @@ public CassandraDefaultBucketDAO defaultBucketDAO() { public void readShouldNotReturnInvalidResultsWhenPartialDataPresent() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); when(defaultBucketDAO().readPart(blobId, 1)).thenReturn(Mono.empty()); - assertThatThrownBy(() -> IOUtils.toString(testee().read(testee().getDefaultBucketName(), blobId), StandardCharsets.UTF_8)) + assertThatThrownBy(() -> IOUtils.toString(testee().read(BucketName.DEFAULT, blobId), StandardCharsets.UTF_8)) .isInstanceOf(ObjectStoreException.class) .hasMessageContaining("Missing blob part for blobId"); } @@ -121,12 +120,12 @@ public void readShouldNotReturnInvalidResultsWhenPartialDataPresent() { public void readBytesShouldNotReturnInvalidResultsWhenPartialDataPresent() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); when(defaultBucketDAO().readPart(blobId, 1)).thenReturn(Mono.empty()); - assertThatThrownBy(() -> Mono.from(testee().readBytes(testee().getDefaultBucketName(), blobId)).block()) + assertThatThrownBy(() -> Mono.from(testee().readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class) .hasMessageContaining("Missing blob part for blobId"); } @@ -135,11 +134,11 @@ public void readBytesShouldNotReturnInvalidResultsWhenPartialDataPresent() { void readShouldReturnValidResultWhenDataMissingInOneNodeButPresentInOthers() throws IOException { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().selectRowCountClOne(blobId)).thenReturn(Mono.empty()); - String data = IOUtils.toString(testee().read(testee().getDefaultBucketName(), blobId), StandardCharsets.UTF_8); + String data = IOUtils.toString(testee().read(BucketName.DEFAULT, blobId), StandardCharsets.UTF_8); assertThat(data).isEqualTo(longString); } @@ -148,11 +147,11 @@ void readShouldReturnValidResultWhenDataMissingInOneNodeButPresentInOthers() thr void readBytesShouldReturnValidResultWhenDataMissingInOneNodeButPresentInOthers() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().selectRowCountClOne(blobId)).thenReturn(Mono.empty()); - byte[] bytes = Mono.from(testee().readBytes(testee().getDefaultBucketName(), blobId)).block(); + byte[] bytes = Mono.from(testee().readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(longString); } @@ -161,11 +160,11 @@ void readBytesShouldReturnValidResultWhenDataMissingInOneNodeButPresentInOthers( void readShouldReturnValidResultWhenPartialDataMissingInOneNodeButPresentInOthers() throws IOException { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); - String data = IOUtils.toString(testee().read(testee().getDefaultBucketName(), blobId), StandardCharsets.UTF_8); + String data = IOUtils.toString(testee().read(BucketName.DEFAULT, blobId), StandardCharsets.UTF_8); assertThat(data).isEqualTo(longString); } @@ -174,11 +173,11 @@ void readShouldReturnValidResultWhenPartialDataMissingInOneNodeButPresentInOther void readBytesShouldReturnValidResultWhenPartialDataMissingInOneNodeButPresentInOthers() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); - byte[] bytes = Mono.from(testee().readBytes(testee().getDefaultBucketName(), blobId)).block(); + byte[] bytes = Mono.from(testee().readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(longString); } @@ -187,8 +186,8 @@ void readBytesShouldReturnValidResultWhenPartialDataMissingInOneNodeButPresentIn void readShouldPublishHitRatioClOneMetric() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - store.read(store.getDefaultBucketName(), blobId); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + store.read(BucketName.DEFAULT, blobId); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().countFor(CASSANDRA_BLOBSTORE_CL_ONE_HIT_COUNT_METRIC_NAME)) @@ -199,8 +198,8 @@ void readShouldPublishHitRatioClOneMetric() { void readBytesShouldPublishHitRatioClOneMetric() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); - Mono.from(store.readBytes(store.getDefaultBucketName(), blobId)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); + Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().countFor(CASSANDRA_BLOBSTORE_CL_ONE_HIT_COUNT_METRIC_NAME)) @@ -211,13 +210,13 @@ void readBytesShouldPublishHitRatioClOneMetric() { void readShouldPublishMissRatioClOneMetric() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); when(defaultBucketDAO().selectRowCountClOne(blobId)).thenReturn(Mono.empty()); - store.read(store.getDefaultBucketName(), blobId); + store.read(BucketName.DEFAULT, blobId); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); - store.read(store.getDefaultBucketName(), blobId); + store.read(BucketName.DEFAULT, blobId); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().countFor(CASSANDRA_BLOBSTORE_CL_ONE_MISS_COUNT_METRIC_NAME)) @@ -228,13 +227,13 @@ void readShouldPublishMissRatioClOneMetric() { void readBytesShouldPublishMissRatioClOneMetric() { BlobStore store = testee(); - BlobId blobId = Mono.from(store.save(store.getDefaultBucketName(), BYTES_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, BYTES_CONTENT, LOW_COST)).block(); when(defaultBucketDAO().selectRowCountClOne(blobId)).thenReturn(Mono.empty()); - Mono.from(store.readBytes(store.getDefaultBucketName(), blobId)).block(); + Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); when(defaultBucketDAO().readPartClOne(blobId, 1)).thenReturn(Mono.empty()); - Mono.from(store.readBytes(store.getDefaultBucketName(), blobId)).block(); + Mono.from(store.readBytes(BucketName.DEFAULT, blobId)).block(); await().atMost(FIVE_SECONDS) .untilAsserted(() -> assertThat(metricsTestExtension.getMetricFactory().countFor(CASSANDRA_BLOBSTORE_CL_ONE_MISS_COUNT_METRIC_NAME)) diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreContract.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreContract.java index b6a6434feba..46c88c751b3 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreContract.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreContract.java @@ -30,6 +30,7 @@ import org.apache.commons.io.IOUtils; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.MetricableBlobStoreContract; import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.util.io.ZeroedInputStream; @@ -50,9 +51,9 @@ public interface CassandraBlobStoreContract extends MetricableBlobStoreContract @Test default void readBytesShouldReturnSplitSavedDataByChunk() { String longString = Strings.repeat("0123456789\n", MULTIPLE_CHUNK_SIZE); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); - byte[] bytes = Mono.from(testee().readBytes(testee().getDefaultBucketName(), blobId)).block(); + byte[] bytes = Mono.from(testee().readBytes(BucketName.DEFAULT, blobId)).block(); assertThat(new String(bytes, StandardCharsets.UTF_8)).isEqualTo(longString); } @@ -61,11 +62,11 @@ default void readBytesShouldReturnSplitSavedDataByChunk() { default void readBytesShouldNotReturnInvalidResultsWhenPartialDataPresent() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPart(blobId, 1)).thenReturn(Mono.empty()); - assertThatThrownBy(() -> Mono.from(testee().readBytes(testee().getDefaultBucketName(), blobId)).block()) + assertThatThrownBy(() -> Mono.from(testee().readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class) .hasMessageContaining("Missing blob part for blobId"); } @@ -74,18 +75,18 @@ default void readBytesShouldNotReturnInvalidResultsWhenPartialDataPresent() { default void readShouldNotReturnInvalidResultsWhenPartialDataPresent() { int repeatCount = MULTIPLE_CHUNK_SIZE * CHUNK_SIZE; String longString = Strings.repeat("0123456789\n", repeatCount); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), longString, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, longString, LOW_COST)).block(); when(defaultBucketDAO().readPart(blobId, 1)).thenReturn(Mono.empty()); - assertThatThrownBy(() -> IOUtils.toString(testee().read(testee().getDefaultBucketName(), blobId), StandardCharsets.UTF_8)) + assertThatThrownBy(() -> IOUtils.toString(testee().read(BucketName.DEFAULT, blobId), StandardCharsets.UTF_8)) .isInstanceOf(ObjectStoreException.class) .hasMessageContaining("Missing blob part for blobId"); } @Test default void deleteBucketShouldThrowWhenDeletingDefaultBucket() { - assertThatThrownBy(() -> testee().deleteBucket(testee().getDefaultBucketName())) + assertThatThrownBy(() -> testee().deleteBucket(BucketName.DEFAULT)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Deleting the default bucket is forbidden"); } @@ -94,9 +95,9 @@ default void deleteBucketShouldThrowWhenDeletingDefaultBucket() { default void blobStoreShouldSupport100MBBlob() throws IOException { ZeroedInputStream data = new ZeroedInputStream(100_000_000); HashingInputStream writeHash = new HashingInputStream(Hashing.sha256(), data); - BlobId blobId = Mono.from(testee().save(testee().getDefaultBucketName(), writeHash, LOW_COST)).block(); + BlobId blobId = Mono.from(testee().save(BucketName.DEFAULT, writeHash, LOW_COST)).block(); - InputStream bytes = testee().read(testee().getDefaultBucketName(), blobId); + InputStream bytes = testee().read(BucketName.DEFAULT, blobId); HashingInputStream readHash = new HashingInputStream(Hashing.sha256(), bytes); consumeStream(readHash); diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java index 4c3ba2c44f4..f91690ecccf 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java @@ -24,7 +24,6 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.blob.api.BlobStoreDAOContract; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.TestBlobId; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.BeforeEach; @@ -51,7 +50,6 @@ void setUp(CassandraCluster cassandra) { CassandraConfiguration.builder() .blobPartSize(CHUNK_SIZE) .build(), - BucketName.DEFAULT, new RecordingMetricFactory()); } diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java index 53ab6a26a36..c4f813f4b6d 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java @@ -26,7 +26,6 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.PlainBlobId; @@ -61,9 +60,8 @@ public MetricableBlobStore createBlobStore() { return new MetricableBlobStore( metricFactory, BlobStoreFactory.builder() - .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, BucketName.DEFAULT, metricFactory)) + .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, metricFactory)) .blobIdFactory(blobIdFactory) - .defaultBucketName() .deduplication()); } diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraPassTroughBlobStoreTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraPassTroughBlobStoreTest.java index 1b073b20f67..6b9d8714c98 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraPassTroughBlobStoreTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraPassTroughBlobStoreTest.java @@ -26,7 +26,6 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.DeleteBlobStoreContract; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.PlainBlobId; @@ -54,9 +53,8 @@ void setUp(CassandraCluster cassandra) { testee = new MetricableBlobStore( metricFactory, BlobStoreFactory.builder() - .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, BucketName.DEFAULT, metricFactory)) + .blobStoreDAO(new CassandraBlobStoreDAO(defaultBucketDAO, bucketDAO, cassandraConfiguration, metricFactory)) .blobIdFactory(blobIdFactory) - .defaultBucketName() .passthrough()); } diff --git a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java index 229d0925cc9..9a870322448 100644 --- a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java +++ b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java @@ -79,14 +79,12 @@ public interface Decoder { private final Encoder encoder; private final Decoder decoder; private final BlobStore blobStore; - private final BucketName bucketName; - public Impl(BlobPartsId.Factory idFactory, Encoder encoder, Decoder decoder, BlobStore blobStore, BucketName bucketName) { + public Impl(BlobPartsId.Factory idFactory, Encoder encoder, Decoder decoder, BlobStore blobStore) { this.idFactory = idFactory; this.encoder = encoder; this.decoder = decoder; this.blobStore = blobStore; - this.bucketName = bucketName; } @Override @@ -100,14 +98,14 @@ public Mono save(T t) { private Mono> saveEntry(Pair entry) { return Mono.just(entry.getLeft()) - .zipWith(entry.getRight().saveIn(bucketName, blobStore)); + .zipWith(entry.getRight().saveIn(BucketName.DEFAULT, blobStore)); } @Override public Mono read(I blobIds) { return Flux.fromIterable(blobIds.asMap().entrySet()) .publishOn(ReactorUtils.BLOCKING_CALL_WRAPPER) - .flatMap(entry -> readByteSource(bucketName, entry.getValue(), entry.getKey().getStoragePolicy()) + .flatMap(entry -> readByteSource(BucketName.DEFAULT, entry.getValue(), entry.getKey().getStoragePolicy()) .map(result -> Pair.of(entry.getKey(), result))) .collectMap(Map.Entry::getKey, Pair::getValue) // Critical to correctly propagate errors. @@ -141,7 +139,7 @@ private Mono readByteSource(BucketName bucketName, BlobId b @Override public Publisher delete(I blobIds) { return Flux.fromIterable(blobIds.asMap().values()) - .flatMap(id -> blobStore.delete(bucketName, id), DEFAULT_CONCURRENCY) + .flatMap(id -> blobStore.delete(BucketName.DEFAULT, id), DEFAULT_CONCURRENCY) .then(); } } diff --git a/server/blob/blob-export-file/src/main/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanism.java b/server/blob/blob-export-file/src/main/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanism.java index e5fd24d7793..d4cce4a29d8 100644 --- a/server/blob/blob-export-file/src/main/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanism.java +++ b/server/blob/blob-export-file/src/main/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanism.java @@ -33,6 +33,7 @@ import org.apache.commons.io.FileUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.export.api.ExportedFileNamesGenerator; import org.apache.james.blob.export.api.FileExtension; @@ -125,7 +126,7 @@ private String copyBlobToFile(BlobId blobId, String fileName = ExportedFileNamesGenerator.generateFileName(fileCustomPrefix, blobId, fileExtension); String fileURL = configuration.exportDirectory + "/" + fileName; File file = fileSystem.getFile(fileURL); - try (InputStream in = blobStore.read(blobStore.getDefaultBucketName(), blobId, LOW_COST)) { + try (InputStream in = blobStore.read(BucketName.DEFAULT, blobId, LOW_COST)) { FileUtils.copyToFile(in, file); } diff --git a/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java b/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java index 2162464b4d9..2e1f536e77b 100644 --- a/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java +++ b/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java @@ -37,6 +37,7 @@ import org.apache.commons.io.IOUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.export.api.FileExtension; @@ -69,7 +70,6 @@ void setUp(FileSystem fileSystem) throws Exception { mailetContext = FakeMailContext.builder().postmaster(MailAddressFixture.POSTMASTER_AT_JAMES).build(); blobStore = MemoryBlobStoreFactory.builder() .blobIdFactory(new PlainBlobId.Factory()) - .defaultBucketName() .passthrough(); InetAddress localHost = mock(InetAddress.class); @@ -83,7 +83,7 @@ void setUp(FileSystem fileSystem) throws Exception { @Test void exportingBlobShouldSendAMail() { - BlobId blobId = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(blobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); String explanation = "The content of a deleted message vault had been shared with you."; testee.blobId(blobId) @@ -115,8 +115,8 @@ void exportingBlobShouldSendAMail() { } @Test - void exportingBlobShouldCreateAFileWithTheCorrespondingContent(FileSystem fileSystem) { - BlobId blobId = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); + void exportingBlobShouldCreateAFileWithTheCorrespondingContent() { + BlobId blobId = Mono.from(blobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); testee.blobId(blobId) .with(MailAddressFixture.RECIPIENT1) @@ -154,7 +154,7 @@ void shareShouldFailWhenBlobDoesNotExist() { @Test void exportingBlobShouldCreateAFileWithoutExtensionWhenNotDeclaringExtension() { - BlobId blobId = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(blobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); testee.blobId(blobId) .with(MailAddressFixture.RECIPIENT1) @@ -178,7 +178,7 @@ void exportingBlobShouldCreateAFileWithoutExtensionWhenNotDeclaringExtension() { @Test void exportingBlobShouldCreateAFileWithExtensionWhenDeclaringExtension() { - BlobId blobId = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(blobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); testee.blobId(blobId) .with(MailAddressFixture.RECIPIENT1) @@ -203,7 +203,7 @@ void exportingBlobShouldCreateAFileWithExtensionWhenDeclaringExtension() { @Test void exportingBlobShouldCreateAFileWithPrefixWhenDeclaringPrefix() { - BlobId blobId = Mono.from(blobStore.save(blobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); + BlobId blobId = Mono.from(blobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); String filePrefix = "deleted-message-of-bob@james.org"; testee.blobId(blobId) diff --git a/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStorePassThroughTest.java b/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStorePassThroughTest.java index 0538af29904..c6967868009 100644 --- a/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStorePassThroughTest.java +++ b/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStorePassThroughTest.java @@ -38,7 +38,6 @@ void setUp() { FileSystemImpl fileSystem = FileSystemImpl.forTesting(); blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new FileBlobStoreFactory(fileSystem).builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .passthrough()); } diff --git a/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreTest.java b/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreTest.java index a41404d725b..d4f71683a55 100644 --- a/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreTest.java +++ b/server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreTest.java @@ -42,7 +42,6 @@ public MetricableBlobStore createBlobStore() { FileSystemImpl fileSystem = FileSystemImpl.forTesting(); return new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new FileBlobStoreFactory(fileSystem).builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .deduplication()); } diff --git a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStorePassThroughTest.java b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStorePassThroughTest.java index 30431191c26..8c4089e6613 100644 --- a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStorePassThroughTest.java +++ b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStorePassThroughTest.java @@ -36,7 +36,6 @@ public class MemoryBlobStorePassThroughTest implements DeleteBlobStoreContract, void setUp() { blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), MemoryBlobStoreFactory.builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .passthrough()); } diff --git a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java index 19fdd2176b1..4bbc8823be1 100644 --- a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java +++ b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java @@ -40,7 +40,6 @@ void setUp() { public MetricableBlobStore createBlobStore() { return new MetricableBlobStore(metricsTestExtension.getMetricFactory(), MemoryBlobStoreFactory.builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .deduplication()); } diff --git a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java index 7fee8a41d86..06b08e6270c 100644 --- a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java +++ b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java @@ -87,17 +87,15 @@ private BucketNameResolver(Optional namespace, Optional pref BucketName resolve(BucketName bucketName) { Preconditions.checkNotNull(bucketName); - if (isNameSpace(bucketName)) { - return bucketName; - } - return prefix - .map(bucketPrefix -> BucketName.of(bucketPrefix + bucketName.asString())) - .orElse(bucketName); + return namespace.filter(any -> BucketName.DEFAULT.equals(bucketName)) + .orElse(prefix + .map(bucketPrefix -> BucketName.of(bucketPrefix + bucketName.asString())) + .orElse(bucketName)); } Optional unresolve(BucketName bucketName) { if (isNameSpace(bucketName)) { - return Optional.of(bucketName); + return Optional.of(BucketName.DEFAULT); } return prefix.map(p -> { diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java index 178830d4b1b..26019a84ad5 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java @@ -32,7 +32,7 @@ class BucketNameResolverTest { @Nested class EmptyPrefix { @ParameterizedTest - @ValueSource(strings = {"namespace", "any", "bucketPrefix-aaa", "bucketPrefix-"}) + @ValueSource(strings = {"default", "any", "bucketPrefix-aaa", "bucketPrefix-"}) void withShouldAddNewValuesInSet(String bucketNameString) { BucketNameResolver resolver = BucketNameResolver.builder() .noPrefix() @@ -85,7 +85,7 @@ void unresolveShouldReturnValueWhenNamespace() { .build(); assertThat(resolver.unresolve(BucketName.of("namespace"))) - .contains(BucketName.of("namespace")); + .contains(BucketName.DEFAULT); } } @@ -204,13 +204,13 @@ void resolveShouldReturnPassedValueWithPrefix() { } @Test - void resolveShouldReturnNamespaceWhenPassingNamespace() { + void resolveShouldReturnNamespaceWhenPassingDefault() { BucketNameResolver resolver = BucketNameResolver.builder() .prefix("bucketPrefix-") .namespace(BucketName.of("namespace")) .build(); - assertThat(resolver.resolve(BucketName.of("namespace"))) + assertThat(resolver.resolve(BucketName.DEFAULT)) .isEqualTo(BucketName.of("namespace")); } @@ -244,7 +244,7 @@ void unresolveShouldReturnNamespaceWhenPassingNamespace() { .build(); assertThat(resolver.unresolve(BucketName.of("namespace"))) - .contains(BucketName.of("namespace")); + .contains(BucketName.DEFAULT); } } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3DeDuplicationBlobStoreTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3DeDuplicationBlobStoreTest.java index 24beccdcba2..06abb0b416f 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3DeDuplicationBlobStoreTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3DeDuplicationBlobStoreTest.java @@ -73,7 +73,6 @@ public BlobStore createBlobStore() { return BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .defaultBucketName() .deduplication(); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3NamespaceTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3NamespaceTest.java index 72e51771ff2..e8efa30c5ca 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3NamespaceTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3NamespaceTest.java @@ -59,7 +59,6 @@ static void setUpClass(DockerAwsS3Container dockerAwsS3) { testee = BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .bucket(BucketName.of("namespace")) .passthrough(); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PassThroughBlobStoreTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PassThroughBlobStoreTest.java index c99777782ad..2b3de233125 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PassThroughBlobStoreTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PassThroughBlobStoreTest.java @@ -59,7 +59,6 @@ static void setUpClass(DockerAwsS3Container dockerAwsS3) { testee = BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .defaultBucketName() .passthrough(); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixAndNamespaceTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixAndNamespaceTest.java index 99183da991c..59654c0848e 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixAndNamespaceTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixAndNamespaceTest.java @@ -68,7 +68,6 @@ public BlobStore createBlobStore() { return BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .bucket(BucketName.of("namespace")) .deduplication(); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixTest.java index 01759adf273..30ff9aa011e 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixTest.java @@ -58,7 +58,6 @@ static void setUpClass(DockerAwsS3Container dockerAwsS3) { testee = BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .defaultBucketName() .passthrough(); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3WithMinIOGenerationAwareBlobIdTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3WithMinIOGenerationAwareBlobIdTest.java index a13a9e772c7..c49ce655d66 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3WithMinIOGenerationAwareBlobIdTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3WithMinIOGenerationAwareBlobIdTest.java @@ -70,7 +70,7 @@ void beforeEach() throws Exception { testee = createBlobStore(blobIdFactory); // Why? https://github.com/apache/james-project/pull/1981#issuecomment-2380396460 - createBucket(testee.getDefaultBucketName().asString()); + createBucket(BucketName.DEFAULT.asString()); } @AfterEach @@ -110,7 +110,6 @@ public BlobStore createBlobStore(BlobId.Factory blobIdFactory) { return BlobStoreFactory.builder() .blobStoreDAO(s3BlobStoreDAO) .blobIdFactory(blobIdFactory) - .defaultBucketName() .deduplication(); } @@ -119,10 +118,9 @@ public BlobStore createBlobStore(BlobId.Factory blobIdFactory) { void saveShouldReturnBlobIdOfString(BlobStore.StoragePolicy storagePolicy) { // Given: A BlobStore and its default bucket BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); // When: Saving a blob - BlobId blobId = Mono.from(store.save(defaultBucketName, "toto", storagePolicy)).block(); + BlobId blobId = Mono.from(store.save(BucketName.DEFAULT, "toto", storagePolicy)).block(); String blobIdString = blobId.asString(); // Then: BlobId string and parsed BlobId should match expectations @@ -141,14 +139,12 @@ class Compatible { private BlobStore withGenerationAwareBlobId; private BlobStore withMinIOGenerationAwareBlobId; - private BucketName defaultBucketName; @BeforeEach void setup() { BlobId.Factory plainBlobIdFactory = new PlainBlobId.Factory(); withGenerationAwareBlobId = createBlobStore(new GenerationAwareBlobId.Factory(clock, plainBlobIdFactory, GenerationAwareBlobId.Configuration.DEFAULT)); withMinIOGenerationAwareBlobId = createBlobStore(new MinIOGenerationAwareBlobId.Factory(clock, GenerationAwareBlobId.Configuration.DEFAULT, plainBlobIdFactory)); - defaultBucketName = withGenerationAwareBlobId.getDefaultBucketName(); } @@ -156,12 +152,12 @@ void setup() { void readWithMinIOGenerationAwareShouldSuccessWhenBlobWasStoredByGenerationAware() { String originalData = "toto" + UUID.randomUUID(); // Given a blob stored with GenerationAwareBlobId - BlobId blobId = Mono.from(withGenerationAwareBlobId.save(defaultBucketName, originalData, LOW_COST)).block(); + BlobId blobId = Mono.from(withGenerationAwareBlobId.save(BucketName.DEFAULT, originalData, LOW_COST)).block(); assertThat(blobId).isInstanceOf(GenerationAwareBlobId.class); // When reading it with MinIOGenerationAwareBlobId - byte[] readAsByte = Mono.from(withMinIOGenerationAwareBlobId.readBytes(defaultBucketName, blobId)).block(); + byte[] readAsByte = Mono.from(withMinIOGenerationAwareBlobId.readBytes(BucketName.DEFAULT, blobId)).block(); // Then the data should be the same assertThat(new String(readAsByte, StandardCharsets.UTF_8)).isEqualTo(originalData); @@ -171,16 +167,16 @@ void readWithMinIOGenerationAwareShouldSuccessWhenBlobWasStoredByGenerationAware void listBlobsShouldReturnCorrectBlobIdWhenBlobWasStoredByGenerationAware() { String originalData = "toto" + UUID.randomUUID(); // Given a blob stored with GenerationAwareBlobId - BlobId blobId = Mono.from(withGenerationAwareBlobId.save(defaultBucketName, originalData, LOW_COST)).block(); + BlobId blobId = Mono.from(withGenerationAwareBlobId.save(BucketName.DEFAULT, originalData, LOW_COST)).block(); assertThat(blobId).isInstanceOf(GenerationAwareBlobId.class); // When listing blobs with MinIOGenerationAwareBlobId - List blobIdList = Flux.from(withMinIOGenerationAwareBlobId.listBlobs(defaultBucketName)).collectList().block(); + List blobIdList = Flux.from(withMinIOGenerationAwareBlobId.listBlobs(BucketName.DEFAULT)).collectList().block(); assertThat(blobIdList).hasSize(1); assertThat(blobIdList.getFirst()).isInstanceOf(GenerationAwareBlobId.class); // And using the returned BlobId to read the data - byte[] readAsByte = Mono.from(withMinIOGenerationAwareBlobId.readBytes(defaultBucketName, blobIdList.getFirst())).block(); + byte[] readAsByte = Mono.from(withMinIOGenerationAwareBlobId.readBytes(BucketName.DEFAULT, blobIdList.getFirst())).block(); // Then the data should be the same as the original data assertThat(new String(readAsByte, StandardCharsets.UTF_8)).isEqualTo(originalData); @@ -190,11 +186,11 @@ void listBlobsShouldReturnCorrectBlobIdWhenBlobWasStoredByGenerationAware() { void readWithGenerationAwareShouldSuccessWhenBlobWasStoredByMinIOGenerationAware() { String originalData = "toto" + UUID.randomUUID(); // Given a blob stored with MinIOGenerationAwareBlobId - BlobId blobId = Mono.from(withMinIOGenerationAwareBlobId.save(defaultBucketName, originalData, LOW_COST)).block(); + BlobId blobId = Mono.from(withMinIOGenerationAwareBlobId.save(BucketName.DEFAULT, originalData, LOW_COST)).block(); assertThat(blobId).isInstanceOf(MinIOGenerationAwareBlobId.class); // When reading it with GenerationAwareBlobId - byte[] readAsByte = Mono.from(withGenerationAwareBlobId.readBytes(defaultBucketName, blobId)).block(); + byte[] readAsByte = Mono.from(withGenerationAwareBlobId.readBytes(BucketName.DEFAULT, blobId)).block(); // Then the data should be the same assertThat(new String(readAsByte, StandardCharsets.UTF_8)).isEqualTo(originalData); @@ -204,16 +200,16 @@ void readWithGenerationAwareShouldSuccessWhenBlobWasStoredByMinIOGenerationAware void listBlobsShouldReturnCorrectBlobIdWhenBlobWasStoredByMinIOGenerationAware() { String originalData = "toto" + UUID.randomUUID(); // Given a blob stored with MinIOGenerationAwareBlobId - BlobId blobId = Mono.from(withMinIOGenerationAwareBlobId.save(defaultBucketName, originalData, LOW_COST)).block(); + BlobId blobId = Mono.from(withMinIOGenerationAwareBlobId.save(BucketName.DEFAULT, originalData, LOW_COST)).block(); assertThat(blobId).isInstanceOf(MinIOGenerationAwareBlobId.class); // When listing blobs with GenerationAwareBlobId - List blobIdList = Flux.from(withGenerationAwareBlobId.listBlobs(defaultBucketName)).collectList().block(); + List blobIdList = Flux.from(withGenerationAwareBlobId.listBlobs(BucketName.DEFAULT)).collectList().block(); assertThat(blobIdList).hasSize(1); assertThat(blobIdList.getFirst()).isInstanceOf(GenerationAwareBlobId.class); // And using the returned BlobId to read the data - byte[] readAsByte = Mono.from(withGenerationAwareBlobId.readBytes(defaultBucketName, blobIdList.getFirst())).block(); + byte[] readAsByte = Mono.from(withGenerationAwareBlobId.readBytes(BucketName.DEFAULT, blobIdList.getFirst())).block(); // Then the data should be the same as the original data assertThat(new String(readAsByte, StandardCharsets.UTF_8)).isEqualTo(originalData); diff --git a/server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobStoreFactory.java b/server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobStoreFactory.java index a8e1ef6fa5f..c5128bbc0c7 100644 --- a/server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobStoreFactory.java +++ b/server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobStoreFactory.java @@ -22,7 +22,6 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.BucketName; public abstract class BlobStoreFactory { @FunctionalInterface @@ -32,16 +31,7 @@ public interface RequireBlobStoreDAO { @FunctionalInterface public interface RequireBlobIdFactory { - RequireBucketName blobIdFactory(BlobId.Factory blobIdFactory); - } - - @FunctionalInterface - public interface RequireBucketName { - RequireStoringStrategy bucket(BucketName defaultBucketName); - - default RequireStoringStrategy defaultBucketName() { - return bucket(BucketName.DEFAULT); - } + RequireStoringStrategy blobIdFactory(BlobId.Factory blobIdFactory); } @FunctionalInterface @@ -58,12 +48,12 @@ default BlobStore deduplication() { } public static RequireBlobStoreDAO builder() { - return blobStoreDAO -> blobIdFactory -> defaultBucketName -> storageStrategy -> { + return blobStoreDAO -> blobIdFactory -> storageStrategy -> { switch (storageStrategy) { case PASSTHROUGH: - return new PassThroughBlobStore(blobStoreDAO, defaultBucketName, blobIdFactory); + return new PassThroughBlobStore(blobStoreDAO, blobIdFactory); case DEDUPLICATION: - return new DeDuplicationBlobStore(blobStoreDAO, defaultBucketName, blobIdFactory); + return new DeDuplicationBlobStore(blobStoreDAO, blobIdFactory); default: throw new IllegalArgumentException("Unknown storage strategy"); } diff --git a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala index 92dfb7f0059..7cb345d93d9 100644 --- a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala +++ b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala @@ -22,7 +22,7 @@ package org.apache.james.server.blob.deduplication import com.google.common.base.Preconditions import com.google.common.hash.{HashCode, Hashing, HashingInputStream} import com.google.common.io.{BaseEncoding, ByteSource, FileBackedOutputStream} -import jakarta.inject.{Inject, Named} +import jakarta.inject.Inject import org.apache.commons.io.IOUtils import org.apache.james.blob.api.BlobStore.BlobIdProvider import org.apache.james.blob.api.{BlobId, BlobStore, BlobStoreDAO, BucketName} @@ -61,7 +61,6 @@ object DeDuplicationBlobStore { } class DeDuplicationBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) defaultBucketName: BucketName, blobIdFactory: BlobId.Factory) extends BlobStore { private val HASH_BLOB_ID_ENCODING_TYPE_PROPERTY = "james.blob.id.hash.encoding" @@ -177,8 +176,6 @@ class DeDuplicationBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, blobStoreDAO.readReactive(bucketName, blobId) } - override def getDefaultBucketName: BucketName = defaultBucketName - override def deleteBucket(bucketName: BucketName): Publisher[Void] = { blobStoreDAO.deleteBucket(bucketName) } @@ -190,7 +187,5 @@ class DeDuplicationBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, SMono.just(Boolean.box(false)) } - override def listBuckets(): Publisher[BucketName] = Flux.concat(blobStoreDAO.listBuckets(), Flux.just(defaultBucketName)).distinct() - override def listBlobs(bucketName: BucketName): Publisher[BlobId] = blobStoreDAO.listBlobs(bucketName) } diff --git a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala index 26de0c5bdee..a2299bf8a3b 100644 --- a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala +++ b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala @@ -21,21 +21,19 @@ package org.apache.james.server.blob.deduplication import com.google.common.base.Preconditions import com.google.common.io.ByteSource -import jakarta.inject.{Inject, Named} +import jakarta.inject.Inject import org.apache.james.blob.api.BlobStore.BlobIdProvider import org.apache.james.blob.api.{BlobId, BlobStore, BlobStoreDAO, BucketName} import org.reactivestreams.Publisher import reactor.core.publisher.Flux -import reactor.core.scala.publisher.{SMono, tupleTwo2ScalaTuple2} +import reactor.core.scala.publisher.SMono import reactor.core.scheduler.Schedulers -import reactor.util.function.{Tuple2, Tuples} +import reactor.util.function.Tuples -import java.io.{ByteArrayInputStream, InputStream} +import java.io.InputStream import java.util.UUID -class PassThroughBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) defaultBucketName: BucketName, - blobIdFactory: BlobId.Factory) extends BlobStore { +class PassThroughBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, blobIdFactory: BlobId.Factory) extends BlobStore { override def save(bucketName: BucketName, data: Array[Byte], storagePolicy: BlobStore.StoragePolicy): Publisher[BlobId] = { save(bucketName, data, withBlobIdByteArray, storagePolicy) @@ -110,8 +108,6 @@ class PassThroughBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, blobStoreDAO.readReactive(bucketName, blobId) } - override def getDefaultBucketName: BucketName = defaultBucketName - override def deleteBucket(bucketName: BucketName): Publisher[Void] = { blobStoreDAO.deleteBucket(bucketName) } @@ -124,7 +120,5 @@ class PassThroughBlobStore @Inject()(blobStoreDAO: BlobStoreDAO, .`then`(SMono.just(Boolean.box(true))) } - override def listBuckets(): Publisher[BucketName] = Flux.concat(blobStoreDAO.listBuckets(), Flux.just(defaultBucketName)).distinct() - override def listBlobs(bucketName: BucketName): Publisher[BlobId] = blobStoreDAO.listBlobs(bucketName) } diff --git a/server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithmContract.java b/server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithmContract.java index 39397f1f145..9e4e7d29b4d 100644 --- a/server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithmContract.java +++ b/server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithmContract.java @@ -84,7 +84,7 @@ default void setUp() { } default BlobStore blobStore() { - return new DeDuplicationBlobStore(blobStoreDAO(), DEFAULT_BUCKET, GENERATION_AWARE_BLOB_ID_FACTORY); + return new DeDuplicationBlobStore(blobStoreDAO(), GENERATION_AWARE_BLOB_ID_FACTORY); } default BloomFilterGCAlgorithm bloomFilterGCAlgorithm() { diff --git a/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessageStore.java b/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessageStore.java index 818cb08be1e..61113a8055e 100644 --- a/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessageStore.java +++ b/server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessageStore.java @@ -40,7 +40,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobType; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.Store; import org.apache.james.blob.api.Store.CloseableByteSource; import org.apache.james.lifecycle.api.Disposable; @@ -65,17 +64,11 @@ public Factory(BlobStore blobStore) { } public Store mimeMessageStore() { - return mimeMessageStore(blobStore.getDefaultBucketName()); - } - - public Store mimeMessageStore(BucketName bucketName) { return new Store.Impl<>( new MimeMessagePartsId.Factory(), new MimeMessageEncoder(), new MimeMessageDecoder(), - blobStore, - bucketName - ); + blobStore); } } diff --git a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java index 2ecad6ba33d..126486088a6 100644 --- a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java +++ b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java @@ -31,6 +31,7 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.ObjectNotFoundException; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.api.Store; @@ -55,7 +56,6 @@ class MimeMessageStoreTest { void setUp() { blobStore = MemoryBlobStoreFactory.builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .passthrough(); testee = MimeMessageStore.factory(blobStore).mimeMessageStore(); } @@ -279,7 +279,7 @@ void saveShouldSeparateHeadersAndBodyInDifferentBlobs() throws Exception { BlobId headerBlobId = parts.getHeaderBlobId(); BlobId bodyBlobId = parts.getBodyBlobId(); - softly.assertThat(new String(Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), headerBlobId)).block(), StandardCharsets.UTF_8)) + softly.assertThat(new String(Mono.from(blobStore.readBytes(BucketName.DEFAULT, headerBlobId)).block(), StandardCharsets.UTF_8)) .isEqualTo("Date: Thu, 6 Sep 2018 13:29:13 +0700 (ICT)\r\n" + "From: any@any.com\r\n" + "To: toddy@any.com\r\n" + @@ -288,7 +288,7 @@ void saveShouldSeparateHeadersAndBodyInDifferentBlobs() throws Exception { "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=UTF-8\r\n" + "Content-Transfer-Encoding: 7bit\r\n\r\n"); - softly.assertThat(new String(Mono.from(blobStore.readBytes(blobStore.getDefaultBucketName(), bodyBlobId)).block(), StandardCharsets.UTF_8)) + softly.assertThat(new String(Mono.from(blobStore.readBytes(BucketName.DEFAULT, bodyBlobId)).block(), StandardCharsets.UTF_8)) .isEqualTo("Important mail content"); }); } diff --git a/server/container/guice/blob/memory/src/main/java/org/apache/james/modules/BlobMemoryModule.java b/server/container/guice/blob/memory/src/main/java/org/apache/james/modules/BlobMemoryModule.java index 331c7cf057f..6181f946bbf 100644 --- a/server/container/guice/blob/memory/src/main/java/org/apache/james/modules/BlobMemoryModule.java +++ b/server/container/guice/blob/memory/src/main/java/org/apache/james/modules/BlobMemoryModule.java @@ -22,14 +22,12 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore; import com.google.inject.AbstractModule; import com.google.inject.Scopes; -import com.google.inject.name.Names; public class BlobMemoryModule extends AbstractModule { @@ -43,9 +41,5 @@ protected void configure() { bind(MemoryBlobStoreDAO.class).in(Scopes.SINGLETON); bind(BlobStoreDAO.class).to(MemoryBlobStoreDAO.class); - - bind(BucketName.class) - .annotatedWith(Names.named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER)) - .toInstance(BucketName.DEFAULT); } } diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/DefaultBucketModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/DefaultBucketModule.java deleted file mode 100644 index 7fa236a4fb9..00000000000 --- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/DefaultBucketModule.java +++ /dev/null @@ -1,35 +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.modules.mailbox; - -import org.apache.james.blob.api.BlobStore; -import org.apache.james.blob.api.BucketName; - -import com.google.inject.AbstractModule; -import com.google.inject.name.Names; - -public class DefaultBucketModule extends AbstractModule { - @Override - protected void configure() { - bind(BucketName.class) - .annotatedWith(Names.named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER)) - .toInstance(BucketName.DEFAULT); - } -} diff --git a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java index a0c467bdb98..abee4d6afb2 100644 --- a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java +++ b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java @@ -44,7 +44,6 @@ import org.apache.james.modules.blobstore.validation.StoragePolicyConfigurationSanityEnforcementModule; import org.apache.james.modules.mailbox.BlobStoreAPIModule; import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule; -import org.apache.james.modules.mailbox.DefaultBucketModule; import org.apache.james.modules.objectstorage.S3BlobStoreModule; import org.apache.james.modules.objectstorage.S3BucketModule; import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore; @@ -71,7 +70,6 @@ static class CassandraBlobStoreDAODeclarationModule extends AbstractModule { @Override protected void configure() { install(new CassandraBlobStoreDependenciesModule()); - install(new DefaultBucketModule()); bind(BlobStoreDAO.class).annotatedWith(Names.named(UNENCRYPTED)).to(CassandraBlobStoreDAO.class); } @@ -105,7 +103,6 @@ S3RequestOption provideS3RequestOption(S3BlobStoreConfiguration configuration) t static class FileBlobStoreDAODeclarationModule extends AbstractModule { @Override protected void configure() { - install(new DefaultBucketModule()); bind(BlobStoreDAO.class).annotatedWith(Names.named(UNENCRYPTED)).to(FileBlobStoreDAO.class); } @@ -116,7 +113,6 @@ static class PostgresBlobStoreDAODeclarationModule extends AbstractModule { protected void configure() { install(new BlobPostgresModule()); - install(new DefaultBucketModule()); bind(BlobStoreDAO.class).annotatedWith(Names.named(UNENCRYPTED)).to(PostgresBlobStoreDAO.class); } diff --git a/server/container/guice/mailrepository-blob/src/main/java/org/apache/james/modules/mailrepository/BlobstoreMailRepositoryModule.java b/server/container/guice/mailrepository-blob/src/main/java/org/apache/james/modules/mailrepository/BlobstoreMailRepositoryModule.java index 3f4cf8f9ea4..8c7b03e2385 100644 --- a/server/container/guice/mailrepository-blob/src/main/java/org/apache/james/modules/mailrepository/BlobstoreMailRepositoryModule.java +++ b/server/container/guice/mailrepository-blob/src/main/java/org/apache/james/modules/mailrepository/BlobstoreMailRepositoryModule.java @@ -19,13 +19,9 @@ package org.apache.james.modules.mailrepository; -import jakarta.inject.Named; - import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.BucketName; import org.apache.james.mailrepository.api.MailRepositoryFactory; import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.Protocol; @@ -54,10 +50,9 @@ protected void configure() { @ProvidesIntoSet() public MailRepositoryFactory blobMailRepository(BlobStoreDAO blobStore, - BlobId.Factory blobIdFactory, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) BucketName defaultBucketName + BlobId.Factory blobIdFactory ) { - return new BlobMailRepositoryFactory(blobStore, blobIdFactory, defaultBucketName); + return new BlobMailRepositoryFactory(blobStore, blobIdFactory); } } diff --git a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSourceTest.java b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSourceTest.java index c64bee9a099..e616ea0af6c 100644 --- a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSourceTest.java +++ b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSourceTest.java @@ -41,7 +41,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -public class PostgresMailRepositoryBlobReferenceSourceTest { +class PostgresMailRepositoryBlobReferenceSourceTest { @RegisterExtension static PostgresExtension postgresExtension = PostgresExtension.withoutRowLevelSecurity(PostgresDataDefinition.aggregateModules(PostgresMailRepositoryDataDefinition.MODULE)); @@ -55,7 +55,6 @@ void beforeEach() { BlobId.Factory factory = new PlainBlobId.Factory(); BlobStore blobStore = MemoryBlobStoreFactory.builder() .blobIdFactory(factory) - .defaultBucketName() .passthrough(); postgresMailRepositoryContentDAO = new PostgresMailRepositoryContentDAO(postgresExtension.getDefaultPostgresExecutor(), MimeMessageStore.factory(blobStore), factory); postgresMailRepositoryBlobReferenceSource = new PostgresMailRepositoryBlobReferenceSource(postgresMailRepositoryContentDAO); diff --git a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryTest.java b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryTest.java index 9438d60ff22..c9b13a3e40e 100644 --- a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryTest.java +++ b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryTest.java @@ -56,7 +56,6 @@ public PostgresMailRepository retrieveRepository(MailRepositoryPath path) { MailRepositoryUrl url = MailRepositoryUrl.fromPathAndProtocol(new Protocol("postgres"), path); BlobStore blobStore = MemoryBlobStoreFactory.builder() .blobIdFactory(BLOB_ID_FACTORY) - .defaultBucketName() .passthrough(); return new PostgresMailRepository(url, new PostgresMailRepositoryContentDAO(postgresExtension.getDefaultPostgresExecutor(), MimeMessageStore.factory(blobStore), BLOB_ID_FACTORY)); } diff --git a/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepository.scala b/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepository.scala index 7d6f3bd44f4..d3daa85f1cd 100644 --- a/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepository.scala +++ b/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepository.scala @@ -171,14 +171,14 @@ class BlobMailRepository(val mailMetaDataBlobStore: BlobStore, @throws[MessagingException] override def size: Long = - Flux.from(mailMetaDataBlobStore.listBlobs(mailMetaDataBlobStore.getDefaultBucketName)) + Flux.from(mailMetaDataBlobStore.listBlobs(BucketName.DEFAULT)) .filter(this.belongsToMailRepository) .count() .block() @throws[MessagingException] override def list: util.Iterator[MailKey] = - Flux.from(mailMetaDataBlobStore.listBlobs(mailMetaDataBlobStore.getDefaultBucketName)) + Flux.from(mailMetaDataBlobStore.listBlobs(BucketName.DEFAULT)) .filter(this.belongsToMailRepository) .map[MailKey](blobId => new MailKey(blobId.asString)) .toIterable @@ -219,7 +219,7 @@ class BlobMailRepository(val mailMetaDataBlobStore: BlobStore, @throws[MessagingException] override def removeAll(): Unit = { - Flux.from(mailMetaDataBlobStore.listBlobs(mailMetaDataBlobStore.getDefaultBucketName)) + Flux.from(mailMetaDataBlobStore.listBlobs(BucketName.DEFAULT)) .flatMap(blobId => this.remove(MailPartsId(blobId))) .blockLast() } @@ -228,7 +228,6 @@ class BlobMailRepository(val mailMetaDataBlobStore: BlobStore, new MailPartsId.Factory, new BlobMailRepository.MailEncoder(mailMetadataBlobIdFactory), new BlobMailRepository.MailDecoder(mailMetadataBlobIdFactory), - mailMetaDataBlobStore, - mailMetaDataBlobStore.getDefaultBucketName + mailMetaDataBlobStore ) } \ No newline at end of file diff --git a/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepositoryFactory.scala b/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepositoryFactory.scala index a0208ffdff3..92020782f14 100644 --- a/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepositoryFactory.scala +++ b/server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepositoryFactory.scala @@ -19,7 +19,6 @@ package org.apache.james.mailrepository.blob -import jakarta.inject.Named import jakarta.mail.internet.MimeMessage import org.apache.james.blob.api._ import org.apache.james.blob.mail.{MimeMessagePartsId, MimeMessageStore} @@ -40,24 +39,18 @@ class MailRepositoryBlobIdFactory( } class BlobMailRepositoryFactory(blobStoreDao: BlobStoreDAO, - blobIdFactory: BlobId.Factory, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) defaultBucketName: BucketName - ) extends MailRepositoryFactory { + blobIdFactory: BlobId.Factory) extends MailRepositoryFactory { override val mailRepositoryClass: Class[_ <: MailRepository] = classOf[BlobMailRepository] override def create(url: MailRepositoryUrl): MailRepository = { val metadataUrl = url.subUrl("mailMetadata") val metadataIdFactory = new MailRepositoryBlobIdFactory( blobIdFactory = blobIdFactory, - url = metadataUrl - ) + url = metadataUrl) val metadataBlobStore = BlobStoreFactory.builder() .blobStoreDAO(blobStoreDao) - .blobIdFactory( - metadataIdFactory - ) - .bucket(defaultBucketName) + .blobIdFactory(metadataIdFactory) .passthrough() val mimeMessageStore: Store[MimeMessage, MimeMessagePartsId] = buildMimeMessageStore(url) @@ -68,14 +61,11 @@ class BlobMailRepositoryFactory(blobStoreDao: BlobStoreDAO, private def buildMimeMessageStore(url: MailRepositoryUrl) = { val mimeMessageIdFactory = new MailRepositoryBlobIdFactory( blobIdFactory = blobIdFactory, - url = url.subUrl("mimeMessagedata") - ) + url = url.subUrl("mimeMessagedata")) + val mimeMessageBlobStore = BlobStoreFactory.builder() .blobStoreDAO(blobStoreDao) - .blobIdFactory( - mimeMessageIdFactory - ) - .bucket(defaultBucketName) + .blobIdFactory(mimeMessageIdFactory) .passthrough() val mimeMessageStore = new MimeMessageStore.Factory(mimeMessageBlobStore).mimeMessageStore() mimeMessageStore diff --git a/server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/BlobMailRepositoryTest.java b/server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/BlobMailRepositoryTest.java index fbf0f8036ed..e66e04f30fa 100644 --- a/server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/BlobMailRepositoryTest.java +++ b/server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/BlobMailRepositoryTest.java @@ -20,9 +20,7 @@ package org.apache.james.mailrepository.blob; import org.apache.james.blob.api.PlainBlobId; -import org.apache.james.blob.mail.MimeMessageStore; import org.apache.james.blob.memory.MemoryBlobStoreDAO; -import org.apache.james.blob.memory.MemoryBlobStoreFactory; import org.apache.james.mailrepository.MailRepositoryContract; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryPath; @@ -34,22 +32,14 @@ class BlobMailRepositoryTest implements MailRepositoryContract { private MailRepository blobMailRepository; - private PlainBlobId.Factory blobIdFactory; - private MemoryBlobStoreDAO blobStore; - private MimeMessageStore.Factory mimeMessageStoreFactory; private BlobMailRepositoryFactory blobMailRepositoryFactory; @BeforeEach void setup() { - blobIdFactory = new PlainBlobId.Factory(); - blobStore = new MemoryBlobStoreDAO(); - var mimeMessageBlobStore = MemoryBlobStoreFactory.builder() - .blobIdFactory(blobIdFactory) - .defaultBucketName() - .passthrough(); - mimeMessageStoreFactory = new MimeMessageStore.Factory(mimeMessageBlobStore); + PlainBlobId.Factory blobIdFactory = new PlainBlobId.Factory(); + MemoryBlobStoreDAO blobStore = new MemoryBlobStoreDAO(); MailRepositoryPath path = MailRepositoryPath.from("var/mail/error"); - blobMailRepositoryFactory = new BlobMailRepositoryFactory(blobStore, blobIdFactory, mimeMessageBlobStore.getDefaultBucketName()); + blobMailRepositoryFactory = new BlobMailRepositoryFactory(blobStore, blobIdFactory); blobMailRepository = buildBlobMailRepository(path); } diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/BlobRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/BlobRoutes.java index ff37a2aa715..03364e9ba08 100644 --- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/BlobRoutes.java +++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/BlobRoutes.java @@ -24,11 +24,9 @@ import java.util.Set; import jakarta.inject.Inject; -import jakarta.inject.Named; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobReferenceSource; -import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.blob.api.BucketName; import org.apache.james.server.blob.deduplication.BlobGCTask; @@ -54,7 +52,6 @@ public class BlobRoutes implements Routes { private final JsonTransformer jsonTransformer; private final Clock clock; private final BlobStoreDAO blobStoreDAO; - private final BucketName bucketName; private final Set blobReferenceSources; private final GenerationAwareBlobId.Configuration generationAwareBlobIdConfiguration; private final BlobId.Factory generationAwareBlobIdFactory; @@ -64,7 +61,6 @@ public BlobRoutes(TaskManager taskManager, JsonTransformer jsonTransformer, Clock clock, BlobStoreDAO blobStoreDAO, - @Named(BlobStore.DEFAULT_BUCKET_NAME_QUALIFIER) BucketName defaultBucketName, Set blobReferenceSources, GenerationAwareBlobId.Configuration generationAwareBlobIdConfiguration, BlobId.Factory generationAwareBlobIdFactory) { @@ -72,7 +68,6 @@ public BlobRoutes(TaskManager taskManager, this.jsonTransformer = jsonTransformer; this.clock = clock; this.blobStoreDAO = blobStoreDAO; - this.bucketName = defaultBucketName; this.blobReferenceSources = blobReferenceSources; this.generationAwareBlobIdConfiguration = generationAwareBlobIdConfiguration; this.generationAwareBlobIdFactory = generationAwareBlobIdFactory; @@ -104,7 +99,7 @@ public Task gcUnreferenced(Request request) { .generationAwareBlobIdFactory(generationAwareBlobIdFactory) .generationAwareBlobIdConfiguration(generationAwareBlobIdConfiguration) .blobReferenceSource(blobReferenceSources) - .bucketName(bucketName) + .bucketName(BucketName.DEFAULT) .clock(clock) .expectedBlobCount(expectedBlobCount) .associatedProbability(associatedProbability) diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/BlobRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/BlobRoutesTest.java index 8f3204489e4..7196b8748c0 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/BlobRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/BlobRoutesTest.java @@ -101,7 +101,7 @@ void setUp() { GenerationAwareBlobId.Factory generationAwareBlobIdFactory = new GenerationAwareBlobId.Factory(clock, BLOB_ID_FACTORY, GENERATION_AWARE_BLOB_ID_CONFIGURATION); BlobStoreDAO blobStoreDAO = new MemoryBlobStoreDAO(); - blobStore = new DeDuplicationBlobStore(blobStoreDAO, DEFAULT_BUCKET, generationAwareBlobIdFactory); + blobStore = new DeDuplicationBlobStore(blobStoreDAO, generationAwareBlobIdFactory); JsonTransformer jsonTransformer = new JsonTransformer(); TasksRoutes tasksRoutes = new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of(BlobGCTaskAdditionalInformationDTO.SERIALIZATION_MODULE)); BlobRoutes blobRoutes = new BlobRoutes( @@ -109,7 +109,6 @@ void setUp() { jsonTransformer, clock, blobStoreDAO, - DEFAULT_BUCKET, ImmutableSet.of(blobReferenceSource), GENERATION_AWARE_BLOB_ID_CONFIGURATION, generationAwareBlobIdFactory); diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutesTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutesTest.java index 3b1b8c8ba06..20b8c2f7f95 100644 --- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutesTest.java +++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutesTest.java @@ -39,7 +39,6 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.apache.james.core.Username; @@ -101,9 +100,7 @@ void setUp() { clock = new UpdatableTickingClock(TIMESTAMP.toInstant()); BlobStoreDAO blobStoreDAO = new MemoryBlobStoreDAO(); BlobId.Factory blobIdFactory = new PlainBlobId.Factory(); - blobStore = new PassThroughBlobStore(blobStoreDAO, - BucketName.of("default"), - blobIdFactory); + blobStore = new PassThroughBlobStore(blobStoreDAO, blobIdFactory); cassandraUploadRepository = new CassandraUploadRepository(new UploadDAO(cassandraCluster.getCassandraCluster().getConf(), blobIdFactory), blobIdFactory, blobStoreDAO, clock); diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/ExportService.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/ExportService.java index acf4d602344..952eaa569b8 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/ExportService.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/ExportService.java @@ -29,6 +29,7 @@ import org.apache.commons.io.FileUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.export.api.FileExtension; import org.apache.james.core.MailAddress; @@ -86,7 +87,7 @@ private BlobId zipToBlob(Username username, Flux messages) throw try (FileBackedOutputStream fileOutputStream = new FileBackedOutputStream(FileUtils.ONE_MB_BI.intValue())) { zipper.zip(contentLoader(username), messages.toStream(), fileOutputStream); ByteSource byteSource = fileOutputStream.asByteSource(); - return Mono.from(blobStore.save(blobStore.getDefaultBucketName(), byteSource.openStream(), LOW_COST)).block(); + return Mono.from(blobStore.save(BucketName.DEFAULT, byteSource.openStream(), LOW_COST)).block(); } } diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java index 33b75394494..a89ec08fdf4 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java @@ -187,7 +187,6 @@ void beforeEach() throws Exception { blobStore = spy(BlobStoreFactory.builder() .blobStoreDAO(blobStoreDAO) .blobIdFactory(blobIdFactory) - .defaultBucketName() .passthrough()); clock = new UpdatableTickingClock(OLD_DELETION_DATE.toInstant()); vault = spy(new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(), @@ -1986,7 +1985,7 @@ void exportShouldSaveDeletedMessagesDataToBlobStore() throws Exception { byte[] expectedZippedData = zippedMessagesData(); - assertThat(blobStore.read(blobStore.getDefaultBucketName(), blobExporting.getExportedBlobId().get())) + assertThat(blobStore.read(BucketName.DEFAULT, blobExporting.getExportedBlobId().get())) .hasSameContentAs(new ByteArrayInputStream(expectedZippedData)); } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java index f509bcf6c76..2a85aea86ce 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java @@ -30,6 +30,7 @@ import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.export.api.FileExtension; import org.apache.james.core.Username; @@ -112,7 +113,7 @@ InputStream zipMailboxesContent(Progress progress, Username username) throws IOE Mono export(Progress progress, Username username, InputStream inputStream) { return Mono.fromRunnable(() -> progress.setStage(Stage.EXPORTING)) .then(Mono.usingWhen( - blobStore.save(blobStore.getDefaultBucketName(), inputStream, BlobStore.StoragePolicy.LOW_COST), + blobStore.save(BucketName.DEFAULT, inputStream, BlobStore.StoragePolicy.LOW_COST), blobId -> export(username, blobId), this::deleteBlob) .doOnSuccess(any -> progress.setStage(Stage.COMPLETED)) @@ -137,7 +138,7 @@ private Mono export(Username username, BlobId blobId) { } private Mono deleteBlob(BlobId blobId) { - return Mono.from(blobStore.delete(blobStore.getDefaultBucketName(), blobId)) + return Mono.from(blobStore.delete(BucketName.DEFAULT, blobId)) .onErrorResume(e -> { LOGGER.error("Error deleting Blob with blobId: {}", blobId.asString(), e); return Mono.empty(); diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java index c1736765184..5758ba7f8d7 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java @@ -35,6 +35,7 @@ import jakarta.mail.MessagingException; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.ObjectNotFoundException; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.export.api.FileExtension; @@ -189,10 +190,10 @@ void exportUserMailboxesDataShouldDeleteBlobAfterCompletion() throws Exception { String blobId = fileName.substring(fileName.lastIndexOf("-") + 1); SoftAssertions.assertSoftly(softly -> { - assertThatThrownBy(() -> testSystem.blobStore.read(testSystem.blobStore.getDefaultBucketName(), FACTORY.parse(blobId))) + assertThatThrownBy(() -> testSystem.blobStore.read(BucketName.DEFAULT, FACTORY.parse(blobId))) .isInstanceOf(ObjectNotFoundException.class); - assertThatThrownBy(() -> testSystem.blobStore.read(testSystem.blobStore.getDefaultBucketName(), FACTORY.parse(blobId))) - .hasMessage(String.format("blob '%s' not found in bucket '%s'", blobId, testSystem.blobStore.getDefaultBucketName().asString())); + assertThatThrownBy(() -> testSystem.blobStore.read(BucketName.DEFAULT, FACTORY.parse(blobId))) + .hasMessage(String.format("blob '%s' not found in bucket '%s'", blobId, BucketName.DEFAULT.asString())); }); } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java index 26a973db140..b9d482875f8 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java @@ -79,7 +79,6 @@ public class ExportServiceTestSystem { blobStore = Mockito.spy(MemoryBlobStoreFactory.builder() .blobIdFactory(FACTORY) - .defaultBucketName() .passthrough()); mailetContext = FakeMailContext.builder().postmaster(MailAddressFixture.POSTMASTER_AT_JAMES).build(); blobExport = new LocalFileBlobExportMechanism(mailetContext, blobStore, fileSystem, dnsService, diff --git a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueFactoryTest.java b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueFactoryTest.java index e7bcdc6f3c5..95cc5b5da77 100644 --- a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueFactoryTest.java +++ b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueFactoryTest.java @@ -28,7 +28,6 @@ import org.apache.james.backends.pulsar.DockerPulsarExtension; import org.apache.james.backends.pulsar.PulsarClients; import org.apache.james.backends.pulsar.PulsarConfiguration; -import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.PlainBlobId; import org.apache.james.blob.api.Store; import org.apache.james.blob.mail.MimeMessagePartsId; @@ -70,7 +69,7 @@ void setUp(DockerPulsarExtension.DockerPulsar dockerPulsar, MailQueueMetricExten blobIdFactory = new PlainBlobId.Factory(); MemoryBlobStoreDAO memoryBlobStore = new MemoryBlobStoreDAO(); - PassThroughBlobStore blobStore = new PassThroughBlobStore(memoryBlobStore, BucketName.DEFAULT, blobIdFactory); + PassThroughBlobStore blobStore = new PassThroughBlobStore(memoryBlobStore, blobIdFactory); MimeMessageStore.Factory mimeMessageStoreFactory = new MimeMessageStore.Factory(blobStore); mimeMessageStore = mimeMessageStoreFactory.mimeMessageStore(); factory = new RawMailQueueItemDecoratorFactory(); diff --git a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java index 833cf621848..586d5c367c4 100644 --- a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java +++ b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java @@ -94,7 +94,7 @@ void setUp(DockerPulsarExtension.DockerPulsar pulsar, MailQueueMetricExtension.M blobIdFactory = new PlainBlobId.Factory(); memoryBlobStore = new MemoryBlobStoreDAO(); - PassThroughBlobStore blobStore = new PassThroughBlobStore(memoryBlobStore, BucketName.DEFAULT, blobIdFactory); + PassThroughBlobStore blobStore = new PassThroughBlobStore(memoryBlobStore, blobIdFactory); MimeMessageStore.Factory mimeMessageStoreFactory = new MimeMessageStore.Factory(blobStore); mimeMessageStore = mimeMessageStoreFactory.mimeMessageStore(); factory = new RawMailQueueItemDecoratorFactory(); From 04f32ead218903bb36df0688f43a54686edd2a9a Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Thu, 8 Jan 2026 09:58:48 +0100 Subject: [PATCH 2/6] [ENHANCEMENT] Remove unused BlobStoreDAO::listBuckets method Only used for: - 1 test - Implementation detail of S3 healthcheck --- .../james/blob/aes/AESBlobStoreDAO.java | 5 -- .../apache/james/blob/api/BlobStoreDAO.java | 2 - .../blob/api/BucketBlobStoreDAOContract.java | 65 ------------------- .../blob/cassandra/CassandraBlobStoreDAO.java | 7 -- .../james/blob/file/FileBlobStoreDAO.java | 9 --- .../james/blob/memory/MemoryBlobStoreDAO.java | 5 -- .../blob/postgres/PostgresBlobStoreDAO.java | 7 -- .../aws}/ObjectStorageHealthCheck.java | 7 +- .../objectstorage/aws/S3BlobStoreDAO.java | 1 - .../objectstorage/aws/S3HealthCheckTest.java | 3 +- .../blob/objectstorage/aws/S3MinioTest.java | 22 ------- .../aws/sse/S3BlobStoreDAOWithSSECTest.java | 13 ---- .../blobstore/BlobStoreModulesChooser.java | 2 +- 13 files changed, 6 insertions(+), 142 deletions(-) rename server/blob/{blob-api/src/main/java/org/apache/james/blob/api => blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws}/ObjectStorageHealthCheck.java (91%) diff --git a/server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/AESBlobStoreDAO.java b/server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/AESBlobStoreDAO.java index 17803c42034..b68fbd25de1 100644 --- a/server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/AESBlobStoreDAO.java +++ b/server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/AESBlobStoreDAO.java @@ -190,11 +190,6 @@ public Publisher deleteBucket(BucketName bucketName) { return underlying.deleteBucket(bucketName); } - @Override - public Publisher listBuckets() { - return underlying.listBuckets(); - } - @Override public Publisher listBlobs(BucketName bucketName) { return underlying.listBlobs(bucketName); diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java index 6d110c49b91..f75c088b6a1 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java @@ -103,7 +103,5 @@ default Publisher save(BucketName bucketName, BlobId blobId, String data) */ Publisher deleteBucket(BucketName bucketName); - Publisher listBuckets(); - Publisher listBlobs(BucketName bucketName); } diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreDAOContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreDAOContract.java index eb71a37cb1f..acb4fe845ac 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreDAOContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreDAOContract.java @@ -35,7 +35,6 @@ import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.junit.jupiter.api.Test; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public interface BucketBlobStoreDAOContract { @@ -173,68 +172,4 @@ default void deleteBucketConcurrentlyShouldNotFail() throws Exception { .operationCount(10) .runSuccessfullyWithin(Duration.ofMinutes(1)); } - - @Test - default void listBucketsShouldReturnEmptyWhenNone() { - BlobStoreDAO store = testee(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .isEmpty(); - } - - @Test - default void listBucketsShouldReturnBucketInUse() { - BlobStoreDAO store = testee(); - - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(TEST_BUCKET_NAME); - } - - @Test - default void listBucketsShouldNotReturnDuplicates() { - BlobStoreDAO store = testee(); - - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .hasSize(1); - } - - @Test - default void listBucketsShouldReturnAllBucketsInUse() { - BlobStoreDAO store = testee(); - - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - Mono.from(store.save(CUSTOM_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(TEST_BUCKET_NAME, CUSTOM_BUCKET_NAME); - } - - @Test - default void listBucketsShouldNotReturnDeletedBuckets() { - BlobStoreDAO store = testee(); - - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - - Mono.from(store.deleteBucket(TEST_BUCKET_NAME)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .isEmpty(); - } - - @Test - default void listBucketsShouldReturnBucketsWithNoBlob() { - BlobStoreDAO store = testee(); - - Mono.from(store.save(TEST_BUCKET_NAME, TEST_BLOB_ID, SHORT_BYTEARRAY)).block(); - - Mono.from(store.delete(TEST_BUCKET_NAME, TEST_BLOB_ID)).block(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .containsOnly(TEST_BUCKET_NAME); - } } diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java index 48b13e385d5..e29c217b9ae 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java @@ -279,13 +279,6 @@ private byte[] byteBuffersToBytesArray(List byteBuffers) { .array(); } - @Override - public Publisher listBuckets() { - return bucketDAO.listAll() - .map(Pair::getLeft) - .distinct(); - } - @Override public Publisher listBlobs(BucketName bucketName) { if (isDefaultBucket(bucketName)) { diff --git a/server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreDAO.java b/server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreDAO.java index 95b9b2e5e83..a022a6cf3a7 100644 --- a/server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreDAO.java +++ b/server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreDAO.java @@ -200,15 +200,6 @@ public Mono deleteBucket(BucketName bucketName) { .then(); } - @Override - public Publisher listBuckets() { - return Mono.fromCallable(() -> Files.list(root.toPath())) - .flatMapMany(Flux::fromStream) - .map(path -> BucketName.of(path.getFileName().toString())) - .subscribeOn(Schedulers.boundedElastic()) - .onErrorResume(NoSuchFileException.class, e -> Flux.empty()); - } - @Override public Publisher listBlobs(BucketName bucketName) { return Mono.fromCallable(() -> { diff --git a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreDAO.java b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreDAO.java index 22e586191d7..0bb142a6a5d 100644 --- a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreDAO.java +++ b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreDAO.java @@ -141,11 +141,6 @@ public Mono deleteBucket(BucketName bucketName) { }); } - @Override - public Publisher listBuckets() { - return Flux.fromIterable(ImmutableSet.copyOf(blobs.rowKeySet())); - } - @Override public Publisher listBlobs(BucketName bucketName) { return Flux.fromIterable(ImmutableSet.copyOf(blobs.row(bucketName).keySet())); diff --git a/server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStoreDAO.java b/server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStoreDAO.java index dd579aae9d3..bde235e5557 100644 --- a/server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStoreDAO.java +++ b/server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStoreDAO.java @@ -147,13 +147,6 @@ public Mono deleteBucket(BucketName bucketName) { .where(BUCKET_NAME.eq(bucketName.asString())))); } - @Override - public Flux listBuckets() { - return postgresExecutor.executeRows(dsl -> Flux.from(dsl.selectDistinct(BUCKET_NAME) - .from(TABLE_NAME))) - .map(record -> BucketName.of(record.get(BUCKET_NAME))); - } - @Override public Flux listBlobs(BucketName bucketName) { return Flux.defer(() -> listBlobsBatch(bucketName, Optional.empty(), PostgresUtils.QUERY_BATCH_SIZE)) diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java similarity index 91% rename from server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java rename to server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java index ccd606d8379..6ffa588cc81 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java +++ b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java @@ -17,12 +17,13 @@ * under the License. * ****************************************************************/ -package org.apache.james.blob.api; +package org.apache.james.blob.objectstorage.aws; import java.time.Duration; import jakarta.inject.Inject; +import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.core.healthcheck.ComponentName; import org.apache.james.core.healthcheck.HealthCheck; import org.apache.james.core.healthcheck.Result; @@ -35,10 +36,10 @@ public class ObjectStorageHealthCheck implements HealthCheck { private static final ComponentName COMPONENT_NAME = new ComponentName("ObjectStorage"); - private final BlobStoreDAO blobStoreDAO; + private final S3BlobStoreDAO blobStoreDAO; @Inject - public ObjectStorageHealthCheck(BlobStoreDAO blobStoreDAO) { + public ObjectStorageHealthCheck(S3BlobStoreDAO blobStoreDAO) { this.blobStoreDAO = blobStoreDAO; } diff --git a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java index 737393b0c96..00100f525cf 100644 --- a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java +++ b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java @@ -419,7 +419,6 @@ public Mono deleteAllBuckets() { .then(); } - @Override public Publisher listBuckets() { return Mono.fromFuture(client::listBuckets) .flatMapIterable(ListBucketsResponse::buckets) diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java index 11570eba3a8..0fefae5882c 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java @@ -22,7 +22,6 @@ import static org.assertj.core.api.Assertions.assertThat; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.ObjectStorageHealthCheck; import org.apache.james.blob.api.TestBlobId; import org.apache.james.core.healthcheck.Result; import org.apache.james.metrics.api.NoopGaugeRegistry; @@ -51,7 +50,7 @@ void setUp(DockerAwsS3Container dockerAwsS3) { .build(); S3ClientFactory s3ClientFactory = new S3ClientFactory(s3Configuration, new RecordingMetricFactory(), new NoopGaugeRegistry()); - BlobStoreDAO s3BlobStoreDAO = new S3BlobStoreDAO(s3ClientFactory, s3Configuration, new TestBlobId.Factory(), S3RequestOption.DEFAULT); + S3BlobStoreDAO s3BlobStoreDAO = new S3BlobStoreDAO(s3ClientFactory, s3Configuration, new TestBlobId.Factory(), S3RequestOption.DEFAULT); s3HealthCheck = new ObjectStorageHealthCheck(s3BlobStoreDAO); } diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioTest.java index dc4a4e3ba3b..67f1ee2bbb2 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioTest.java @@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.Optional; -import java.util.concurrent.ExecutionException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStoreDAO; @@ -42,7 +41,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; import software.amazon.awssdk.services.s3.model.S3Exception; @@ -86,15 +84,6 @@ private void createBucket(String bucketName) throws Exception { .get(); } - private void deleteBucket(String bucketName) { - try { - s3ClientFactory.get().deleteBucket(builder -> builder.bucket(bucketName)) - .get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException("Error while deleting bucket", e); - } - } - @Override public BlobStoreDAO testee() { return testee; @@ -114,17 +103,6 @@ void saveShouldWorkWhenValidBlobId() { assertThat(Mono.from(testee.readBytes(TEST_BUCKET_NAME, TEST_BLOB_ID)).block()).isEqualTo(SHORT_BYTEARRAY); } - @Test - @Override - public void listBucketsShouldReturnEmptyWhenNone() { - deleteBucket(TEST_BUCKET_NAME.asString()); - - BlobStoreDAO store = testee(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .isEmpty(); - } - @Test @Override @Disabled("S3minio return `Connection: close` in header response, https://github.com/apache/james-project/pull/1981#issuecomment-2380396460") diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3BlobStoreDAOWithSSECTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3BlobStoreDAOWithSSECTest.java index 4c55a699fa6..185e9fcf50e 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3BlobStoreDAOWithSSECTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3BlobStoreDAOWithSSECTest.java @@ -22,7 +22,6 @@ import static org.apache.james.blob.api.BlobStoreDAOFixture.TEST_BUCKET_NAME; import static org.apache.james.blob.objectstorage.aws.JamesS3MetricPublisher.DEFAULT_S3_METRICS_PREFIX; import static org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration.UPLOAD_RETRY_EXCEPTION_PREDICATE; -import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -45,7 +44,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import reactor.core.publisher.Flux; import reactor.util.retry.Retry; import software.amazon.awssdk.services.s3.S3AsyncClient; @@ -101,17 +99,6 @@ private void deleteBucket(String bucketName) { } } - @Test - @Override - public void listBucketsShouldReturnEmptyWhenNone() { - deleteBucket(TEST_BUCKET_NAME.asString()); - - BlobStoreDAO store = testee(); - - assertThat(Flux.from(store.listBuckets()).collectList().block()) - .isEmpty(); - } - @Test @Override @Disabled("S3minio return `Connection: close` in header response, https://github.com/apache/james-project/pull/1981#issuecomment-2380396460") diff --git a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java index abee4d6afb2..677272c6493 100644 --- a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java +++ b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java @@ -28,7 +28,7 @@ import org.apache.james.blob.aes.CryptoConfig; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.api.ObjectStorageHealthCheck; +import org.apache.james.blob.objectstorage.aws.ObjectStorageHealthCheck; import org.apache.james.blob.cassandra.CassandraBlobStoreDAO; import org.apache.james.blob.cassandra.cache.CachedBlobStore; import org.apache.james.blob.file.FileBlobStoreDAO; From 408480273160a36d840dbe9a9e6ad612dc588581 Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Thu, 8 Jan 2026 10:12:47 +0100 Subject: [PATCH 3/6] fixup! [ENHANCEMENT] Remove unused BlobStoreDAO::listBuckets method --- .../apache/james/blob/memory/MemoryBlobStoreDAOTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreDAOTest.java b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreDAOTest.java index 83748a79c5d..3225301dd67 100644 --- a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreDAOTest.java +++ b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreDAOTest.java @@ -22,7 +22,6 @@ import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.blob.api.BlobStoreDAOContract; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; class MemoryBlobStoreDAOTest implements BlobStoreDAOContract { @@ -37,10 +36,4 @@ void setUp() { public BlobStoreDAO testee() { return blobStore; } - - @Override - @Disabled("Not supported") - public void listBucketsShouldReturnBucketsWithNoBlob() { - - } } From 80b9b0bf017e87da94edbd894c92e1b534c209ae Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Thu, 8 Jan 2026 10:22:44 +0100 Subject: [PATCH 4/6] fixup! fixup! [ENHANCEMENT] Remove unused BlobStoreDAO::listBuckets method --- .../org/apache/james/blob/aes/AESBlobStoreDAOTest.java | 7 ------- .../james/blob/cassandra/CassandraBlobStoreDAOTest.java | 7 ------- .../james/blob/postgres/PostgresBlobStoreDAOTest.java | 6 ------ 3 files changed, 20 deletions(-) diff --git a/server/blob/blob-aes/src/test/java/org/apache/james/blob/aes/AESBlobStoreDAOTest.java b/server/blob/blob-aes/src/test/java/org/apache/james/blob/aes/AESBlobStoreDAOTest.java index ad58cd0a726..8be37283f6d 100644 --- a/server/blob/blob-aes/src/test/java/org/apache/james/blob/aes/AESBlobStoreDAOTest.java +++ b/server/blob/blob-aes/src/test/java/org/apache/james/blob/aes/AESBlobStoreDAOTest.java @@ -30,7 +30,6 @@ import org.apache.james.blob.api.BlobStoreDAOContract; import org.apache.james.blob.memory.MemoryBlobStoreDAO; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.google.common.io.ByteSource; @@ -84,10 +83,4 @@ void underlyingDataShouldBeEncryptedWhenUsingByteSource() { assertThat(bytes).isNotEqualTo(SHORT_BYTEARRAY); } - - @Override - @Disabled("Not supported by the Memory blob store") - public void listBucketsShouldReturnBucketsWithNoBlob() { - - } } \ No newline at end of file diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java index f91690ecccf..23205a13e80 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java @@ -27,7 +27,6 @@ import org.apache.james.blob.api.TestBlobId; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.RegisterExtension; public class CassandraBlobStoreDAOTest implements BlobStoreDAOContract { @@ -57,10 +56,4 @@ void setUp(CassandraCluster cassandra) { public BlobStoreDAO testee() { return testee; } - - @Override - @Disabled("Not supported by the Cassandra blob store") - public void listBucketsShouldReturnBucketsWithNoBlob() { - - } } \ No newline at end of file diff --git a/server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreDAOTest.java b/server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreDAOTest.java index 7399cfcfa39..de9a050336f 100644 --- a/server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreDAOTest.java +++ b/server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreDAOTest.java @@ -32,7 +32,6 @@ import org.apache.james.blob.api.PlainBlobId; import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -59,11 +58,6 @@ public BlobStoreDAO testee() { return blobStore; } - @Override - @Disabled("Not supported") - public void listBucketsShouldReturnBucketsWithNoBlob() { - } - @Override @ParameterizedTest(name = "[{index}] {0}") @MethodSource("blobs") From bb9eb2959b8db10cf78bc7c23f601a60b0004e58 Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Thu, 8 Jan 2026 10:32:05 +0100 Subject: [PATCH 5/6] fixup! fixup! fixup! [ENHANCEMENT] Remove unused BlobStoreDAO::listBuckets method --- .../james/blob/objectstorage/aws/ObjectStorageHealthCheck.java | 1 - .../apache/james/blob/objectstorage/aws/S3HealthCheckTest.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java index 6ffa588cc81..a7d309d166b 100644 --- a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java +++ b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/ObjectStorageHealthCheck.java @@ -23,7 +23,6 @@ import jakarta.inject.Inject; -import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.core.healthcheck.ComponentName; import org.apache.james.core.healthcheck.HealthCheck; import org.apache.james.core.healthcheck.Result; diff --git a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java index 0fefae5882c..588df9f8648 100644 --- a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java +++ b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java @@ -21,7 +21,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.james.blob.api.BlobStoreDAO; import org.apache.james.blob.api.TestBlobId; import org.apache.james.core.healthcheck.Result; import org.apache.james.metrics.api.NoopGaugeRegistry; @@ -32,7 +31,7 @@ import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class S3HealthCheckTest { +class S3HealthCheckTest { private ObjectStorageHealthCheck s3HealthCheck; From d12849ec9cb796b530a63aa7e2680d5d0753cdd4 Mon Sep 17 00:00:00 2001 From: Benoit TELLIER Date: Thu, 8 Jan 2026 10:39:42 +0100 Subject: [PATCH 6/6] fixup! fixup! fixup! fixup! [ENHANCEMENT] Remove unused BlobStoreDAO::listBuckets method --- .../apache/james/modules/blobstore/BlobStoreModulesChooser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java index 677272c6493..72195a523f0 100644 --- a/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java +++ b/server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java @@ -28,10 +28,10 @@ import org.apache.james.blob.aes.CryptoConfig; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BlobStoreDAO; -import org.apache.james.blob.objectstorage.aws.ObjectStorageHealthCheck; import org.apache.james.blob.cassandra.CassandraBlobStoreDAO; import org.apache.james.blob.cassandra.cache.CachedBlobStore; import org.apache.james.blob.file.FileBlobStoreDAO; +import org.apache.james.blob.objectstorage.aws.ObjectStorageHealthCheck; import org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration; import org.apache.james.blob.objectstorage.aws.S3BlobStoreDAO; import org.apache.james.blob.objectstorage.aws.S3RequestOption;