1 package org.apache.torque.dsfactory;
2
3 /* ====================================================================
4 * The Apache Software License, Version 1.1
5 *
6 * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
7 * reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. The end-user documentation included with the redistribution,
22 * if any, must include the following acknowledgment:
23 * "This product includes software developed by the
24 * Apache Software Foundation (http://www.apache.org/)."
25 * Alternately, this acknowledgment may appear in the software itself,
26 * if and wherever such third-party acknowledgments normally appear.
27 *
28 * 4. The names "Apache" and "Apache Software Foundation" and
29 * "Apache Turbine" must not be used to endorse or promote products
30 * derived from this software without prior written permission. For
31 * written permission, please contact apache@apache.org.
32 *
33 * 5. Products derived from this software may not be called "Apache",
34 * "Apache Turbine", nor may "Apache" appear in their name, without
35 * prior written permission of the Apache Software Foundation.
36 *
37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48 * SUCH DAMAGE.
49 * ====================================================================
50 *
51 * This software consists of voluntary contributions made by many
52 * individuals on behalf of the Apache Software Foundation. For more
53 * information on the Apache Software Foundation, please see
54 * <http://www.apache.org/>.
55 */
56
57 import java.util.Iterator;
58
59 import javax.sql.ConnectionPoolDataSource;
60
61 import org.apache.commons.beanutils.ConvertUtils;
62 import org.apache.commons.beanutils.MappedPropertyDescriptor;
63 import org.apache.commons.beanutils.PropertyUtils;
64
65 import org.apache.commons.configuration.Configuration;
66 import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS;
67
68 import org.apache.commons.logging.Log;
69 import org.apache.commons.logging.LogFactory;
70
71 import org.apache.torque.Torque;
72 import org.apache.torque.TorqueException;
73
74 /***
75 * A class that contains common functionality of the factories in this
76 * package.
77 *
78 * @author <a href="mailto:jmcnally@apache.org">John McNally</a>
79 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
80 * @version $Id: AbstractDataSourceFactory.java,v 1.12 2003/08/19 18:30:34 mpoeschl Exp $
81 */
82 public abstract class AbstractDataSourceFactory
83 {
84 /*** "pool" Key for the configuration */
85 public static final String POOL_KEY = "pool";
86
87 /*** "connection" Key for the configuration */
88 public static final String CONNECTION_KEY = "connection";
89
90 /*** "default.pool" Key for the configuration */
91 public static final String DEFAULT_POOL_KEY = "defaults.pool";
92
93 /*** "default.connection" Key for the configuration */
94 public static final String DEFAULT_CONNECTION_KEY = "defaults.connection";
95
96 /*** The log */
97 private static Log log = LogFactory.getLog(AbstractDataSourceFactory.class);
98
99 /***
100 * Encapsulates setting configuration properties on
101 * <code>DataSource</code> objects.
102 *
103 * @param property the property to read from the configuration
104 * @param c the configuration to read the property from
105 * @param ds the <code>DataSource</code> instance to write the property to
106 * @throws Exception if anything goes wrong
107 */
108 protected void setProperty(String property, Configuration c, Object ds)
109 throws Exception
110 {
111 String key = property;
112 Class dsClass = ds.getClass();
113 int dot = property.indexOf('.');
114 try
115 {
116 if (dot > 0)
117 {
118 property = property.substring(0, dot);
119
120 MappedPropertyDescriptor mappedPD =
121 new MappedPropertyDescriptor(property, dsClass);
122 Class propertyType = mappedPD.getMappedPropertyType();
123 Configuration subProps = c.subset(property);
124 // use reflection to set properties
125 Iterator j = subProps.getKeys();
126 while (j.hasNext())
127 {
128 String subProp = (String) j.next();
129 String propVal = subProps.getString(subProp);
130 Object value = ConvertUtils.convert(propVal, propertyType);
131 PropertyUtils
132 .setMappedProperty(ds, property, subProp, value);
133
134 if (log.isDebugEnabled())
135 {
136 log.debug("setMappedProperty("
137 + ds + ", "
138 + property + ", "
139 + subProp + ", "
140 + value
141 + ")");
142 }
143 }
144 }
145 else
146 {
147 Class propertyType =
148 PropertyUtils.getPropertyType(ds, property);
149 Object value =
150 ConvertUtils.convert(c.getString(property), propertyType);
151 PropertyUtils.setSimpleProperty(ds, property, value);
152
153 if (log.isDebugEnabled())
154 {
155 log.debug("setSimpleProperty("
156 + ds + ", "
157 + property + ", "
158 + value
159 + ")");
160 }
161 }
162 }
163 catch (Exception e)
164 {
165 log.error(
166 "Property: "
167 + property
168 + " value: "
169 + c.getString(key)
170 + " is not supported by DataSource: "
171 + ds.getClass().getName());
172 }
173 }
174
175 /***
176 * Iterate over a Configuration subset and apply all
177 * properties to a passed object which must contain Bean
178 * setter and getter
179 *
180 * @param c The configuration subset
181 * @param o The object to apply the properties to
182 * @throws TorqueException if a property set fails
183 */
184 protected void applyConfiguration(Configuration c, Object o)
185 throws TorqueException
186 {
187 log.debug("applyConfiguration(" + c + ", " + o + ")");
188
189 if (c != null)
190 {
191 try
192 {
193 for (Iterator i = c.getKeys(); i.hasNext();)
194 {
195 String key = (String) i.next();
196 setProperty(key, c, o);
197 }
198 }
199 catch (Exception e)
200 {
201 log.error(e);
202 throw new TorqueException(e);
203 }
204 }
205 }
206
207 /***
208 * Initializes the ConnectionPoolDataSource.
209 *
210 * @param configuration where to read the settings from
211 * @throws TorqueException if a property set fails
212 * @return a configured <code>ConnectionPoolDataSource</code>
213 */
214 protected ConnectionPoolDataSource initCPDS(Configuration configuration)
215 throws TorqueException
216 {
217 log.debug("Starting initCPDS");
218 ConnectionPoolDataSource cpds = new DriverAdapterCPDS();
219 Configuration c = Torque.getConfiguration();
220
221 if (c == null)
222 {
223 log.warn("Global Configuration not set,"
224 + " no Default connection pool data source configured!");
225 }
226 else
227 {
228 Configuration conf = c.subset(DEFAULT_CONNECTION_KEY);
229 applyConfiguration(conf, cpds);
230 }
231
232 Configuration conf = configuration.subset(CONNECTION_KEY);
233 applyConfiguration(conf, cpds);
234
235 return cpds;
236 }
237 }
This page was automatically generated by Maven