KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > Yasna > forum > database > DbConnectionManager


1 /**
2  * Copyright (C) 2001 Yasna.com. All rights reserved.
3  *
4  * ===================================================================
5  * The Apache Software License, Version 1.1
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  * if any, must include the following acknowledgment:
21  * "This product includes software developed by
22  * Yasna.com (http://www.yasna.com)."
23  * Alternately, this acknowledgment may appear in the software itself,
24  * if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Yazd" and "Yasna.com" must not be used to
27  * endorse or promote products derived from this software without
28  * prior written permission. For written permission, please
29  * contact yazd@yasna.com.
30  *
31  * 5. Products derived from this software may not be called "Yazd",
32  * nor may "Yazd" appear in their name, without prior written
33  * permission of Yasna.com.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED. IN NO EVENT SHALL YASNA.COM OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of Yasna.com. For more information
51  * on Yasna.com, please see <http://www.yasna.com>.
52  */

53
54
55 package com.Yasna.forum.database;
56 import java.sql.*;
57 import com.Yasna.forum.*;
58
59 import javax.sql.DataSource JavaDoc;
60 import javax.naming.InitialContext JavaDoc;
61
62 /**
63  * Central manager of database connections. All methods are static so that they
64  * can be easily accessed throughout the classes in the database package.
65  */

66 public class DbConnectionManager {
67
68     private static DbConnectionProvider connectionProvider;
69     private static Object JavaDoc providerLock = new Object JavaDoc();
70     private static boolean AppServerPooler = false;
71     private static boolean checkedPooler = false;
72     private static DataSource JavaDoc appServerSource;
73     public static final String JavaDoc CONTEXT_JDBC_NAME=SystemProperty.getProperty("JNDI.dataprovider");
74
75     /**
76      * Returns a database connection from the currently active connection
77      * provider.
78      */

79     public static Connection getConnection() {
80         Connection con=null;
81         if (appServerSource == null && !checkedPooler){
82             checkedPooler=true;
83             try{
84                 InitialContext JavaDoc ctxt = new InitialContext JavaDoc ();
85                 appServerSource = (DataSource JavaDoc)ctxt.lookup(CONTEXT_JDBC_NAME);
86                 AppServerPooler=true;
87                 System.err.println("Yazd got a connection provider from app server ("+CONTEXT_JDBC_NAME+")");
88             }catch(Exception JavaDoc e){
89                 System.err.println("Failed to find an application datasource ("+CONTEXT_JDBC_NAME+"): "+e.getMessage());
90             }
91         }
92         if (connectionProvider == null && !AppServerPooler) {
93             synchronized (providerLock) {
94                 if (connectionProvider == null) {
95                     //Attempt to load the connection provider classname as
96
//a Yazd property.
97
String JavaDoc className =
98                         PropertyManager.getProperty("connectionProvider.className");
99                     if (className != null) {
100                         //Attempt to load the class.
101
try {
102                             Class JavaDoc conClass = Class.forName(className);
103                             connectionProvider = (DbConnectionProvider)conClass.newInstance();
104                         }
105                         catch(Exception JavaDoc e) {
106                             System.err.println("Warning: failed to create the " +
107                                 "connection provider specified by connection" +
108                                 "Provider.className. Using the default pool.");
109                             connectionProvider = new DbConnectionDefaultPool();
110                         }
111                     }
112                     else {
113                         connectionProvider = new DbConnectionDefaultPool();
114                     }
115                     connectionProvider.start();
116                 }
117             }
118         }
119         if(AppServerPooler){
120             try{
121                 con = appServerSource.getConnection ();
122             }catch(Exception JavaDoc e){
123                 System.err.println("There was a problem obtaining a connection from application server :"+e.getMessage());
124             }
125         }else{
126             con = connectionProvider.getConnection();
127         }
128         if (con == null) {
129             System.err.println("WARNING: DbConnectionManager.getConnection() " +
130                 "failed to obtain a connection.");
131         }
132         return con;
133     }
134
135     /**
136      * Returns the current connection provider. The only case in which this
137      * method should be called is if more information about the current
138      * connection provider is needed. Database connections should always be
139      * obtained by calling the getConnection method of this class.
140      */

141     public static DbConnectionProvider getDbConnectionProvider() {
142         return connectionProvider;
143     }
144
145     /**
146      * Sets the connection provider. The old provider (if it exists) is shut
147      * down before the new one is started. A connection provider <b>should
148      * not</b> be started before being passed to the connection manager
149      * because the manager will call the start() method automatically.
150      */

151     public static void setDbConnectionProvider(DbConnectionProvider provider) {
152         synchronized (providerLock) {
153             if (connectionProvider != null) {
154                 connectionProvider.destroy();
155                 connectionProvider = null;
156             }
157             connectionProvider = provider;
158             provider.start();
159         }
160     }
161
162
163 }
164
Popular Tags