001 package org.apache.torque.util;
002
003 import java.io.File;
004 import java.io.FileInputStream;
005 import java.io.InputStreamReader;
006 import java.io.Reader;
007 import java.util.Map;
008 import java.util.Properties;
009 import java.util.Set;
010
011 import org.apache.commons.beanutils.BeanUtils;
012 import org.apache.commons.lang.StringUtils;
013 import org.apache.commons.logging.Log;
014 import org.apache.commons.logging.LogFactory;
015 import org.kuali.core.db.torque.PropertyHandlingException;
016 import org.kuali.core.db.torque.Utils;
017 import org.springframework.core.io.DefaultResourceLoader;
018 import org.springframework.core.io.Resource;
019 import org.springframework.core.io.ResourceLoader;
020
021 public class BeanPropertiesLoader {
022 private static final Log log = LogFactory.getLog(BeanPropertiesLoader.class);
023
024 Utils utils = new Utils();
025 String location;
026 String encoding;
027 Object bean;
028 boolean overrideExistingPropertyValues = true;
029 boolean overrideSystemProperties = false;
030 String description;
031
032 public BeanPropertiesLoader() {
033 this(null, null, null, null);
034 }
035
036 public BeanPropertiesLoader(Object bean, String location, String encoding, String description) {
037 super();
038 this.bean = bean;
039 this.location = location;
040 this.encoding = encoding;
041 this.description = description;
042 }
043
044 public boolean isPropertiesExist() {
045 return utils.isFileOrResource(location);
046 }
047
048 protected boolean isSkip(Map<String, Object> description, String key) {
049 Object value = description.get(key);
050 if (value != null && !isOverrideExistingPropertyValues()) {
051 // The property is already set, don't override it unless they have asked us to
052 log.debug("Skipping property " + key + " it is already set to " + value);
053 return true;
054 }
055 Set<String> beanProperties = description.keySet();
056 if (!beanProperties.contains(key)) {
057 // This is not a property of the bean
058 log.debug("Skipping property " + key + " as it is not a property of this bean");
059 return true;
060 }
061 return false;
062 }
063
064 @SuppressWarnings("unchecked")
065 public void loadToBean() throws PropertyHandlingException {
066 if (!utils.isFileOrResource(location)) {
067 log.info("------------------------------------------------------------------------");
068 log.warn("No properties file located at " + location);
069 log.info("------------------------------------------------------------------------");
070 return;
071 } else {
072 log.info("------------------------------------------------------------------------");
073 log.info("Loading " + getDescription() + " properties from " + location);
074 log.info("------------------------------------------------------------------------");
075 }
076 try {
077 Properties properties = getProperties();
078 if (!overrideSystemProperties) {
079 properties.putAll(System.getProperties());
080 }
081 Set<String> keys = properties.stringPropertyNames();
082 Map<String, Object> description = BeanUtils.describe(bean);
083 for (String key : keys) {
084 if (isSkip(description, key)) {
085 continue;
086 }
087 // Extract the value and set it on the bean
088 String newValue = properties.getProperty(key);
089 log.info("Setting " + key + "=" + getLogValue(key, newValue));
090 BeanUtils.copyProperty(bean, key, newValue);
091 }
092 } catch (Exception e) {
093 throw new PropertyHandlingException(e);
094 }
095 }
096
097 /**
098 * Don't display password'ish type properties
099 */
100 protected String getLogValue(String key, String value) {
101 int pos = key.toLowerCase().indexOf("password");
102 if (pos == -1) {
103 return value;
104 } else {
105 return StringUtils.repeat("*", value.length());
106 }
107 }
108
109 /**
110 * Load the properties file into a Properties object
111 */
112 public Properties getProperties() throws PropertyHandlingException {
113 try {
114 Reader reader = getReader();
115 Properties properties = new Properties();
116 properties.load(reader);
117 return properties;
118 } catch (Exception e) {
119 throw new PropertyHandlingException(e);
120 }
121 }
122
123 /**
124 * Return a Reader for reading in the properties file. First check the file system to see if the file exists. If
125 * not, return a Reader using Spring Resource loading
126 */
127 protected Reader getReader() throws PropertyHandlingException {
128 try {
129 File file = new File(location);
130 if (file.exists()) {
131 return new InputStreamReader(new FileInputStream(file), getEncoding());
132 }
133 ResourceLoader loader = new DefaultResourceLoader();
134 Resource resource = loader.getResource(location);
135 return new InputStreamReader(resource.getInputStream(), getEncoding());
136 } catch (Exception e) {
137 throw new PropertyHandlingException(e);
138 }
139 }
140
141 public String getLocation() {
142 return location;
143 }
144
145 public void setLocation(String location) {
146 this.location = location;
147 }
148
149 public String getEncoding() {
150 return encoding;
151 }
152
153 public void setEncoding(String encoding) {
154 this.encoding = encoding;
155 }
156
157 public Object getBean() {
158 return bean;
159 }
160
161 public void setBean(Object bean) {
162 this.bean = bean;
163 }
164
165 public boolean isOverrideExistingPropertyValues() {
166 return overrideExistingPropertyValues;
167 }
168
169 public void setOverrideExistingPropertyValues(boolean override) {
170 this.overrideExistingPropertyValues = override;
171 }
172
173 public String getDescription() {
174 return description;
175 }
176
177 public void setDescription(String description) {
178 this.description = description;
179 }
180
181 public boolean isOverrideSystemProperties() {
182 return overrideSystemProperties;
183 }
184
185 public void setOverrideSystemProperties(boolean overrideSystemProperties) {
186 this.overrideSystemProperties = overrideSystemProperties;
187 }
188
189 }