001package org.kuali.common.util.properties.spring;
002
003import java.util.Properties;
004
005import org.kuali.common.util.PropertyUtils;
006import org.kuali.common.util.enc.EncContext;
007import org.kuali.common.util.project.model.Project;
008import org.kuali.common.util.project.spring.AutowiredProjectConfig;
009import org.kuali.common.util.properties.DefaultPropertiesService;
010import org.kuali.common.util.properties.PropertiesService;
011import org.kuali.common.util.property.ImmutableProperties;
012import org.kuali.common.util.property.processor.JasyptDecryptingProcessor;
013import org.kuali.common.util.property.processor.OverridingProcessor;
014import org.kuali.common.util.property.processor.ProcessorsProcessor;
015import org.kuali.common.util.property.processor.PropertyProcessor;
016import org.kuali.common.util.property.processor.ResolvingProcessor;
017import org.kuali.common.util.spring.env.BasicEnvironmentService;
018import org.kuali.common.util.spring.env.EnvironmentService;
019import org.kuali.common.util.spring.service.SpringServiceConfig;
020import org.springframework.beans.factory.annotation.Autowired;
021import org.springframework.context.annotation.Bean;
022import org.springframework.context.annotation.Configuration;
023import org.springframework.context.annotation.Import;
024
025@Configuration
026@Import({ SpringServiceConfig.class, AutowiredProjectConfig.class })
027public class DefaultPropertiesServiceConfig implements PropertiesServiceConfig {
028
029        @Autowired
030        Project project;
031
032        @Autowired
033        EnvironmentService env;
034
035        @Override
036        @Bean
037        public PropertiesService propertiesService() {
038                Properties overrides = getOverrides(project);
039                PropertyProcessor processor = getPostProcessor(overrides);
040                return new DefaultPropertiesService(overrides, processor);
041        }
042
043        private Properties getOverrides(Project project) {
044                // Get a reference to system + environment properties
045                Properties global = PropertyUtils.getGlobalProperties();
046
047                // Setup a properties object where system properties "win" over project properties
048                return ImmutableProperties.copyOf(PropertyUtils.combine(project.getProperties(), global));
049        }
050
051        private PropertyProcessor getPostProcessor(Properties overrides) {
052                EnvironmentService env = new BasicEnvironmentService(overrides);
053                EncContext context = EncContext.builder(env).removeSystemProperties(true).build();
054                PropertyProcessor override = new OverridingProcessor(overrides);
055                PropertyProcessor decrypt = new JasyptDecryptingProcessor(context.getTextEncryptor());
056                PropertyProcessor resolver = new ResolvingProcessor();
057                return new ProcessorsProcessor(override, decrypt, resolver);
058        }
059
060}