1 package org.apache.torque.dsfactory;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import javax.sql.ConnectionPoolDataSource;
23 import javax.sql.DataSource;
24
25 import org.apache.commons.configuration.Configuration;
26
27 import org.apache.commons.dbcp.datasources.PerUserPoolDataSource;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31
32 import org.apache.torque.Torque;
33 import org.apache.torque.TorqueException;
34
35 /**
36 * A factory that looks up the DataSource using the JDBC2 pool methods.
37 *
38 * @author <a href="mailto:jmcnally@apache.org">John McNally</a>
39 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
40 * @version $Id: PerUserPoolDataSourceFactory.java 1336091 2012-05-09 11:09:40Z tfischer $
41 */
42 public class PerUserPoolDataSourceFactory
43 extends AbstractDataSourceFactory
44 {
45
46 /** The log. */
47 private static Log log
48 = LogFactory.getLog(PerUserPoolDataSourceFactory.class);
49
50 /** The wrapped <code>DataSource</code>. */
51 private PerUserPoolDataSource ds = null;
52
53 /**
54 * @see org.apache.torque.dsfactory.DataSourceFactory#getDataSource
55 */
56 public DataSource getDataSource()
57 {
58 return ds;
59 }
60
61 /**
62 * @see org.apache.torque.dsfactory.DataSourceFactory#initialize
63 */
64 public void initialize(Configuration configuration) throws TorqueException
65 {
66 ConnectionPoolDataSource cpds = initCPDS(configuration);
67 PerUserPoolDataSource dataSource = initJdbc2Pool(configuration);
68 dataSource.setConnectionPoolDataSource(cpds);
69 this.ds = dataSource;
70 }
71
72 /**
73 * Initializes the Jdbc2PoolDataSource.
74 *
75 * @param configuration where to read the settings from
76 * @throws TorqueException if a property set fails
77 * @return a configured <code>Jdbc2PoolDataSource</code>
78 */
79 private PerUserPoolDataSource initJdbc2Pool(Configuration configuration)
80 throws TorqueException
81 {
82 log.debug("Starting initJdbc2Pool");
83 PerUserPoolDataSource dataSource = new PerUserPoolDataSource();
84 Configuration c = Torque.getConfiguration();
85
86 if (c == null || c.isEmpty())
87 {
88 log.warn("Global Configuration not set,"
89 + " no Default pool data source configured!");
90 }
91 else
92 {
93 Configuration conf = c.subset(DEFAULT_POOL_KEY);
94 applyConfiguration(conf, dataSource);
95 }
96
97 Configuration conf = configuration.subset(POOL_KEY);
98 applyConfiguration(conf, dataSource);
99 return dataSource;
100 }
101
102 /**
103 * Closes the pool associated with this factory and releases it.
104 * @throws TorqueException if the pool cannot be closed properly
105 */
106 public void close() throws TorqueException
107 {
108 try
109 {
110 ds.close();
111 }
112 catch (Exception e)
113 {
114 log.error("Exception caught during close()", e);
115 throw new TorqueException(e);
116 }
117 ds = null;
118 }
119
120 }