package com.aol.micro.server.spring.properties; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import com.aol.micro.server.config.Config; import com.aol.micro.server.config.ConfigAccessor; @Configuration public class PropertyFileConfig { private final static Logger logger = LoggerFactory.getLogger(PropertyFileConfig.class); public PropertyFileConfig() { } public PropertyFileConfig(boolean set) { if (set) new Config().set(); // make sure config instance is set } @Bean public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() throws IOException { PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); Properties props = propertyFactory(); configurer.setProperties(props); configurer.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE); return configurer; } @Bean public Properties propertyFactory() throws IOException { List<Resource> resources = loadPropertyResource(); PropertiesFactoryBean factory = new PropertiesFactoryBean(); factory.setLocations(resources.toArray(new Resource[resources.size()])); factory.afterPropertiesSet(); Properties props = factory.getObject(); new ConfigAccessor().get() .getProperties() .entrySet() .forEach(e -> { if (props.getProperty(e.getKey()) == null) { props.put(e.getKey(), e.getValue()); } }); System.getProperties() .entrySet() .forEach(e -> props.put(e.getKey(), e.getValue())); return props; } private List<Resource> loadPropertyResource() { List<Resource> resources = new ArrayList<>(); String applicationPropertyFileName = new ConfigAccessor().get() .getPropertiesName(); loadProperties(applicationPropertyFileName, "application").ifPresent(it -> resources.add(it)); String serviceTypePropertyFileName = new ConfigAccessor().get() .getServiceTypePropertiesName(); loadProperties(serviceTypePropertyFileName, "service-type").ifPresent(it -> resources.add(it)); String instancePropertyFileName = new ConfigAccessor().get() .getInstancePropertiesName(); loadProperties(instancePropertyFileName, "instance").ifPresent(it -> resources.add(it)); return resources; } private Optional<Resource> loadProperties(String applicationPropertyFileName, String type) { Optional<Resource> resource = Optional.empty(); if (new File( "./" + applicationPropertyFileName).exists()) { resource = Optional.of(new FileSystemResource( new File( "./" + applicationPropertyFileName))); logger.info("./" + applicationPropertyFileName + " added"); } URL urlResource = PropertyFileConfig.class.getClassLoader() .getResource(applicationPropertyFileName); if (urlResource != null) { resource = Optional.of(new UrlResource( urlResource)); logger.info(applicationPropertyFileName + " added"); } if (System.getProperty(type + ".env") != null) { URL envResource = PropertyFileConfig.class.getClassLoader() .getResource(createEnvBasedPropertyFileName(applicationPropertyFileName)); if (envResource != null) { resource = Optional.of(new UrlResource( envResource)); logger.info(createEnvBasedPropertyFileName(applicationPropertyFileName) + " added"); } } if (System.getProperty(type + ".property.file") != null) { resource = Optional.of(new FileSystemResource( new File( System.getProperty(type + ".property.file")))); logger.info(System.getProperty("application.property.file") + " added"); } return resource; } private String createEnvBasedPropertyFileName(String applicationPropertyFileName) { return applicationPropertyFileName.substring(0, applicationPropertyFileName.lastIndexOf(".")) + "-" + System.getProperty("application.env") + ".properties"; } }