View Javadoc
1 /* ====================================================================
2 * License:
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * 3. The end-user documentation included with the redistribution,
17 * if any, must include the following acknowledgment:
18 * "This product includes software developed by
19 * Robert Half International (http://www.rhi.com/)."
20 * Alternately, this acknowledgment may appear in the software itself,
21 * if and wherever such third-party acknowledgments normally appear.
22 *
23 * 4. The names "Parc", "RHI", and "Robert Half International" must
24 * not be used to endorse or promote products derived from this
25 * software without prior written permission. For written
26 * permission, please contact pete.mckinstry@rhi.com.
27 *
28 * 5. Products derived from this software may not be called "PARC",
29 * nor may "PARC" appear in their name, without prior written
30 * permission of Robert Half International.
31 *
32 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
33 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
36 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
39 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
41 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
42 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 * SUCH DAMAGE.
44 * ====================================================================
45 *
46 */
47 package com.rhi.architecture.db;
48
49 import com.rhi.architecture.config.ConfigurationException;
50 import com.rhi.architecture.logging.LogUtil;
51 import com.rhi.architecture.logging.Logger;
52 import com.rhi.architecture.resource.Resource;
53
54 import java.util.Collection;
55 import java.util.HashMap;
56 import java.util.Iterator;
57 import java.util.Properties;
58
59 import org.exolab.castor.jdo.Database;
60 import org.exolab.castor.jdo.DatabaseNotFoundException;
61 import org.exolab.castor.jdo.JDO;
62 import org.exolab.castor.jdo.PersistenceException;
63
64 /***
65 * Castor JDO Database pooling factory.
66 * - A database is a connection in castor speak.
67 *
68 * @author Pete McKinstry
69 * @copyright 2002, Robert Half Int'l., Inc. All rights reserved.
70 *
71 * @since 1.0
72 */
73 public class JDODatabaseFactory implements Resource {
74
75 private static Logger log =
76 LogUtil.getLogger(JDODatabaseFactory.class.getName());
77
78 private static HashMap databases = new HashMap();
79
80 /***
81 * Default Constructor
82 *
83 * @since 1.0
84 */
85 public JDODatabaseFactory() {
86 super();
87 }
88
89 /***
90 * No initialization required.
91 * @param p
92 */
93 public void init(Properties p) {
94 // no-op
95 };
96
97 /***
98 * get Database
99 * @param configFile
100 * @param dbName
101 * @return
102 * @throws ConfigurationException
103 */
104 public Database getDatabase(String configFile, String dbName)
105 throws ConfigurationException {
106
107 PooledDatabase db = null;
108 String key = configFile + dbName;
109
110 if (databases.containsKey(key)) {
111 log.debug("Database already created, Checking validity...");
112 db = (PooledDatabase) databases.get(key);
113 if (db.realIsClosed()) {
114 log.error("someone closed a pooled db. removing from pool.");
115 databases.remove(key);
116 db = null;
117 }
118 }
119
120 if (db == null) {
121 db = createDatabase(configFile, dbName);
122 databases.put(key, db);
123 }
124 if (db != null) {
125 db.reset();
126 }
127 return db;
128 }
129
130 /***
131 * Helper method to initialize a new Database obj.
132 * @param configFile
133 * @param dbName
134 * @return PooledDatabase
135 * @throws ConfigurationException
136 */
137 private PooledDatabase createDatabase(String configFile, String dbName)
138 throws ConfigurationException {
139 PooledDatabase db = null;
140 try {
141 JDO jdo = new JDO();
142 jdo.setConfiguration(configFile);
143 jdo.setDatabaseName(dbName);
144 Database local = jdo.getDatabase();
145 db = new PooledDatabase(local);
146 }
147 catch (DatabaseNotFoundException e) {
148 throw new ConfigurationException("db name invalid. e= " + e);
149 }
150 catch (PersistenceException e) {
151 throw new ConfigurationException(
152 "db connection " + "could not be established. e = " + e);
153 }
154 return db;
155 }
156
157 /***
158 * Cleanup the object pool that provides the connections.
159 *
160 * @since 1.0
161 */
162 public void close() {
163 try {
164 Collection dbCollection = databases.values();
165 Iterator iter = dbCollection.iterator();
166 while (iter.hasNext()) {
167 PooledDatabase db = (PooledDatabase) iter.next();
168 if (db.realIsClosed() == false) {
169 db.realClose();
170 }
171 }
172 }
173 catch (Exception e) {
174 log.error("exception caught = " + e);
175 }
176 }
177
178 }
This page was automatically generated by Maven