зеркало из
				https://github.com/iharh/notes.git
				synced 2025-11-04 07:36: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);
 | 
						|
	}
 | 
						|
}
 |