You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2020/02/07 14:05:27 UTC
[james-project] 05/09: JAMES-3028 implement MemoryBlobStore with
MemoryDumbBlobStore
This is an automated email from the ASF dual-hosted git repository.
matthieu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit e4382de0dddc2f5edba44485b22bdb0d5cf703a5
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Thu Jan 9 14:57:45 2020 +0100
JAMES-3028 implement MemoryBlobStore with MemoryDumbBlobStore
---
.../james/vault/DeletedMessageVaultHookTest.java | 3 +-
.../blob/BlobStoreDeletedMessageVaultTest.java | 3 +-
.../file/LocalFileBlobExportMechanismTest.java | 3 +-
.../apache/james/blob/memory/MemoryBlobStore.java | 47 +++++++---------------
.../james/blob/memory/MemoryBlobStoreTest.java | 3 +-
.../james/blob/union/HybridBlobStoreTest.java | 25 ++++++------
.../james/blob/mail/MimeMessageStoreTest.java | 3 +-
.../routes/DeletedMessagesVaultRoutesTest.java | 4 +-
.../linshare/LinshareBlobExportMechanismTest.java | 3 +-
9 files changed, 42 insertions(+), 52 deletions(-)
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 852a3cb..8c5cfc8 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
@@ -31,6 +31,7 @@ import java.util.List;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.core.MailAddress;
import org.apache.james.core.MaybeSender;
import org.apache.james.core.Username;
@@ -108,7 +109,7 @@ class DeletedMessageVaultHookTest {
void setUp() throws Exception {
clock = Clock.fixed(DELETION_DATE.toInstant(), ZoneOffset.UTC);
messageVault = new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(),
- new MemoryBlobStore(new HashBlobId.Factory()), new BucketNameGenerator(clock), clock,
+ new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore()), new BucketNameGenerator(clock), clock,
RetentionConfiguration.DEFAULT);
DeletedMessageConverter deletedMessageConverter = new DeletedMessageConverter();
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 cf09ffb..6c03f4f 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
@@ -41,6 +41,7 @@ import java.time.ZonedDateTime;
import org.apache.james.blob.api.BucketName;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.metrics.tests.RecordingMetricFactory;
import org.apache.james.utils.UpdatableTickingClock;
import org.apache.james.vault.DeletedMessageVault;
@@ -64,7 +65,7 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
clock = new UpdatableTickingClock(NOW.toInstant());
metricFactory = new RecordingMetricFactory();
messageVault = new BlobStoreDeletedMessageVault(metricFactory, new MemoryDeletedMessageMetadataVault(),
- new MemoryBlobStore(new HashBlobId.Factory()),
+ new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore()),
new BucketNameGenerator(clock), clock, RetentionConfiguration.DEFAULT);
}
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 174b2c3..91a85a0 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
@@ -43,6 +43,7 @@ import org.apache.james.blob.api.ObjectStoreException;
import org.apache.james.blob.export.api.FileExtension;
import org.apache.james.blob.export.file.LocalFileBlobExportMechanism.Configuration;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.dnsservice.api.DNSService;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.util.MimeMessageUtil;
@@ -67,7 +68,7 @@ class LocalFileBlobExportMechanismTest {
@BeforeEach
void setUp(FileSystem fileSystem) throws Exception {
mailetContext = FakeMailContext.builder().postmaster(MailAddressFixture.POSTMASTER_AT_JAMES).build();
- blobStore = new MemoryBlobStore(new HashBlobId.Factory());
+ blobStore = new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore());
InetAddress localHost = mock(InetAddress.class);
when(localHost.getHostName()).thenReturn(JAMES_HOST);
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 bd2615c..6c5b67c 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
@@ -22,7 +22,6 @@ package org.apache.james.blob.memory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Optional;
import javax.inject.Inject;
@@ -30,30 +29,27 @@ 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.ObjectNotFoundException;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
import reactor.core.publisher.Mono;
public class MemoryBlobStore implements BlobStore {
private final BlobId.Factory factory;
private final BucketName defaultBucketName;
- private final Table<BucketName, BlobId, byte[]> blobs;
+ private final MemoryDumbBlobStore dumbBlobStore;
@Inject
- public MemoryBlobStore(BlobId.Factory factory) {
- this(factory, BucketName.DEFAULT);
+ public MemoryBlobStore(BlobId.Factory factory, MemoryDumbBlobStore dumbBlobStore) {
+ this(factory, BucketName.DEFAULT, dumbBlobStore);
}
@VisibleForTesting
- public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName) {
+ public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName, MemoryDumbBlobStore dumbBlobStore) {
this.factory = factory;
this.defaultBucketName = defaultBucketName;
- blobs = HashBasedTable.create();
+ this.dumbBlobStore = dumbBlobStore;
}
@Override
@@ -63,12 +59,8 @@ public class MemoryBlobStore implements BlobStore {
BlobId blobId = factory.forPayload(data);
- return Mono.fromCallable(() -> {
- synchronized (blobs) {
- blobs.put(bucketName, blobId, data);
- return blobId;
- }
- });
+ return dumbBlobStore.save(bucketName, blobId, data)
+ .then(Mono.just(blobId));
}
@Override
@@ -86,31 +78,26 @@ public class MemoryBlobStore implements BlobStore {
@Override
public Mono<byte[]> readBytes(BucketName bucketName, BlobId blobId) {
Preconditions.checkNotNull(bucketName);
- return Mono.fromCallable(() -> retrieveStoredValue(bucketName, blobId));
+ return retrieveStoredValue(bucketName, blobId);
}
@Override
public InputStream read(BucketName bucketName, BlobId blobId) {
Preconditions.checkNotNull(bucketName);
- return new ByteArrayInputStream(retrieveStoredValue(bucketName, blobId));
+ return retrieveStoredValue(bucketName, blobId)
+ .map(ByteArrayInputStream::new)
+ .block();
}
@Override
public Mono<Void> deleteBucket(BucketName bucketName) {
Preconditions.checkNotNull(bucketName);
- return Mono.fromRunnable(() -> {
- synchronized (blobs) {
- blobs.row(bucketName).clear();
- }
- });
+ return dumbBlobStore.deleteBucket(bucketName);
}
- private byte[] retrieveStoredValue(BucketName bucketName, BlobId blobId) {
- synchronized (blobs) {
- return Optional.ofNullable(blobs.get(bucketName, blobId))
- .orElseThrow(() -> new ObjectNotFoundException("Unable to find blob with id " + blobId + " in bucket " + bucketName.asString()));
- }
+ private Mono<byte[]> retrieveStoredValue(BucketName bucketName, BlobId blobId) {
+ return dumbBlobStore.readBytes(bucketName, blobId);
}
@Override
@@ -123,11 +110,7 @@ public class MemoryBlobStore implements BlobStore {
Preconditions.checkNotNull(bucketName);
Preconditions.checkNotNull(blobId);
- return Mono.fromRunnable(() -> {
- synchronized (blobs) {
- blobs.remove(bucketName, blobId);
- }
- });
+ return dumbBlobStore.delete(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 6dbac34..f482139 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
@@ -21,6 +21,7 @@ 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.DumbBlobStore;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.api.MetricableBlobStore;
import org.apache.james.blob.api.MetricableBlobStoreContract;
@@ -33,7 +34,7 @@ public class MemoryBlobStoreTest implements MetricableBlobStoreContract {
@BeforeEach
void setUp() {
- blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new MemoryBlobStore(BLOB_ID_FACTORY));
+ blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()));
}
@Override
diff --git a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java
index ad9d38f..a17dc55 100644
--- a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java
+++ b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java
@@ -37,6 +37,7 @@ import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.api.ObjectNotFoundException;
import org.apache.james.blob.api.ObjectStoreException;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
@@ -157,8 +158,8 @@ class HybridBlobStoreTest implements BlobStoreContract {
@BeforeEach
void setup() {
- lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
- highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
+ highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
hybridBlobStore = HybridBlobStore.builder()
.lowCost(lowCostBlobStore)
.highPerformance(highPerformanceBlobStore)
@@ -279,7 +280,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
class LowCostSaveThrowsExceptionDirectly {
@Test
void saveShouldFailWhenException() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new ThrowingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -292,7 +293,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void saveInputStreamShouldFailWhenException() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new ThrowingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -309,7 +310,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void saveShouldFailWhenLowCostCompletedExceptionally() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new FailingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -322,7 +323,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void saveInputStreamShouldFallBackToPerformingWhenLowCostCompletedExceptionally() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new FailingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -340,7 +341,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void readShouldReturnFallbackToPerformingWhenLowCostGotException() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new ThrowingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -354,7 +355,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void readBytesShouldReturnFallbackToPerformingWhenLowCostGotException() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new ThrowingBlobStore())
@@ -374,7 +375,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void readShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new FailingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -388,7 +389,7 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void readBytesShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() {
- MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
HybridBlobStore hybridBlobStore = HybridBlobStore.builder()
.lowCost(new FailingBlobStore())
.highPerformance(highPerformanceBlobStore)
@@ -474,8 +475,8 @@ class HybridBlobStoreTest implements BlobStoreContract {
@Test
void getDefaultBucketNameShouldThrowWhenBlobStoreDontShareTheSameDefaultBucketName() {
- lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("lowCost"));
- highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("highPerformance"));
+ lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("lowCost"), new MemoryDumbBlobStore());
+ highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("highPerformance"), new MemoryDumbBlobStore());
hybridBlobStore = HybridBlobStore.builder()
.lowCost(lowCostBlobStore)
.highPerformance(highPerformanceBlobStore)
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 9bd8327..ca3e64d 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.BlobStore;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.api.Store;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.core.builder.MimeMessageBuilder;
import org.apache.james.util.MimeMessageUtil;
import org.assertj.core.api.SoftAssertions;
@@ -45,7 +46,7 @@ class MimeMessageStoreTest {
@BeforeEach
void setUp() {
- blobStore = new MemoryBlobStore(BLOB_ID_FACTORY);
+ blobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore());
testee = MimeMessageStore.factory(blobStore).mimeMessageStore();
}
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 a7457c0..50a0cec 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
@@ -77,6 +77,7 @@ import org.apache.james.blob.api.BucketName;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.export.api.BlobExportMechanism;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.core.Domain;
import org.apache.james.core.MailAddress;
import org.apache.james.core.MaybeSender;
@@ -128,7 +129,6 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import com.google.common.collect.ImmutableList;
-
import io.restassured.RestAssured;
import io.restassured.filter.log.LogDetail;
import reactor.core.publisher.Flux;
@@ -174,7 +174,7 @@ class DeletedMessagesVaultRoutesTest {
@BeforeEach
void beforeEach() throws Exception {
blobIdFactory = new HashBlobId.Factory();
- blobStore = spy(new MemoryBlobStore(blobIdFactory));
+ blobStore = spy(new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore()));
clock = new UpdatableTickingClock(OLD_DELETION_DATE.toInstant());
vault = spy(new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(),
blobStore, new BucketNameGenerator(clock), clock,
diff --git a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java
index 729bbeb..2988281 100644
--- a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java
+++ b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java
@@ -37,6 +37,7 @@ import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.export.api.BlobExportMechanism;
import org.apache.james.blob.export.api.FileExtension;
import org.apache.james.blob.memory.MemoryBlobStore;
+import org.apache.james.blob.memory.MemoryDumbBlobStore;
import org.apache.james.core.MailAddress;
import org.apache.james.linshare.client.Document;
import org.apache.james.linshare.client.LinshareAPI;
@@ -64,7 +65,7 @@ class LinshareBlobExportMechanismTest {
@BeforeEach
void setUp() throws Exception {
blobIdFactory = new HashBlobId.Factory();
- blobStore = new MemoryBlobStore(blobIdFactory);
+ blobStore = new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore());
testee = new LinshareBlobExportMechanism(
linshareExtension.getAPIFor(USER_1),
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org