1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.common.util.spring;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  import java.util.Map;
21  import java.util.Properties;
22  
23  import org.kuali.common.util.Assert;
24  import org.kuali.common.util.FormatUtils;
25  import org.kuali.common.util.PropertyUtils;
26  import org.kuali.common.util.property.ProjectProperties;
27  import org.kuali.common.util.property.ProjectPropertiesComparator;
28  import org.kuali.common.util.property.PropertiesContext;
29  import org.slf4j.Logger;
30  import org.slf4j.LoggerFactory;
31  import org.springframework.beans.factory.FactoryBean;
32  import org.springframework.util.CollectionUtils;
33  
34  
35  
36  
37  public class ProjectPropertiesLoaderFactoryBean implements FactoryBean<Properties> {
38  
39  	private static final Logger logger = LoggerFactory.getLogger(ProjectPropertiesLoaderFactoryBean.class);
40  
41  	List<String> locations;
42  	boolean singleton = true;
43  	ProjectPropertiesComparator comparator;
44  
45  	@Override
46  	public Properties getObject() {
47  		Assert.isFalse(CollectionUtils.isEmpty(locations), "locations is empty");
48  		long start = System.currentTimeMillis();
49  		List<ProjectProperties> pps = new ArrayList<ProjectProperties>();
50  		
51  		for (String location : locations) {
52  			Map<String, ProjectProperties> beans = SpringUtils.getAllBeans(location, ProjectProperties.class);
53  			logger.info("Located {} sets of project properties", beans.size());
54  
55  			List<ProjectProperties> list = new ArrayList<ProjectProperties>();
56  			
57  			for (ProjectProperties bean : beans.values()) {
58  				list.add(bean);
59  			}
60  			
61  			pps.addAll(list);
62  		}
63  
64  		
65  		Properties properties = new Properties();
66  		for (ProjectProperties pp : pps) {
67  			PropertiesContext ctx = pp.getPropertiesContext();
68  			Properties combined = PropertyUtils.combine(properties, ctx.getProperties());
69  			ctx.setProperties(combined);
70  			Properties loaded = PropertyUtils.load(ctx);
71  			properties.putAll(loaded);
72  		}
73  		String elapsed = FormatUtils.getTime(System.currentTimeMillis() - start);
74  		logger.info("Loaded {} properties.  Total time: {}", properties.size(), elapsed);
75  		return properties;
76  	}
77  
78  	@Override
79  	public Class<Properties> getObjectType() {
80  		return Properties.class;
81  	}
82  
83  	@Override
84  	public boolean isSingleton() {
85  		return singleton;
86  	}
87  
88  	public void setSingleton(boolean singleton) {
89  		this.singleton = singleton;
90  	}
91  
92  	public List<String> getLocations() {
93  		return locations;
94  	}
95  
96  	public void setLocations(List<String> locations) {
97  		this.locations = locations;
98  	}
99  
100 	public ProjectPropertiesComparator getComparator() {
101 		return comparator;
102 	}
103 
104 	public void setComparator(ProjectPropertiesComparator comparator) {
105 		this.comparator = comparator;
106 	}
107 
108 }