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

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

commit 0a6fd194467e253644d375c7c88d41e5ac4455a0
Author: Rene Cordier <[email protected]>
AuthorDate: Mon Jul 15 17:38:07 2019 +0700

    JAMES-2829 memory implementation of delete method for BlobStore
---
 .../blob/api/MetricableBlobStoreContract.java      |  2 --
 .../blob/cassandra/CassandraBlobsDAOTest.java      |  6 ++++
 .../apache/james/blob/memory/MemoryBlobStore.java  | 10 ++++--
 .../james/blob/memory/MemoryBlobStoreTest.java     |  3 +-
 .../ObjectStorageBlobsDAOAWSCryptoTest.java        |  7 ++++
 .../ObjectStorageBlobsDAOAWSNamespaceTest.java     |  6 ++++
 ...ctStorageBlobsDAOAWSPrefixAndNamespaceTest.java |  6 ++++
 .../ObjectStorageBlobsDAOAWSPrefixTest.java        |  6 ++++
 .../ObjectStorageBlobsDAOAWSTest.java              |  7 ++++
 .../objectstorage/ObjectStorageBlobsDAOTest.java   |  7 ++++
 .../apache/james/blob/union/UnionBlobStore.java    | 16 ++++++---
 .../james/blob/union/UnionBlobStoreTest.java       | 39 ++++++++++++++++++++++
 12 files changed, 105 insertions(+), 10 deletions(-)

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 481aa98..e3c50c9 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
@@ -31,7 +31,6 @@ import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.metrics.tests.RecordingMetricFactory;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.BeforeEachCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
@@ -119,7 +118,6 @@ public interface MetricableBlobStoreContract extends 
BlobStoreContract {
     }
 
     @Test
-    @Disabled("JAMES-2829 Not supported yet")
     default void deleteShouldPublishDeleteTimerMetrics() {
         BlobId blobId1 = testee().save(testee().getDefaultBucketName(), 
BYTES_CONTENT).block();
         BlobId blobId2 = testee().save(testee().getDefaultBucketName(), 
BYTES_CONTENT).block();
diff --git 
a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
 
b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
index 2ba4ccd..cd3d2ad 100644
--- 
a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
+++ 
b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java
@@ -93,4 +93,10 @@ public class CassandraBlobsDAOTest implements 
MetricableBlobStoreContract {
         assertThat(bytes).hasSameContentAs(new ZeroedInputStream(100_000_000));
     }
 
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
+
 }
\ No newline at end of file
diff --git 
a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java
 
b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java
index d28437c..f10e75e 100644
--- 
a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java
+++ 
b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java
@@ -27,7 +27,6 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
@@ -121,7 +120,14 @@ public class MemoryBlobStore implements BlobStore {
 
     @Override
     public Mono<Void> delete(BucketName bucketName, BlobId blobId) {
-        throw new NotImplementedException("not implemented");
+        Preconditions.checkNotNull(bucketName);
+        Preconditions.checkNotNull(blobId);
+
+        return Mono.fromRunnable(() -> {
+            synchronized (blobs) {
+                blobs.remove(bucketName, blobId);
+            }
+        });
     }
 
 }
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 721c198..6f8686a 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
@@ -22,12 +22,13 @@ package org.apache.james.blob.memory;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketBlobStoreContract;
+import org.apache.james.blob.api.DeleteBlobStoreContract;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.api.MetricableBlobStore;
 import org.apache.james.blob.api.MetricableBlobStoreContract;
 import org.junit.jupiter.api.BeforeEach;
 
-public class MemoryBlobStoreTest implements MetricableBlobStoreContract, 
BucketBlobStoreContract {
+public class MemoryBlobStoreTest implements MetricableBlobStoreContract, 
BucketBlobStoreContract, DeleteBlobStoreContract {
 
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new 
HashBlobId.Factory();
     private BlobStore blobStore;
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java
index 0e56285..242e8ce 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java
@@ -33,6 +33,7 @@ import 
org.apache.james.blob.objectstorage.crypto.CryptoConfig;
 import org.apache.james.blob.objectstorage.swift.Credentials;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerAwsS3Extension.class)
@@ -84,4 +85,10 @@ public class ObjectStorageBlobsDAOAWSCryptoTest implements 
MetricableBlobStoreCo
     public BlobId.Factory blobIdFactory() {
         return BLOB_ID_FACTORY;
     }
+
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java
index 8eab612..e17b34a 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java
@@ -32,6 +32,7 @@ import 
org.apache.james.blob.objectstorage.aws.DockerAwsS3Container;
 import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerAwsS3Extension.class)
@@ -78,5 +79,10 @@ public class ObjectStorageBlobsDAOAWSNamespaceTest 
implements MetricableBlobStor
         return new HashBlobId.Factory();
     }
 
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
 
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java
index dae3ff8..c377d32 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java
@@ -32,6 +32,7 @@ import 
org.apache.james.blob.objectstorage.aws.DockerAwsS3Container;
 import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerAwsS3Extension.class)
@@ -79,5 +80,10 @@ public class ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest 
implements Metricabl
         return new HashBlobId.Factory();
     }
 
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
 
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java
index e9cd435..8835d0f 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java
@@ -31,6 +31,7 @@ import 
org.apache.james.blob.objectstorage.aws.DockerAwsS3Container;
 import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerAwsS3Extension.class)
@@ -77,5 +78,10 @@ public class ObjectStorageBlobsDAOAWSPrefixTest implements 
MetricableBlobStoreCo
         return new HashBlobId.Factory();
     }
 
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
 
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java
index 6fd6a6f..a61618a 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java
@@ -31,6 +31,7 @@ import 
org.apache.james.blob.objectstorage.aws.DockerAwsS3Container;
 import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerAwsS3Extension.class)
@@ -76,4 +77,10 @@ public class ObjectStorageBlobsDAOAWSTest implements 
MetricableBlobStoreContract
     public BlobId.Factory blobIdFactory() {
         return BLOB_ID_FACTORY;
     }
+
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
index 2a3b534..b887ad8 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
@@ -46,6 +46,7 @@ import org.jclouds.blobstore.domain.StorageType;
 import org.jclouds.domain.Location;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -205,5 +206,11 @@ public class ObjectStorageBlobsDAOTest implements 
MetricableBlobStoreContract, B
         Mono<byte[]> resultFuture = 
testee.readBytes(testee.getDefaultBucketName(), 
blobId).subscribeOn(Schedulers.elastic());
         assertThat(resultFuture.toFuture()).isNotCompleted();
     }
+
+    @Override
+    @Disabled("JAMES-2829 Not supported yet")
+    public void deleteShouldPublishDeleteTimerMetrics() {
+
+    }
 }
 
diff --git 
a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
 
b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
index 7fd0aa6..b822b02 100644
--- 
a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
+++ 
b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
@@ -154,7 +153,14 @@ public class UnionBlobStore implements BlobStore {
     public Mono<Void> deleteBucket(BucketName bucketName) {
         return Mono.defer(() -> currentBlobStore.deleteBucket(bucketName))
             .and(legacyBlobStore.deleteBucket(bucketName))
-            .onErrorResume(this::logAndReturnEmpty);
+            .onErrorResume(this::logDeleteFailureAndReturnEmpty);
+    }
+
+    @Override
+    public Mono<Void> delete(BucketName bucketName, BlobId blobId) {
+        return Mono.defer(() -> currentBlobStore.delete(bucketName, blobId))
+            .and(legacyBlobStore.delete(bucketName, blobId))
+            .onErrorResume(this::logDeleteFailureAndReturnEmpty);
     }
 
     private InputStream readFallBackIfEmptyResult(BucketName bucketName, 
BlobId blobId) {
@@ -197,9 +203,9 @@ public class UnionBlobStore implements BlobStore {
         return Mono.empty();
     }
 
-    @Override
-    public Mono<Void> delete(BucketName bucketName, BlobId blobId) {
-        throw new NotImplementedException("not implemented");
+    private <T> Mono<T> logDeleteFailureAndReturnEmpty(Throwable throwable) {
+        LOGGER.error("Cannot delete from either legacy or current blob store", 
throwable);
+        return Mono.empty();
     }
 
     @Override
diff --git 
a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
 
b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
index d7ea4e8..e981edf 100644
--- 
a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
+++ 
b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
@@ -561,4 +561,43 @@ class UnionBlobStoreTest implements BlobStoreContract {
         assertThatThrownBy(() -> unionBlobStore.getDefaultBucketName())
             .isInstanceOf(IllegalStateException.class);
     }
+
+    @Test
+    void deleteShouldDeleteBothCurrentAndLegacyBlob() {
+        BlobId legacyBlobId = legacyBlobStore.save(BucketName.DEFAULT, 
BLOB_CONTENT).block();
+        BlobId currentBlobId = currentBlobStore.save(BucketName.DEFAULT, 
BLOB_CONTENT).block();
+
+        unionBlobStore.delete(BucketName.DEFAULT, currentBlobId).block();
+
+        assertThatThrownBy(() -> legacyBlobStore.readBytes(BucketName.DEFAULT, 
legacyBlobId).block())
+            .isInstanceOf(ObjectStoreException.class);
+        assertThatThrownBy(() -> 
currentBlobStore.readBytes(BucketName.DEFAULT, currentBlobId).block())
+            .isInstanceOf(ObjectStoreException.class);
+    }
+
+    @Test
+    void deleteShouldDeleteCurrentBlobEvenWhenLegacyDoesNotExist() {
+        BlobId currentBlobId = currentBlobStore.save(BucketName.DEFAULT, 
BLOB_CONTENT).block();
+
+        unionBlobStore.delete(BucketName.DEFAULT, currentBlobId).block();
+
+        assertThatThrownBy(() -> 
currentBlobStore.readBytes(BucketName.DEFAULT, currentBlobId).block())
+            .isInstanceOf(ObjectStoreException.class);
+    }
+
+    @Test
+    void deleteShouldDeleteLegacyBlobEvenWhenCurrentDoesNotExist() {
+        BlobId legacyBlobId = legacyBlobStore.save(BucketName.DEFAULT, 
BLOB_CONTENT).block();
+
+        unionBlobStore.delete(BucketName.DEFAULT, legacyBlobId).block();
+
+        assertThatThrownBy(() -> legacyBlobStore.readBytes(BucketName.DEFAULT, 
legacyBlobId).block())
+            .isInstanceOf(ObjectStoreException.class);
+    }
+
+    @Test
+    void deleteShouldNotThrowWhenCurrentAndLegacyBlobsDoNotExist() {
+        assertThatCode(() -> unionBlobStore.delete(BucketName.DEFAULT, 
blobIdFactory().randomId()).block())
+            .doesNotThrowAnyException();
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to