зеркало из
https://github.com/iharh/notes.git
synced 2025-11-01 06:06:08 +02:00
520 строки
21 KiB
Plaintext
520 строки
21 KiB
Plaintext
!!!!
|
|
we expose BasicAWSCredentials
|
|
default - ProfileCredentialsProvider
|
|
profileName = "default"
|
|
|
|
AWSStaticCredentialsProvider
|
|
ProfileCredentialsProvider
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false)
|
|
@Import({ ContextDefaultConfigurationRegistrar.class, ContextCredentialsAutoConfiguration.Registrar.class })
|
|
@ConditionalOnClass(name = "com.amazonaws.auth.AWSCredentialsProvider")
|
|
public class ContextCredentialsAutoConfiguration {
|
|
/**
|
|
* The prefix used for AWS credentials related properties.
|
|
*/
|
|
public static final String AWS_CREDENTIALS_PROPERTY_PREFIX = "cloud.aws.credentials";
|
|
/**
|
|
* Bind AWS credentials related properties to a property instance.
|
|
* @return An {@link AwsCredentialsProperties} instance
|
|
*/
|
|
@Bean
|
|
@ConfigurationProperties(prefix = AWS_CREDENTIALS_PROPERTY_PREFIX)
|
|
public AwsCredentialsProperties awsCredentialsProperties() {
|
|
return new AwsCredentialsProperties();
|
|
}
|
|
|
|
/**
|
|
* Registrar for the credentials provider.
|
|
*/
|
|
public static class Registrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {
|
|
private Environment environment;
|
|
|
|
@Override
|
|
public void setEnvironment(Environment environment) {
|
|
this.environment = environment;
|
|
}
|
|
@Override
|
|
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
|
|
// Do not register a credentials provider if a bean with the same name is already registered.
|
|
if (registry.containsBeanDefinition(CredentialsProviderFactoryBean.CREDENTIALS_PROVIDER_BEAN_NAME)) {
|
|
return;
|
|
}
|
|
Boolean useDefaultCredentialsChain = this.environment.getProperty(
|
|
AWS_CREDENTIALS_PROPERTY_PREFIX + ".useDefaultAwsCredentialsChain", Boolean.class, false);
|
|
String accessKey = this.environment.getProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".accessKey");
|
|
String secretKey = this.environment.getProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".secretKey");
|
|
if (useDefaultCredentialsChain && (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(secretKey))) {
|
|
registerDefaultAWSCredentialsProvider(registry);
|
|
} else {
|
|
registerCredentialsProvider(registry, accessKey, secretKey,
|
|
this.environment.getProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".instanceProfile", Boolean.class, true)
|
|
&& !this.environment.containsProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".accessKey"),
|
|
this.environment.getProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".profileName", DEFAULT_PROFILE_NAME),
|
|
this.environment.getProperty(AWS_CREDENTIALS_PROPERTY_PREFIX + ".profilePath"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
org.springframework.cloud.aws.context.config.support.ContextConfigurationUtils
|
|
public final class ContextConfigurationUtils {
|
|
|
|
/**
|
|
* Name of the region provider bean.
|
|
*/
|
|
public static final String REGION_PROVIDER_BEAN_NAME = "regionProvider";
|
|
|
|
// @checkstyle:off
|
|
private static final String POST_PROCESSOR_CLASS_NAME = "org.springframework.cloud.aws.context.config.AmazonEc2InstanceDataPropertySourcePostProcessor";
|
|
|
|
// @checkstyle:on
|
|
private static final String POST_PROCESSOR_BEAN_NAME = "AmazonEc2InstanceDataPropertySourcePostProcessor";
|
|
|
|
private ContextConfigurationUtils() {
|
|
}
|
|
|
|
public static void registerRegionProvider(BeanDefinitionRegistry registry,
|
|
boolean autoDetect, String configuredRegion) {
|
|
if (autoDetect && StringUtils.hasText(configuredRegion)) {
|
|
throw new IllegalArgumentException(
|
|
"No region must be configured if autoDetect is defined as true");
|
|
}
|
|
|
|
AbstractBeanDefinition beanDefinition;
|
|
|
|
if (autoDetect) {
|
|
beanDefinition = BeanDefinitionBuilder
|
|
.genericBeanDefinition(Ec2MetadataRegionProvider.class)
|
|
.getBeanDefinition();
|
|
}
|
|
else if (StringUtils.hasText(configuredRegion)) {
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder
|
|
.genericBeanDefinition(StaticRegionProvider.class);
|
|
builder.addConstructorArgValue(configuredRegion);
|
|
beanDefinition = builder.getBeanDefinition();
|
|
}
|
|
else {
|
|
throw new IllegalArgumentException(
|
|
"Region must be manually configured or autoDetect enabled");
|
|
}
|
|
|
|
BeanDefinitionReaderUtils.registerBeanDefinition(
|
|
new BeanDefinitionHolder(beanDefinition, REGION_PROVIDER_BEAN_NAME),
|
|
registry);
|
|
AmazonWebserviceClientConfigurationUtils.replaceDefaultRegionProvider(registry,
|
|
REGION_PROVIDER_BEAN_NAME);
|
|
}
|
|
|
|
public static void registerDefaultAWSCredentialsProvider(
|
|
BeanDefinitionRegistry registry) {
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder
|
|
.rootBeanDefinition(DefaultAWSCredentialsProviderChain.class);
|
|
registry.registerBeanDefinition(
|
|
CredentialsProviderFactoryBean.CREDENTIALS_PROVIDER_BEAN_NAME,
|
|
builder.getBeanDefinition());
|
|
AmazonWebserviceClientConfigurationUtils.replaceDefaultCredentialsProvider(
|
|
registry, CredentialsProviderFactoryBean.CREDENTIALS_PROVIDER_BEAN_NAME);
|
|
}
|
|
|
|
public static void registerCredentialsProvider(BeanDefinitionRegistry registry,
|
|
String accessKey, String secretKey, boolean instanceProfile,
|
|
String profileName, String profilePath) {
|
|
BeanDefinitionBuilder factoryBeanBuilder = BeanDefinitionBuilder
|
|
.genericBeanDefinition(CredentialsProviderFactoryBean.class);
|
|
|
|
ManagedList<BeanDefinition> awsCredentialsProviders = new ManagedList<>();
|
|
|
|
if (StringUtils.hasText(accessKey)) {
|
|
BeanDefinitionBuilder credentials = BeanDefinitionBuilder.rootBeanDefinition(BasicAWSCredentials.class);
|
|
credentials.addConstructorArgValue(accessKey);
|
|
credentials.addConstructorArgValue(secretKey);
|
|
|
|
// !!!
|
|
BeanDefinitionBuilder provider = BeanDefinitionBuilder.rootBeanDefinition(AWSStaticCredentialsProvider.class);
|
|
provider.addConstructorArgValue(credentials.getBeanDefinition());
|
|
|
|
awsCredentialsProviders.add(provider.getBeanDefinition());
|
|
}
|
|
|
|
if (instanceProfile) {
|
|
awsCredentialsProviders.add(BeanDefinitionBuilder
|
|
.rootBeanDefinition(EC2ContainerCredentialsProviderWrapper.class)
|
|
.getBeanDefinition());
|
|
}
|
|
|
|
if (StringUtils.hasText(profileName)) {
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ProfileCredentialsProvider.class);
|
|
if (StringUtils.hasText(profilePath)) {
|
|
builder.addConstructorArgValue(profilePath);
|
|
}
|
|
|
|
builder.addConstructorArgValue(profileName);
|
|
awsCredentialsProviders.add(builder.getBeanDefinition());
|
|
}
|
|
|
|
factoryBeanBuilder.addConstructorArgValue(awsCredentialsProviders);
|
|
|
|
registry.registerBeanDefinition(
|
|
CredentialsProviderFactoryBean.CREDENTIALS_PROVIDER_BEAN_NAME,
|
|
factoryBeanBuilder.getBeanDefinition());
|
|
|
|
AmazonWebserviceClientConfigurationUtils.replaceDefaultCredentialsProvider(
|
|
registry, CredentialsProviderFactoryBean.CREDENTIALS_PROVIDER_BEAN_NAME);
|
|
}
|
|
|
|
public static void registerInstanceDataPropertySource(BeanDefinitionRegistry registry,
|
|
String valueSeparator, String attributeSeparator) {
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(POST_PROCESSOR_CLASS_NAME);
|
|
builder.addPropertyValue("valueSeparator", valueSeparator);
|
|
builder.addPropertyValue("attributeSeparator", attributeSeparator);
|
|
|
|
registry.registerBeanDefinition(POST_PROCESSOR_BEAN_NAME,
|
|
builder.getBeanDefinition());
|
|
}
|
|
|
|
}
|
|
|
|
!!!!
|
|
https://github.com/spring-cloud/spring-cloud-aws/blob/master/spring-cloud-aws-core/src/main/java/org/springframework/cloud/aws/core/config/AmazonWebserviceClientFactoryBean.java
|
|
!!!!
|
|
org.springframework.cloud.aws.core.config.AmazonWebserviceClientFactoryBean
|
|
public class AmazonWebserviceClientFactoryBean<T extends AmazonWebServiceClient> extends AbstractFactoryBean<T> {
|
|
private final Class<? extends AmazonWebServiceClient> clientClass;
|
|
|
|
private final AWSCredentialsProvider credentialsProvider;
|
|
|
|
private RegionProvider regionProvider;
|
|
|
|
private Region customRegion;
|
|
|
|
private ExecutorService executor;
|
|
|
|
public AmazonWebserviceClientFactoryBean(Class<T> clientClass,
|
|
AWSCredentialsProvider credentialsProvider) {
|
|
this.clientClass = clientClass;
|
|
this.credentialsProvider = credentialsProvider;
|
|
}
|
|
|
|
public AmazonWebserviceClientFactoryBean(Class<T> clientClass, AWSCredentialsProvider credentialsProvider, RegionProvider regionProvider) {
|
|
this(clientClass, credentialsProvider);
|
|
setRegionProvider(regionProvider);
|
|
}
|
|
|
|
@Override
|
|
public Class<?> getObjectType() {
|
|
return this.clientClass;
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@Override
|
|
protected T createInstance() throws Exception {
|
|
String builderName = this.clientClass.getName() + "Builder";
|
|
Class<?> className = ClassUtils.resolveClassName(builderName, ClassUtils.getDefaultClassLoader());
|
|
|
|
Method method = ClassUtils.getStaticMethod(className, "standard");
|
|
Assert.notNull(method, "Could not find standard() method in class:'" + className.getName() + "'");
|
|
|
|
AwsClientBuilder<?, T> builder = (AwsClientBuilder<?, T>) ReflectionUtils.invokeMethod(method, null);
|
|
|
|
if (this.executor != null) {
|
|
AwsAsyncClientBuilder<?, T> asyncBuilder = (AwsAsyncClientBuilder<?, T>) builder;
|
|
asyncBuilder.withExecutorFactory((ExecutorFactory) () -> this.executor);
|
|
}
|
|
|
|
if (this.credentialsProvider != null) {
|
|
builder.withCredentials(this.credentialsProvider);
|
|
}
|
|
|
|
if (this.customRegion != null) {
|
|
builder.withRegion(this.customRegion.getName());
|
|
}
|
|
else if (this.regionProvider != null) {
|
|
builder.withRegion(this.regionProvider.getRegion().getName());
|
|
}
|
|
else {
|
|
builder.withRegion(Regions.DEFAULT_REGION);
|
|
}
|
|
return builder.build();
|
|
}
|
|
|
|
public void setRegionProvider(RegionProvider regionProvider) {
|
|
this.regionProvider = regionProvider;
|
|
}
|
|
|
|
public void setCustomRegion(String customRegionName) {
|
|
this.customRegion = RegionUtils.getRegion(customRegionName);
|
|
}
|
|
|
|
public void setExecutor(ExecutorService executor) {
|
|
this.executor = executor;
|
|
}
|
|
|
|
@Override
|
|
protected void destroyInstance(T instance) throws Exception {
|
|
instance.shutdown();
|
|
}
|
|
}
|
|
|
|
|
|
org.springframework.cloud.aws.context.config.annotation.ContextResourceLoaderConfiguration
|
|
@Configuration(proxyBeanMethods = false)
|
|
@Import(ContextResourceLoaderConfiguration.Registrar.class)
|
|
public class ContextResourceLoaderConfiguration {
|
|
/**
|
|
* Registrar for Amazon webservice client.
|
|
*/
|
|
public static class Registrar implements ImportBeanDefinitionRegistrar {
|
|
@Override
|
|
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
|
|
// !!!
|
|
BeanDefinitionHolder client = AmazonWebserviceClientConfigurationUtils.registerAmazonWebserviceClient(this, registry,
|
|
AmazonS3Client.class.getName(), null, null);
|
|
|
|
BeanDefinitionBuilder configurer = BeanDefinitionBuilder.genericBeanDefinition(SimpleStorageProtocolResolverConfigurer.class);
|
|
configurer.addConstructorArgValue(getProtocolResolver(client));
|
|
|
|
BeanDefinitionReaderUtils.registerWithGeneratedName(configurer.getBeanDefinition(), registry);
|
|
}
|
|
protected BeanDefinition getProtocolResolver(BeanDefinitionHolder client) {
|
|
BeanDefinitionBuilder resolver = BeanDefinitionBuilder.rootBeanDefinition(SimpleStorageProtocolResolver.class);
|
|
resolver.addConstructorArgReference(client.getBeanName());
|
|
|
|
BeanDefinition taskExecutor = getTaskExecutorDefinition();
|
|
if (taskExecutor != null) {
|
|
resolver.addPropertyValue("taskExecutor", taskExecutor);
|
|
}
|
|
return resolver.getBeanDefinition();
|
|
}
|
|
protected BeanDefinition getTaskExecutorDefinition() {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public final class AmazonWebserviceClientConfigurationUtils {
|
|
// Name of the bean for region provider.
|
|
public static final String REGION_PROVIDER_BEAN_NAME = "org.springframework.cloud.aws.core.region.RegionProvider.BEAN_NAME";
|
|
// Name of the bean for credentials provider.
|
|
public static final String CREDENTIALS_PROVIDER_BEAN_NAME = "org.springframework.cloud.aws.core.credentials.CredentialsProviderFactoryBean.BEAN_NAME";
|
|
private static final String SERVICE_IMPLEMENTATION_SUFFIX = "Client";
|
|
|
|
private AmazonWebserviceClientConfigurationUtils() {
|
|
// Avoid instantiation
|
|
}
|
|
public static BeanDefinitionHolder registerAmazonWebserviceClient(Object source, BeanDefinitionRegistry registry, String serviceNameClassName, String customRegionProvider, String customRegion) {
|
|
|
|
String beanName = getBeanName(serviceNameClassName);
|
|
|
|
if (registry.containsBeanDefinition(beanName)) {
|
|
return new BeanDefinitionHolder(registry.getBeanDefinition(beanName), beanName);
|
|
}
|
|
|
|
BeanDefinition definition = getAmazonWebserviceClientBeanDefinition(source, serviceNameClassName, customRegionProvider, customRegion, registry);
|
|
BeanDefinitionHolder holder = new BeanDefinitionHolder(definition, beanName);
|
|
BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
|
|
|
|
return holder;
|
|
}
|
|
public static AbstractBeanDefinition getAmazonWebserviceClientBeanDefinition(Object source, String serviceNameClassName, String customRegionProvider, String customRegion, BeanDefinitionRegistry beanDefinitionRegistry) {
|
|
|
|
if (StringUtils.hasText(customRegionProvider) && StringUtils.hasText(customRegion)) {
|
|
throw new IllegalArgumentException("Only region or regionProvider can be configured, but not both");
|
|
}
|
|
|
|
registerCredentialsProviderIfNeeded(beanDefinitionRegistry);
|
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AmazonWebserviceClientFactoryBean.class);
|
|
|
|
// Configure constructor parameters
|
|
builder.addConstructorArgValue(serviceNameClassName);
|
|
builder.addConstructorArgReference(CREDENTIALS_PROVIDER_BEAN_NAME);
|
|
|
|
// Configure source of the bean definition
|
|
builder.getRawBeanDefinition().setSource(source);
|
|
|
|
// Configure region properties (either custom region provider or custom region)
|
|
if (StringUtils.hasText(customRegionProvider)) {
|
|
builder.addPropertyReference("regionProvider", customRegionProvider);
|
|
} else if (StringUtils.hasText(customRegion)) {
|
|
builder.addPropertyValue("customRegion", customRegion);
|
|
} else {
|
|
registerRegionProviderBeanIfNeeded(beanDefinitionRegistry);
|
|
builder.addPropertyReference("regionProvider", REGION_PROVIDER_BEAN_NAME);
|
|
}
|
|
return builder.getBeanDefinition();
|
|
}
|
|
private static void registerCredentialsProviderIfNeeded(BeanDefinitionRegistry registry) {
|
|
if (!registry.containsBeanDefinition(CREDENTIALS_PROVIDER_BEAN_NAME)) { // !!!
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CredentialsProviderFactoryBean.class);
|
|
builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
registry.registerBeanDefinition(CREDENTIALS_PROVIDER_BEAN_NAME, builder.getBeanDefinition());
|
|
}
|
|
}
|
|
|
|
...
|
|
}
|
|
|
|
//
|
|
// ??? - where do we instantiate this ???
|
|
//
|
|
// AbstractAutowireCapableBeanFactory.doCreateBean(...
|
|
// org.springframework.beans.factory.support.RootBeanDefinition mbd
|
|
// -> ConstructorResolver.resolveConstructorArguments(String beanName: "org...SimpleStorageProtocolResolverConfigurer"
|
|
// AbstractAutowireCapableBeanFactory.autowireConstructor(...)
|
|
// AbstractAutowireCapableBeanFactory.createBeanInstance(...)
|
|
// ...
|
|
// DefaultListableBeanFactory.preInstantiateSingletons()
|
|
// beanName = org.springframework.cloud.aws.context.support.io.SimpleStorageProtocolResolverConfigurer#0
|
|
|
|
org.springframework.cloud.aws.core.io.s3.SimpleStorageProtocolResolver
|
|
public class SimpleStorageProtocolResolver implements ProtocolResolver, InitializingBean {
|
|
private final AmazonS3 amazonS3;
|
|
|
|
private TaskExecutor taskExecutor;
|
|
|
|
// TODO: usages ???
|
|
public SimpleStorageProtocolResolver(AmazonS3 amazonS3) {
|
|
this.amazonS3 = AmazonS3ProxyFactory.createProxy(amazonS3);
|
|
}
|
|
@RuntimeUse
|
|
public void setTaskExecutor(TaskExecutor taskExecutor) {
|
|
this.taskExecutor = taskExecutor;
|
|
}
|
|
@Override
|
|
public void afterPropertiesSet() {
|
|
if (this.taskExecutor == null) {
|
|
this.taskExecutor = new SyncTaskExecutor();
|
|
}
|
|
}
|
|
@Override
|
|
public Resource resolve(String location, ResourceLoader resourceLoader) {
|
|
if (SimpleStorageNameUtils.isSimpleStorageResource(location)) {
|
|
return new SimpleStorageResource(this.amazonS3,
|
|
SimpleStorageNameUtils.getBucketNameFromLocation(location),
|
|
SimpleStorageNameUtils.getObjectNameFromLocation(location),
|
|
this.taskExecutor,
|
|
SimpleStorageNameUtils.getVersionIdFromLocation(location));
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
public AmazonS3 getAmazonS3() {
|
|
return this.amazonS3;
|
|
}
|
|
}
|
|
|
|
org.springframework.cloud.aws.context.support.io.SimpleStorageProtocolResolverConfigurer
|
|
private final ProtocolResolver resourceLoader;
|
|
|
|
public SimpleStorageProtocolResolverConfigurer(SimpleStorageProtocolResolver simpleStorageProtocolResolver) {
|
|
this.resourceLoader = simpleStorageProtocolResolver; // !!!
|
|
}
|
|
@Override
|
|
public int getOrder() {
|
|
return Ordered.HIGHEST_PRECEDENCE;
|
|
}
|
|
@Override
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
if (applicationContext instanceof ConfigurableApplicationContext) {
|
|
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
|
|
configurableApplicationContext.addProtocolResolver(this.resourceLoader);
|
|
}
|
|
}
|
|
|
|
org.springframework.cloud.aws.core.io.s3.SimpleStorageResource
|
|
@Override
|
|
public InputStream getInputStream() throws IOException {
|
|
GetObjectRequest getObjectRequest = new GetObjectRequest(this.bucketName, this.objectName);
|
|
if (this.versionId != null) {
|
|
getObjectRequest.setVersionId(this.versionId);
|
|
}
|
|
return this.amazonS3.getObject(getObjectRequest).getObjectContent();
|
|
}
|
|
|
|
org.springframework.cloud.aws.core.io.s3.AmazonS3ClientFactory
|
|
public class AmazonS3ClientFactory {
|
|
|
|
private static final String CREDENTIALS_PROVIDER_FIELD_NAME = "awsCredentialsProvider";
|
|
|
|
private final ConcurrentHashMap<String, AmazonS3> clientCache = new ConcurrentHashMap<>(
|
|
Regions.values().length);
|
|
|
|
private final Field credentialsProviderField;
|
|
|
|
public AmazonS3ClientFactory() {
|
|
this.credentialsProviderField = ReflectionUtils.findField(AmazonS3Client.class,
|
|
CREDENTIALS_PROVIDER_FIELD_NAME);
|
|
Assert.notNull(this.credentialsProviderField,
|
|
"Credentials Provider field not found, this class does not work with the current "
|
|
+ "AWS SDK release");
|
|
ReflectionUtils.makeAccessible(this.credentialsProviderField);
|
|
}
|
|
|
|
private static String getRegion(String endpointUrl) {
|
|
Assert.notNull(endpointUrl, "Endpoint Url must not be null");
|
|
try {
|
|
URI uri = new URI(endpointUrl);
|
|
if ("s3.amazonaws.com".equals(uri.getHost())) {
|
|
return Regions.DEFAULT_REGION.getName();
|
|
}
|
|
else {
|
|
return new AmazonS3URI(endpointUrl).getRegion();
|
|
}
|
|
}
|
|
catch (URISyntaxException e) {
|
|
throw new RuntimeException("Malformed URL received for endpoint", e);
|
|
}
|
|
}
|
|
|
|
private static AmazonS3Client getAmazonS3ClientFromProxy(AmazonS3 amazonS3) {
|
|
if (AopUtils.isAopProxy(amazonS3)) {
|
|
Advised advised = (Advised) amazonS3;
|
|
Object target = null;
|
|
try {
|
|
target = advised.getTargetSource().getTarget();
|
|
}
|
|
catch (Exception e) {
|
|
return null;
|
|
}
|
|
return target instanceof AmazonS3Client ? (AmazonS3Client) target : null;
|
|
}
|
|
else {
|
|
return amazonS3 instanceof AmazonS3Client ? (AmazonS3Client) amazonS3 : null;
|
|
}
|
|
}
|
|
|
|
public AmazonS3 createClientForEndpointUrl(AmazonS3 prototype, String endpointUrl) {
|
|
Assert.notNull(prototype, "AmazonS3 must not be null");
|
|
Assert.notNull(endpointUrl, "Endpoint Url must not be null");
|
|
|
|
String region = getRegion(endpointUrl);
|
|
Assert.notNull(region,
|
|
"Error detecting region from endpoint url:'" + endpointUrl + "'");
|
|
|
|
if (!this.clientCache.containsKey(region)) {
|
|
AmazonS3ClientBuilder amazonS3ClientBuilder = buildAmazonS3ForRegion(
|
|
prototype, region);
|
|
this.clientCache.putIfAbsent(region, amazonS3ClientBuilder.build());
|
|
}
|
|
|
|
return this.clientCache.get(region);
|
|
}
|
|
|
|
private AmazonS3ClientBuilder buildAmazonS3ForRegion(AmazonS3 prototype,
|
|
String region) {
|
|
AmazonS3ClientBuilder clientBuilder = AmazonS3ClientBuilder.standard();
|
|
|
|
AmazonS3Client target = getAmazonS3ClientFromProxy(prototype);
|
|
if (target != null) {
|
|
AWSCredentialsProvider awsCredentialsProvider = (AWSCredentialsProvider) ReflectionUtils
|
|
.getField(this.credentialsProviderField, target);
|
|
clientBuilder.withCredentials(awsCredentialsProvider);
|
|
}
|
|
|
|
return clientBuilder.withRegion(region);
|
|
}
|
|
}
|