1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.configuration2.spring;
19
20 import java.util.Properties;
21 import java.util.stream.Stream;
22
23 import org.apache.commons.configuration2.CompositeConfiguration;
24 import org.apache.commons.configuration2.Configuration;
25 import org.apache.commons.configuration2.ConfigurationConverter;
26 import org.apache.commons.configuration2.builder.fluent.Configurations;
27 import org.apache.commons.lang3.ArrayUtils;
28 import org.springframework.beans.factory.FactoryBean;
29 import org.springframework.beans.factory.InitializingBean;
30 import org.springframework.core.io.Resource;
31 import org.springframework.util.Assert;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class ConfigurationPropertiesFactoryBean implements InitializingBean, FactoryBean<Properties> {
48
49
50 private CompositeConfiguration compositeConfiguration;
51
52
53 private Configuration[] configurations;
54
55
56 private Resource[] locations;
57
58
59 private boolean throwExceptionOnMissing = true;
60
61 public ConfigurationPropertiesFactoryBean() {
62 }
63
64 public ConfigurationPropertiesFactoryBean(final Configuration configuration) {
65 Assert.notNull(configuration, "configuration");
66 this.compositeConfiguration = new CompositeConfiguration(configuration);
67 }
68
69
70
71
72 @Override
73 public Properties getObject() throws Exception {
74 return compositeConfiguration != null ? ConfigurationConverter.getProperties(compositeConfiguration) : null;
75 }
76
77
78
79
80 @Override
81 public Class<?> getObjectType() {
82 return Properties.class;
83 }
84
85
86
87
88 @Override
89 public boolean isSingleton() {
90 return true;
91 }
92
93
94
95
96 @Override
97 public void afterPropertiesSet() throws Exception {
98 if (compositeConfiguration == null && ArrayUtils.isEmpty(configurations) && ArrayUtils.isEmpty(locations)) {
99 throw new IllegalArgumentException("no configuration object or location specified");
100 }
101
102 if (compositeConfiguration == null) {
103 compositeConfiguration = new CompositeConfiguration();
104 }
105
106 compositeConfiguration.setThrowExceptionOnMissing(throwExceptionOnMissing);
107
108 if (configurations != null) {
109 Stream.of(configurations).forEach(compositeConfiguration::addConfiguration);
110 }
111
112 if (locations != null) {
113 for (final Resource location : locations) {
114 compositeConfiguration.addConfiguration(new Configurations().properties(location.getURL()));
115 }
116 }
117 }
118
119 public Configuration[] getConfigurations() {
120 return defensiveCopy(configurations);
121 }
122
123
124
125
126
127
128 public void setConfigurations(final Configuration... configurations) {
129 this.configurations = defensiveCopy(configurations);
130 }
131
132 public Resource[] getLocations() {
133 return defensiveCopy(locations);
134 }
135
136
137
138
139
140
141
142 public void setLocations(final Resource... locations) {
143 this.locations = defensiveCopy(locations);
144 }
145
146 public boolean isThrowExceptionOnMissing() {
147 return throwExceptionOnMissing;
148 }
149
150
151
152
153
154
155
156 public void setThrowExceptionOnMissing(final boolean throwExceptionOnMissing) {
157 this.throwExceptionOnMissing = throwExceptionOnMissing;
158 }
159
160 public CompositeConfiguration getConfiguration() {
161 return compositeConfiguration;
162 }
163
164
165
166
167
168
169
170
171 private static <T> T[] defensiveCopy(final T[] src) {
172 return src != null ? src.clone() : null;
173 }
174 }