1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.env.beans;
18
19 import java.io.IOException;
20 import java.util.Properties;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import org.springframework.beans.BeansException;
25 import org.springframework.beans.factory.BeanDefinitionStoreException;
26 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
27 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
28 import org.springframework.context.ApplicationContext;
29 import org.springframework.context.ApplicationContextAware;
30 import org.springframework.core.io.Resource;
31
32 import ch.elca.el4j.core.context.ModuleApplicationContext;
33 import ch.elca.el4j.core.exceptions.MisconfigurationRTException;
34 import ch.elca.el4j.env.xml.EnvXml;
35 import ch.elca.el4j.services.monitoring.notification.CoreNotificationHelper;
36 import ch.elca.el4j.util.encryption.AbstractPropertyEncryptor;
37 import ch.elca.el4j.util.encryption.EncryptionException;
38 import ch.elca.el4j.util.encryption.PasswordSource;
39 import ch.elca.el4j.util.env.PropertyEncryptionUtil;
40
41
42
43
44
45
46
47
48
49 public class EnvPropertyPlaceholderConfigurer
50 extends PropertyPlaceholderConfigurer implements ApplicationContextAware {
51
52
53
54
55 public static final String ENV_PLACEHOLDER_PROPERTIES_LOCATION
56 = "classpath:env-placeholder.properties";
57
58
59
60
61 public static final String OLD_ENV_PROPERTIES_LOCATION
62 = "classpath:env/env.properties";
63
64
65
66
67
68 protected static final Logger s_logger
69 = LoggerFactory.getLogger(ModuleApplicationContext.EL4J_DEBUGGING_LOGGER);
70
71
72
73
74 protected ApplicationContext m_applicationContext;
75
76
77
78
79 protected PropertyEncryptionUtil m_util = new PropertyEncryptionUtil();
80
81
82
83
84 private AbstractPropertyEncryptor m_cryptor;
85
86
87
88
89 private String m_cryptorFile = null;
90
91
92
93
94
95
96
97 @Override
98 public void postProcessBeanFactory(
99 ConfigurableListableBeanFactory beanFactory) throws BeansException {
100
101
102 Resource oldEnvLocation = m_applicationContext.getResource(OLD_ENV_PROPERTIES_LOCATION);
103 if (oldEnvLocation.exists()) {
104 throw new MisconfigurationRTException(
105 "DEPRECATED: The used env placeholder properties file '"
106 + oldEnvLocation.toString()
107 + "' is deprecated. Please use the new loaction '"
108 + ENV_PLACEHOLDER_PROPERTIES_LOCATION + "'.");
109 }
110
111
112 boolean envXmlFound = false;
113 EnvXml envXmlConfigLoader;
114 if (m_applicationContext instanceof ModuleApplicationContext) {
115 ModuleApplicationContext mac = (ModuleApplicationContext) m_applicationContext;
116 envXmlConfigLoader = new EnvXml(m_applicationContext, mac.isMostSpecificResourceLast());
117 } else {
118 envXmlConfigLoader = new EnvXml();
119 }
120 if (envXmlConfigLoader.hasValidConfigurations()) {
121 super.setProperties((Properties) envXmlConfigLoader.getGroupConfiguration(EnvXml.ENV_GROUP_PLACEHOLDERS));
122 super.setLocalOverride(true);
123 envXmlFound = true;
124 }
125
126
127 Resource envLocation = m_applicationContext.getResource(ENV_PLACEHOLDER_PROPERTIES_LOCATION);
128 String envLocationUrl = "no url";
129 if (envLocation.exists()) {
130 try {
131 envLocationUrl = envLocation.getURL().toString();
132 } catch (IOException e) {
133 envLocationUrl = "unknown url";
134 }
135 }
136
137 if (!envXmlFound) {
138 if (envLocation.exists()) {
139 s_logger.debug("The used env placeholder properties file is '"
140 + envLocationUrl + "'.");
141 super.setLocation(envLocation);
142 } else {
143 s_logger.warn(
144 "No env placeholder properties file could be found. The "
145 + "correct location for this file is '"
146 + EnvXml.ENV_XML_LOCATION + "'.");
147 }
148 }
149
150 super.postProcessBeanFactory(beanFactory);
151 }
152
153
154
155
156
157
158 @Override
159 public void setLocation(Resource location) {
160 CoreNotificationHelper.notifyMisconfiguration(
161 "It is not allowed to set the location manually!");
162 }
163
164
165
166
167
168
169 @Override
170 public void setLocations(Resource[] locations) {
171 CoreNotificationHelper.notifyMisconfiguration(
172 "It is not allowed to set the locations manually!");
173 }
174
175
176
177
178 public void setApplicationContext(ApplicationContext applicationContext)
179 throws BeansException {
180 m_applicationContext = applicationContext;
181 }
182
183
184
185
186
187 public void setNoEncryption() {
188 m_util.deactivate();
189 }
190
191
192
193
194
195 public void setPasswordSource(PasswordSource source) {
196 m_util.setSource(source);
197 }
198
199
200
201
202 public void setCryptorFile(String file) {
203 m_cryptorFile = file;
204 }
205
206
207
208
209
210
211
212 protected String convertPropertyValue(String originalValue) {
213 String value = originalValue;
214
215 if (!m_util.isInited()) {
216 if (m_cryptorFile != null) {
217 m_util.init(m_applicationContext, m_cryptorFile);
218 } else {
219 m_util.init(m_applicationContext);
220 }
221 if (m_util.isActive()) {
222 m_cryptor = m_util.getCryptor();
223 }
224 }
225 if (m_util.isActive()) {
226 try {
227 value = m_cryptor.processString(originalValue);
228 } catch (EncryptionException e) {
229 throw new BeanDefinitionStoreException(
230 "Error during decryption.");
231 }
232 }
233
234 return super.convertPropertyValue(value);
235 }
236 }