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