%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.torque.dsfactory.AbstractDataSourceFactory |
|
|
1 | package org.apache.torque.dsfactory; |
|
2 | ||
3 | /* |
|
4 | * Copyright 2001-2004 The Apache Software Foundation. |
|
5 | * |
|
6 | * Licensed under the Apache License, Version 2.0 (the "License") |
|
7 | * you may not use this file except in compliance with the License. |
|
8 | * You may obtain a copy of the License at |
|
9 | * |
|
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
11 | * |
|
12 | * Unless required by applicable law or agreed to in writing, software |
|
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
15 | * See the License for the specific language governing permissions and |
|
16 | * limitations under the License. |
|
17 | */ |
|
18 | ||
19 | import java.util.Iterator; |
|
20 | ||
21 | import javax.sql.ConnectionPoolDataSource; |
|
22 | ||
23 | import org.apache.commons.beanutils.ConvertUtils; |
|
24 | import org.apache.commons.beanutils.MappedPropertyDescriptor; |
|
25 | import org.apache.commons.beanutils.PropertyUtils; |
|
26 | ||
27 | import org.apache.commons.configuration.Configuration; |
|
28 | import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS; |
|
29 | ||
30 | import org.apache.commons.logging.Log; |
|
31 | import org.apache.commons.logging.LogFactory; |
|
32 | ||
33 | import org.apache.torque.Torque; |
|
34 | import org.apache.torque.TorqueException; |
|
35 | ||
36 | /** |
|
37 | * A class that contains common functionality of the factories in this |
|
38 | * package. |
|
39 | * |
|
40 | * @author <a href="mailto:jmcnally@apache.org">John McNally</a> |
|
41 | * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> |
|
42 | * @version $Id: AbstractDataSourceFactory.java,v 1.12.2.2 2004/05/20 04:35:14 seade Exp $ |
|
43 | */ |
|
44 | 0 | public abstract class AbstractDataSourceFactory |
45 | { |
|
46 | /** "pool" Key for the configuration */ |
|
47 | public static final String POOL_KEY = "pool"; |
|
48 | ||
49 | /** "connection" Key for the configuration */ |
|
50 | public static final String CONNECTION_KEY = "connection"; |
|
51 | ||
52 | /** "default.pool" Key for the configuration */ |
|
53 | public static final String DEFAULT_POOL_KEY = "defaults.pool"; |
|
54 | ||
55 | /** "default.connection" Key for the configuration */ |
|
56 | public static final String DEFAULT_CONNECTION_KEY = "defaults.connection"; |
|
57 | ||
58 | /** The log */ |
|
59 | 0 | private static Log log = LogFactory.getLog(AbstractDataSourceFactory.class); |
60 | ||
61 | /** |
|
62 | * Encapsulates setting configuration properties on |
|
63 | * <code>DataSource</code> objects. |
|
64 | * |
|
65 | * @param property the property to read from the configuration |
|
66 | * @param c the configuration to read the property from |
|
67 | * @param ds the <code>DataSource</code> instance to write the property to |
|
68 | * @throws Exception if anything goes wrong |
|
69 | */ |
|
70 | protected void setProperty(String property, Configuration c, Object ds) |
|
71 | throws Exception |
|
72 | { |
|
73 | 0 | String key = property; |
74 | 0 | Class dsClass = ds.getClass(); |
75 | 0 | int dot = property.indexOf('.'); |
76 | try |
|
77 | { |
|
78 | 0 | if (dot > 0) |
79 | { |
|
80 | 0 | property = property.substring(0, dot); |
81 | ||
82 | 0 | MappedPropertyDescriptor mappedPD = |
83 | new MappedPropertyDescriptor(property, dsClass); |
|
84 | 0 | Class propertyType = mappedPD.getMappedPropertyType(); |
85 | 0 | Configuration subProps = c.subset(property); |
86 | // use reflection to set properties |
|
87 | 0 | Iterator j = subProps.getKeys(); |
88 | 0 | while (j.hasNext()) |
89 | { |
|
90 | 0 | String subProp = (String) j.next(); |
91 | 0 | String propVal = subProps.getString(subProp); |
92 | 0 | Object value = ConvertUtils.convert(propVal, propertyType); |
93 | 0 | PropertyUtils |
94 | .setMappedProperty(ds, property, subProp, value); |
|
95 | ||
96 | 0 | if (log.isDebugEnabled()) |
97 | { |
|
98 | 0 | log.debug("setMappedProperty(" |
99 | + ds + ", " |
|
100 | + property + ", " |
|
101 | + subProp + ", " |
|
102 | + value |
|
103 | + ")"); |
|
104 | } |
|
105 | } |
|
106 | } |
|
107 | else |
|
108 | { |
|
109 | 0 | Class propertyType = |
110 | PropertyUtils.getPropertyType(ds, property); |
|
111 | 0 | Object value = |
112 | ConvertUtils.convert(c.getString(property), propertyType); |
|
113 | 0 | PropertyUtils.setSimpleProperty(ds, property, value); |
114 | ||
115 | 0 | if (log.isDebugEnabled()) |
116 | { |
|
117 | 0 | log.debug("setSimpleProperty(" |
118 | + ds + ", " |
|
119 | + property + ", " |
|
120 | + value |
|
121 | + ")"); |
|
122 | } |
|
123 | } |
|
124 | } |
|
125 | 0 | catch (Exception e) |
126 | { |
|
127 | 0 | log.error( |
128 | "Property: " |
|
129 | + property |
|
130 | + " value: " |
|
131 | + c.getString(key) |
|
132 | + " is not supported by DataSource: " |
|
133 | + ds.getClass().getName()); |
|
134 | 0 | } |
135 | 0 | } |
136 | ||
137 | /** |
|
138 | * Iterate over a Configuration subset and apply all |
|
139 | * properties to a passed object which must contain Bean |
|
140 | * setter and getter |
|
141 | * |
|
142 | * @param c The configuration subset |
|
143 | * @param o The object to apply the properties to |
|
144 | * @throws TorqueException if a property set fails |
|
145 | */ |
|
146 | protected void applyConfiguration(Configuration c, Object o) |
|
147 | throws TorqueException |
|
148 | { |
|
149 | 0 | log.debug("applyConfiguration(" + c + ", " + o + ")"); |
150 | ||
151 | 0 | if (c != null) |
152 | { |
|
153 | try |
|
154 | { |
|
155 | 0 | for (Iterator i = c.getKeys(); i.hasNext();) |
156 | { |
|
157 | 0 | String key = (String) i.next(); |
158 | 0 | setProperty(key, c, o); |
159 | } |
|
160 | } |
|
161 | 0 | catch (Exception e) |
162 | { |
|
163 | 0 | log.error(e); |
164 | 0 | throw new TorqueException(e); |
165 | 0 | } |
166 | } |
|
167 | 0 | } |
168 | ||
169 | /** |
|
170 | * Initializes the ConnectionPoolDataSource. |
|
171 | * |
|
172 | * @param configuration where to read the settings from |
|
173 | * @throws TorqueException if a property set fails |
|
174 | * @return a configured <code>ConnectionPoolDataSource</code> |
|
175 | */ |
|
176 | protected ConnectionPoolDataSource initCPDS(Configuration configuration) |
|
177 | throws TorqueException |
|
178 | { |
|
179 | 0 | log.debug("Starting initCPDS"); |
180 | 0 | ConnectionPoolDataSource cpds = new DriverAdapterCPDS(); |
181 | 0 | Configuration c = Torque.getConfiguration(); |
182 | ||
183 | 0 | if (c == null) |
184 | { |
|
185 | 0 | log.warn("Global Configuration not set," |
186 | + " no Default connection pool data source configured!"); |
|
187 | } |
|
188 | else |
|
189 | { |
|
190 | 0 | Configuration conf = c.subset(DEFAULT_CONNECTION_KEY); |
191 | 0 | applyConfiguration(conf, cpds); |
192 | } |
|
193 | ||
194 | 0 | Configuration conf = configuration.subset(CONNECTION_KEY); |
195 | 0 | applyConfiguration(conf, cpds); |
196 | ||
197 | 0 | return cpds; |
198 | } |
|
199 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |