Untitled
unknown
plain_text
2 years ago
17 kB
22
Indexable
@Slf4j
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("default-worker-");
executor.setMaxPoolSize(10);
return executor;
}
@Bean("statisticsThreadPool")
public ThreadPoolTaskExecutor statisticsThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("stat-worker-");
executor.setCorePoolSize(3);
executor.setMaxPoolSize(10);
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
log.error("async exception: " + ex.getMessage());
log.error("method: " + method.getName());
for (Object param : params) {
log.error("param: " + param);
}
};
}
@Bean
public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(
ThreadPoolTaskExecutor threadPoolTaskExecutor) {
return new DelegatingSecurityContextAsyncTaskExecutor(threadPoolTaskExecutor);
}
}
///////////////////////////////////////////
@Configuration
@Slf4j
public class AwsConfig {
@Value("${multicp.aws.profile:default}")
private String multiCpProfile;
@Bean
public AmazonS3 multiCpS3() {
log.info("Creating amazonS3 for multi cp...");
return AmazonS3ClientBuilder
.standard()
.withRegion(Regions.CN_NORTH_1)
.withCredentials(new ProfileCredentialsProvider(multiCpProfile))
.withForceGlobalBucketAccessEnabled(true)
.build();
}
@Bean
public AmazonS3 portalS3() {
log.info("Creating amazonS3 for portal...");
return AmazonS3ClientBuilder
.standard()
.withRegion(Regions.US_EAST_1)
.withForceGlobalBucketAccessEnabled(true)
.build();
}
@Bean
public AmazonCloudFront portalCloudFront() {
log.info("Creating cloudfront for portal...");
return AmazonCloudFrontClientBuilder
.standard()
.withRegion(Regions.US_EAST_1)
.build();
}
@Bean
public AmazonSimpleEmailService simpleEmailService() {
return AmazonSimpleEmailServiceClientBuilder
.standard()
.withRegion(Regions.US_EAST_1)
.build();
}
}
/////////////////////////////////////////////
@Configuration
@EnableCaching
public class EhcacheConfig {
public static final String CONTENTS_PUSH_STATS_OVER_ALL = "contents_push_stats_over_all";
@Bean(name = "cacheManager")
public EhCacheCacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManager());
}
private CacheManager ehCacheManager() {
net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
config.setName("portal-dashboard-api");
config.setDynamicConfig(true);
config.updateCheck(false);
setCacheContentsPushStatsOverAll(config);
return net.sf.ehcache.CacheManager.newInstance(config);
}
private void setCacheContentsPushStatsOverAll(net.sf.ehcache.config.Configuration config) {
CacheConfiguration cache = createCache(CONTENTS_PUSH_STATS_OVER_ALL,
MemoryStoreEvictionPolicy.LRU, 50, 24 * 60 * 60);
config.addCache(cache);
}
private CacheConfiguration createCache(String name, MemoryStoreEvictionPolicy evictionPolicy,
int maxEntriesLocalHeap, int timeToLiveSeconds) {
CacheConfiguration cache = new CacheConfiguration();
cache.setName(name);
cache.setMemoryStoreEvictionPolicyFromObject(evictionPolicy);
cache.setMaxEntriesLocalHeap(maxEntriesLocalHeap);
cache.setTimeToLiveSeconds(timeToLiveSeconds);
cache.statistics(true);
return cache;
}
}
////////////////////////////////////////////
@Configuration
public class EncryptorConfig {
private static final String JASYPT_ALGORITHM = "PBEWithMD5AndDES";
private static final String JASYPT_PASSWORD_SALT = getJasyptPassword();
@Bean(name = "jasyptStringEncryptor")
public static StringEncryptor jasyptStringEncryptor() {
StandardPBEStringEncryptor configurationEncryptor = new StandardPBEStringEncryptor();
configurationEncryptor.setConfig(environmentVariablesConfiguration());
return configurationEncryptor;
}
private static String getJasyptPassword() {
byte[] bytesFromFile = ResourceUtils.readBytesFromResource(
"encrypted.jasypt_password");
byte[] saltKey = bytesFromFile;
if (Profiles.isActiveProfile(Profiles.PRD) || Profiles.isActiveProfile(Profiles.STG)) {
AWSKMS kmsClient = getAwskms();
ByteBuffer ciphertextBlob = ByteBuffer.wrap(bytesFromFile);
DecryptResult decryptResult =
kmsClient.decrypt(new DecryptRequest().withCiphertextBlob(ciphertextBlob));
saltKey = decryptResult.getPlaintext().array();
}
return new String(saltKey, StandardCharsets.UTF_8);
}
private static AWSKMS getAwskms() {
AWSKMSClientBuilder awskmsClientBuilder = AWSKMSClientBuilder
.standard();
if (Profiles.isActiveProfile(Profiles.STG)) {
awskmsClientBuilder = awskmsClientBuilder.withRegion(Regions.AP_SOUTHEAST_1);
}
return awskmsClientBuilder.build();
}
public static PBEConfig environmentVariablesConfiguration() {
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(JASYPT_ALGORITHM);
config.setPassword(JASYPT_PASSWORD_SALT);
return config;
}
}
//////////////////////////////////////////////////////
@Configuration
@Slf4j
public class FeatureApiProxyConfig {
private static final String FEATURE_API_PROXY_CONFIG_JSON = "feature-api-proxy-config.json";
private final FeatureApiProxyInfo featureApiProxyInfo;
private static final StringEncryptor CONFIG_ENCRYPTOR =
EncryptorConfig.jasyptStringEncryptor();
public FeatureApiProxyConfig(@Lazy FeatureApiProxyInfo featureApiProxyInfo) {
this.featureApiProxyInfo = featureApiProxyInfo;
}
@Bean
public FeatureApiProxyInfo featureApiProxy() throws IOException {
FeatureApiProxyInfo.FeatureApiProxySetting proxy = null;
try (InputStream inputStream = new ClassPathResource(FEATURE_API_PROXY_CONFIG_JSON)
.getInputStream()) {
proxy = new ObjectMapper().readValue(inputStream,
FeatureApiProxyInfo.FeatureApiProxySetting.class);
} catch (IOException e) {
log.error("Failed to read {}", FEATURE_API_PROXY_CONFIG_JSON);
throw new IOException(e);
}
log.info("featureApiProxyInfo init : " + proxy);
return new FeatureApiProxyInfo(proxy);
}
/**
* FeatureApiProxyInfo
*/
@Data
public static class FeatureApiProxyInfo {
private FeatureApiProxySetting proxySetting;
private Map<String, FeatureApiInfo> apiInfoMap;
public FeatureApiProxyInfo(FeatureApiProxySetting settings) {
if (settings != null && settings.apiList != null) {
if (settings.apiList.stream()
.anyMatch(apiInfo ->
apiInfo.getProxyApiUriPrefix().split("/").length != 3)) {
throw new InvalidDataException("Proxy-api-uri-prefix must be in 2depth.");
}
this.proxySetting = settings;
apiInfoMap = new ConcurrentHashMap<>();
proxySetting.apiList.sort(
Comparator.comparing(FeatureApiInfo::getProxyApiUriPrefix));
}
}
public FeatureApiInfo getApiInfo(String requestUri) {
if (proxySetting == null) {
throw new UrlNotFoundException(requestUri);
}
return apiInfoMap.computeIfAbsent(requestUri, s ->
proxySetting.apiList.stream()
.filter(item -> matchToProxyApiUriPrefix(requestUri,
item.getProxyApiUriPrefix()))
.findFirst()
.orElseThrow(() -> new UrlNotFoundException(requestUri)));
}
private boolean matchToProxyApiUriPrefix(String requestUri, String prefix) {
if (!requestUri.startsWith(prefix)) {
return false;
}
String[] parsedUri = requestUri.split("/");
String[] parsedPrefix = prefix.split("/");
return parsedUri[1].equals(parsedPrefix[1]) && parsedUri[2].equals(parsedPrefix[2]);
}
/**
* FeatureApiProxySetting
*/
@Data
public static class FeatureApiProxySetting {
private String portalApiEndpoint;
private List<FeatureApiInfo> apiList;
}
/**
* FeatureApiInfo
*/
@Data
public static class FeatureApiInfo {
private String name;
private String title;
private String proxyApiUriPrefix;
private SwaggerInfo swaggerInfo;
private String targetApiEndpoint;
private ApiAuthorization authorization;
private List<String> allowedHeaders;
}
/**
* SwaggerInfo
*/
@Data
public static class SwaggerInfo {
private String version;
private String apiDocsUrl;
}
/**
* ApiAuthorization
*/
@Data
public static class ApiAuthorization {
private Type type;
private String key;
private String value;
private String role;
public void setValue(String value) {
if (value != null && value.startsWith("ENC(") && value.endsWith(")")) {
value = CONFIG_ENCRYPTOR.decrypt(value.substring(4, value.length() - 1));
}
this.value = value;
}
public enum Type {
@JsonProperty("header")
HEADER,
@JsonProperty("SAHeader")
SA_HEADER,
@JsonProperty("queryParam")
QUERY_PARAM
}
}
}
}
////////////////////////////////////////////
@Configuration
public class MessageSenderConfig {
@Value("${slack.webhooks.url:}")
private String slackWebhooksUrl;
@Autowired
private Environment environment;
@Bean(name = "slackMessageSender")
@ConditionalOnProperty(prefix = "message", name = "channel", havingValue = "slack")
public MessageSender slackMessageSender() {
return new SlackMessageSender(slackWebhooksUrl, environment.getActiveProfiles()[0]);
}
@Bean(name = "consoleMessageSender")
@ConditionalOnProperty(prefix = "message", name = "channel", havingValue = "console",
matchIfMissing = true)
public MessageSender consoleMessageSender() {
return new ConsoleMessageSender();
}
}
/////////////////////////////////////////
@Configuration
@Profile({Profiles.LOCAL, Profiles.DEV, Profiles.STG})
public class OpenApiConfig {
public static final String X_SERVER_AUTH = "X-Server-Auth";
@Autowired
private FeatureApiProxyInfo featureApiProxy;
@Bean
public OpenAPI openAPI() {
Info info = new Info()
.title("Internet Portal Dashboard API")
.description("Internet Portal Dashboard API");
return new OpenAPI()
.addServersItem(new Server().url("/"))
.components(new Components().addSecuritySchemes(X_SERVER_AUTH,
new SecurityScheme().type(Type.APIKEY).in(In.HEADER).name(X_SERVER_AUTH)))
.addSecurityItem(new SecurityRequirement().addList(X_SERVER_AUTH))
.info(info);
}
@Primary
@Bean
public SwaggerUiConfigProperties swaggerUiConfigProperties(
SwaggerUiConfigProperties swaggerUiConfigProperties) {
Set<SwaggerUrl> swaggerUrls =
featureApiProxy.getProxySetting().getApiList().stream()
.filter(apiInfo -> apiInfo.getSwaggerInfo() != null)
.map(apiInfo -> {
SwaggerUrl swaggerUrl = new SwaggerUrl();
swaggerUrl.setName(apiInfo.getName());
swaggerUrl.setUrl("/features/portal-api-docs"
+ apiInfo.getProxyApiUriPrefix());
return swaggerUrl;
}).collect(Collectors.toSet());
SwaggerUrl portal = new SwaggerUrl();
portal.setName("InternetPortal");
portal.setUrl("/v3/api-docs");
swaggerUrls.add(portal);
swaggerUiConfigProperties.setUrls(swaggerUrls);
swaggerUiConfigProperties.setUrlsPrimaryName("InternetPortal");
return swaggerUiConfigProperties;
}
}
/////////////////////////////////////////
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
MappingJackson2HttpMessageConverter textHttpMessageConverter =
new MappingJackson2HttpMessageConverter();
List<MediaType> textMediaTypes = new ArrayList<>();
textMediaTypes.add(MediaType.TEXT_PLAIN);
textHttpMessageConverter.setSupportedMediaTypes(textMediaTypes);
HttpMessageConverter<?> stringHttpMessageConverter =
new StringHttpMessageConverter(Charset.forName("UTF-8"));
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
List<HttpMessageConverter<?>> messageConverters =
restTemplate.getMessageConverters();
messageConverters.add(textHttpMessageConverter);
messageConverters.add(0, stringHttpMessageConverter);
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(TimeUnit.SECONDS.toMillis(2));
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
}
//////////////////////////////////
@Configuration
@Slf4j
public class RootConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
TypeMap<ExperimentDetailVo, Experiment> propertyMapper =
modelMapper.createTypeMap(ExperimentDetailVo.class, Experiment.class);
propertyMapper.addMappings(mapper -> mapper.skip(Experiment::setTesters));
propertyMapper.addMappings(mapper -> mapper.skip(Experiment::setRules));
propertyMapper.addMappings(mapper -> mapper.skip(Experiment::setVariants));
propertyMapper.addMappings(mapper -> mapper.skip(Experiment::setSiLogs));
propertyMapper.addMappings(mapper -> mapper.skip(Experiment::setMeasures));
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
return modelMapper;
}
}
Editor is loading...
Leave a Comment