Skip to content

Commit

Permalink
Simplify the multi-tenant configuration
Browse files Browse the repository at this point in the history
- extra complexity of two interfaces doesn't seem justified
#201
  • Loading branch information
paulcwarren committed May 28, 2020
1 parent f54125d commit bcc47de
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,6 @@ protected Object getContentStoreImpl() {
DefaultResourceLoader loader = new DefaultResourceLoader();
loader.addProtocolResolver(s3Protocol);

return new DefaultS3StoreImpl(loader, s3StorePlacementService, client, null, null);
return new DefaultS3StoreImpl(loader, s3StorePlacementService, client, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import org.springframework.content.commons.utils.BeanUtils;
import org.springframework.content.commons.utils.Condition;
import org.springframework.content.commons.utils.PlacementService;
import org.springframework.content.s3.config.CurrentTenantIdentifierResolver;
import org.springframework.content.s3.config.MultiTenantAmazonS3Provider;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.io.DefaultResourceLoader;
Expand Down Expand Up @@ -46,17 +45,15 @@ public class DefaultS3StoreImpl<S, SID extends Serializable>
private ResourceLoader loader;
private PlacementService placementService;
private AmazonS3 client;
private CurrentTenantIdentifierResolver tenantIdResolver;
private MultiTenantAmazonS3Provider clientProvider;

public DefaultS3StoreImpl(ResourceLoader loader, PlacementService placementService, AmazonS3 client, CurrentTenantIdentifierResolver tenantIdResolver, MultiTenantAmazonS3Provider provider) {
public DefaultS3StoreImpl(ResourceLoader loader, PlacementService placementService, AmazonS3 client, MultiTenantAmazonS3Provider provider) {
Assert.notNull(loader, "loader must be specified");
Assert.notNull(placementService, "placementService must be specified");
Assert.notNull(client, "client must be specified");
this.loader = loader;
this.placementService = placementService;
this.client = client;
this.tenantIdResolver = tenantIdResolver;
this.clientProvider = provider;
}

Expand Down Expand Up @@ -111,21 +108,17 @@ protected Resource getResourceInternal(S3ObjectId id) {

AmazonS3 clientToUse = client;
ResourceLoader loaderToUse = loader;
if (tenantIdResolver != null && clientProvider != null) {
String tenantId = tenantIdResolver.resolveCurrentTenantIdentifier();
if (tenantId != null) {
AmazonS3 client = clientProvider.getAmazonS3(tenantId);
if (clientProvider != null) {
AmazonS3 client = clientProvider.getAmazonS3();
if (client != null) {
SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();

if (client != null) {
SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
DefaultResourceLoader loader = new DefaultResourceLoader();
loader.addProtocolResolver(s3Protocol);

DefaultResourceLoader loader = new DefaultResourceLoader();
loader.addProtocolResolver(s3Protocol);

clientToUse = client;
loaderToUse = loader;
}
clientToUse = client;
loaderToUse = loader;
}
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,13 @@
/**
* A callback, used by the S3 default store implementation when returning a resource, in order to establish which
* AmazonS3 client to provide to the Resource being returned.
*
* The tenantId is resolved by the {@link CurrentTenantIdentifierResolver}
*/
public interface MultiTenantAmazonS3Provider {

/**
* The AmazonS3 client to use, or null
*
* @param tenantId the current tenant identifier
* @return the AmazonS3 client to use, or null
* @return the AmazonS3 client to use, or null
*/
AmazonS3 getAmazonS3(String tenantId);
AmazonS3 getAmazonS3();
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import org.springframework.content.commons.utils.PlacementServiceImpl;
import org.springframework.content.s3.Bucket;
import org.springframework.content.s3.S3ObjectIdResolver;
import org.springframework.content.s3.config.CurrentTenantIdentifierResolver;
import org.springframework.content.s3.config.MultiTenantAmazonS3Provider;
import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.converter.Converter;
Expand Down Expand Up @@ -53,7 +52,6 @@ public class DefaultS3StoreImplTest {
private PlacementService placementService;
private AmazonS3 client, client2;

private CurrentTenantIdentifierResolver tenantIdResolver;
private MultiTenantAmazonS3Provider clientProvider;

private S3ObjectIdResolver resolver;
Expand Down Expand Up @@ -99,7 +97,7 @@ public String convert(String source) {
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);

s3ObjectIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client, null, null);
s3ObjectIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client, null);
});
JustBeforeEach(() -> {
try {
Expand All @@ -117,7 +115,7 @@ public String convert(String source) {
});
Context("given the store's ID is a custom ID type", () -> {
JustBeforeEach(() -> {
customS3ContentIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client, null, null);
customS3ContentIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client,null);

try {
r = customS3ContentIdBasedStore.getResource(customId);
Expand Down Expand Up @@ -250,7 +248,7 @@ public String getKey(CustomContentId idOrEntity) {
JustBeforeEach(() -> {
placementService = new PlacementServiceImpl();
S3StoreConfiguration.addDefaultS3ObjectIdConverters(placementService, defaultBucket);
s3ObjectIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client, tenantIdResolver, clientProvider);
s3ObjectIdBasedStore = new DefaultS3StoreImpl<>(loader, placementService, client, clientProvider);

try {
r = s3ObjectIdBasedStore.getResource(new S3ObjectId("some-bucket", "some-object-id"));
Expand All @@ -262,21 +260,10 @@ public String getKey(CustomContentId idOrEntity) {

BeforeEach(() -> {
client2 = mock(AmazonS3.class);
tenantIdResolver = new CurrentTenantIdentifierResolver() {
@Override
public String resolveCurrentTenantIdentifier() {
return "client2";
}
};
clientProvider = new MultiTenantAmazonS3Provider(){
@Override
public AmazonS3 getAmazonS3(String tenantId) {
if ("client1".equals(tenantId)) {
return client;
} else if ("client2".equals(tenantId)) {
return client2;
}
throw new IllegalArgumentException("not a valid tenant id");
public AmazonS3 getAmazonS3() {
return client2;
};
};
});
Expand All @@ -293,7 +280,7 @@ public AmazonS3 getAmazonS3(String tenantId) {

Describe("AssociativeStore", () -> {
JustBeforeEach(() -> {
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client,null,null);
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client,null);
});
Context("#getResource", () -> {
JustBeforeEach(() -> {
Expand Down Expand Up @@ -463,7 +450,7 @@ public S3ObjectId convert(TestEntity source) {

Describe("ContentStore", () -> {
JustBeforeEach(() -> {
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client,null,null);
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client,null);
});
Context("#setContent", () -> {
BeforeEach(() -> {
Expand Down

0 comments on commit bcc47de

Please sign in to comment.